Skip to content

Commit ee4d30c

Browse files
committed
adds unit tests for const functions and uints
1 parent 346bf9d commit ee4d30c

File tree

2 files changed

+244
-0
lines changed

2 files changed

+244
-0
lines changed

include/attwoodn/expression_tree.hpp

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -218,14 +218,28 @@ namespace attwoodn::expression_tree {
218218

219219
template<class T> struct type_id{typedef T type;};
220220

221+
/**
222+
* Makes an expression tree leaf node for comparing pointer-type member variables of a class/struct
223+
*/
221224
template<typename Obj, typename CompValue, typename Op = typename type_id<bool (*)(CompValue*, CompValue*)>::type,
222225
typename std::enable_if<std::is_convertible<CompValue, CompValue*>::value, int>::type = 0>
223226
node::expression_tree_leaf_node<Obj, Op, CompValue>* make_expr( CompValue Obj::* member_var, Op op, CompValue comp_value ) {
224227
return new node::expression_tree_leaf_node<Obj, Op, CompValue>( member_var, op, comp_value );
225228
}
226229

230+
/**
231+
* Makes an expression tree leaf node for comparing value-type member variables of a class/struct
232+
*/
227233
template<typename Obj, typename CompValue, typename Op = typename type_id<bool (*)(CompValue, CompValue)>::type>
228234
node::expression_tree_leaf_node<Obj, Op, CompValue>* make_expr( const CompValue Obj::* member_var, Op op, CompValue comp_value ) {
229235
return new node::expression_tree_leaf_node<Obj, Op, CompValue>( member_var, op, comp_value );
230236
}
237+
238+
/**
239+
* Makes an expression tree leaf node for comparing a class/struct's const member function return values
240+
*/
241+
template<typename Obj, typename CompValue, typename Op = typename type_id<bool (*)(CompValue, CompValue)>::type>
242+
node::expression_tree_leaf_node<Obj, Op, CompValue>* make_expr( CompValue (Obj::* member_func)() const, Op op, CompValue comp_value ) {
243+
return new node::expression_tree_leaf_node<Obj, Op, CompValue>( member_func, op, comp_value );
244+
}
231245
}

tests/expression_tree_leaf_node.cpp

Lines changed: 230 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
#include <attwoodn/expression_tree.hpp>
2+
#include <limits>
23
#include <iostream>
34
#include <cassert>
45

@@ -8,14 +9,23 @@ struct test_fixture {
89
std::string some_string;
910
const std::string some_const_string = "this IS 4 T3s7 $tRing ";
1011
char* some_char_ptr;
12+
uint16_t some_uint;
13+
14+
bool is_some_uint_greater_than_zero() const {
15+
return some_uint;
16+
}
1117
};
1218

1319
void test_string_evaluation();
1420
void test_char_ptr_evaluation();
21+
void test_uint_evaluation();
22+
void test_const_func_evaluation();
1523

