|
25 | 25 | // strings instead of `{?}` being printed. It works because catch uses the
|
26 | 26 | // appropriate overload of `operator<<` where it exists.
|
27 | 27 | #include <util/byte_operators.h>
|
| 28 | +#include <util/c_types.h> |
28 | 29 |
|
29 | 30 | #include <goto-symex/path_storage.h>
|
30 | 31 | #include <solvers/smt2_incremental/smt_to_smt2_string.h>
|
@@ -908,3 +909,46 @@ TEST_CASE(
|
908 | 909 | REQUIRE(test.sent_commands == expected_commands);
|
909 | 910 | }
|
910 | 911 | }
|
| 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