<!DOCTYPE html>
<!--
Copyright 2016 The Chromium Authors. All rights reserved.
Use of this source code is governed by a BSD-style license that can be
found in the LICENSE file.
-->

<link rel="import" href="/tracing/base/range.html">
<link rel="import" href="/tracing/base/unit.html">
<link rel="import" href="/tracing/value/diagnostics/diagnostic_map.html">
<link rel="import" href="/tracing/value/diagnostics/generic.html">
<link rel="import" href="/tracing/value/histogram.html">
<link rel="import" href="/tracing/value/value_set.html">

<script>
'use strict';

tr.b.unittest.testSuite(function() {
  test('addValuesFromDicts', function() {
    var n = new tr.v.Histogram('foo', tr.b.Unit.byName.unitlessNumber);
    var values = new tr.v.ValueSet([n]);
    var values2 = new tr.v.ValueSet();
    values2.addValuesFromDicts(values.valueDicts);
    assert.lengthOf(values2.getValuesNamed('foo'), 1);
  });

  test('addValueFromDictsWithSampleDiagnostic', function() {
    var n = new tr.v.Histogram('foo', tr.b.Unit.byName.count);
    n.addSample(10, {bar: new tr.v.d.Generic('baz')});

    var values = new tr.v.ValueSet([n]);
    var values2 = new tr.v.ValueSet();
    values2.addValuesFromDicts(values.valueDicts);
    assert.lengthOf(values2.getValuesNamed('foo'), 1);
    var v = values2.getValuesNamed('foo')[0];
    assert.lengthOf(v.getBinForValue(10).diagnosticMaps, 1);
    var dm = v.getBinForValue(10).diagnosticMaps[0];
    assert.strictEqual(dm.size, 1);
    assert.instanceOf(dm.get('bar'), tr.v.d.Generic);
    assert.strictEqual(dm.get('bar').value, 'baz');
  });

  test('relatedValueSetDiagnostic', function() {
    var unit = tr.b.Unit.byName.unitlessNumber;
    var a = new tr.v.Histogram('a', unit);
    var b = new tr.v.Histogram('b', unit);
    var c = new tr.v.Histogram('c', unit);
    a.diagnostics.set('rvs', new tr.v.d.RelatedValueSet([b, c]));

    // Don't serialize c just yet.
    var values = new tr.v.ValueSet([a, b]);

    var sourceValues = values.sourceValues;
    assert.lengthOf(sourceValues, 1);
    assert.strictEqual(sourceValues[0], a);

    var values2 = new tr.v.ValueSet();
    values2.addValuesFromDicts(values.valueDicts);

    var a2 = values2.getValuesNamed('a');
    assert.lengthOf(a2, 1);
    a2 = a2[0];
    assert.strictEqual(a2.guid, a.guid);
    assert.instanceOf(a2, tr.v.Histogram);
    assert.notStrictEqual(a2, a);

    var b2 = values2.getValuesNamed('b');
    assert.lengthOf(b2, 1);
    b2 = b2[0];
    assert.strictEqual(b2.guid, b.guid);
    assert.instanceOf(b2, tr.v.Histogram);
    assert.notStrictEqual(b2, b);

    var rvs2 = a2.diagnostics.get('rvs');
    assert.instanceOf(rvs2, tr.v.d.RelatedValueSet);
    assert.lengthOf(rvs2, 2);

    // Assert that b and c are in a2's RelatedValueSet.
    var rvs2vs = [...rvs2];
    var rvs2guids = rvs2vs.map(v => v.guid);
    var b2i = rvs2guids.indexOf(b.guid);
    assert.strictEqual(rvs2vs[b2i], b2);

    var c2i = rvs2guids.indexOf(c.guid);
    assert.strictEqual(rvs2vs[c2i].guid, c.guid);
    assert.instanceOf(rvs2vs[c2i], tr.v.d.ValueRef);

    // Now serialize c and add it to values2.
    // Related value resolution is idempotent.
    // Old values can refer to new values.
    values2.addValuesFromDicts([c.asDict()]);

    var c2 = values2.getValuesNamed('c');
    assert.lengthOf(c2, 1);
    c2 = c2[0];
    assert.strictEqual(c2.guid, c.guid);
    assert.notStrictEqual(c2, c);

    // Now a real c2 Value should be in a2's RelatedValueSet.
    rvs2vs = [...rvs2];
    rvs2guids = rvs2vs.map(v => v.guid);
    b2i = rvs2guids.indexOf(b.guid);
    c2i = rvs2guids.indexOf(c.guid);
    assert.strictEqual(b2, rvs2vs[b2i]);
    assert.strictEqual(c2, rvs2vs[c2i]);
  });

  test('relatedValueMapDiagnostic', function() {
    var unit = tr.b.Unit.byName.unitlessNumber;
    var a = new tr.v.Histogram('a', unit);
    var b = new tr.v.Histogram('b', unit);
    var c = new tr.v.Histogram('c', unit);
    var rvm = new tr.v.d.RelatedValueMap();
    rvm.set('y', b);
    rvm.set('z', c);
    a.diagnostics.set('rvm', rvm);

    // Don't serialize c just yet.
    var values = new tr.v.ValueSet([a, b]);

    var sourceValues = values.sourceValues;
    assert.lengthOf(sourceValues, 1);
    assert.strictEqual(sourceValues[0], a);

    var values2 = new tr.v.ValueSet();
    values2.addValuesFromDicts(values.valueDicts);

    var a2 = values2.getValuesNamed('a');
    assert.lengthOf(a2, 1);
    a2 = a2[0];
    assert.strictEqual(a2.guid, a.guid);
    assert.instanceOf(a2, tr.v.Histogram);
    assert.notStrictEqual(a2, a);

    var b2 = values2.getValuesNamed('b');
    assert.lengthOf(b2, 1);
    b2 = b2[0];
    assert.strictEqual(b2.guid, b.guid);
    assert.instanceOf(b2, tr.v.Histogram);
    assert.notStrictEqual(b2, b);

    var rvm2 = a2.diagnostics.get('rvm');
    assert.instanceOf(rvm2, tr.v.d.RelatedValueMap);
    assert.lengthOf(rvm2, 2);

    // Assert that b and c are in a2's RelatedValueMap.
    // |c| should still be a ValueRef since it wasn't in values2.
    assert.strictEqual(rvm2.get('y'), b2);
    assert.instanceOf(rvm2.get('z'), tr.v.d.ValueRef);

    // Now serialize c and add it to values2.
    // Related value resolution is idempotent.
    // Old values can refer to new values.
    values2.addValuesFromDicts([c.asDict()]);

    var c2 = values2.getValuesNamed('c');
    assert.lengthOf(c2, 1);
    c2 = c2[0];
    assert.strictEqual(c2.guid, c.guid);
    assert.instanceOf(c2, tr.v.Histogram);
    assert.notStrictEqual(c2, c);

    // b2 should still be in a2's RelatedValueMap.
    assert.strictEqual(rvm2.get('y'), b2);

    // Now a real c2 Value should be in a2's RelatedValueMap.
    assert.strictEqual(rvm2.get('z'), c2);
  });

  test('sourceValuesWithSampleDiagnostic', function() {
    var unit = tr.b.Unit.byName.unitlessNumber;
    var aHist = new tr.v.Histogram('a', unit);
    aHist.addSample(1);

    var numeric = new tr.v.Histogram('b', tr.b.Unit.byName.unitlessNumber);
    numeric.addSample(1, {rvs: new tr.v.d.RelatedValueSet([aHist])});

    var values = new tr.v.ValueSet([aHist, numeric]);
    assert.lengthOf(values.sourceValues, 1);
    assert.strictEqual(values.sourceValues[0], numeric);
  });
});
</script>
