blob: fd24e9b11cf01d0cf1d1220a4f75cfab99f1bf6d [file] [log] [blame]
# Copyright (c) 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.
import datetime
import operator
import unittest
from perf_insights import corpus_query
class FilterTests(unittest.TestCase):
def testEqNumber(self):
f = corpus_query.Filter.FromString("a = 3")
self.assertEquals(f.a.fieldName, 'a')
self.assertEquals(f.op, operator.eq)
self.assertEquals(f.b.constant, 3)
self.assertFalse(f.Eval({'a': 4}))
self.assertTrue(f.Eval({'a': 3}))
def testInTuple(self):
f = corpus_query.Filter.FromString("a IN (1, 2)")
self.assertEquals(f.a.fieldName, 'a');
self.assertEquals(f.op, corpus_query._InOp);
self.assertEquals(f.b.constant, (1, 2));
self.assertFalse(f.Eval({'a': 3}))
self.assertTrue(f.Eval({'a': 1}))
def testInTupleStr(self):
f = corpus_query.Filter.FromString("a IN ('a', 'b')")
self.assertEquals(f.a.fieldName, 'a');
self.assertEquals(f.op, corpus_query._InOp);
self.assertEquals(f.b.constant, ('a', 'b'));
self.assertFalse(f.Eval({'a': 'c'}))
self.assertTrue(f.Eval({'a': 'a'}))
def testTupleInMetdata(self):
f = corpus_query.Filter.FromString("'c' IN tags")
self.assertEquals(f.a.constant, 'c');
self.assertEquals(f.op, corpus_query._InOp);
self.assertEquals(f.b.fieldName, 'tags');
self.assertFalse(f.Eval({'tags': ('a', 'b')}))
self.assertTrue(f.Eval({'tags': ('a', 'b', 'c')}))
def testDateComparison(self):
f = corpus_query.Filter.FromString(
"date >= Date(2015-01-02 3:04:05.678)")
self.assertEquals(f.a.fieldName, 'date');
self.assertEquals(f.op, operator.ge);
self.assertTrue(isinstance(f.b.constant, datetime.datetime));
at = datetime.datetime(2015, 1, 2, 3, 4, 5, 678000)
self.assertEquals(f.b.constant, at)
before = datetime.datetime(2014, 12, 1, 2, 3, 4, 0)
self.assertFalse(f.Eval({'date': before}))
after = datetime.datetime(2015, 2, 3, 4, 5, 6, 789000)
self.assertTrue(f.Eval({'date': at}))
self.assertTrue(f.Eval({'date': after}))
class CorpusQueryTests(unittest.TestCase):
def testSimple(self):
q = corpus_query.CorpusQuery.FromString('')
self.assertTrue(q.Eval({'a': 1}))
def testSimpleOp(self):
q = corpus_query.CorpusQuery.FromString('a = 3')
self.assertFalse(q.Eval({'a': 1}))
self.assertTrue(q.Eval({'a': 3}))
def testMultipleFiltersOp(self):
q = corpus_query.CorpusQuery.FromString(
'a = 3 AND b = 4')
self.assertFalse(q.Eval({'a': 1, 'b': 1}))
self.assertFalse(q.Eval({'a': 3, 'b': 1}))
self.assertFalse(q.Eval({'a': 1, 'b': 4}))
self.assertTrue(q.Eval({'a': 3, 'b': 4}))
def testDateRange(self):
f = corpus_query.CorpusQuery.FromString(
'date >= Date(2015-01-01 00:00:00.00) AND ' +
'date < Date(2015-02-01 00:00:00.00)')
just_before_start = datetime.datetime(2014, 12, 31, 23, 59, 59, 99999)
start = datetime.datetime(2015, 1, 1, 0, 0, 0, 0)
end = datetime.datetime(2015, 2, 1, 0, 0, 0, 0)
just_before_end = datetime.datetime(2015, 1, 31, 23, 59, 59, 999999)
middle = datetime.datetime(2015, 1, 15, 0, 0, 0, 0)
way_after = datetime.datetime(2015, 3, 1, 0, 0, 0, 0)
self.assertFalse(f.Eval({'date': just_before_start}))
self.assertTrue(f.Eval({'date': start}))
self.assertTrue(f.Eval({'date': middle}))
self.assertTrue(f.Eval({'date': just_before_end}))
self.assertFalse(f.Eval({'date': end}))
self.assertFalse(f.Eval({'date': way_after}))