#include "api/z3.h"
#include "api/api_util.h"
#include "api/api_context.h"
#include "util/debug.h"
#include <iostream>
void test_ast_map_basic_operations() {
Z3_config cfg = Z3_mk_config();
Z3_context ctx = Z3_mk_context(cfg);
Z3_ast_map m = Z3_mk_ast_map(ctx);
VERIFY(m != nullptr);
VERIFY(Z3_ast_map_size(ctx, m) == 0);
Z3_sort int_sort = Z3_mk_int_sort(ctx);
Z3_ast one = Z3_mk_numeral(ctx, "1", int_sort);
Z3_ast two = Z3_mk_numeral(ctx, "2", int_sort);
Z3_ast_map_insert(ctx, m, one, two);
VERIFY(Z3_ast_map_size(ctx, m) == 1);
VERIFY(Z3_ast_map_contains(ctx, m, one));
Z3_ast found = Z3_ast_map_find(ctx, m, one);
VERIFY(found != nullptr);
Z3_del_config(cfg);
Z3_del_context(ctx);
}
void test_ast_map_overwrite() {
Z3_config cfg = Z3_mk_config();
Z3_context ctx = Z3_mk_context(cfg);
Z3_ast_map m = Z3_mk_ast_map(ctx);
Z3_sort int_sort = Z3_mk_int_sort(ctx);
Z3_ast one = Z3_mk_numeral(ctx, "1", int_sort);
Z3_ast three = Z3_mk_numeral(ctx, "3", int_sort);
Z3_ast_map_insert(ctx, m, one, three);
VERIFY(Z3_ast_map_size(ctx, m) == 1);
Z3_ast_map_insert(ctx, m, one, one);
VERIFY(Z3_ast_map_size(ctx, m) == 1);
Z3_ast found = Z3_ast_map_find(ctx, m, one);
VERIFY(found != nullptr);
Z3_del_config(cfg);
Z3_del_context(ctx);
}
void test_ast_map_erase() {
Z3_config cfg = Z3_mk_config();
Z3_context ctx = Z3_mk_context(cfg);
Z3_ast_map m = Z3_mk_ast_map(ctx);
Z3_sort int_sort = Z3_mk_int_sort(ctx);
Z3_ast one = Z3_mk_numeral(ctx, "1", int_sort);
Z3_ast two = Z3_mk_numeral(ctx, "2", int_sort);
Z3_ast_map_insert(ctx, m, one, two);
Z3_ast_map_insert(ctx, m, two, one);
VERIFY(Z3_ast_map_size(ctx, m) == 2);
Z3_ast_map_erase(ctx, m, one);
VERIFY(Z3_ast_map_size(ctx, m) == 1);
VERIFY(!Z3_ast_map_contains(ctx, m, one));
VERIFY(Z3_ast_map_contains(ctx, m, two));
Z3_ast_map_erase(ctx, m, one);
VERIFY(Z3_ast_map_size(ctx, m) == 1);
Z3_ast_map_erase(ctx, m, two);
VERIFY(Z3_ast_map_size(ctx, m) == 0);
VERIFY(!Z3_ast_map_contains(ctx, m, two));
Z3_del_config(cfg);
Z3_del_context(ctx);
}
void test_ast_map_reset() {
Z3_config cfg = Z3_mk_config();
Z3_context ctx = Z3_mk_context(cfg);
Z3_ast_map m = Z3_mk_ast_map(ctx);
Z3_sort int_sort = Z3_mk_int_sort(ctx);
Z3_ast one = Z3_mk_numeral(ctx, "1", int_sort);
Z3_ast two = Z3_mk_numeral(ctx, "2", int_sort);
Z3_ast_map_insert(ctx, m, one, two);
Z3_ast_map_insert(ctx, m, two, one);
VERIFY(Z3_ast_map_size(ctx, m) == 2);
Z3_ast_map_reset(ctx, m);
VERIFY(Z3_ast_map_size(ctx, m) == 0);
VERIFY(!Z3_ast_map_contains(ctx, m, one));
VERIFY(!Z3_ast_map_contains(ctx, m, two));
Z3_del_config(cfg);
Z3_del_context(ctx);
}
void test_ast_map_keys() {
Z3_config cfg = Z3_mk_config();
Z3_context ctx = Z3_mk_context(cfg);
Z3_ast_map m = Z3_mk_ast_map(ctx);
Z3_sort int_sort = Z3_mk_int_sort(ctx);
Z3_symbol x_sym = Z3_mk_string_symbol(ctx, "x");
Z3_symbol y_sym = Z3_mk_string_symbol(ctx, "y");
Z3_symbol z_sym = Z3_mk_string_symbol(ctx, "z");
Z3_ast x = Z3_mk_const(ctx, x_sym, int_sort);
Z3_ast y = Z3_mk_const(ctx, y_sym, int_sort);
Z3_ast z = Z3_mk_const(ctx, z_sym, int_sort);
Z3_ast one = Z3_mk_int(ctx, 1, int_sort);
Z3_ast two = Z3_mk_int(ctx, 2, int_sort);
Z3_ast three = Z3_mk_int(ctx, 3, int_sort);
Z3_ast_map_insert(ctx, m, x, one);
Z3_ast_map_insert(ctx, m, y, two);
Z3_ast_map_insert(ctx, m, z, three);
Z3_ast_vector keys = Z3_ast_map_keys(ctx, m);
VERIFY(keys != nullptr);
VERIFY(Z3_ast_vector_size(ctx, keys) == 3);
bool found_x = false, found_y = false, found_z = false;
for (unsigned i = 0; i < Z3_ast_vector_size(ctx, keys); i++) {
Z3_ast key = Z3_ast_vector_get(ctx, keys, i);
if (Z3_is_eq_ast(ctx, key, x)) found_x = true;
if (Z3_is_eq_ast(ctx, key, y)) found_y = true;
if (Z3_is_eq_ast(ctx, key, z)) found_z = true;
}
VERIFY(found_x && found_y && found_z);
Z3_del_config(cfg);
Z3_del_context(ctx);
}
void test_ast_map_to_string() {
Z3_config cfg = Z3_mk_config();
Z3_context ctx = Z3_mk_context(cfg);
Z3_ast_map m = Z3_mk_ast_map(ctx);
Z3_string empty_str = Z3_ast_map_to_string(ctx, m);
VERIFY(empty_str != nullptr);
Z3_sort int_sort = Z3_mk_int_sort(ctx);
Z3_symbol x_sym = Z3_mk_string_symbol(ctx, "x");
Z3_ast x = Z3_mk_const(ctx, x_sym, int_sort);
Z3_ast one = Z3_mk_int(ctx, 1, int_sort);
Z3_ast_map_insert(ctx, m, x, one);
Z3_string str = Z3_ast_map_to_string(ctx, m);
VERIFY(str != nullptr);
VERIFY(strstr(str, "ast-map") != nullptr);
Z3_del_config(cfg);
Z3_del_context(ctx);
}
void test_ast_map_ref_counting() {
Z3_config cfg = Z3_mk_config();
Z3_context ctx = Z3_mk_context(cfg);
Z3_ast_map m = Z3_mk_ast_map(ctx);
Z3_ast_map_inc_ref(ctx, m);
Z3_ast_map_dec_ref(ctx, m);
Z3_ast_map_dec_ref(ctx, nullptr);
Z3_del_config(cfg);
Z3_del_context(ctx);
}
void test_ast_map_different_ast_types() {
Z3_config cfg = Z3_mk_config();
Z3_context ctx = Z3_mk_context(cfg);
Z3_ast_map m = Z3_mk_ast_map(ctx);
Z3_sort int_sort = Z3_mk_int_sort(ctx);
Z3_sort bool_sort = Z3_mk_bool_sort(ctx);
Z3_symbol x_sym = Z3_mk_string_symbol(ctx, "x");
Z3_symbol p_sym = Z3_mk_string_symbol(ctx, "p");
Z3_ast x = Z3_mk_const(ctx, x_sym, int_sort);
Z3_ast p = Z3_mk_const(ctx, p_sym, bool_sort);
Z3_ast zero = Z3_mk_int(ctx, 0, int_sort);
Z3_ast true_ast = Z3_mk_true(ctx);
Z3_ast false_ast = Z3_mk_false(ctx);
Z3_ast_map_insert(ctx, m, x, zero);
Z3_ast_map_insert(ctx, m, p, true_ast);
Z3_ast_map_insert(ctx, m, false_ast, true_ast);
VERIFY(Z3_ast_map_size(ctx, m) == 3);
Z3_ast found_x = Z3_ast_map_find(ctx, m, x);
VERIFY(Z3_is_eq_ast(ctx, found_x, zero));
Z3_ast found_p = Z3_ast_map_find(ctx, m, p);
VERIFY(Z3_is_eq_ast(ctx, found_p, true_ast));
Z3_ast found_false = Z3_ast_map_find(ctx, m, false_ast);
VERIFY(Z3_is_eq_ast(ctx, found_false, true_ast));
Z3_del_config(cfg);
Z3_del_context(ctx);
}
void test_ast_map_find_errors() {
Z3_config cfg = Z3_mk_config();
Z3_context ctx = Z3_mk_context(cfg);
Z3_ast_map m = Z3_mk_ast_map(ctx);
Z3_sort int_sort = Z3_mk_int_sort(ctx);
Z3_symbol x_sym = Z3_mk_string_symbol(ctx, "x");
Z3_ast x = Z3_mk_const(ctx, x_sym, int_sort);
Z3_ast result = Z3_ast_map_find(ctx, m, x);
VERIFY(result == nullptr);
Z3_del_config(cfg);
Z3_del_context(ctx);
}
void tst_api_ast_map() {
test_ast_map_basic_operations();
test_ast_map_overwrite();
test_ast_map_erase();
test_ast_map_reset();
test_ast_map_ref_counting();
test_ast_map_to_string();
}