-
Notifications
You must be signed in to change notification settings - Fork 192
/
Copy pathoperatorsTest.cpp
187 lines (173 loc) · 9.95 KB
/
operatorsTest.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
#include "operators.h"
#define BOOST_TEST_MODULE functor_of
#include <boost/test/included/unit_test.hpp>
namespace bp = boost::proto;
using namespace streamulus;
struct ValuesFixture {
protected:
int i0 = 7;
int j0 = 2;
ValuesFixture() {
i = iexp = i0;
j = jexp = j0;
pi = &i;
}
int i, j, iexp, jexp;
int *pi;
};
BOOST_FIXTURE_TEST_SUITE(functor_of_test, ValuesFixture)
// Note: operators don't actually modify the stream, just generate a modified output.
// So we compare the vale of the "stream" with unmodified input values
BOOST_AUTO_TEST_CASE(unary_operators) {
BOOST_CHECK_EQUAL(functor_of<bp::tag::negate>()(i), -iexp);
BOOST_CHECK_EQUAL(i, i0);
BOOST_CHECK_EQUAL(functor_of<bp::tag::negate>()(-i), iexp);
BOOST_CHECK_EQUAL(i, i0);
BOOST_CHECK_EQUAL(functor_of<bp::tag::dereference>()(pi), iexp);
BOOST_CHECK_EQUAL(i, i0);
BOOST_CHECK_EQUAL(functor_of<bp::tag::complement>()(i), ~iexp);
BOOST_CHECK_EQUAL(i, i0);
BOOST_CHECK_EQUAL(functor_of<bp::tag::logical_not>()(i), !iexp);
BOOST_CHECK_EQUAL(i, i0);
}
BOOST_AUTO_TEST_CASE(increment_decrement_operators) {
BOOST_CHECK_EQUAL(functor_of<bp::tag::pre_inc>()(i), ++iexp);
BOOST_CHECK_EQUAL(i, i0); iexp = i0;
BOOST_CHECK_EQUAL(functor_of<bp::tag::pre_dec>()(i), --iexp);
BOOST_CHECK_EQUAL(i, i0); iexp = i0;
BOOST_CHECK_EQUAL(functor_of<bp::tag::post_inc>()(i), iexp++);
BOOST_CHECK_EQUAL(i, i0); iexp = i0;
BOOST_CHECK_EQUAL(functor_of<bp::tag::post_dec>()(i), iexp--);
BOOST_CHECK_EQUAL(i, i0); iexp = i0;
}
BOOST_AUTO_TEST_CASE(binary_operators) {
BOOST_CHECK_EQUAL(functor_of<bp::tag::shift_left>()(i, j), (iexp << jexp));
BOOST_CHECK(i == i0 && j == j0);
BOOST_CHECK_EQUAL(functor_of<bp::tag::shift_left>()(j, i), (jexp << iexp));
BOOST_CHECK(i == i0 && j == j0);
BOOST_CHECK_EQUAL(functor_of<bp::tag::shift_right>()(i, j), (iexp >> jexp));
BOOST_CHECK(i == i0 && j == j0);
BOOST_CHECK_EQUAL(functor_of<bp::tag::shift_right>()(j, i), (jexp >> iexp));
BOOST_CHECK(i == i0 && j == j0);
BOOST_CHECK_EQUAL(functor_of<bp::tag::multiplies>()(i, j), (iexp * jexp));
BOOST_CHECK(i == i0 && j == j0);
BOOST_CHECK_EQUAL(functor_of<bp::tag::multiplies>()(j, i), (jexp * iexp));
BOOST_CHECK(i == i0 && j == j0);
BOOST_CHECK_EQUAL(functor_of<bp::tag::divides>()(i, j), (iexp / jexp));
BOOST_CHECK(i == i0 && j == j0);
BOOST_CHECK_EQUAL(functor_of<bp::tag::divides>()(j, i), (jexp / iexp));
BOOST_CHECK(i == i0 && j == j0);
BOOST_CHECK_EQUAL(functor_of<bp::tag::modulus>()(i, j), (iexp % jexp));
BOOST_CHECK(i == i0 && j == j0);
BOOST_CHECK_EQUAL(functor_of<bp::tag::modulus>()(j, i), (jexp % iexp));
BOOST_CHECK(i == i0 && j == j0);
BOOST_CHECK_EQUAL(functor_of<bp::tag::plus>()(i, j), (iexp + jexp));
BOOST_CHECK(i == i0 && j == j0);
BOOST_CHECK_EQUAL(functor_of<bp::tag::plus>()(j, i), (jexp + iexp));
BOOST_CHECK(i == i0 && j == j0);
BOOST_CHECK_EQUAL(functor_of<bp::tag::minus>()(i, j), (iexp - jexp));
BOOST_CHECK(i == i0 && j == j0);
BOOST_CHECK_EQUAL(functor_of<bp::tag::minus>()(j, i), (jexp - iexp));
BOOST_CHECK(i == i0 && j == j0);
BOOST_CHECK_EQUAL(functor_of<bp::tag::less>()(i, j), (iexp < jexp));
BOOST_CHECK(i == i0 && j == j0);
BOOST_CHECK_EQUAL(functor_of<bp::tag::less>()(j, i), (jexp < iexp));
BOOST_CHECK(i == i0 && j == j0);
BOOST_CHECK_EQUAL(functor_of<bp::tag::greater>()(i, j), (iexp > jexp));
BOOST_CHECK(i == i0 && j == j0);
BOOST_CHECK_EQUAL(functor_of<bp::tag::greater>()(j, i), (jexp > iexp));
BOOST_CHECK(i == i0 && j == j0);
BOOST_CHECK_EQUAL(functor_of<bp::tag::less_equal>()(i, j), (iexp <= jexp));
BOOST_CHECK(i == i0 && j == j0);
BOOST_CHECK_EQUAL(functor_of<bp::tag::less_equal>()(j, i), (jexp <= iexp));
BOOST_CHECK(i == i0 && j == j0);
BOOST_CHECK_EQUAL(functor_of<bp::tag::greater_equal>()(i, j), (iexp >= jexp));
BOOST_CHECK(i == i0 && j == j0);
BOOST_CHECK_EQUAL(functor_of<bp::tag::greater_equal>()(j, i), (jexp >= iexp));
BOOST_CHECK(i == i0 && j == j0);
BOOST_CHECK_EQUAL(functor_of<bp::tag::equal_to>()(i, j), (iexp == jexp));
BOOST_CHECK(i == i0 && j == j0);
BOOST_CHECK_EQUAL(functor_of<bp::tag::equal_to>()(j, i), (jexp == iexp));
BOOST_CHECK(i == i0 && j == j0);
BOOST_CHECK_EQUAL(functor_of<bp::tag::not_equal_to>()(i, j), (iexp != jexp));
BOOST_CHECK(i == i0 && j == j0);
BOOST_CHECK_EQUAL(functor_of<bp::tag::not_equal_to>()(j, i), (jexp != iexp));
BOOST_CHECK(i == i0 && j == j0);
BOOST_CHECK_EQUAL(functor_of<bp::tag::logical_or>()(i, j), (iexp || jexp));
BOOST_CHECK(i == i0 && j == j0);
BOOST_CHECK_EQUAL(functor_of<bp::tag::logical_or>()(j, i), (jexp || iexp));
BOOST_CHECK(i == i0 && j == j0);
BOOST_CHECK_EQUAL(functor_of<bp::tag::logical_and>()(i, j), (iexp && jexp));
BOOST_CHECK(i == i0 && j == j0);
BOOST_CHECK_EQUAL(functor_of<bp::tag::logical_and>()(j, i), (jexp && iexp));
BOOST_CHECK(i == i0 && j == j0);
BOOST_CHECK_EQUAL(functor_of<bp::tag::bitwise_or>()(i, j), (iexp | jexp));
BOOST_CHECK(i == i0 && j == j0);
BOOST_CHECK_EQUAL(functor_of<bp::tag::bitwise_or>()(j, i), (jexp | iexp));
BOOST_CHECK(i == i0 && j == j0);
BOOST_CHECK_EQUAL(functor_of<bp::tag::bitwise_and>()(i, j), (iexp & jexp));
BOOST_CHECK(i == i0 && j == j0);
BOOST_CHECK_EQUAL(functor_of<bp::tag::bitwise_and>()(j, i), (jexp & iexp));
BOOST_CHECK(i == i0 && j == j0);
BOOST_CHECK_EQUAL(functor_of<bp::tag::bitwise_xor>()(i, j), (iexp ^ jexp));
BOOST_CHECK(i == i0 && j == j0);
BOOST_CHECK_EQUAL(functor_of<bp::tag::bitwise_xor>()(j, i), (jexp ^ iexp));
BOOST_CHECK(i == i0 && j == j0);
}
BOOST_AUTO_TEST_CASE(assignment_operators) {
BOOST_CHECK_EQUAL(functor_of<bp::tag::assign>()(i, j), (iexp = jexp));
BOOST_CHECK(i == i0 && j == j0); iexp = i0; jexp = j0;
BOOST_CHECK_EQUAL(functor_of<bp::tag::assign>()(j, i), (jexp = iexp));
BOOST_CHECK(i == i0 && j == j0); iexp = i0; jexp = j0;
BOOST_CHECK_EQUAL(functor_of<bp::tag::shift_left_assign>()(i, j), (iexp <<= jexp));
BOOST_CHECK(i == i0 && j == j0); iexp = i0; jexp = j0;
BOOST_CHECK_EQUAL(functor_of<bp::tag::shift_left_assign>()(j, i), (jexp <<= iexp));
BOOST_CHECK(i == i0 && j == j0); iexp = i0; jexp = j0;
BOOST_CHECK_EQUAL(functor_of<bp::tag::shift_right_assign>()(i, j), (iexp >>= jexp));
BOOST_CHECK(i == i0 && j == j0); iexp = i0; jexp = j0;
BOOST_CHECK_EQUAL(functor_of<bp::tag::shift_right_assign>()(j, i), (jexp >>= iexp));
BOOST_CHECK(i == i0 && j == j0); iexp = i0; jexp = j0;
BOOST_CHECK_EQUAL(functor_of<bp::tag::multiplies_assign>()(i, j), (iexp *= jexp));
BOOST_CHECK(i == i0 && j == j0); iexp = i0; jexp = j0;
BOOST_CHECK_EQUAL(functor_of<bp::tag::multiplies_assign>()(j, i), (jexp *= iexp));
BOOST_CHECK(i == i0 && j == j0); iexp = i0; jexp = j0;
BOOST_CHECK_EQUAL(functor_of<bp::tag::divides_assign>()(i, j), (iexp /= jexp));
BOOST_CHECK(i == i0 && j == j0); iexp = i0; jexp = j0;
BOOST_CHECK_EQUAL(functor_of<bp::tag::divides_assign>()(j, i), (jexp /= iexp));
BOOST_CHECK(i == i0 && j == j0); iexp = i0; jexp = j0;
BOOST_CHECK_EQUAL(functor_of<bp::tag::modulus_assign>()(i, j), (iexp %= jexp));
BOOST_CHECK(i == i0 && j == j0); iexp = i0; jexp = j0;
BOOST_CHECK_EQUAL(functor_of<bp::tag::modulus_assign>()(j, i), (jexp %= iexp));
BOOST_CHECK(i == i0 && j == j0); iexp = i0; jexp = j0;
BOOST_CHECK_EQUAL(functor_of<bp::tag::plus_assign>()(i, j), (iexp += jexp));
BOOST_CHECK(i == i0 && j == j0); iexp = i0; jexp = j0;
BOOST_CHECK_EQUAL(functor_of<bp::tag::plus_assign>()(j, i), (jexp += iexp));
BOOST_CHECK(i == i0 && j == j0); iexp = i0; jexp = j0;
BOOST_CHECK_EQUAL(functor_of<bp::tag::minus_assign>()(i, j), (iexp -= jexp));
BOOST_CHECK(i == i0 && j == j0); iexp = i0; jexp = j0;
BOOST_CHECK_EQUAL(functor_of<bp::tag::minus_assign>()(j, i), (jexp -= iexp));
BOOST_CHECK(i == i0 && j == j0); iexp = i0; jexp = j0;
BOOST_CHECK_EQUAL(functor_of<bp::tag::bitwise_and_assign>()(i, j), (iexp &= jexp));
BOOST_CHECK(i == i0 && j == j0); iexp = i0; jexp = j0;
BOOST_CHECK_EQUAL(functor_of<bp::tag::bitwise_and_assign>()(j, i), (jexp &= iexp));
BOOST_CHECK(i == i0 && j == j0); iexp = i0; jexp = j0;
BOOST_CHECK_EQUAL(functor_of<bp::tag::bitwise_or_assign>()(i, j), (iexp |= jexp));
BOOST_CHECK(i == i0 && j == j0); iexp = i0; jexp = j0;
BOOST_CHECK_EQUAL(functor_of<bp::tag::bitwise_or_assign>()(j, i), (jexp |= iexp));
BOOST_CHECK(i == i0 && j == j0); iexp = i0; jexp = j0;
BOOST_CHECK_EQUAL(functor_of<bp::tag::bitwise_xor_assign>()(i, j), (iexp ^= jexp));
BOOST_CHECK(i == i0 && j == j0); iexp = i0; jexp = j0;
BOOST_CHECK_EQUAL(functor_of<bp::tag::bitwise_xor_assign>()(j, i), (jexp ^= iexp));
BOOST_CHECK(i == i0 && j == j0); iexp = i0; jexp = j0;
}
BOOST_AUTO_TEST_CASE(if_else_) {
BOOST_CHECK_EQUAL(functor_of<bp::tag::if_else_>()(true, i, j), (true ? iexp : jexp));
BOOST_CHECK(i == i0 && j == j0);
BOOST_CHECK_EQUAL(functor_of<bp::tag::if_else_>()(true, j, i), (true ? jexp : iexp));
BOOST_CHECK(i == i0 && j == j0);
BOOST_CHECK_EQUAL(functor_of<bp::tag::if_else_>()(false, i, j), (false ? iexp : jexp));
BOOST_CHECK(i == i0 && j == j0);
BOOST_CHECK_EQUAL(functor_of<bp::tag::if_else_>()(false, j, i), (false ? jexp : iexp));
BOOST_CHECK(i == i0 && j == j0);
}
BOOST_AUTO_TEST_SUITE_END()