Skip to content

Commit 26ae9a9

Browse files
Unit test improve convert exprt to string exprt
Structure using GIVEN WHEN THEN
1 parent b76b116 commit 26ae9a9

File tree

1 file changed

+54
-27
lines changed

1 file changed

+54
-27
lines changed

unit/java_bytecode/java_string_library_preprocess/convert_exprt_to_string_exprt.cpp

Lines changed: 54 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@
1717
#include <util/namespace.h>
1818
#include <langapi/mode.h>
1919

20-
exprt convert_exprt_to_string_exprt_unit_test(
20+
refined_string_exprt convert_exprt_to_string_exprt_unit_test(
2121
java_string_library_preprocesst &preprocess,
2222
const exprt &deref,
2323
const source_locationt &loc,
@@ -30,30 +30,57 @@ exprt convert_exprt_to_string_exprt_unit_test(
3030

3131
TEST_CASE("Convert exprt to string exprt")
3232
{
33-
source_locationt loc;
34-
symbol_tablet symbol_table;
35-
namespacet ns(symbol_table);
36-
code_blockt code;
37-
java_string_library_preprocesst preprocess;
38-
preprocess.add_string_type("java.lang.String", symbol_table);
39-
symbol_typet java_string_type("java::java.lang.String");
40-
symbol_exprt expr("a", pointer_type(java_string_type));
41-
convert_exprt_to_string_exprt_unit_test(
42-
preprocess, expr, loc, symbol_table, code);
43-
register_language(new_java_bytecode_language);
44-
45-
std::vector<std::string> code_string;
46-
for(auto op : code.operands())
47-
code_string.push_back(from_expr(ns, "", op));
48-
49-
REQUIRE(code_string.size()==7);
50-
REQUIRE(code_string[0]=="int cprover_string_length$1;");
51-
REQUIRE(code_string[1]=="char cprover_string_array$2[INFINITY()];");
52-
REQUIRE(code_string[2]=="cprover_string_length$1 = a->length;");
53-
REQUIRE(code_string[3]=="__CPROVER_assume(!(a->data == null));");
54-
REQUIRE(code_string[4]=="cprover_string_array$2 = *a->data;");
55-
REQUIRE(code_string[5]=="struct __CPROVER_refined_string_type { int length; "
56-
"char content[INFINITY()]; } cprover_string$3;");
57-
REQUIRE(code_string[6]=="cprover_string$3 = { .=cprover_string_length$1, "
58-
".=cprover_string_array$2 };");
33+
GIVEN("A location, a string expression, and a symbol table")
34+
{
35+
source_locationt loc;
36+
symbol_tablet symbol_table;
37+
namespacet ns(symbol_table);
38+
code_blockt code;
39+
java_string_library_preprocesst preprocess;
40+
preprocess.add_string_type("java.lang.String", symbol_table);
41+
symbol_typet java_string_type("java::java.lang.String");
42+
symbol_exprt expr("a", pointer_type(java_string_type));
43+
44+
WHEN("String expression is converted to refined string expression")
45+
{
46+
refined_string_exprt string_expr =
47+
convert_exprt_to_string_exprt_unit_test(
48+
preprocess, expr, loc, symbol_table, code);
49+
50+
THEN("The type of the returd expression is that of refined strings")
51+
{
52+
REQUIRE(string_expr.id() == ID_struct);
53+
REQUIRE(is_refined_string_type(string_expr.type()));
54+
}
55+
56+
THEN("Code is produced")
57+
{
58+
register_language(new_java_bytecode_language);
59+
60+
std::vector<std::string> code_string;
61+
const std::regex spaces("\\s+");
62+
const std::regex numbers("\\$[0-9]*");
63+
for(auto op : code.operands())
64+
{
65+
const std::string line = from_expr(ns, "", op);
66+
code_string.push_back(
67+
std::regex_replace(
68+
std::regex_replace(line, spaces, " "), numbers, ""));
69+
}
70+
71+
const std::vector<std::string> reference_code = {
72+
"char *cprover_string_content;",
73+
"int cprover_string_length;",
74+
"cprover_string_length = a->length;",
75+
"cprover_string_content = a->data;"};
76+
77+
for(std::size_t i = 0;
78+
i < code_string.size() && i < reference_code.size();
79+
++i)
80+
REQUIRE(code_string[i] == reference_code[i]);
81+
82+
REQUIRE(code_string.size() == reference_code.size());
83+
}
84+
}
85+
}
5986
}

0 commit comments

Comments
 (0)