class TestQuery(unittest.TestCase): def setUp(self): self.discodb = DiscoDB( (('alice', ('blue',)), ('bob', ('red',)), ('carol', ('blue', 'red'))), ) def q(self, s): return self.discodb.query(Q.parse(s)) def test_empty(self): self.assertEqual(list(self.q('')), []) self.assertEqual(len(self.q('')), 0) def test_get_len(self): self.assertEqual(len(self.discodb.get('alice')), 1) self.assertEquals(len(self.discodb.get('bob')), 1) self.assertEquals(len(self.discodb.get('carol')), 2) def test_query_len(self): self.assertEquals(len(self.q('alice')), 1) self.assertEquals(len(self.q('bob')), 1) self.assertEquals(len(self.q('carol')), 2) self.assertEquals(len(self.q('alice & bob')), 0) self.assertEquals(len(self.q('alice | bob')), 2) self.assertEquals(len(self.q('alice & carol')), 1) self.assertEquals(len(self.q('alice | carol')), 2) self.assertEquals(len(self.q('alice|bob|carol')), 2) self.assertEquals(len(self.q('alice&bob&carol')), 0) def test_query_len_doesnt_advance_iter(self): # check that calling len() doesn't advance the iterator res = self.q('alice') self.assertEquals(len(res), 1) self.assertEquals(len(res), 1) def test_query_results(self): self.assertEquals(set(self.q('alice')), set(['blue'])) self.assertEquals(set(self.q('bob')), set(['red'])) self.assertEquals(set(self.q('carol')), set(['blue', 'red'])) self.assertEquals(set(self.q('alice & bob')), set()) self.assertEquals(set(self.q('alice | bob')), set(['blue', 'red'])) self.assertEquals(set(self.q('alice & carol')), set(['blue'])) self.assertEquals(set(self.q('alice | carol')), set(['blue', 'red'])) self.assertEquals(set(self.q('alice|bob|carol')), set(['blue', 'red'])) self.assertEquals(set(self.q('alice&bob&carol')), set()) def test_query_len_nonkey(self): self.assertEquals(len(self.q('nonkey')), 0) self.assertEquals(len(self.q('~nonkey')), 2) self.assertEquals(len(self.q('nonkey & alice')), 0) self.assertEquals(len(self.q('nonkey | alice')), 1) def test_query_results_nonkey(self): self.assertEquals(set(self.q('nonkey')), set()) self.assertEquals(set(self.q('~nonkey')), set(['blue', 'red'])) self.assertEquals(set(self.q('nonkey & alice')), set()) self.assertEquals(set(self.q('nonkey | alice')), set(['blue']))
class TestMappingProtocol(unittest.TestCase): numkeys = 1000 def setUp(self): self.discodb = DiscoDB(k_vs_iter(self.numkeys)) def test_contains(self): assert "0" in self.discodb assert "key" not in self.discodb def test_length(self): self.assertEquals(len(self.discodb), self.numkeys) def test_get(self): len(list(self.discodb.get('0'))) self.assertEquals(self.discodb.get('X'), None) self.assertEquals(self.discodb.get('X', 'Y'), 'Y') def test_getitem(self): for x in xrange(self.numkeys): try: list(self.discodb[str(x)]) except KeyError: self.assertEquals(x, self.numkeys) def test_iter(self): self.assertEquals(list(self.discodb), list(self.discodb.keys())) def test_items(self): for key, values in self.discodb.items(): key, list(values) def test_keys(self): len(list(self.discodb.keys())) def test_values(self): len(list(self.discodb.values())) def test_unique_values(self): len(list(self.discodb.unique_values())) def test_peek(self): self.assertNotEquals(self.discodb.peek('0'), None) self.assertEquals(self.discodb.peek('X'), None) self.assert_(int(self.discodb.peek('0', '1')) >= 0) def test_query(self): q = Q.parse('5 & 10 & (15 | 30)') list(self.discodb.query(q)) def test_str(self): repr(self.discodb) str(self.discodb)