@@ -103,3 +103,62 @@ SCENARIO("Unary eval on intervals", "[core][analyses][interval][eval]")
103
103
}
104
104
}
105
105
}
106
+
107
+ TEST_CASE (" binary eval switch" , " [core][analyses][interval]" )
108
+ {
109
+ const auto interval_of = [](const int value) {
110
+ return constant_interval_exprt (from_integer (value, signedbv_typet (32 )));
111
+ };
112
+
113
+ const auto interval_from_to = [](const int lower, const int upper) {
114
+ return constant_interval_exprt (
115
+ from_integer (lower, signedbv_typet (32 )),
116
+ from_integer (upper, signedbv_typet (32 )));
117
+ };
118
+
119
+ const auto boolean_interval = [](const bool value) {
120
+ return constant_interval_exprt::tvt_to_interval (tvt (value));
121
+ };
122
+
123
+ constant_interval_exprt two = interval_of (2 );
124
+ constant_interval_exprt five = interval_of (5 );
125
+ constant_interval_exprt eight = interval_of (8 );
126
+
127
+ SECTION (" Numeric operations" )
128
+ {
129
+ REQUIRE (five.eval (ID_plus, eight) == interval_of (13 ));
130
+ REQUIRE (five.eval (ID_minus, eight) == interval_of (-3 ));
131
+ REQUIRE (five.eval (ID_mult, eight) == interval_of (40 ));
132
+ REQUIRE (five.eval (ID_div, eight) == interval_of (0 ));
133
+ REQUIRE (five.eval (ID_mod, eight) == interval_from_to (0 , 5 ));
134
+ REQUIRE (five.eval (ID_shl, two) == interval_of (20 /* 5 << 2 */ ));
135
+ REQUIRE (five.eval (ID_ashr, two) == interval_of (1 /* 5 >> 2 */ ));
136
+ REQUIRE (five.eval (ID_bitor, eight) == interval_of (13 ));
137
+ REQUIRE (five.eval (ID_bitand, eight) == interval_of (0 ));
138
+ REQUIRE (five.eval (ID_bitxor, two) == interval_of (7 ));
139
+ }
140
+ SECTION (" Comparisons" )
141
+ {
142
+ REQUIRE (five.eval (ID_lt, eight) == boolean_interval (true ));
143
+ REQUIRE (five.eval (ID_le, eight) == boolean_interval (true ));
144
+ REQUIRE (five.eval (ID_gt, eight) == boolean_interval (false ));
145
+ REQUIRE (five.eval (ID_ge, eight) == boolean_interval (false ));
146
+ REQUIRE (five.eval (ID_equal, eight) == boolean_interval (false ));
147
+ REQUIRE (five.eval (ID_notequal, eight) == boolean_interval (true ));
148
+ }
149
+ SECTION (" Logical operators" )
150
+ {
151
+ const auto true_interval = boolean_interval (true );
152
+ const auto false_interval = boolean_interval (false );
153
+ REQUIRE (
154
+ true_interval.eval (ID_and, false_interval) == boolean_interval (false ));
155
+ REQUIRE (
156
+ true_interval.eval (ID_or, false_interval) == boolean_interval (true ));
157
+ REQUIRE (
158
+ true_interval.eval (ID_xor, false_interval) == boolean_interval (true ));
159
+ }
160
+ SECTION (" Invalid operations" )
161
+ {
162
+ REQUIRE (five.eval (ID_type, eight).is_top ());
163
+ }
164
+ }
0 commit comments