Rename test files to test_*.py
[joel/kofoto.git] / src / test / test_searching.py
1 #! /usr/bin/env python
2
3 import os
4 import sys
5 import unittest
6
7 if __name__ == "__main__":
8     cwd = os.getcwd()
9     libdir = unicode(os.path.realpath(
10         os.path.join(os.path.dirname(sys.argv[0]), "..", "packages")))
11     os.chdir(libdir)
12     sys.path.insert(0, libdir)
13 from kofoto.shelf import *
14 from kofoto.search import *
15
16 PICDIR = unicode(os.path.realpath(
17     os.path.join("..", "reference_pictures", "working")))
18
19 ######################################################################
20
21 db = "shelf.tmp"
22 codeset = "latin1"
23
24 def removeTmpDb():
25     for x in [db, db + "-journal"]:
26         if os.path.exists(x):
27             os.unlink(x)
28
29 from test_shelf import TestShelfFixture
30
31 class TestSearch(TestShelfFixture):
32     def setUp(self):
33         TestShelfFixture.setUp(self)
34         self.images = list(self.shelf.getAllImages())
35         cat_a = self.shelf.getCategoryByTag(u"a")
36         cat_b = self.shelf.getCategoryByTag(u"b")
37         cat_c = self.shelf.getCategoryByTag(u"c")
38         cat_d = self.shelf.getCategoryByTag(u"d")
39         self.images[0].addCategory(cat_a)
40         self.images[0].addCategory(cat_b)
41         self.images[1].addCategory(cat_c)
42         self.images[0].setAttribute(u"foo", u"abc")
43         self.images[0].setAttribute(u"bar", u"17")
44         self.images[1].setAttribute(u"foo", u"xyz")
45         self.images[2].setAttribute(u"fie", u"fum")
46
47     def tearDown(self):
48         TestShelfFixture.tearDown(self)
49
50     def test_search(self):
51         tests = [
52             (u"a", [self.images[0], self.images[1]]),
53             (u"b", [self.images[0]]),
54             (u"c", [self.images[1]]),
55             (u"d", []),
56             (u"(((b)))", [self.images[0]]),
57             (u'@foo >= "b\'ar"', [self.images[1]]),
58             (u"a and b", [self.images[0]]),
59             (u'a and @foo = "abc"', [self.images[0]]),
60             (u'a and @foo = xyz', [self.images[1]]),
61             (u'@foo = "abc" and @bar = 17', [self.images[0]]),
62             (u'a and b and @bar = "17" and @foo = abc', [self.images[0]]),
63             (u"not a and c", []),
64             (u"not exactly a and c", [self.images[1]]),
65             (u"not (a and b) and a", [self.images[1]]),
66             (u"not a and not b and @fie=fum", [self.images[2]]),
67             (u"a and b or c", [self.images[0], self.images[1]]),
68             (u"b or c and d", [self.images[0]]),
69             (u"a or b or c or d", [self.images[0], self.images[1]]),
70             (ur' ((a and not b) or @gazonk != "hej \"ju\"") and c ', [self.images[1]]),
71             (u"/alpha and a", [self.images[0], self.images[1]]),
72             (u"/epsilon", []),
73             (u"/zeta", [self.images[0], self.images[1]]),
74             ]
75         parser = Parser(self.shelf)
76         for expression, expectedResult in tests:
77             parseTree = parser.parse(expression)
78             result = sorted(
79                 self.shelf.search(parseTree), key=lambda x: x.getId())
80             assert result == expectedResult, (expression, expectedResult, result)
81
82     def test_parseErrors(self):
83         tests = [
84             (u"+", BadTokenError),
85             (u":a and +", BadTokenError),
86             (u'"', UnterminatedStringError),
87             (ur'"\"\\\"', UnterminatedStringError),
88             ]
89         parser = Parser(self.shelf)
90         for expression, expectedException in tests:
91             try:
92                 parser.parse(expression)
93             except expectedException:
94                 pass
95             except Exception, e:
96                 assert False, (expression, expectedException, e)
97
98 ######################################################################
99
100 if __name__ == "__main__":
101     removeTmpDb()
102     unittest.main()