<!DOCTYPE html>
<!--
Copyright (c) 2013 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/utils.html">
<link rel="import" href="/tracing/value/numeric.html">
<link rel="import" href="/tracing/value/unit.html">
<link rel="import" href="/tracing/value/value.html">

<script>
'use strict';

tr.b.unittest.testSuite(function() {
  test('numericValueBasic', function() {
    var canonicalUrl = 'my_test.json';
    var n = new tr.v.ScalarNumeric(tr.v.Unit.byName.sizeInBytes, 314);
    var v = new tr.v.NumericValue(canonicalUrl, 'MyNumeric', n);
    var d = v.asDict();

    var v2 = tr.v.Value.fromDict(d);
    assert.instanceOf(v2, tr.v.NumericValue);
    assert.equal(v.name, v2.name);
    assert.equal(v.numeric.value, v2.numeric.value);
    assert.equal(v.canonicalUrl, v2.canonicalUrl);
  });

  test('dictValueBasic', function() {
    var canonicalUrl = 'my_test.json';
    var v = new tr.v.DictValue(canonicalUrl, 'MyDict', {my_key: 'my_value'});
    var d = v.asDict();

    var v2 = tr.v.Value.fromDict(d);
    assert.instanceOf(v2, tr.v.DictValue);
    assert.equal(v.groupingKeys.value_name, v2.groupingKeys.value_name);
    assert.deepEqual(v.value, v2.value);
  });

  test('failureValueBasic', function() {
    var canonicalUrl = 'my_test.json';
    var v = new tr.v.FailureValue(
      canonicalUrl, 'MyFailure',
      {description: 'Description', stack: tr.b.stackTraceAsString()});
    var d = v.asDict();

    var v2 = tr.v.Value.fromDict(d);
    assert.instanceOf(v2, tr.v.FailureValue);
    assert.equal(v.name, v2.name);
    assert.equal(v.description, v2.description);
    assert.equal(v.stack, v2.stack);
    assert.equal(v.diagnostics.canonical_url, v2.diagnostics.canonical_url);
  });

  test('skipValueBasic', function() {
    var canonicalUrl = 'my_test.json';
    var v = new tr.v.SkipValue(canonicalUrl, 'MySkip',
                               {description: 'WhySkipped'});
    var d = v.asDict();

    var v2 = tr.v.Value.fromDict(d);
    assert.instanceOf(v2, tr.v.SkipValue);
    assert.equal(v.groupingKeys.value_name, v2.groupingKeys.value_name);
    assert.equal(v.description, v2.description);
  });

  test('addGroupingKey', function() {
    var canonicalUrl = 'my_test.json';
    var n = new tr.v.ScalarNumeric(tr.v.Unit.byName.sizeInBytes, 314);
    var v = new tr.v.NumericValue(canonicalUrl, 'MyScalar', n);

    v.addGroupingKey('foo', 'bar');
    assert.equal(v.groupingKeys.foo, 'bar');
  });

  test('addDuplicateGroupingKeyThrows', function() {
    var canonicalUrl = 'my_test.json';
    var n = new tr.v.ScalarNumeric(tr.v.Unit.byName.sizeInBytes, 314);
    var v = new tr.v.NumericValue(canonicalUrl, 'MyScalar', n);

    assert.throws(function() { v.addGroupingKey('name', 'bar'); });
  });
});

</script>
