<!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/unit.html">
<link rel="import" href="/tracing/model/object_instance.html">
<link rel="import" href="/tracing/ui/analysis/generic_object_view.html">
<link rel="import" href="/tracing/ui/base/deep_utils.html">
<link rel="import" href="/tracing/value/numeric.html">

<script>
'use strict';

tr.b.unittest.testSuite(function() {
  test('undefinedValue', function() {
    var view = document.createElement('tr-ui-a-generic-object-view');
    view.object = undefined;
    assert.equal(Polymer.dom(view.$.content).textContent, 'undefined');
  });

  test('nullValue', function() {
    var view = document.createElement('tr-ui-a-generic-object-view');
    view.object = null;
    assert.equal(Polymer.dom(view.$.content).textContent, 'null');
  });

  test('stringValue', function() {
    var view = document.createElement('tr-ui-a-generic-object-view');
    view.object = 'string value';
    assert.equal(Polymer.dom(view.$.content).textContent, '"string value"');
  });

  test('multiLineStringValue', function() {
    var view = document.createElement('tr-ui-a-generic-object-view');
    view.object = 'i am a\n  string value\ni have\n  various indents';
    this.addHTMLOutput(view);
    var c = view.$.content;
  });

  test('multiLineStringValueInsideObject', function() {
    var view = document.createElement('tr-ui-a-generic-object-view');
    view.object = {key: 'i am a\n  string value\ni have\n  various indents',
                   value: 'simple'};
    this.addHTMLOutput(view);
    var c = view.$.content;

  });

  test('jsonObjectStringValue', function() {
    var view = document.createElement('tr-ui-a-generic-object-view');
    view.object = '{"x": 1}';
    assert.equal(view.$.content.children.length, 1);
    assert.equal(view.$.content.children[0].children.length, 4);
  });

  test('jsonArrayStringValue', function() {
    var view = document.createElement('tr-ui-a-generic-object-view');
    view.object = '[1,2,3]';
    assert.equal(view.$.content.children.length, 3);
  });

  test('booleanValue', function() {
    var view = document.createElement('tr-ui-a-generic-object-view');
    view.object = false;
    assert.equal(Polymer.dom(view.$.content).textContent, 'false');
  });

  test('numberValue', function() {
    var view = document.createElement('tr-ui-a-generic-object-view');
    view.object = 3.14159;
    assert.equal(Polymer.dom(view.$.content).textContent, '3.14159');
  });

  test('objectSnapshotValue', function() {
    var view = document.createElement('tr-ui-a-generic-object-view');

    var i10 = new tr.model.ObjectInstance(
        {}, '0x1000', 'cat', 'name', 10);
    var s10 = i10.addSnapshot(10, {foo: 1});

    view.object = s10;
    this.addHTMLOutput(view);
    assert.strictEqual(view.$.content.children[0].dataElement.tagName,
        'TR-UI-A-ANALYSIS-LINK');
  });

  test('objectInstanceValue', function() {
    var view = document.createElement('tr-ui-a-generic-object-view');

    var i10 = new tr.model.ObjectInstance(
        {}, '0x1000', 'cat', 'name', 10);
    var s10 = i10.addSnapshot(10, {foo: 1});

    view.object = i10;
    assert.strictEqual(view.$.content.children[0].dataElement.tagName,
        'TR-UI-A-ANALYSIS-LINK');
  });

  test('instantiate_emptyArrayValue', function() {
    var view = document.createElement('tr-ui-a-generic-object-view');
    view.object = [];
    this.addHTMLOutput(view);
  });

  test('instantiate_twoValueArrayValue', function() {
    var view = document.createElement('tr-ui-a-generic-object-view');
    view.object = [1, 2];
    this.addHTMLOutput(view);
  });

  test('instantiate_twoValueBArrayValue', function() {
    var view = document.createElement('tr-ui-a-generic-object-view');
    view.object = [1, {x: 1}];
    this.addHTMLOutput(view);
  });

  test('instantiate_arrayValue', function() {
    var view = document.createElement('tr-ui-a-generic-object-view');
    view.object = [1, 2, 'three'];
    this.addHTMLOutput(view);
  });

  test('instantiate_arrayWithSimpleObjectValue', function() {
    var view = document.createElement('tr-ui-a-generic-object-view');
    view.object = [{simple: 'object'}];
    this.addHTMLOutput(view);
  });

  test('instantiate_arrayWithComplexObjectValue', function() {
    var view = document.createElement('tr-ui-a-generic-object-view');
    view.object = [{col0: 'object', col1: 0},
                   {col2: 'Object', col3: 1}];
    this.addHTMLOutput(view);
    assert.equal(undefined, tr.b.findDeepElementMatching(
      view.$.content, 'table'));
  });

  test('instantiate_arrayWithDeepObjectValue', function() {
    var view = document.createElement('tr-ui-a-generic-object-view');
    view.object = [{key: {deep: 'object values make isTable() return false'}}];
    this.addHTMLOutput(view);
    assert.equal(undefined, tr.b.findDeepElementMatching(
      view.$.content, 'table'));
  });

  test('jsonTableValue', function() {
    var view = document.createElement('tr-ui-a-generic-object-view');
    view.object = [
      {col0: 'object', col1: 0, col2: 'foo'},
      {col0: 'Object', col1: 1, col2: 42}
    ];
    this.addHTMLOutput(view);

    var table = tr.b.findDeepElementMatching(view.$.content, 'tr-ui-b-table');
    assert.equal('col0', table.tableColumns[0].title);
    assert.equal('col1', table.tableColumns[1].title);
    assert.equal('object', table.tableColumns[0].value(table.tableRows[0]));
    assert.equal('Object', table.tableColumns[0].value(table.tableRows[1]));
    assert.equal(0, table.tableColumns[1].value(table.tableRows[0]));
    assert.equal(1, table.tableColumns[1].value(table.tableRows[1]));
    assert.isDefined(table.tableColumns[0].cmp);
    assert.isDefined(table.tableColumns[1].cmp);
    assert.isUndefined(table.tableColumns[2].cmp);
  });

  test('instantiate_objectValue', function() {
    var view = document.createElement('tr-ui-a-generic-object-view');
    view.object = {
      'entry_one': 'entry_one_value',
      'entry_two': 2,
      'entry_three': [3, 4, 5]
    };
    this.addHTMLOutput(view);
  });

  test('timeDurationValue', function() {
    var view = document.createElement('tr-ui-a-generic-object-view');
    view.object =
        new tr.v.ScalarNumeric(tr.b.Unit.byName.timeDurationInMs, 3);
    assert.isDefined(tr.b.findDeepElementMatching(
      view.$.content, 'tr-v-ui-scalar-span'));
  });

  test('timeStampValue', function() {
    var view = document.createElement('tr-ui-a-generic-object-view');
    view.object = new tr.v.ScalarNumeric(tr.b.Unit.byName.timeStampInMs, 3);
    assert.isDefined(tr.b.findDeepElementMatching(
      view.$.content, 'tr-v-ui-scalar-span'));
  });

  test('scalarValue', function() {
    var view = document.createElement('tr-ui-a-generic-object-view');
    view.object =
        new tr.v.ScalarNumeric(tr.b.Unit.byName.normalizedPercentage, .3);
    var m = tr.b.findDeepElementMatching(
        view.$.content, 'tr-v-ui-scalar-span');
    assert.isDefined(m);
    assert.equal(m.value, .3);
    assert.equal(m.unit, tr.b.Unit.byName.normalizedPercentage);
  });

  test('httpLink', function() {
    var view = document.createElement('tr-ui-a-generic-object-view');
    var url = 'https://google.com/chrome';
    view.object = {a: url};
    this.addHTMLOutput(view);
    var a = tr.b.findDeepElementMatching(view.$.content, 'a');
    assert.isDefined(a);
    assert.strictEqual(url, a.href);
    assert.strictEqual(url, a.textContent);
  });
});
</script>
