<script>
'use strict';
-tvcm.unittest.testSuite(function() { // @suppress longLineCheck
+tv.unittest.testSuite(function() { // @suppress longLineCheck
var AsyncSliceGroup = tracing.trace_model.AsyncSliceGroup;
var AsyncSliceGroupTrack = tracing.tracks.AsyncSliceGroupTrack;
var Process = tracing.trace_model.Process;
var Thread = tracing.trace_model.Thread;
var newAsyncSlice = tracing.test_utils.newAsyncSlice;
+ var newAsyncSliceNamed = tracing.test_utils.newAsyncSliceNamed;
test('filterSubRows', function() {
var model = new tracing.TraceModel();
var p1 = new Process(model, 1);
var t1 = new Thread(p1, 1);
var g = new AsyncSliceGroup(t1);
- g.push(newAsyncSlice(0, 1, t1, t1));
+ var s1 = newAsyncSlice(0, 1, t1, t1);
+ var subs1 = newAsyncSliceNamed("b", 0, 1, t1, t1);
+ s1.subSlices = [subs1];
+ g.push(s1);
g.push(newAsyncSlice(1, 1, t1, t1));
var track = new AsyncSliceGroupTrack(new tracing.TimelineViewport());
track.group = g;
var subRows = track.subRows;
- assertEquals(1, subRows.length);
+ assertEquals(2, subRows.length);
assertEquals(2, subRows[0].length);
- assertEquals(g.slices[0].subSlices[0], subRows[0][0]);
- assertEquals(g.slices[1].subSlices[0], subRows[0][1]);
+ assertEquals(1, subRows[1].length);
+ assertEquals(g.slices[0].subSlices[0], subRows[1][0]);
+ assertUndefined(g.slices[1].subSlices);
});
test('rebuildSubRows_twoOverlappingSlices', function() {
var t1 = new Thread(p1, 1);
var g = new AsyncSliceGroup(t1);
- g.push(newAsyncSlice(0, 1, t1, t1));
- g.push(newAsyncSlice(0, 1.5, t1, t1));
+ var s1 = newAsyncSlice(0, 1, t1, t1);
+ var subs1 = newAsyncSliceNamed("b", 0, 1, t1, t1);
+ s1.subSlices = [subs1];
+ var s2 = newAsyncSlice(0, 1.5, t1, t1);
+ var subs2 = newAsyncSliceNamed("b", 0, 1, t1, t1);
+ s2.subSlices = [subs2];
+ g.push(s1);
+ g.push(s2);
+
g.updateBounds();
var track = new AsyncSliceGroupTrack(new tracing.TimelineViewport());
var subRows = track.subRows;
- assertEquals(2, subRows.length);
+ assertEquals(4, subRows.length);
assertEquals(1, subRows[0].length);
- assertEquals(g.slices[0].subSlices[0], subRows[0][0]);
-
assertEquals(1, subRows[1].length);
- assertEquals(g.slices[1].subSlices[0], subRows[1][0]);
+ assertEquals(1, subRows[2].length);
+ assertEquals(1, subRows[3].length);
+ assertEquals(g.slices[0].subSlices[0], subRows[1][0]);
+ assertEquals(g.slices[1].subSlices[0], subRows[3][0]);
});
test('rebuildSubRows_threePartlyOverlappingSlices', function() {
assertEquals(2, subRows.length);
assertEquals(2, subRows[0].length);
- assertEquals(g.slices[0].subSlices[0], subRows[0][0]);
- assertEquals(g.slices[2].subSlices[0], subRows[0][1]);
-
+ assertEquals(g.slices[0], subRows[0][0]);
+ assertEquals(g.slices[2], subRows[0][1]);
+ assertEquals(g.slices[1], subRows[1][0]);
assertEquals(1, subRows[1].length);
- assertEquals(g.slices[1].subSlices[0], subRows[1][0]);
+ assertUndefined(g.slices[0].subSlices);
+ assertUndefined(g.slices[1].subSlices);
+ assertUndefined(g.slices[2].subSlices);
});
test('rebuildSubRows_threeOverlappingSlices', function() {
var subRows = track.subRows;
assertEquals(2, subRows.length);
assertEquals(2, subRows[0].length);
- assertEquals(g.slices[0].subSlices[0], subRows[0][0]);
- assertEquals(g.slices[2].subSlices[0], subRows[0][1]);
assertEquals(1, subRows[1].length);
- assertEquals(g.slices[1].subSlices[0], subRows[1][0]);
+ assertEquals(g.slices[0], subRows[0][0]);
+ assertEquals(g.slices[1], subRows[1][0]);
+ assertEquals(g.slices[2], subRows[0][1]);
+ });
+
+ // Tests that no slices and their sub slices overlap.
+ test('rebuildSubRows_NonOverlappingSubSlices', function() {
+ var model = new tracing.TraceModel();
+ var p1 = new Process(model, 1);
+ var t1 = new Thread(p1, 1);
+ var g = new AsyncSliceGroup(t1);
+
+ var slice1 = newAsyncSlice(0, 5, t1, t1);
+ var slice1Child = newAsyncSlice(1, 2, t1, t1);
+ slice1.subSlices = [slice1Child];
+ var slice2 = newAsyncSlice(3, 5, t1, t1);
+ var slice3 = newAsyncSlice(5, 4, t1, t1);
+ var slice3Child = newAsyncSlice(6, 2, t1, t1);
+ slice3.subSlices = [slice3Child];
+ g.push(slice1);
+ g.push(slice2);
+ g.push(slice3);
+ g.updateBounds();
+
+ var track = new AsyncSliceGroupTrack(new tracing.TimelineViewport());
+ track.group = g;
+
+ var subRows = track.subRows;
+ // Checks each sub row to see that we don't have any overlapping slices.
+ for (var i = 0; i < subRows.length; i++) {
+ var row = subRows[i];
+ for (var j = 0; j < row.length; j++) {
+ for (var k = j + 1; k < row.length; k++) {
+ assertTrue(row[j].end <= row[k].start);
+ }
+ }
+ }
+ });
+
+ test('rebuildSubRows_NonOverlappingSubSlicesThreeNestedLevels', function() {
+ var model = new tracing.TraceModel();
+ var p1 = new Process(model, 1);
+ var t1 = new Thread(p1, 1);
+ var g = new AsyncSliceGroup(t1);
+
+ var slice1 = newAsyncSlice(0, 4, t1, t1);
+ var slice1Child = newAsyncSlice(1, 2, t1, t1);
+ slice1.subSlices = [slice1Child];
+ var slice2 = newAsyncSlice(2, 7, t1, t1);
+ var slice3 = newAsyncSlice(5, 5, t1, t1);
+ var slice3Child = newAsyncSlice(6, 3, t1, t1);
+ var slice3Child2 = newAsyncSlice(7, 1, t1, t1);
+ slice3.subSlices = [slice3Child];
+ slice3Child.subSlices = [slice3Child2];
+ g.push(slice1);
+ g.push(slice2);
+ g.push(slice3);
+ g.updateBounds();
+
+ var track = new AsyncSliceGroupTrack(new tracing.TimelineViewport());
+ track.group = g;
+
+ var subRows = track.subRows;
+ // Checks each sub row to see that we don't have any overlapping slices.
+ for (var i = 0; i < subRows.length; i++) {
+ var row = subRows[i];
+ for (var j = 0; j < row.length; j++) {
+ for (var k = j + 1; k < row.length; k++) {
+ assertTrue(row[j].end <= row[k].start);
+ }
+ }
+ }
});
+
});
</script>