Skip to content

Commit 6673edd

Browse files
committed
Initial unit tests to capture array write behaviour
1 parent 9750b53 commit 6673edd

File tree

2 files changed

+96
-0
lines changed

2 files changed

+96
-0
lines changed

unit/Makefile

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ SRC += analyses/ai/ai.cpp \
2222
analyses/variable-sensitivity/constant_abstract_value/to_predicate.cpp \
2323
analyses/variable-sensitivity/constant_pointer_abstract_object/to_predicate.cpp \
2424
analyses/variable-sensitivity/full_array_abstract_object/array_builder.cpp \
25+
analyses/variable-sensitivity/full_array_abstract_object/maximum_length.cpp \
2526
analyses/variable-sensitivity/full_array_abstract_object/merge.cpp \
2627
analyses/variable-sensitivity/full_array_abstract_object/to_predicate.cpp \
2728
analyses/variable-sensitivity/eval.cpp \
Lines changed: 95 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,95 @@
1+
/*******************************************************************\
2+
3+
Module: Tests for full_array_abstract_objectt maximum length
4+
5+
Author: Jez Higgins
6+
7+
\*******************************************************************/
8+
9+
#include "array_builder.h"
10+
#include <analyses/variable-sensitivity/variable_sensitivity_object_factory.h>
11+
#include <analyses/variable-sensitivity/variable_sensitivity_test_helpers.h>
12+
#include <testing-utils/use_catch.h>
13+
#include <util/arith_tools.h>
14+
#include <util/bitvector_types.h>
15+
#include <util/mathematical_types.h>
16+
17+
using abstract_object_ptrt = std::shared_ptr<const abstract_objectt>;
18+
19+
static abstract_object_ptrt write_array(
20+
const abstract_object_ptrt &array,
21+
int index,
22+
int new_value,
23+
abstract_environmentt &env,
24+
namespacet &ns)
25+
{
26+
const typet type = signedbv_typet(32);
27+
28+
return array->write(
29+
env,
30+
ns,
31+
std::stack<exprt>(),
32+
index_exprt(nil_exprt(), from_integer(index, type)),
33+
env.eval(from_integer(new_value, type), ns),
34+
false);
35+
}
36+
37+
SCENARIO(
38+
"arrays have maximum length",
39+
"[core][analyses][variable-sensitivity][full_array_abstract_object][max_"
40+
"array]")
41+
{
42+
auto object_factory = variable_sensitivity_object_factoryt::configured_with(
43+
vsd_configt::value_set());
44+
abstract_environmentt environment(object_factory);
45+
environment.make_top();
46+
symbol_tablet symbol_table;
47+
namespacet ns(symbol_table);
48+
49+
WHEN("Under maximum size, array = {1, 2, 3}")
50+
{
51+
WHEN("array[3] = 4")
52+
{
53+
auto array = build_array({1, 2, 3}, environment, ns);
54+
55+
auto updated = write_array(array, 3, 4, environment, ns);
56+
57+
THEN("array equals {1, 2, 3, 4}")
58+
{
59+
EXPECT_INDEX(updated, 0, 1, environment, ns);
60+
EXPECT_INDEX(updated, 1, 2, environment, ns);
61+
EXPECT_INDEX(updated, 2, 3, environment, ns);
62+
EXPECT_INDEX(updated, 3, 4, environment, ns);
63+
}
64+
}
65+
WHEN("a[0] = 99")
66+
{
67+
auto array = build_array({1, 2, 3}, environment, ns);
68+
69+
auto updated = write_array(array, 0, 99, environment, ns);
70+
71+
THEN("array equals {99, 2, 3}")
72+
{
73+
EXPECT_INDEX(updated, 0, 99, environment, ns);
74+
EXPECT_INDEX(updated, 1, 2, environment, ns);
75+
EXPECT_INDEX(updated, 2, 3, environment, ns);
76+
}
77+
}
78+
WHEN("a[5] = 99")
79+
{
80+
auto array = build_array({1, 2, 3}, environment, ns);
81+
82+
auto updated = write_array(array, 5, 99, environment, ns);
83+
84+
THEN("array equals {1, 2, 3, <empty>, <empty>, 99}")
85+
{
86+
EXPECT_INDEX(updated, 0, 1, environment, ns);
87+
EXPECT_INDEX(updated, 1, 2, environment, ns);
88+
EXPECT_INDEX(updated, 2, 3, environment, ns);
89+
EXPECT_EMPTY_INDEX(updated, 3, environment, ns);
90+
EXPECT_EMPTY_INDEX(updated, 4, environment, ns);
91+
EXPECT_INDEX(updated, 5, 99, environment, ns);
92+
}
93+
}
94+
}
95+
}

0 commit comments

Comments
 (0)