<!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/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(result[0].guid, 1);

    var result = tquery.filter('b').selection;
    assert.equal(result.length, 1);
    assert.equal(result[0].guid, 2);

    var result = tquery.filter(/^c$/).selection;
    assert.equal(result.length, 1);
    assert.equal(result[0].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(result[0].guid, 4);

    var result = tquery.filter(hasAncestor()).selection;
    assert.equal(result.length, 1);
    assert.equal(result[0].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(result[0].guid, 1);

    var result = tquery.filter(allOf('a1', /1/)).selection;
    assert.equal(result.length, 1);
    assert.equal(result[0].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);
    assert.equal(result[0].guid, 1);
    assert.equal(result[1].guid, 2);

    var result = tquery.filter(anyOf('not there', 'a')).selection;
    assert.equal(result.length, 1);
    assert.equal(result[0].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);
    assert.equal(result[0].guid, 1);
    assert.equal(result[1].guid, 2);
    assert.equal(result[2].guid, 3);

    var result = tquery.filter(isTopLevel('a')).selection;
    assert.equal(result.length, 1);
    assert.equal(result[0].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(result[0].guid, 2);

    var result = tquery.filter(hasDuration(3, Infinity)).selection;
    assert.equal(result.length, 1);
    assert.equal(result[0].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(result[0].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);
    assert.equal(result[0].guid, 2);
    assert.equal(result[1].guid, 3);

    // 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(result[0].guid, 3);
  });
});
</script>
