<!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.newSlice(1, 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);
  });
});
</script>
