Skip to content

Commit a5b5674

Browse files
committed
Term visitor test
1 parent 5ffdc7d commit a5b5674

File tree

1 file changed

+118
-0
lines changed

1 file changed

+118
-0
lines changed

unit/solvers/smt2_incremental/smt_terms.cpp

Lines changed: 118 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,8 @@
66

77
#include <util/mp_arith.h>
88

9+
#include <type_traits>
10+
911
TEST_CASE("smt_bool_literal_termt upcasts.", "[core][smt2_incremental]")
1012
{
1113
smt_termt term{smt_bool_literal_termt{true}};
@@ -100,3 +102,119 @@ TEST_CASE("smt_termt equality.", "[core][smt2_incremental]")
100102
CHECK_FALSE(not_false == not_true);
101103
CHECK(not_false == smt_not_termt{smt_bool_literal_termt{false}});
102104
}
105+
106+
template <typename expected_termt>
107+
class term_visit_type_checkert final : public smt_term_const_downcast_visitort
108+
{
109+
public:
110+
bool expected_term_visited = false;
111+
bool unexpected_term_visited = false;
112+
113+
void visit(const smt_bool_literal_termt &) override
114+
{
115+
if(std::is_same<expected_termt, smt_bool_literal_termt>::value)
116+
{
117+
expected_term_visited = true;
118+
}
119+
else
120+
{
121+
unexpected_term_visited = true;
122+
}
123+
}
124+
125+
void visit(const smt_not_termt &) override
126+
{
127+
if(std::is_same<expected_termt, smt_not_termt>::value)
128+
{
129+
expected_term_visited = true;
130+
}
131+
else
132+
{
133+
unexpected_term_visited = true;
134+
}
135+
}
136+
137+
void visit(const smt_identifier_termt &) override
138+
{
139+
if(std::is_same<expected_termt, smt_identifier_termt>::value)
140+
{
141+
expected_term_visited = true;
142+
}
143+
else
144+
{
145+
unexpected_term_visited = true;
146+
}
147+
}
148+
149+
void visit(const smt_bit_vector_constant_termt &) override
150+
{
151+
if(std::is_same<expected_termt, smt_bit_vector_constant_termt>::value)
152+
{
153+
expected_term_visited = true;
154+
}
155+
else
156+
{
157+
unexpected_term_visited = true;
158+
}
159+
}
160+
161+
void visit(const smt_function_application_termt &) override
162+
{
163+
if(std::is_same<expected_termt, smt_function_application_termt>::value)
164+
{
165+
expected_term_visited = true;
166+
}
167+
else
168+
{
169+
unexpected_term_visited = true;
170+
}
171+
}
172+
};
173+
174+
template <typename term_typet>
175+
term_typet make_test_value();
176+
177+
template <>
178+
smt_bool_literal_termt make_test_value<smt_bool_literal_termt>()
179+
{
180+
return smt_bool_literal_termt{false};
181+
}
182+
183+
template <>
184+
smt_not_termt make_test_value<smt_not_termt>()
185+
{
186+
return smt_not_termt{smt_bool_literal_termt{false}};
187+
}
188+
189+
template <>
190+
smt_identifier_termt make_test_value<smt_identifier_termt>()
191+
{
192+
return smt_identifier_termt{"foo", smt_bool_sortt{}};
193+
}
194+
195+
template <>
196+
smt_bit_vector_constant_termt make_test_value<smt_bit_vector_constant_termt>()
197+
{
198+
return smt_bit_vector_constant_termt{0, 32};
199+
}
200+
201+
template <>
202+
smt_function_application_termt make_test_value<smt_function_application_termt>()
203+
{
204+
return smt_function_application_termt{smt_bool_sortt{}, "bar", {}};
205+
}
206+
207+
TEMPLATE_TEST_CASE(
208+
"smt_termt::accept(visitor)",
209+
"[core][smt2_incremental]",
210+
smt_bool_literal_termt,
211+
smt_not_termt,
212+
smt_identifier_termt,
213+
smt_bit_vector_constant_termt,
214+
smt_function_application_termt)
215+
{
216+
term_visit_type_checkert<TestType> checker;
217+
make_test_value<TestType>().accept(checker);
218+
CHECK(checker.expected_term_visited);
219+
CHECK_FALSE(checker.unexpected_term_visited);
220+
}

0 commit comments

Comments
 (0)