<!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="/tracing/core/filter.html">
<link rel="import" href="/tracing/core/test_utils.html">
<link rel="import" href="/tracing/base/unittest.html">

<script>
'use strict';

tr.b.unittest.testSuite(function() {
  var TitleOrCategoryFilter = tr.c.TitleOrCategoryFilter;
  var ExactTitleFilter = tr.c.ExactTitleFilter;
  var FullTextFilter = tr.c.FullTextFilter;

  test('titleOrCategoryFilter', function() {
    assert.throw(function() {
      new TitleOrCategoryFilter();
    });
    assert.throw(function() {
      new TitleOrCategoryFilter('');
    });

    var s0 = tr.c.test_utils.newSliceCategory('cat', 'a', 1, 3);
    assert.isTrue(new TitleOrCategoryFilter('a').matchSlice(s0));
    assert.isTrue(new TitleOrCategoryFilter('cat').matchSlice(s0));
    assert.isTrue(new TitleOrCategoryFilter('at').matchSlice(s0));
    assert.isFalse(new TitleOrCategoryFilter('b').matchSlice(s0));
    assert.isFalse(new TitleOrCategoryFilter('X').matchSlice(s0));

    var s1 = tr.c.test_utils.newSliceCategory('cat', 'abc', 1, 3);
    assert.isTrue(new TitleOrCategoryFilter('abc').matchSlice(s1));
    assert.isTrue(new TitleOrCategoryFilter('Abc').matchSlice(s1));
    assert.isTrue(new TitleOrCategoryFilter('cat').matchSlice(s1));
    assert.isTrue(new TitleOrCategoryFilter('Cat').matchSlice(s1));
    assert.isFalse(new TitleOrCategoryFilter('cat1').matchSlice(s1));
    assert.isFalse(new TitleOrCategoryFilter('X').matchSlice(s1));
  });

  test('exactTitleFilter', function() {
    assert.throw(function() {
      new ExactTitleFilter();
    });
    assert.throw(function() {
      new ExactTitleFilter('');
    });

    var s0 = tr.c.test_utils.newSliceNamed('a', 1, 3);
    assert.isTrue(new ExactTitleFilter('a').matchSlice(s0));
    assert.isFalse(new ExactTitleFilter('b').matchSlice(s0));
    assert.isFalse(new ExactTitleFilter('A').matchSlice(s0));

    var s1 = tr.c.test_utils.newSliceNamed('abc', 1, 3);
    assert.isTrue(new ExactTitleFilter('abc').matchSlice(s1));
    assert.isFalse(new ExactTitleFilter('Abc').matchSlice(s1));
    assert.isFalse(new ExactTitleFilter('bc').matchSlice(s1));
    assert.isFalse(new ExactTitleFilter('a').matchSlice(s1));
  });

  test('fullTextFilter', function() {
    assert.throw(function() {
      new FullTextFilter();
    });
    assert.throw(function() {
      new FullTextFilter('');
    });

    var s0 = tr.c.test_utils.newSliceCategory('cat', 'a', 1, 3);
    s0.args['key'] = 'value';
    s0.args['anotherKey'] = 'anotherValue';
    assert.isTrue(new FullTextFilter('cat').matchSlice(s0));
    assert.isTrue(new FullTextFilter('a').matchSlice(s0));
    assert.isTrue(new FullTextFilter('key').matchSlice(s0));
    assert.isTrue(new FullTextFilter('value').matchSlice(s0));
    assert.isTrue(new FullTextFilter('anotherValue').matchSlice(s0));
    assert.isFalse(new FullTextFilter('not there').matchSlice(s0));

    var s1 = tr.c.test_utils.newSliceCategory('cat', 'a', 1, 3);
    s1.args['key'] = 123;
    assert.isTrue(new FullTextFilter('123').matchSlice(s1));

    var s2 = tr.c.test_utils.newSliceCategory('cat', 'a', 1, 3);
    s2.args['key'] = ['innerValue1', 'innerValue2'];
    assert.isTrue(new FullTextFilter('innerValue1').matchSlice(s2));
    assert.isTrue(new FullTextFilter('innerValue2').matchSlice(s2));

    var s3 = tr.c.test_utils.newSliceCategory('cat', 'a', 1, 3);
    s3.args['key'] = ['one', 'two', 'three'];
    assert.isTrue(new FullTextFilter('two').matchSlice(s3));

    var s4 = tr.c.test_utils.newSliceCategory('cat', 'a', 1, 3);
    s4.args['key'] = undefined;
    assert.isFalse(new FullTextFilter('not there').matchSlice(s4));
  });
});
</script>
