Skip to content

Commit e366841

Browse files
authored
Merge pull request #4733 from romainbrenguier/unit-test/ssa_exprt
Unit test ssa_exprt
2 parents 6bee122 + fb7abbd commit e366841

File tree

2 files changed

+187
-0
lines changed

2 files changed

+187
-0
lines changed

unit/Makefile

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -74,6 +74,7 @@ SRC += analyses/ai/ai.cpp \
7474
util/simplify_expr.cpp \
7575
util/small_map.cpp \
7676
util/small_shared_n_way_ptr.cpp \
77+
util/ssa_expr.cpp \
7778
util/std_expr.cpp \
7879
util/string2int.cpp \
7980
util/string_utils/join_string.cpp \

unit/util/ssa_expr.cpp

Lines changed: 186 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,186 @@
1+
/*******************************************************************\
2+
3+
Module: Unit test for ssa_expr.h/ssa_expr.cpp
4+
5+
Author: Romain Brenguier, [email protected]
6+
7+
\*******************************************************************/
8+
9+
#include <testing-utils/use_catch.h>
10+
11+
#include <util/arith_tools.h>
12+
#include <util/ssa_expr.h>
13+
#include <util/symbol_table.h>
14+
15+
TEST_CASE("Constructor of ssa_exprt", "[unit][util][ssa_expr]")
16+
{
17+
GIVEN("An expression containing member access, array access and a symbol")
18+
{
19+
const signedbv_typet int_type{32};
20+
const array_typet array_type{int_type, from_integer(10, int_type)};
21+
std::vector<struct_typet::componentt> components;
22+
components.emplace_back("array_field", array_type);
23+
const struct_typet struct_type{components};
24+
const symbol_exprt symbol{"sym", struct_type};
25+
const index_exprt index{member_exprt{symbol, components.back()},
26+
from_integer(9, int_type)};
27+
28+
WHEN("construct an ssa_exprt from `sym.array_field[9]`")
29+
{
30+
const ssa_exprt ssa{index};
31+
THEN("the ssa_exprt has identifier 'sym..array_field[[9]]'")
32+
{
33+
REQUIRE(ssa.get_identifier() == "sym..array_field[[9]]");
34+
REQUIRE(ssa.get_l1_object_identifier() == "sym..array_field[[9]]");
35+
}
36+
THEN("the ssa_exprt has no level set")
37+
{
38+
REQUIRE(ssa.get_level_0() == irep_idt{});
39+
REQUIRE(ssa.get_level_1() == irep_idt{});
40+
REQUIRE(ssa.get_level_2() == irep_idt{});
41+
}
42+
}
43+
}
44+
}
45+
46+
TEST_CASE("Set level", "[unit][util][ssa_expr]")
47+
{
48+
GIVEN("An SSA expression constructed from a symbol")
49+
{
50+
const signedbv_typet int_type{32};
51+
const symbol_exprt symbol{"sym", int_type};
52+
ssa_exprt ssa(symbol);
53+
54+
WHEN("set_level_0")
55+
{
56+
ssa.set_level_0(1);
57+
REQUIRE(ssa.get_level_0() == "1");
58+
REQUIRE(ssa.get_level_1() == irep_idt{});
59+
REQUIRE(ssa.get_level_2() == irep_idt{});
60+
REQUIRE(ssa.get_original_expr() == symbol);
61+
REQUIRE(ssa.get_identifier() == "sym!1");
62+
REQUIRE(ssa.get_l1_object_identifier() == "sym!1");
63+
}
64+
65+
WHEN("set_level_1")
66+
{
67+
ssa.set_level_1(3);
68+
REQUIRE(ssa.get_level_0() == irep_idt{});
69+
REQUIRE(ssa.get_level_1() == "3");
70+
REQUIRE(ssa.get_level_2() == irep_idt{});
71+
REQUIRE(ssa.get_original_expr() == symbol);
72+
REQUIRE(ssa.get_identifier() == "sym@3");
73+
REQUIRE(ssa.get_l1_object_identifier() == "sym@3");
74+
}
75+
76+
WHEN("set_level_2")
77+
{
78+
ssa.set_level_2(7);
79+
REQUIRE(ssa.get_level_0() == irep_idt{});
80+
REQUIRE(ssa.get_level_1() == irep_idt{});
81+
REQUIRE(ssa.get_level_2() == "7");
82+
REQUIRE(ssa.get_original_expr() == symbol);
83+
REQUIRE(ssa.get_identifier() == "sym#7");
84+
REQUIRE(ssa.get_l1_object_identifier() == "sym");
85+
}
86+
}
87+
}
88+
89+
TEST_CASE("Set expression", "[unit][util][ssa_expr]")
90+
{
91+
GIVEN("An SSA expression constructed from a symbol")
92+
{
93+
const signedbv_typet int_type{32};
94+
const array_typet array_type{int_type, from_integer(10, int_type)};
95+
const symbol_exprt symbol{"sym", array_type};
96+
const index_exprt index{symbol, from_integer(9, int_type)};
97+
ssa_exprt ssa(symbol);
98+
ssa.set_level_0(1);
99+
ssa.set_level_1(3);
100+
ssa.set_level_2(7);
101+
102+
WHEN("call set_expression with an index_exprt")
103+
{
104+
ssa.set_expression(index);
105+
THEN("Indices are preserved")
106+
{
107+
REQUIRE(ssa.get_level_0() == "1");
108+
REQUIRE(ssa.get_level_1() == "3");
109+
REQUIRE(ssa.get_level_2() == "7");
110+
}
111+
THEN("The underlying expression has been replaced")
112+
{
113+
REQUIRE(ssa.get_original_expr() == index);
114+
}
115+
THEN("The identifiers are updated")
116+
{
117+
REQUIRE(ssa.get_identifier() == "sym!1@3#7[[9]]");
118+
REQUIRE(ssa.get_l1_object_identifier() == "sym!1@3[[9]]");
119+
}
120+
}
121+
}
122+
}
123+
124+
TEST_CASE("ssa_exprt::get_object_name", "[unit][util][ssa_expr]")
125+
{
126+
GIVEN("An ssa_exprt constructed from a symbol")
127+
{
128+
const signedbv_typet int_type{32};
129+
const symbol_exprt symbol{"sym", int_type};
130+
const ssa_exprt ssa{symbol};
131+
132+
THEN("The object name is the same as the symbol name")
133+
{
134+
REQUIRE(ssa.get_object_name() == "sym");
135+
}
136+
}
137+
138+
GIVEN("An expression containing member access, array access and a symbol")
139+
{
140+
const signedbv_typet int_type{32};
141+
const array_typet array_type{int_type, from_integer(10, int_type)};
142+
std::vector<struct_typet::componentt> components;
143+
components.emplace_back("array_field", array_type);
144+
const struct_typet struct_type{components};
145+
const symbol_exprt symbol{"sym", struct_type};
146+
const index_exprt index{member_exprt{symbol, components.back()},
147+
from_integer(9, int_type)};
148+
const ssa_exprt ssa{symbol};
149+
150+
THEN("The object name is the same as the symbol")
151+
{
152+
REQUIRE(ssa.get_object_name() == "sym");
153+
}
154+
}
155+
}
156+
157+
TEST_CASE("ssa_exprt::get_l1_object", "[unit][util][ssa_expr]")
158+
{
159+
GIVEN("An ssa_exprt containing member access, array access and a symbol")
160+
{
161+
const signedbv_typet int_type{32};
162+
const array_typet array_type{int_type, from_integer(10, int_type)};
163+
std::vector<struct_typet::componentt> components;
164+
components.emplace_back("array_field", array_type);
165+
const struct_typet struct_type{components};
166+
const symbol_exprt symbol{"sym", struct_type};
167+
const index_exprt index{member_exprt{symbol, components.back()},
168+
from_integer(9, int_type)};
169+
ssa_exprt ssa{symbol};
170+
ssa.set_level_0(1);
171+
ssa.set_level_1(3);
172+
ssa.set_level_2(7);
173+
174+
WHEN("get_l1_object is called")
175+
{
176+
const ssa_exprt l1_object = ssa.get_l1_object();
177+
THEN("level 0 and level 1 are the same, l2 is removed")
178+
{
179+
REQUIRE(l1_object.get_level_0() == "1");
180+
REQUIRE(l1_object.get_level_1() == "3");
181+
REQUIRE(l1_object.get_level_2() == irep_idt{});
182+
REQUIRE(l1_object.get_identifier() == "sym!1@3");
183+
}
184+
}
185+
}
186+
}

0 commit comments

Comments
 (0)