<!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/time_to_object_instance_map.html">
<link rel="import" href="/model/object_instance.html">

<script>
'use strict';

tr.b.unittest.testSuite(function() {
  var createObjectInstance = function(parent, id, category, name, creationTs) {
    return new tr.model.ObjectInstance(
        parent, id, category, name, creationTs);
  };

  test('timeToObjectInstanceMap', function() {
    var m = new tr.model.TimeToObjectInstanceMap(
        createObjectInstance, {}, 7);
    m.addSnapshot('cat', 'name', 10, 'a1');
    m.addSnapshot('cat', 'name', 20, 'a2');
    m.idWasDeleted('cat', 'name', 30);
    m.addSnapshot('cat', 'name', 40, 'b');

    assert.equal(m.instances.length, 2);

    var i0 = m.getInstanceAt(0);
    var i10 = m.getInstanceAt(10);
    assert.equal(i0, i10);

    assert.isDefined(i10);
    assert.equal(i10.snapshots.length, 2);
    assert.equal(i10.snapshots[0].args, 'a1');
    assert.equal(i10.snapshots[1].args, 'a2');

    assert.equal(i10.deletionTs, 30);

    var i15 = m.getInstanceAt(15);
    assert.equal(i15, i10);

    var i20 = m.getInstanceAt(20);
    assert.equal(i20, i10);

    var i30 = m.getInstanceAt(30);
    assert.isUndefined(i30);

    var i35 = m.getInstanceAt(35);
    assert.isUndefined(i35);

    var i40 = m.getInstanceAt(40);
    assert.isDefined(i40);
    assert.notEqual(i40, i10);
    assert.equal(i40.snapshots.length, 1);
    assert.equal(i40.creationTs, 40);
    assert.equal(i40.deletionTs, Number.MAX_VALUE);

    var i41 = m.getInstanceAt(41);
    assert.equal(i40, i41);
  });

  test('timeToObjectInstanceMapsBoundsLogic', function() {
    var m = new tr.model.TimeToObjectInstanceMap(
        createObjectInstance, {}, 7);
    m.addSnapshot('cat', 'name', 10, 'a1');
    m.addSnapshot('cat', 'name', 20, 'a2');
    m.idWasDeleted('cat', 'name', 30);
    m.addSnapshot('cat', 'name', 40, 'b');
    m.addSnapshot('cat', 'name', 41, 'b');

    m.instances.forEach(function(i) { i.updateBounds(); });

    var iA = m.getInstanceAt(10);
    assert.equal(iA.bounds.min, 10);
    assert.equal(iA.bounds.max, 30);

    var iB = m.getInstanceAt(40);
    assert.equal(iB.bounds.min, 40);
    assert.equal(iB.bounds.max, 41);
  });

  test('earlySnapshot', function() {
    var m = new tr.model.TimeToObjectInstanceMap(
        createObjectInstance, {}, 7);
    var i10 = m.idWasCreated('cat', 'name', 10, 'a1');
    m.idWasDeleted('cat', 'name', 20);

    assert.throws(function() {
      m.addSnapshot('cat', 'name', 5, 'a1');
    });
    assert.equal(i10.creationTs, 10);
    assert.equal(i10.deletionTs, 20);
  });

  test('earlySnapshotWithImplicitCreate', function() {
    var m = new tr.model.TimeToObjectInstanceMap(
        createObjectInstance, {}, 7);
    var i10 = m.idWasDeleted('cat', 'name', 20);
    m.addSnapshot('cat', 'name', 5, 'a1');
    assert.equal(i10.creationTs, 5);
    assert.equal(i10.deletionTs, 20);
  });

  test('getInstanceBeforeCreationImplicitCreate', function() {
    var m = new tr.model.TimeToObjectInstanceMap(
        createObjectInstance, {}, 7);
    var i10 = m.idWasCreated('cat', 'name', 10, 'a1');
    m.idWasDeleted('cat', 'name', 20);
    assert.isUndefined(m.getInstanceAt(5));
  });

  test('getInstanceBeforeCreationImplicitCreateWithSnapshot', function() {
    var m = new tr.model.TimeToObjectInstanceMap(
        createObjectInstance, {}, 7);
    var s5 = m.addSnapshot('cat', 'name', 5, 'a1');
    var i10 = m.idWasDeleted('cat', 'name', 20);
    assert.equal(m.getInstanceAt(5), i10);
  });

  test('successiveDeletions', function() {
    var m = new tr.model.TimeToObjectInstanceMap(
        createObjectInstance, {}, 7);
    var i20 = m.idWasDeleted('cat', 'name', 20);
    var i30 = m.idWasDeleted('cat', 'name', 30);
    var i40 = m.idWasDeleted('cat', 'name', 40);
    assert.equal(i20.creationTs, 20);
    assert.isFalse(i20.creationTsWasExplicit);
    assert.equal(i20.deletionTs, 20);
    assert.isTrue(i20.deletionTsWasExplicit);

    assert.equal(i30.creationTs, 30);
    assert.isFalse(i30.creationTsWasExplicit);
    assert.equal(i30.deletionTs, 30);
    assert.isTrue(i30.deletionTsWasExplicit);


    assert.equal(i40.creationTs, 40);
    assert.isFalse(i40.creationTsWasExplicit);
    assert.equal(i40.deletionTs, 40);
    assert.isTrue(i40.deletionTsWasExplicit);
  });

  test('snapshotAfterDeletion', function() {
    var m = new tr.model.TimeToObjectInstanceMap(
        createObjectInstance, {}, 7);
    var i10 = m.idWasCreated('cat', 'name', 10, 'a1');
    m.idWasDeleted('cat', 'name', 20);

    var s25 = m.addSnapshot('cat', 'name', 25, 'a1');
    var i25 = s25.objectInstance;

    assert.equal(i10.creationTs, 10);
    assert.equal(i10.deletionTs, 20);
    assert.notEqual(i25, i10);
    assert.equal(i25.creationTs, 25);
    assert.equal(i25.deletionTs, Number.MAX_VALUE);
  });
});
</script>

