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

<script>
'use strict';

tr.b.unittest.testSuite(function() { // @suppress longLineCheck
  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>

