Skip to content

Commit 9273d5a

Browse files
author
Enrico Steffinlongo
committed
Add unit test for non-lowered terms get_identifier
1 parent afbe00f commit 9273d5a

File tree

1 file changed

+44
-0
lines changed

1 file changed

+44
-0
lines changed

unit/solvers/smt2_incremental/smt2_incremental_decision_procedure.cpp

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@
2525
// strings instead of `{?}` being printed. It works because catch uses the
2626
// appropriate overload of `operator<<` where it exists.
2727
#include <util/byte_operators.h>
28+
#include <util/c_types.h>
2829

2930
#include <goto-symex/path_storage.h>
3031
#include <solvers/smt2_incremental/smt_to_smt2_string.h>
@@ -908,3 +909,46 @@ TEST_CASE(
908909
REQUIRE(test.sent_commands == expected_commands);
909910
}
910911
}
912+
913+
static c_enum_typet make_c_enum_type(
914+
const unsignedbv_typet &underlying_type,
915+
unsigned int value_count)
916+
{
917+
c_enum_typet enum_type{underlying_type};
918+
919+
auto &members = enum_type.members();
920+
members.reserve(value_count);
921+
922+
for(unsigned int i = 0; i < value_count; ++i)
923+
{
924+
c_enum_typet::c_enum_membert member;
925+
member.set_identifier("V" + std::to_string(i));
926+
member.set_base_name("V" + std::to_string(i));
927+
member.set_value(integer2bvrep(i, underlying_type.get_width()));
928+
members.push_back(member);
929+
}
930+
return enum_type;
931+
}
932+
933+
TEST_CASE(
934+
"smt2_incremental_decision_proceduret getting enum values back from solver.",
935+
"[core][smt2_incremental]")
936+
{
937+
auto test = decision_procedure_test_environmentt::make();
938+
const unsignedbv_typet enum_underlying_type{32};
939+
const c_enum_typet enum_type = make_c_enum_type(enum_underlying_type, 5);
940+
const type_symbolt enum_symbol{"my_enum", enum_type, ID_C};
941+
test.symbol_table.insert(enum_symbol);
942+
const c_enum_tag_typet enum_tag{enum_symbol.name};
943+
const symbolt enum_value_symbol{"my_enum_value", enum_tag, ID_C};
944+
test.symbol_table.insert(enum_value_symbol);
945+
const auto symbol_expr = enum_value_symbol.symbol_expr();
946+
const auto eq_expr = equal_exprt{symbol_expr, symbol_expr};
947+
948+
test.procedure.handle(eq_expr);
949+
test.mock_responses.push_back(
950+
smt_get_value_responset{{{"B0", smt_bool_literal_termt{true}}}});
951+
auto returned = test.procedure.get(eq_expr);
952+
953+
REQUIRE(returned == constant_exprt{"true", bool_typet{}});
954+
}

0 commit comments

Comments
 (0)