1624
int main(int argc, char** argv) {
1725
test_string_evaluation();
1826
test_char_ptr_evaluation();
27+
test_uint_evaluation();
28+
test_const_func_evaluation();
1929

2030
return EXIT_SUCCESS;
2131
}
@@ -371,4 +381,224 @@ void test_char_ptr_evaluation() {
371381
fixture.some_char_ptr = &c_too;
372382
assert(expr->evaluate(fixture));
373383
}
384+
}
385+
386+
void test_uint_evaluation() {
387+
test_fixture fixture;
388+
389+
// test equals
390+
{
391+
auto expr = make_expr(&test_fixture::some_uint, op::equals, (uint16_t) 9001);
392+
393+
fixture.some_uint = 0;
394+
assert(!expr->evaluate(fixture));
395+
396+
fixture.some_uint = 1;
397+
assert(!expr->evaluate(fixture));
398+
399+
fixture.some_uint = -1;
400+
assert(!expr->evaluate(fixture));
401+
402+
fixture.some_uint = 9000;
403+
assert(!expr->evaluate(fixture));
404+
405+
fixture.some_uint = 9002;
406+
assert(!expr->evaluate(fixture));
407+
408+
fixture.some_uint = 9001;
409+
assert(expr->evaluate(fixture));
410+
}
411+
412+
// test not_equals
413+
{
414+
auto expr = make_expr(&test_fixture::some_uint, op::not_equals, (uint16_t) 9001);
415+
416+
fixture.some_uint = 0;
417+
assert(expr->evaluate(fixture));
418+
419+
fixture.some_uint = 1;
420+
assert(expr->evaluate(fixture));
421+
422+
fixture.some_uint = -1;
423+
assert(expr->evaluate(fixture));
424+
425+
fixture.some_uint = 9000;
426+
assert(expr->evaluate(fixture));
427+
428+
fixture.some_uint = 9002;
429+
assert(expr->evaluate(fixture));
430+
431+
fixture.some_uint = 9001;
432+
assert(!expr->evaluate(fixture));
433+
}
434+
435+
// test less_than
436+
{
437+
auto expr = make_expr(&test_fixture::some_uint, op::less_than, (uint16_t) 9001);
438+
439+
fixture.some_uint = 0;
440+
assert(expr->evaluate(fixture));
441+
442+
fixture.some_uint = 1;
443+
assert(expr->evaluate(fixture));
444+
445+
fixture.some_uint = -1;
446+
assert(!expr->evaluate(fixture));
447+
448+
fixture.some_uint = 9000;
449+
assert(expr->evaluate(fixture));
450+
451+
fixture.some_uint = 9002;
452+
assert(!expr->evaluate(fixture));
453+
454+
fixture.some_uint = 9001;
455+
assert(!expr->evaluate(fixture));
456+
}
457+
458+
// test greater_than
459+
{
460+
auto expr = make_expr(&test_fixture::some_uint, op::greater_than, (uint16_t) 9001);
461+
462+
fixture.some_uint = 0;
463+
assert(!expr->evaluate(fixture));
464+
465+
fixture.some_uint = 1;
466+
assert(!expr->evaluate(fixture));
467+
468+
fixture.some_uint = -1;
469+
assert(expr->evaluate(fixture));
470+
471+
fixture.some_uint = 9000;
472+
assert(!expr->evaluate(fixture));
473+
474+
fixture.some_uint = 9002;
475+
assert(expr->evaluate(fixture));
476+
477+
fixture.some_uint = 9001;
478+
assert(!expr->evaluate(fixture));
479+
}
480+
}
481+
482+
void test_const_func_evaluation() {
483+
test_fixture fixture;
484+
485+
// test equals
486+
{
487+
auto expr1 = make_expr(&test_fixture::is_some_uint_greater_than_zero, &op::equals, true);
488+
auto expr2 = make_expr(&test_fixture::is_some_uint_greater_than_zero, &op::equals, false);
489+
490+
fixture.some_uint = 0;
491+
assert(!expr1->evaluate(fixture));
492+
assert(expr2->evaluate(fixture));
493+
494+
fixture.some_uint = std::numeric_limits<uint16_t>::min();
495+
assert(!expr1->evaluate(fixture));
496+
assert(expr2->evaluate(fixture));
497+
498+
fixture.some_uint = 1;
499+
assert(expr1->evaluate(fixture));
500+
assert(!expr2->evaluate(fixture));
501+
502+
fixture.some_uint = 500;
503+
assert(expr1->evaluate(fixture));
504+
assert(!expr2->evaluate(fixture));
505+
506+
fixture.some_uint = std::numeric_limits<uint16_t>::max();
507+
assert(expr1->evaluate(fixture));
508+
assert(!expr2->evaluate(fixture));
509+
510+
fixture.some_uint = -1;
511+
assert(expr1->evaluate(fixture));
512+
assert(!expr2->evaluate(fixture));
513+
}
514+
515+
// test not_equals
516+
{
517+
auto expr1 = make_expr(&test_fixture::is_some_uint_greater_than_zero, &op::not_equals, true);
518+
auto expr2 = make_expr(&test_fixture::is_some_uint_greater_than_zero, &op::not_equals, false);
519+
520+
fixture.some_uint = 0;
521+
assert(expr1->evaluate(fixture));
522+
assert(!expr2->evaluate(fixture));
523+
524+
fixture.some_uint = std::numeric_limits<uint16_t>::min();
525+
assert(expr1->evaluate(fixture));
526+
assert(!expr2->evaluate(fixture));
527+
528+
fixture.some_uint = 1;
529+
assert(!expr1->evaluate(fixture));
530+
assert(expr2->evaluate(fixture));
531+
532+
fixture.some_uint = 500;
533+
assert(!expr1->evaluate(fixture));
534+
assert(expr2->evaluate(fixture));
535+
536+
fixture.some_uint = std::numeric_limits<uint16_t>::max();
537+
assert(!expr1->evaluate(fixture));
538+
assert(expr2->evaluate(fixture));
539+
540+
fixture.some_uint = -1;
541+
assert(!expr1->evaluate(fixture));
542+
assert(expr2->evaluate(fixture));
543+
}
544+
545+
// test less_than
546+
{
547+
auto expr1 = make_expr(&test_fixture::is_some_uint_greater_than_zero, &op::less_than, true);
548+
auto expr2 = make_expr(&test_fixture::is_some_uint_greater_than_zero, &op::less_than, false);
549+
550+
fixture.some_uint = 0;
551+
assert(expr1->evaluate(fixture));
552+
assert(!expr2->evaluate(fixture));
553+
554+
fixture.some_uint = std::numeric_limits<uint16_t>::min();
555+
assert(expr1->evaluate(fixture));
556+
assert(!expr2->evaluate(fixture));
557+
558+
fixture.some_uint = 1;
559+
assert(!expr1->evaluate(fixture));
560+
assert(!expr2->evaluate(fixture));
561+
562+
fixture.some_uint = 500;
563+
assert(!expr1->evaluate(fixture));
564+
assert(!expr2->evaluate(fixture));
565+
566+
fixture.some_uint = std::numeric_limits<uint16_t>::max();
567+
assert(!expr1->evaluate(fixture));
568+
assert(!expr2->evaluate(fixture));
569+
570+
fixture.some_uint = -1;
571+
assert(!expr1->evaluate(fixture));
572+
assert(!expr2->evaluate(fixture));
573+
}
574+
575+
// test greater_than
576+
{
577+
auto expr1 = make_expr(&test_fixture::is_some_uint_greater_than_zero, &op::greater_than, true);
578+
auto expr2 = make_expr(&test_fixture::is_some_uint_greater_than_zero, &op::greater_than, false);
579+
580+
fixture.some_uint = 0;
581+
assert(!expr1->evaluate(fixture));
582+
assert(!expr2->evaluate(fixture));
583+
584+
fixture.some_uint = std::numeric_limits<uint16_t>::min();
585+
assert(!expr1->evaluate(fixture));
586+
assert(!expr2->evaluate(fixture));
587+
588+
fixture.some_uint = 1;
589+
assert(!expr1->evaluate(fixture));
590+
assert(expr2->evaluate(fixture));
591+
592+
fixture.some_uint = 500;
593+
assert(!expr1->evaluate(fixture));
594+
assert(expr2->evaluate(fixture));
595+
596+
fixture.some_uint = std::numeric_limits<uint16_t>::max();
597+
assert(!expr1->evaluate(fixture));
598+
assert(expr2->evaluate(fixture));
599+
600+
fixture.some_uint = -1;
601+
assert(!expr1->evaluate(fixture));
602+
assert(expr2->evaluate(fixture));
603+
}
374604
}

0 commit comments

Comments
 (0)