@@ -8,12 +8,14 @@ void test_simple_expression_tree();
88void test_complex_expression_tree ();
99void test_moved_expression_tree ();
1010void test_copied_expression_tree ();
11+ void test_user_defined_operator ();
1112
1213int main (int argc, char ** argv) {
1314 test_simple_expression_tree ();
1415 test_complex_expression_tree ();
1516 test_moved_expression_tree ();
1617 test_copied_expression_tree ();
18+ test_user_defined_operator ();
1719
1820 return EXIT_SUCCESS;
1921}
@@ -57,6 +59,140 @@ void test_simple_expression_tree() {
5759
5860void test_complex_expression_tree () {
5961
62+ // expression: (uint > 0 AND (some_string > "a" AND some_string < "z")) OR (some_string > "0" AND some_string < "9")
63+ expression_tree<test_fixture> expr {
64+ (make_expr (&test_fixture::is_some_uint_greater_than_zero, op::equals, true )
65+ ->AND ((make_expr (&test_fixture::some_string, op::greater_than, std::string (" a" ))
66+ ->AND (make_expr (&test_fixture::some_string, op::less_than, std::string (" z" )))
67+ ))
68+ )
69+ ->OR ((make_expr (&test_fixture::some_string, op::greater_than, std::string (" 0" ))
70+ ->AND (make_expr (&test_fixture::some_string, op::less_than, std::string (" 9" )))
71+ )
72+ )
73+ };
74+
75+ test_fixture fixture;
76+
77+ fixture.some_uint = 0 ;
78+
79+ // test left-hand side of the expression tree when some_uint is 0
80+ {
81+ fixture.some_string = " a" ;
82+ assert (!expr.evaluate (fixture));
83+
84+ fixture.some_string = " aaa" ;
85+ assert (!expr.evaluate (fixture));
86+
87+ fixture.some_string = " c" ;
88+ assert (!expr.evaluate (fixture));
89+
90+ fixture.some_string = " yyyyy" ;
91+ assert (!expr.evaluate (fixture));
92+
93+ fixture.some_string = " B" ;
94+ assert (!expr.evaluate (fixture));
95+
96+ fixture.some_string = " ZZZ" ;
97+ assert (!expr.evaluate (fixture));
98+
99+ fixture.some_string = " /" ;
100+ assert (!expr.evaluate (fixture));
101+
102+ fixture.some_string = " red" ;
103+ assert (!expr.evaluate (fixture));
104+
105+ fixture.some_string = " " ;
106+ assert (!expr.evaluate (fixture));
107+
108+ fixture.some_string = " tree fiddy" ;
109+ assert (!expr.evaluate (fixture));
110+ }
111+
112+ // test right-hand side of the expression tree when some_uint is 0
113+ {
114+ fixture.some_string = " 000" ;
115+ assert (expr.evaluate (fixture));
116+
117+ fixture.some_string = " 00" ;
118+ assert (expr.evaluate (fixture));
119+
120+ fixture.some_string = " 0" ;
121+ assert (!expr.evaluate (fixture));
122+
123+ fixture.some_string = " 12345" ;
124+ assert (expr.evaluate (fixture));
125+
126+ fixture.some_string = " 7" ;
127+ assert (expr.evaluate (fixture));
128+
129+ fixture.some_string = " 89999" ;
130+ assert (expr.evaluate (fixture));
131+
132+ fixture.some_string = " 9" ;
133+ assert (!expr.evaluate (fixture));
134+ }
135+
136+ fixture.some_uint = 1 ;
137+
138+ // test left-hand side of the expression tree when some_uint is 0
139+ {
140+ fixture.some_string = " a" ;
141+ assert (!expr.evaluate (fixture));
142+
143+ fixture.some_string = " aaa" ;
144+ assert (expr.evaluate (fixture));
145+
146+ fixture.some_string = " c" ;
147+ assert (expr.evaluate (fixture));
148+
149+ fixture.some_string = " yyyyy" ;
150+ assert (expr.evaluate (fixture));
151+
152+ fixture.some_string = " B" ;
153+ assert (!expr.evaluate (fixture));
154+
155+ fixture.some_string = " ZZZ" ;
156+ assert (!expr.evaluate (fixture));
157+
158+ fixture.some_string = " /" ;
159+ assert (!expr.evaluate (fixture));
160+
161+ fixture.some_string = " red" ;
162+ assert (expr.evaluate (fixture));
163+
164+ fixture.some_string = " " ;
165+ assert (!expr.evaluate (fixture));
166+
167+ fixture.some_string = " tree fiddy" ;
168+ assert (expr.evaluate (fixture));
169+ }
170+
171+ // test right-hand side of the expression tree when some_uint is 1
172+ {
173+ fixture.some_string = " 000" ;
174+ assert (expr.evaluate (fixture));
175+
176+ fixture.some_string = " 00" ;
177+ assert (expr.evaluate (fixture));
178+
179+ fixture.some_string = " 0" ;
180+ assert (!expr.evaluate (fixture));
181+
182+ fixture.some_string = " 12345" ;
183+ assert (expr.evaluate (fixture));
184+
185+ fixture.some_string = " 7" ;
186+ assert (expr.evaluate (fixture));
187+
188+ fixture.some_string = " 89999" ;
189+ assert (expr.evaluate (fixture));
190+
191+ fixture.some_string = " 9" ;
192+ assert (!expr.evaluate (fixture));
193+ }
194+
195+
60196}
61197
62198void test_moved_expression_tree () {
@@ -90,7 +226,7 @@ void test_moved_expression_tree() {
90226 };
91227 test_procedure (expr);
92228
93- expression_tree<test_fixture> move_constructed_expr ( std::move (expr) );
229+ expression_tree<test_fixture> move_constructed_expr (std::move (expr));
94230 test_procedure (move_constructed_expr);
95231
96232 expression_tree<test_fixture> move_assigned_expr = std::move (move_constructed_expr);
@@ -128,7 +264,7 @@ void test_copied_expression_tree() {
128264 };
129265 test_procedure (expr);
130266
131- expression_tree<test_fixture> copy_constructed_expr ( expr );
267+ expression_tree<test_fixture> copy_constructed_expr (expr);
132268 test_procedure (copy_constructed_expr);
133269
134270 expression_tree<test_fixture> copy_assigned_expr = copy_constructed_expr;
@@ -137,4 +273,8 @@ void test_copied_expression_tree() {
137273 // ensure both of the old copied versions still work after copying
138274 test_procedure (expr);
139275 test_procedure (copy_constructed_expr);
276+ }
277+
278+ void test_user_defined_operator () {
279+
140280}
0 commit comments