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

<script>
'use strict';

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

  test('timeToObjectInstanceMap', function() {
    var m = new tv.c.trace_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 tv.c.trace_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 tv.c.trace_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 tv.c.trace_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 tv.c.trace_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 tv.c.trace_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 tv.c.trace_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 tv.c.trace_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>

