Skip to content

Commit 512734e

Browse files
Add some unit tests to test the behaviour
1 parent 3f892bb commit 512734e

File tree

1 file changed

+115
-0
lines changed

1 file changed

+115
-0
lines changed

unit/analyses/variable-sensitivity/value_set/abstract_value.cpp

Lines changed: 115 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ Author: Diffblue Ltd.
1212
#include <analyses/variable-sensitivity/variable_sensitivity_domain.h>
1313
#include <ansi-c/expr2c.h>
1414

15+
#include <analyses/variable-sensitivity/variable_sensitivity_object_factory.h>
1516
#include <sstream>
1617
#include <string>
1718
#include <util/arith_tools.h>
@@ -360,3 +361,117 @@ TEST_CASE(
360361

361362
REQUIRE(value_set.to_constant() == value);
362363
}
364+
365+
static abstract_environmentt get_value_set_abstract_environment()
366+
{
367+
vsd_configt config;
368+
config.advanced_sensitivities.new_value_set = true;
369+
config.context_tracking.data_dependency_context = false;
370+
config.context_tracking.last_write_context = false;
371+
variable_sensitivity_object_factoryt::instance().set_options(config);
372+
return abstract_environmentt{};
373+
}
374+
375+
TEST_CASE("Eval on an constant gives us that constant", VALUE_SET_TEST_TAGS)
376+
{
377+
const auto environment = get_value_set_abstract_environment();
378+
namespacet ns{symbol_tablet{}};
379+
const auto zero = from_integer(0, signedbv_typet{32});
380+
const auto eval_result = environment.eval(zero, ns);
381+
REQUIRE(eval_result != nullptr);
382+
REQUIRE(!eval_result->is_top());
383+
REQUIRE(!eval_result->is_bottom());
384+
const auto eval_result_as_value_set =
385+
std::dynamic_pointer_cast<const value_set_abstract_valuet>(
386+
eval_result->unwrap_context());
387+
REQUIRE(eval_result_as_value_set != nullptr);
388+
REQUIRE(eval_result_as_value_set->get_values().size() == 1);
389+
REQUIRE_THAT(eval_result_as_value_set->get_values(), ContainsAllOf{zero});
390+
}
391+
392+
TEST_CASE(
393+
"Eval on a plus expression with constant operands gives us the result of "
394+
"that plus",
395+
VALUE_SET_TEST_TAGS)
396+
{
397+
const auto environment = get_value_set_abstract_environment();
398+
namespacet ns{symbol_tablet{}};
399+
const auto s32_type = signedbv_typet{32};
400+
const auto three = from_integer(3, s32_type);
401+
const auto five = from_integer(5, s32_type);
402+
const auto three_plus_five = plus_exprt{three, five};
403+
404+
auto eval_result = environment.eval(three_plus_five, ns);
405+
REQUIRE(eval_result != nullptr);
406+
REQUIRE(!eval_result->is_top());
407+
REQUIRE(!eval_result->is_bottom());
408+
409+
const auto eval_result_as_value_set =
410+
std::dynamic_pointer_cast<const value_set_abstract_valuet>(
411+
eval_result->unwrap_context());
412+
REQUIRE(eval_result_as_value_set != nullptr);
413+
const auto eight = from_integer(8, s32_type);
414+
REQUIRE(eval_result_as_value_set->get_values().size() == 1);
415+
REQUIRE_THAT(eval_result_as_value_set->get_values(), ContainsAllOf{eight});
416+
}
417+
418+
TEST_CASE(
419+
"Eval on a multiply expression on symbols gives us the results of that "
420+
"multiplication",
421+
VALUE_SET_TEST_TAGS)
422+
{
423+
auto environment = get_value_set_abstract_environment();
424+
symbol_tablet symbol_table;
425+
426+
const auto s32_type = signedbv_typet{32};
427+
428+
symbolt a_symbol{};
429+
a_symbol.name = a_symbol.pretty_name = a_symbol.base_name = "a";
430+
a_symbol.is_lvalue = true;
431+
a_symbol.type = s32_type;
432+
symbol_table.add(a_symbol);
433+
434+
symbolt b_symbol{};
435+
b_symbol.name = b_symbol.pretty_name = b_symbol.base_name = "b";
436+
b_symbol.is_lvalue = true;
437+
b_symbol.type = s32_type;
438+
symbol_table.add(b_symbol);
439+
symbol_table.add(b_symbol);
440+
441+
const namespacet ns{symbol_table};
442+
443+
const auto three = from_integer(3, s32_type);
444+
const auto four = from_integer(4, s32_type);
445+
const auto five = from_integer(5, s32_type);
446+
const auto six = from_integer(6, s32_type);
447+
448+
const auto three_or_five = std::make_shared<const value_set_abstract_valuet>(
449+
s32_type, value_set_abstract_valuet::valuest{three, five});
450+
environment.assign(a_symbol.symbol_expr(), three_or_five, ns);
451+
452+
const auto four_or_six = std::make_shared<const value_set_abstract_valuet>(
453+
s32_type, value_set_abstract_valuet::valuest{four, six});
454+
environment.assign(b_symbol.symbol_expr(), four_or_six, ns);
455+
456+
const auto a_times_b =
457+
mult_exprt{a_symbol.symbol_expr(), b_symbol.symbol_expr()};
458+
459+
const auto eval_result = environment.eval(a_times_b, ns);
460+
REQUIRE(eval_result != nullptr);
461+
REQUIRE(!eval_result->is_top());
462+
REQUIRE(!eval_result->is_bottom());
463+
464+
const auto eval_result_as_value_set =
465+
std::dynamic_pointer_cast<const value_set_abstract_valuet>(
466+
eval_result->unwrap_context());
467+
REQUIRE(eval_result_as_value_set != nullptr);
468+
REQUIRE(eval_result_as_value_set->get_values().size() == 4);
469+
470+
const auto twelve = from_integer(12, s32_type);
471+
const auto eighteen = from_integer(18, s32_type);
472+
const auto twenty = from_integer(20, s32_type);
473+
const auto twentyfour = from_integer(30, s32_type);
474+
REQUIRE_THAT(
475+
eval_result_as_value_set->get_values(),
476+
ContainsAllOf(twelve, eighteen, twenty, twentyfour));
477+
}

0 commit comments

Comments
 (0)