Skip to content

Commit 456028d

Browse files
committed
Add combinable test
1 parent ebbbb4c commit 456028d

File tree

1 file changed

+76
-0
lines changed

1 file changed

+76
-0
lines changed
Lines changed: 76 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,76 @@
1+
from django.test import SimpleTestCase
2+
3+
from django_mongodb_backend.expressions.search import (
4+
CombinedSearchExpression,
5+
CompoundExpression,
6+
SearchEquals,
7+
)
8+
9+
10+
class CombinedSearchExpressionResolutionTest(SimpleTestCase):
11+
def test_combined_expression_and_or_not_resolution(self):
12+
A = SearchEquals(path="headline", value="A")
13+
B = SearchEquals(path="headline", value="B")
14+
C = SearchEquals(path="headline", value="C")
15+
D = SearchEquals(path="headline", value="D")
16+
expr = (~A | B) & (C | D)
17+
solved = CombinedSearchExpression.resolve(expr)
18+
self.assertIsInstance(solved, CompoundExpression)
19+
solved_A = CompoundExpression(must_not=[CompoundExpression(must=[A])])
20+
solved_B = CompoundExpression(must=[B])
21+
solved_C = CompoundExpression(must=[C])
22+
solved_D = CompoundExpression(must=[D])
23+
self.assertCountEqual(solved.must[0].should, [solved_A, solved_B])
24+
self.assertEqual(solved.must[0].minimum_should_match, 1)
25+
self.assertEqual(solved.must[1].should, [solved_C, solved_D])
26+
27+
def test_combined_expression_de_morgans_resolution(self):
28+
A = SearchEquals(path="headline", value="A")
29+
B = SearchEquals(path="headline", value="B")
30+
C = SearchEquals(path="headline", value="C")
31+
D = SearchEquals(path="headline", value="D")
32+
expr = ~(A | B) & (C | D)
33+
solved_A = CompoundExpression(must_not=[CompoundExpression(must=[A])])
34+
solved_B = CompoundExpression(must_not=[CompoundExpression(must=[B])])
35+
solved_C = CompoundExpression(must=[C])
36+
solved_D = CompoundExpression(must=[D])
37+
solved = CombinedSearchExpression.resolve(expr)
38+
self.assertIsInstance(solved, CompoundExpression)
39+
self.assertCountEqual(solved.must[0].must, [solved_A, solved_B])
40+
self.assertEqual(solved.must[0].minimum_should_match, None)
41+
self.assertEqual(solved.must[1].should, [solved_C, solved_D])
42+
self.assertEqual(solved.minimum_should_match, None)
43+
44+
def test_combined_expression_doble_negation(self):
45+
A = SearchEquals(path="headline", value="A")
46+
expr = ~~A
47+
solved = CombinedSearchExpression.resolve(expr)
48+
solved_A = CompoundExpression(must=[A])
49+
self.assertIsInstance(solved, CompoundExpression)
50+
self.assertEqual(solved, solved_A)
51+
52+
def test_combined_expression_long_right_tree(self):
53+
A = SearchEquals(path="headline", value="A")
54+
B = SearchEquals(path="headline", value="B")
55+
C = SearchEquals(path="headline", value="C")
56+
D = SearchEquals(path="headline", value="D")
57+
solved_A = CompoundExpression(must=[A])
58+
solved_B = CompoundExpression(must_not=[CompoundExpression(must=[B])])
59+
solved_C = CompoundExpression(must=[C])
60+
solved_D = CompoundExpression(must=[D])
61+
expr = A & ~(B & ~(C & D))
62+
solved = CombinedSearchExpression.resolve(expr)
63+
self.assertIsInstance(solved, CompoundExpression)
64+
self.assertEqual(len(solved.must), 2)
65+
self.assertEqual(solved.must[0], solved_A)
66+
self.assertEqual(len(solved.must[1].should), 2)
67+
self.assertEqual(solved.must[1].should[0], solved_B)
68+
self.assertCountEqual(solved.must[1].should[1].must, [solved_C, solved_D])
69+
expr = A | ~(B | ~(C | D))
70+
solved = CombinedSearchExpression.resolve(expr)
71+
self.assertIsInstance(solved, CompoundExpression)
72+
self.assertEqual(len(solved.should), 2)
73+
self.assertEqual(solved.should[0], solved_A)
74+
self.assertEqual(len(solved.should[1].must), 2)
75+
self.assertEqual(solved.should[1].must[0], solved_B)
76+
self.assertCountEqual(solved.should[1].must[1].should, [solved_C, solved_D])

0 commit comments

Comments
 (0)