1// Copyright (c) 2013 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5'use strict';
6
7base.require('tracing.test_utils');
8base.require('tracing.trace_model.time_to_object_instance_map');
9base.require('tracing.trace_model.object_instance');
10
11base.unittest.testSuite('tracing.trace_model.time_to_object_instance_map',
12                        function() {
13      var createObjectInstance = function(parent, id, category, name,
14                                      creationTs) {
15        return new tracing.trace_model.ObjectInstance(
16            parent, id, category, name, creationTs);
17      };
18
19      test('timeToObjectInstanceMap', function() {
20        var m = new tracing.trace_model.TimeToObjectInstanceMap(
21            createObjectInstance, {}, 7);
22        m.addSnapshot('cat', 'name', 10, 'a1');
23        m.addSnapshot('cat', 'name', 20, 'a2');
24        m.idWasDeleted('cat', 'name', 30);
25        m.addSnapshot('cat', 'name', 40, 'b');
26
27        assertEquals(2, m.instances.length);
28
29        var i0 = m.getInstanceAt(0);
30        var i10 = m.getInstanceAt(10);
31        assertEquals(i10, i0);
32
33        assertNotUndefined(i10);
34        assertEquals(2, i10.snapshots.length);
35        assertEquals('a1', i10.snapshots[0].args);
36        assertEquals('a2', i10.snapshots[1].args);
37
38        assertEquals(30, i10.deletionTs);
39
40        var i15 = m.getInstanceAt(15);
41        assertEquals(i10, i15);
42
43        var i20 = m.getInstanceAt(20);
44        assertEquals(i10, i20);
45
46        var i30 = m.getInstanceAt(30);
47        assertUndefined(i30);
48
49        var i35 = m.getInstanceAt(35);
50        assertUndefined(i35);
51
52        var i40 = m.getInstanceAt(40);
53        assertNotUndefined(i40);
54        assertNotEquals(i10, i40);
55        assertEquals(1, i40.snapshots.length);
56        assertEquals(40, i40.creationTs);
57        assertEquals(Number.MAX_VALUE, i40.deletionTs);
58
59        var i41 = m.getInstanceAt(41);
60        assertEquals(i41, i40);
61      });
62
63      test('timeToObjectInstanceMapsBoundsLogic', function() {
64        var m = new tracing.trace_model.TimeToObjectInstanceMap(
65            createObjectInstance, {}, 7);
66        m.addSnapshot('cat', 'name', 10, 'a1');
67        m.addSnapshot('cat', 'name', 20, 'a2');
68        m.idWasDeleted('cat', 'name', 30);
69        m.addSnapshot('cat', 'name', 40, 'b');
70        m.addSnapshot('cat', 'name', 41, 'b');
71
72        m.instances.forEach(function(i) { i.updateBounds(); });
73
74        var iA = m.getInstanceAt(10);
75        assertEquals(10, iA.bounds.min);
76        assertEquals(30, iA.bounds.max);
77
78        var iB = m.getInstanceAt(40);
79        assertEquals(40, iB.bounds.min);
80        assertEquals(41, iB.bounds.max);
81      });
82
83      test('earlySnapshot', function() {
84        var m = new tracing.trace_model.TimeToObjectInstanceMap(
85            createObjectInstance, {}, 7);
86        var i10 = m.idWasCreated('cat', 'name', 10, 'a1');
87        m.idWasDeleted('cat', 'name', 20);
88
89        assertThrows(function() {
90          m.addSnapshot('cat', 'name', 5, 'a1');
91        });
92        assertEquals(10, i10.creationTs);
93        assertEquals(20, i10.deletionTs);
94      });
95
96      test('earlySnapshotWithImplicitCreate', function() {
97        var m = new tracing.trace_model.TimeToObjectInstanceMap(
98            createObjectInstance, {}, 7);
99        var i10 = m.idWasDeleted('cat', 'name', 20);
100        m.addSnapshot('cat', 'name', 5, 'a1');
101        assertEquals(5, i10.creationTs);
102        assertEquals(20, i10.deletionTs);
103      });
104
105      test('getInstanceBeforeCreationImplicitCreate', function() {
106        var m = new tracing.trace_model.TimeToObjectInstanceMap(
107            createObjectInstance, {}, 7);
108        var i10 = m.idWasCreated('cat', 'name', 10, 'a1');
109        m.idWasDeleted('cat', 'name', 20);
110        assertEquals(undefined, m.getInstanceAt(5));
111      });
112
113      test('getInstanceBeforeCreationImplicitCreateWithSnapshot', function() {
114        var m = new tracing.trace_model.TimeToObjectInstanceMap(
115            createObjectInstance, {}, 7);
116        var s5 = m.addSnapshot('cat', 'name', 5, 'a1');
117        var i10 = m.idWasDeleted('cat', 'name', 20);
118        assertEquals(i10, m.getInstanceAt(5));
119      });
120
121      test('snapshotAfterDeletion', function() {
122        var m = new tracing.trace_model.TimeToObjectInstanceMap(
123            createObjectInstance, {}, 7);
124        var i10 = m.idWasCreated('cat', 'name', 10, 'a1');
125        m.idWasDeleted('cat', 'name', 20);
126
127        var s25 = m.addSnapshot('cat', 'name', 25, 'a1');
128        var i25 = s25.objectInstance;
129
130        assertEquals(10, i10.creationTs);
131        assertEquals(20, i10.deletionTs);
132        assertNotEquals(i10, i25);
133        assertEquals(25, i25.creationTs);
134        assertEquals(Number.MAX_VALUE, i25.deletionTs);
135      });
136    });
137