| <!DOCTYPE html> |
| <!-- |
| Copyright 2015 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="/tracing/base/iteration_helpers.html"> |
| <link rel="import" href="/tracing/core/scripting_controller.html"> |
| <link rel="import" href="/tracing/core/test_utils.html"> |
| <link rel="import" href="/tracing/extras/tquery/tquery.html"> |
| <link rel="import" href="/tracing/model/model.html"> |
| |
| <script> |
| 'use strict'; |
| |
| tr.b.unittest.testSuite(function() { |
| function createTestModel(sliceCount) { |
| var slices = []; |
| for (var i = 0; i < sliceCount; i++) |
| slices.push(tr.c.TestUtils.newSliceEx({start: 1, duration: 2})); |
| return createTestModelWithSlices(slices); |
| } |
| |
| function createTestModelWithSlices(slices) { |
| var model = new tr.Model(); |
| var cpu = model.kernel.getOrCreateCpu(1); |
| for (var i = 0; i < slices.length; i++) |
| cpu.slices.push(slices[i]); |
| return model; |
| } |
| |
| function getScriptObject(name) { |
| var typeInfos = tr.c.ScriptingObjectRegistry.getAllRegisteredTypeInfos(); |
| for (var i = 0; i < typeInfos.length; i++) { |
| if (typeInfos[i].metadata.name === name) { |
| return typeInfos[i].constructor; |
| } |
| } |
| } |
| |
| test('tqueryAsyncSelection', function() { |
| var model = createTestModel(3); |
| var tquery = new tr.e.tquery.TQuery(model); |
| |
| return tquery.ready().then(function(selection) { |
| assert.equal(selection.length, 3); |
| }); |
| }); |
| |
| test('tquerySyncSelection', function() { |
| var model = createTestModel(3); |
| var tquery = new tr.e.tquery.TQuery(model); |
| |
| assert.equal(tquery.selection.length, 3); |
| |
| // Selection should get reset when the model changes. |
| var model = createTestModel(5); |
| tquery.onModelChanged(model); |
| assert.equal(tquery.selection.length, 5); |
| }); |
| |
| test('tqueryPassThroughFiltering', function() { |
| var model = new createTestModel(3); |
| var tquery = new tr.e.tquery.TQuery(model); |
| |
| var result = tquery.filter().filter().selection; |
| assert.equal(result.length, 3); |
| }); |
| |
| test('tqueryFilterHasTitle', function() { |
| var hasTitle = getScriptObject('hasTitle'); |
| var model = createTestModelWithSlices([ |
| {guid: 1, title: 'a'}, |
| {guid: 2, title: 'b'}, |
| {guid: 3, title: 'c'} |
| ]); |
| var tquery = new tr.e.tquery.TQuery(model); |
| |
| var result = tquery.filter(hasTitle('a')).selection; |
| assert.equal(result.length, 1); |
| assert.equal(tr.b.getOnlyElement(result).guid, 1); |
| |
| var result = tquery.filter('b').selection; |
| assert.equal(result.length, 1); |
| assert.equal(tr.b.getOnlyElement(result).guid, 2); |
| |
| var result = tquery.filter(/^c$/).selection; |
| assert.equal(result.length, 1); |
| assert.equal(tr.b.getOnlyElement(result).guid, 3); |
| }); |
| |
| test('tqueryFilterHasAncestor', function() { |
| var hasAncestor = getScriptObject('hasAncestor'); |
| var model = createTestModelWithSlices([ |
| {guid: 1, title: 'a'}, |
| {guid: 2, title: 'b', subSlices: [{guid: 4}]}, |
| {guid: 3, title: 'c'} |
| ]); |
| var tquery = new tr.e.tquery.TQuery(model); |
| |
| var result = tquery.filter(hasAncestor('b')).selection; |
| assert.equal(result.length, 1); |
| assert.equal(tr.b.getOnlyElement(result).guid, 4); |
| |
| var result = tquery.filter(hasAncestor()).selection; |
| assert.equal(result.length, 1); |
| assert.equal(tr.b.getOnlyElement(result).guid, 4); |
| |
| var result = tquery.filter(hasAncestor('a')).selection; |
| assert.equal(result.length, 0); |
| }); |
| |
| test('tqueryFilterAllOf', function() { |
| var allOf = getScriptObject('allOf'); |
| var model = createTestModelWithSlices([ |
| {guid: 1, title: 'a1'}, |
| {guid: 2, title: 'b1'}, |
| {guid: 3, title: 'c1'} |
| ]); |
| var tquery = new tr.e.tquery.TQuery(model); |
| |
| var result = tquery.filter(allOf('a1')).selection; |
| assert.equal(result.length, 1); |
| assert.equal(tr.b.getOnlyElement(result).guid, 1); |
| |
| var result = tquery.filter(allOf('a1', /1/)).selection; |
| assert.equal(result.length, 1); |
| assert.equal(tr.b.getOnlyElement(result).guid, 1); |
| |
| var result = tquery.filter(allOf()).selection; |
| assert.equal(result.length, 3); |
| }); |
| |
| test('tqueryFilterAnyOf', function() { |
| var anyOf = getScriptObject('anyOf'); |
| var model = createTestModelWithSlices([ |
| {guid: 1, title: 'a'}, |
| {guid: 2, title: 'b'}, |
| {guid: 3, title: 'c'} |
| ]); |
| var tquery = new tr.e.tquery.TQuery(model); |
| |
| var result = tquery.filter(anyOf('a', 'b')).selection; |
| assert.equal(result.length, 2); |
| var nextGuid = 1; |
| for (var event of result) |
| assert.equal(event.guid, nextGuid++); |
| |
| var result = tquery.filter(anyOf('not there', 'a')).selection; |
| assert.equal(result.length, 1); |
| assert.equal(tr.b.getOnlyElement(result).guid, 1); |
| |
| var result = tquery.filter(anyOf()).selection; |
| assert.equal(result.length, 3); |
| }); |
| |
| test('tqueryFilterIsTopLevel', function() { |
| var isTopLevel = getScriptObject('isTopLevel'); |
| var model = createTestModelWithSlices([ |
| {guid: 1, title: 'a'}, |
| {guid: 2, title: 'b', subSlices: [{guid: 4}]}, |
| {guid: 3, title: 'c'} |
| ]); |
| var tquery = new tr.e.tquery.TQuery(model); |
| |
| var result = tquery.filter(isTopLevel()).selection; |
| assert.equal(result.length, 3); |
| var nextGuid = 1; |
| for (var event of result) |
| assert.equal(event.guid, nextGuid++); |
| |
| var result = tquery.filter(isTopLevel('a')).selection; |
| assert.equal(result.length, 1); |
| assert.equal(tr.b.getOnlyElement(result).guid, 1); |
| }); |
| |
| test('tqueryFilterHasDuration', function() { |
| var hasDuration = getScriptObject('hasDuration'); |
| var model = createTestModelWithSlices([ |
| {guid: 1, title: 'a', duration: 1}, |
| {guid: 2, title: 'b', duration: 2}, |
| {guid: 3, title: 'c', duration: 3}, |
| {guid: 4, title: 'no duration'} |
| ]); |
| var tquery = new tr.e.tquery.TQuery(model); |
| |
| var result = tquery.filter(hasDuration(1.5, 2.5)).selection; |
| assert.equal(result.length, 1); |
| assert.equal(tr.b.getOnlyElement(result).guid, 2); |
| |
| var result = tquery.filter(hasDuration(3, Infinity)).selection; |
| assert.equal(result.length, 1); |
| assert.equal(tr.b.getOnlyElement(result).guid, 3); |
| |
| var result = tquery.filter(hasDuration(-1, 0)).selection; |
| assert.equal(result.length, 0); |
| |
| var result = tquery.filter(hasDuration(function(d) { |
| return d > 2; |
| })).selection; |
| assert.equal(result.length, 1); |
| assert.equal(tr.b.getOnlyElement(result).guid, 3); |
| }); |
| |
| test('tqueryFilterNot', function() { |
| var not = getScriptObject('not'); |
| var model = createTestModelWithSlices([ |
| {guid: 1, title: 'a'}, |
| {guid: 2, title: 'b'}, |
| {guid: 3, title: 'c'} |
| ]); |
| var tquery = new tr.e.tquery.TQuery(model); |
| |
| var result = tquery.filter(not(/a/)).selection; |
| assert.equal(result.length, 2); |
| var nextGuid = 2; |
| for (var event of result) { |
| assert.equal(event.guid, nextGuid++); |
| } |
| |
| // Test a not() without any subexpressions. |
| assert.throws(function() { not(); }); |
| |
| // Test a not() with too many subexpressions. |
| assert.throws(function() { not(/a/, /b/); }); |
| }); |
| |
| test('tqueryFilterNoneOf', function() { |
| var noneOf = getScriptObject('noneOf'); |
| var model = createTestModelWithSlices([ |
| {guid: 1, title: 'a'}, |
| {guid: 2, title: 'b'}, |
| {guid: 3, title: 'c'} |
| ]); |
| var tquery = new tr.e.tquery.TQuery(model); |
| |
| var result = tquery.filter(noneOf(/a/, /b/)).selection; |
| assert.equal(result.length, 1); |
| assert.equal(tr.b.getOnlyElement(result).guid, 3); |
| }); |
| }); |
| </script> |