<!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/core/test_utils.html">
<link rel="import" href="/tracing/model/object_collection.html">

<script>
'use strict';

tr.b.unittest.testSuite(function() {
  var TestObjectInstance = function(parent, id, category, name, creationTs) {
    tr.model.ObjectInstance.call(
        this, parent, id, category, name, creationTs);
  };

  TestObjectInstance.prototype = {
    __proto__: tr.model.ObjectInstance.prototype
  };

  test('objectInstanceSubtype', function() {
    // Register that TestObjects are bound to TestObjectInstance.
    tr.model.ObjectInstance.register(
        TestObjectInstance,
        {typeName: 'TestObject'});

    try {
      var collection = new tr.model.ObjectCollection({ });
      collection.idWasCreated(
          '0x1000', 'tr.e.cc', 'Frame', 10);
      collection.idWasDeleted(
          '0x1000', 'tr.e.cc', 'Frame', 15);
      collection.idWasCreated(
          '0x1000', 'skia', 'TestObject', 20);
      collection.idWasDeleted(
          '0x1000', 'skia', 'TestObject', 25);

      var testFrame = collection.getObjectInstanceAt('0x1000', 10);
      assert.instanceOf(testFrame, tr.model.ObjectInstance);
      assert.notInstanceOf(testFrame, TestObjectInstance);

      var testObject = collection.getObjectInstanceAt('0x1000', 20);
      assert.instanceOf(testObject, tr.model.ObjectInstance);
      assert.instanceOf(testObject, TestObjectInstance);
    } finally {
      tr.model.ObjectInstance.unregister(TestObjectInstance);
    }
  });

  test('twoSnapshots', function() {
    var collection = new tr.model.ObjectCollection({});
    collection.idWasCreated(
        '0x1000', 'cat', 'Frame', 10);
    collection.addSnapshot(
        '0x1000', 'cat', 'Frame', 10, {foo: 1});
    collection.addSnapshot(
        '0x1000', 'cat', 'Frame', 20, {foo: 2});

    collection.updateBounds();
    assert.equal(collection.bounds.min, 10);
    assert.equal(collection.bounds.max, 20);

    var s0 = collection.getSnapshotAt('0x1000', 1);
    assert.isUndefined(s0);

    var s1 = collection.getSnapshotAt('0x1000', 10);
    assert.equal(s1.args.foo, 1);

    var s2 = collection.getSnapshotAt('0x1000', 15);
    assert.equal(s2.args.foo, 1);
    assert.equal(s1, s2);

    var s3 = collection.getSnapshotAt('0x1000', 20);
    assert.equal(s3.args.foo, 2);
    assert.equal(s1.object, s3.object);

    var s4 = collection.getSnapshotAt('0x1000', 25);
    assert.equal(s4, s3);
  });

  test('twoObjectsSharingOneID', function() {
    var collection = new tr.model.ObjectCollection({});
    collection.idWasCreated(
        '0x1000', 'tr.e.cc', 'Frame', 10);
    collection.idWasDeleted(
        '0x1000', 'tr.e.cc', 'Frame', 15);
    collection.idWasCreated(
        '0x1000', 'skia', 'Picture', 20);
    collection.idWasDeleted(
        '0x1000', 'skia', 'Picture', 25);

    var frame = collection.getObjectInstanceAt('0x1000', 10);
    assert.equal(frame.category, 'tr.e.cc');
    assert.equal(frame.name, 'Frame');

    var picture = collection.getObjectInstanceAt('0x1000', 20);
    assert.equal(picture.category, 'skia');
    assert.equal(picture.name, 'Picture');

    var typeNames = tr.b.dictionaryKeys(collection.getAllInstancesByTypeName());
    typeNames.sort();
    assert.deepEqual(
        ['Frame', 'Picture'],
        typeNames);
    assert.deepEqual(
        [frame],
        collection.getAllInstancesByTypeName()['Frame']);
    assert.deepEqual(
        [picture],
        collection.getAllInstancesByTypeName()['Picture']);
  });

  test('createSnapDelete', function() {
    var collection = new tr.model.ObjectCollection({});
    collection.idWasCreated(
        '0x1000', 'cat', 'Frame', 10);
    collection.addSnapshot(
        '0x1000', 'cat', 'Frame', 10, {foo: 1});
    collection.idWasDeleted(
        '0x1000', 'cat', 'Frame', 15);

    collection.updateBounds();
    assert.equal(collection.bounds.min, 10);
    assert.equal(collection.bounds.max, 15);

    var s10 = collection.getSnapshotAt('0x1000', 10);
    var i10 = s10.objectInstance;
    assert.equal(i10.creationTs, 10);
    assert.equal(i10.deletionTs, 15);
  });

  test('boundsOnUndeletedObject', function() {
    var collection = new tr.model.ObjectCollection({});
    collection.idWasCreated(
        '0x1000', 'cat', 'Frame', 10);
    collection.addSnapshot(
        '0x1000', 'cat', 'Frame', 15, {foo: 1});

    collection.updateBounds();
    assert.equal(10, collection.bounds.min);
    assert.equal(15, collection.bounds.max);
  });

  test('snapshotWithCustomBaseTypeThenDelete', function() {
    var collection = new tr.model.ObjectCollection({});
    var s10 = collection.addSnapshot(
        '0x1000', 'cat', 'cc::PictureLayerImpl', 10, {}, 'cc::LayerImpl');
    collection.idWasDeleted(
        '0x1000', 'cat', 'cc::LayerImpl', 15);
    collection.updateBounds();
    assert.equal(10, collection.bounds.min);
    assert.equal(15, collection.bounds.max);
    assert.equal(s10.objectInstance.name, 'cc::PictureLayerImpl');
    assert.equal(s10.objectInstance.baseTypeName, 'cc::LayerImpl');
  });

  test('newWithSnapshotThatChangesBaseType', function() {
    var collection = new tr.model.ObjectCollection({});
    var i10 = collection.idWasCreated(
        '0x1000', 'cat', 'cc::LayerImpl', 10);
    var s15 = collection.addSnapshot(
        '0x1000', 'cat', 'cc::PictureLayerImpl', 15, {}, 'cc::LayerImpl');
    collection.updateBounds();
    assert.equal(10, collection.bounds.min);
    assert.equal(15, collection.bounds.max);
    assert.equal(s15.objectInstance, i10);
    assert.equal(i10.name, 'cc::PictureLayerImpl');
    assert.equal(i10.baseTypeName, 'cc::LayerImpl');
  });

  test('deleteThenSnapshotWithCustomBase', function() {
    var collection = new tr.model.ObjectCollection({});
    collection.idWasDeleted(
        '0x1000', 'cat', 'cc::LayerImpl', 10);
    var s15 = collection.addSnapshot(
        '0x1000', 'cat', 'cc::PictureLayerImpl', 15, {}, 'cc::LayerImpl');
    collection.updateBounds();
    assert.equal(10, collection.bounds.min);
    assert.equal(15, collection.bounds.max);
    assert.equal(s15.objectInstance.name, 'cc::PictureLayerImpl');
  });

  test('autoDelete', function() {
    var collection = new tr.model.ObjectCollection({});
    collection.idWasCreated(
        '0x1000', 'cat', 'Frame', 10);
    collection.addSnapshot(
        '0x1000', 'cat', 'Frame', 10, {foo: 1});
    collection.autoDeleteObjects(15);

    var s10 = collection.getSnapshotAt('0x1000', 10);
    var i10 = s10.objectInstance;
    assert.equal(15, i10.deletionTs);
  });
});
</script>

