| <!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="/base/task.html"> |
| <link rel="import" href="/core/test_utils.html"> |
| <link rel="import" href="/core/timeline_view.html"> |
| <link rel="import" href="/model/model.html"> |
| |
| <script> |
| 'use strict'; |
| |
| tr.b.unittest.testSuite(function() { |
| var newSliceNamed = tr.c.test_utils.newSliceNamed; |
| var Task = tr.b.Task; |
| |
| var createFullyPopulatedModel = function(opt_withError, opt_withMetadata) { |
| var withError = opt_withError !== undefined ? opt_withError : true; |
| var withMetadata = opt_withMetadata !== undefined ? |
| opt_withMetadata : true; |
| |
| var num_tests = 50; |
| var testIndex = 0; |
| var startTime = 0; |
| |
| var model = new tr.Model(); |
| for (testIndex = 0; testIndex < num_tests; ++testIndex) { |
| var process = model.getOrCreateProcess(10000 + testIndex); |
| if (testIndex % 2 == 0) { |
| var thread = process.getOrCreateThread('Thread Name Here'); |
| thread.sliceGroup.pushSlice(new tr.model.Slice( |
| 'foo', 'a', 0, startTime, {}, 1)); |
| thread.sliceGroup.pushSlice(new tr.model.Slice( |
| 'bar', 'b', 0, startTime + 23, {}, 10)); |
| } else { |
| var thread = process.getOrCreateThread('Name'); |
| thread.sliceGroup.pushSlice(new tr.model.Slice( |
| 'foo', 'a', 0, startTime + 4, {}, 11)); |
| thread.sliceGroup.pushSlice(new tr.model.Slice( |
| 'bar', 'b', 0, startTime + 22, {}, 14)); |
| } |
| } |
| var p1000 = model.getOrCreateProcess(1000); |
| var objects = p1000.objects; |
| objects.idWasCreated('0x1000', 'tr.e.cc', 'LayerTreeHostImpl', 10); |
| objects.addSnapshot('0x1000', 'tr.e.cc', 'LayerTreeHostImpl', 10, |
| 'snapshot-1'); |
| objects.addSnapshot('0x1000', 'tr.e.cc', 'LayerTreeHostImpl', 25, |
| 'snapshot-2'); |
| objects.addSnapshot('0x1000', 'tr.e.cc', 'LayerTreeHostImpl', 40, |
| 'snapshot-3'); |
| objects.idWasDeleted('0x1000', 'tr.e.cc', 'LayerTreeHostImpl', 45); |
| model.updateCategories_(); |
| |
| // Add a known problematic piece of data to test the import errors UI. |
| model.importWarning({ |
| type: 'test_error', |
| message: 'Synthetic Import Error' |
| }); |
| model.updateBounds(); |
| |
| // Add data with metadata information stored |
| model.metadata.push({name: 'a', value: 'testA'}); |
| model.metadata.push({name: 'b', value: 'testB'}); |
| model.metadata.push({name: 'c', value: 'testC'}); |
| |
| return model; |
| }; |
| |
| var visibleTracks = function(trackButtons) { |
| return trackButtons.reduce(function(numVisible, button) { |
| var style = button.parentElement.style; |
| var visible = (style.display.indexOf('none') === -1); |
| return visible ? numVisible + 1 : numVisible; |
| }, 0); |
| }; |
| |
| var modelsEquivalent = function(lhs, rhs) { |
| if (lhs.length !== rhs.length) |
| return false; |
| return lhs.every(function(lhsItem, index) { |
| var rhsItem = rhs[index]; |
| return rhsItem.regexpText === lhsItem.regexpText && |
| rhsItem.isOn === lhsItem.isOn; |
| }); |
| }; |
| |
| test('instantiate', function() { |
| var model11 = createFullyPopulatedModel(true, true); |
| |
| var view = new tr.c.TimelineView(); |
| view.style.height = '400px'; |
| view.style.border = '1px solid black'; |
| view.model = model11; |
| this.addHTMLOutput(view); |
| }); |
| |
| test('changeModelToSomethingDifferent', function() { |
| var model00 = createFullyPopulatedModel(false, false); |
| var model11 = createFullyPopulatedModel(true, true); |
| |
| var view = new tr.c.TimelineView(); |
| view.style.height = '400px'; |
| view.model = model00; |
| view.model = undefined; |
| view.model = model11; |
| view.model = model00; |
| }); |
| |
| test('setModelToSameThingAgain', function() { |
| var model = createFullyPopulatedModel(false, false); |
| |
| // Create a view with am model. |
| var view = new tr.c.TimelineView(); |
| view.style.height = '400px'; |
| view.model = model; |
| var sc = view.selectionController; |
| |
| // Mutate the model and update the view. |
| var t123 = model.getOrCreateProcess(123).getOrCreateThread(123); |
| t123.sliceGroup.pushSlice(newSliceNamed('somethingUnusual', 0, 5)); |
| view.model = model; |
| |
| // Verify that the new bits of the model show up in the view. |
| var selection = new tr.c.Selection(); |
| var filter = new tr.c.TitleOrCategoryFilter('somethingUnusual'); |
| var filterTask = sc.addAllEventsMatchingFilterToSelectionAsTask( |
| filter, selection); |
| Task.RunSynchronously(filterTask); |
| assert.equal(selection.length, 1); |
| }); |
| }); |
| </script> |
| |