21 from operator import eq, lt, le, gt |
21 from operator import eq, lt, le, gt |
22 from logilab.common.testlib import TestCase, unittest_main |
22 from logilab.common.testlib import TestCase, unittest_main |
23 |
23 |
24 from cubicweb import Binary |
24 from cubicweb import Binary |
25 from cubicweb.devtools.testlib import CubicWebTC |
25 from cubicweb.devtools.testlib import CubicWebTC |
26 from cubicweb.appobject import Selector, AndSelector, OrSelector |
26 from cubicweb.predicates import (is_instance, adaptable, match_kwargs, match_user_groups, |
27 from cubicweb.selectors import (is_instance, adaptable, match_kwargs, match_user_groups, |
|
28 multi_lines_rset, score_entity, is_in_state, |
27 multi_lines_rset, score_entity, is_in_state, |
29 on_transition, rql_condition, relation_possible) |
28 on_transition, rql_condition, relation_possible) |
30 from cubicweb.web import action |
29 from cubicweb.web import action |
31 |
30 |
32 |
|
33 class _1_(Selector): |
|
34 def __call__(self, *args, **kwargs): |
|
35 return 1 |
|
36 |
|
37 class _0_(Selector): |
|
38 def __call__(self, *args, **kwargs): |
|
39 return 0 |
|
40 |
|
41 def _2_(*args, **kwargs): |
|
42 return 2 |
|
43 |
|
44 |
|
45 class SelectorsTC(TestCase): |
|
46 def test_basic_and(self): |
|
47 selector = _1_() & _1_() |
|
48 self.assertEqual(selector(None), 2) |
|
49 selector = _1_() & _0_() |
|
50 self.assertEqual(selector(None), 0) |
|
51 selector = _0_() & _1_() |
|
52 self.assertEqual(selector(None), 0) |
|
53 |
|
54 def test_basic_or(self): |
|
55 selector = _1_() | _1_() |
|
56 self.assertEqual(selector(None), 1) |
|
57 selector = _1_() | _0_() |
|
58 self.assertEqual(selector(None), 1) |
|
59 selector = _0_() | _1_() |
|
60 self.assertEqual(selector(None), 1) |
|
61 selector = _0_() | _0_() |
|
62 self.assertEqual(selector(None), 0) |
|
63 |
|
64 def test_selector_and_function(self): |
|
65 selector = _1_() & _2_ |
|
66 self.assertEqual(selector(None), 3) |
|
67 selector = _2_ & _1_() |
|
68 self.assertEqual(selector(None), 3) |
|
69 |
|
70 def test_three_and(self): |
|
71 selector = _1_() & _1_() & _1_() |
|
72 self.assertEqual(selector(None), 3) |
|
73 selector = _1_() & _0_() & _1_() |
|
74 self.assertEqual(selector(None), 0) |
|
75 selector = _0_() & _1_() & _1_() |
|
76 self.assertEqual(selector(None), 0) |
|
77 |
|
78 def test_three_or(self): |
|
79 selector = _1_() | _1_() | _1_() |
|
80 self.assertEqual(selector(None), 1) |
|
81 selector = _1_() | _0_() | _1_() |
|
82 self.assertEqual(selector(None), 1) |
|
83 selector = _0_() | _1_() | _1_() |
|
84 self.assertEqual(selector(None), 1) |
|
85 selector = _0_() | _0_() | _0_() |
|
86 self.assertEqual(selector(None), 0) |
|
87 |
|
88 def test_composition(self): |
|
89 selector = (_1_() & _1_()) & (_1_() & _1_()) |
|
90 self.assertTrue(isinstance(selector, AndSelector)) |
|
91 self.assertEqual(len(selector.selectors), 4) |
|
92 self.assertEqual(selector(None), 4) |
|
93 selector = (_1_() & _0_()) | (_1_() & _1_()) |
|
94 self.assertTrue(isinstance(selector, OrSelector)) |
|
95 self.assertEqual(len(selector.selectors), 2) |
|
96 self.assertEqual(selector(None), 2) |
|
97 |
|
98 def test_search_selectors(self): |
|
99 sel = is_instance('something') |
|
100 self.assertIs(sel.search_selector(is_instance), sel) |
|
101 csel = AndSelector(sel, Selector()) |
|
102 self.assertIs(csel.search_selector(is_instance), sel) |
|
103 csel = AndSelector(Selector(), sel) |
|
104 self.assertIs(csel.search_selector(is_instance), sel) |
|
105 self.assertIs(csel.search_selector((AndSelector, OrSelector)), csel) |
|
106 self.assertIs(csel.search_selector((OrSelector, AndSelector)), csel) |
|
107 self.assertIs(csel.search_selector((is_instance, score_entity)), sel) |
|
108 self.assertIs(csel.search_selector((score_entity, is_instance)), sel) |
|
109 |
|
110 def test_inplace_and(self): |
|
111 selector = _1_() |
|
112 selector &= _1_() |
|
113 selector &= _1_() |
|
114 self.assertEqual(selector(None), 3) |
|
115 selector = _1_() |
|
116 selector &= _0_() |
|
117 selector &= _1_() |
|
118 self.assertEqual(selector(None), 0) |
|
119 selector = _0_() |
|
120 selector &= _1_() |
|
121 selector &= _1_() |
|
122 self.assertEqual(selector(None), 0) |
|
123 selector = _0_() |
|
124 selector &= _0_() |
|
125 selector &= _0_() |
|
126 self.assertEqual(selector(None), 0) |
|
127 |
|
128 def test_inplace_or(self): |
|
129 selector = _1_() |
|
130 selector |= _1_() |
|
131 selector |= _1_() |
|
132 self.assertEqual(selector(None), 1) |
|
133 selector = _1_() |
|
134 selector |= _0_() |
|
135 selector |= _1_() |
|
136 self.assertEqual(selector(None), 1) |
|
137 selector = _0_() |
|
138 selector |= _1_() |
|
139 selector |= _1_() |
|
140 self.assertEqual(selector(None), 1) |
|
141 selector = _0_() |
|
142 selector |= _0_() |
|
143 selector |= _0_() |
|
144 self.assertEqual(selector(None), 0) |
|
145 |
31 |
146 |
32 |
147 class ImplementsSelectorTC(CubicWebTC): |
33 class ImplementsSelectorTC(CubicWebTC): |
148 def test_etype_priority(self): |
34 def test_etype_priority(self): |
149 req = self.request() |
35 req = self.request() |