Add set_int type

This type can be used to store sets of integers. It is intended to
be used to keep track of the display numbers allocated to sessions and
SCP connections.

A test suite for the new type is also added.
This commit is contained in:
matt335672
2025-06-13 12:06:14 +01:00
parent 4508de05c3
commit 7baa27a59f
7 changed files with 522 additions and 0 deletions
+1
View File
@@ -18,6 +18,7 @@ test_common_SOURCES = \
test_list_calls.c \
test_list16_calls.c \
test_parse.c \
test_set_int.c \
test_string_calls.c \
test_string_calls_unicode.c \
test_os_calls.c \
+1
View File
@@ -11,6 +11,7 @@ Suite *make_suite_test_fifo(void);
Suite *make_suite_test_list(void);
Suite *make_suite_test_list16(void);
Suite *make_suite_test_parse(void);
Suite *make_suite_test_set_int(void);
Suite *make_suite_test_string(void);
Suite *make_suite_test_string_unicode(void);
Suite *make_suite_test_os_calls(void);
+1
View File
@@ -50,6 +50,7 @@ int main (void)
srunner_add_suite(sr, make_suite_test_list());
srunner_add_suite(sr, make_suite_test_list16());
srunner_add_suite(sr, make_suite_test_parse());
srunner_add_suite(sr, make_suite_test_set_int());
srunner_add_suite(sr, make_suite_test_string());
srunner_add_suite(sr, make_suite_test_string_unicode());
srunner_add_suite(sr, make_suite_test_os_calls());
+189
View File
@@ -0,0 +1,189 @@
#if defined(HAVE_CONFIG_H)
#include "config_ac.h"
#endif
#include <limits.h>
#include "set_int.h"
#include "test_common.h"
START_TEST(test_basic__bad_args)
{
struct set_int *set = set_int_init(10, 1);
ck_assert_ptr_eq(set, NULL);
// Check for no segfaults with a NULL set
set_int_add(set, 10);
set_int_remove(set, 10);
ck_assert_int_eq(set_int_contains(set, 10), 0);
set_int_add_all(set);
set_int_remove_all(set);
int val = 0;
ck_assert_int_eq(set_int_get_next(set, &val), 0);
set_int_delete(set);
}
END_TEST
START_TEST(test_basic__one_to_ten)
{
int i;
struct set_int *set = set_int_init(1, 10);
ck_assert_ptr_ne(set, NULL);
set_int_add(set, 0); // out-of-range
for (i = 1 ; i <= 5; ++i)
{
set_int_add(set, i);
}
set_int_add(set, 11); // out-of-range
ck_assert_int_eq(set_int_contains(set, 0), 0);
ck_assert_int_eq(set_int_contains(set, 1), 1);
ck_assert_int_eq(set_int_contains(set, 2), 1);
ck_assert_int_eq(set_int_contains(set, 3), 1);
ck_assert_int_eq(set_int_contains(set, 4), 1);
ck_assert_int_eq(set_int_contains(set, 5), 1);
ck_assert_int_eq(set_int_contains(set, 6), 0);
ck_assert_int_eq(set_int_contains(set, 7), 0);
ck_assert_int_eq(set_int_contains(set, 8), 0);
ck_assert_int_eq(set_int_contains(set, 9), 0);
ck_assert_int_eq(set_int_contains(set, 10), 0);
ck_assert_int_eq(set_int_contains(set, 11), 0);
set_int_delete(set);
}
END_TEST
START_TEST(test_basic__add_remove_all)
{
struct set_int *set = set_int_init(1, 10);
ck_assert_ptr_ne(set, NULL);
set_int_add(set, 0); // out-of-range
set_int_add_all(set);
set_int_add(set, 11); // out-of-range
ck_assert_int_eq(set_int_contains(set, 0), 0);
ck_assert_int_eq(set_int_contains(set, 1), 1);
ck_assert_int_eq(set_int_contains(set, 2), 1);
ck_assert_int_eq(set_int_contains(set, 3), 1);
ck_assert_int_eq(set_int_contains(set, 4), 1);
ck_assert_int_eq(set_int_contains(set, 5), 1);
ck_assert_int_eq(set_int_contains(set, 6), 1);
ck_assert_int_eq(set_int_contains(set, 7), 1);
ck_assert_int_eq(set_int_contains(set, 8), 1);
ck_assert_int_eq(set_int_contains(set, 9), 1);
ck_assert_int_eq(set_int_contains(set, 10), 1);
ck_assert_int_eq(set_int_contains(set, 11), 0);
set_int_remove_all(set);
ck_assert_int_eq(set_int_contains(set, 1), 0);
ck_assert_int_eq(set_int_contains(set, 2), 0);
ck_assert_int_eq(set_int_contains(set, 3), 0);
ck_assert_int_eq(set_int_contains(set, 4), 0);
ck_assert_int_eq(set_int_contains(set, 5), 0);
ck_assert_int_eq(set_int_contains(set, 6), 0);
ck_assert_int_eq(set_int_contains(set, 7), 0);
ck_assert_int_eq(set_int_contains(set, 8), 0);
ck_assert_int_eq(set_int_contains(set, 9), 0);
ck_assert_int_eq(set_int_contains(set, 10), 0);
set_int_delete(set);
}
END_TEST
START_TEST(test_basic__single_element)
{
#define VAL -1000
struct set_int *set = set_int_init(VAL, VAL);
ck_assert_ptr_ne(set, NULL);
set_int_add(set, VAL - 1); // out-of-range
set_int_add(set, VAL);
set_int_add(set, VAL + 1); // out-of-range
ck_assert_int_eq(set_int_contains(set, VAL - 1), 0);
ck_assert_int_eq(set_int_contains(set, VAL), 1);
ck_assert_int_eq(set_int_contains(set, VAL + 1), 0);
set_int_add_all(set);
ck_assert_int_eq(set_int_contains(set, VAL - 1), 0);
ck_assert_int_eq(set_int_contains(set, VAL), 1);
ck_assert_int_eq(set_int_contains(set, VAL + 1), 0);
set_int_remove(set, VAL);
ck_assert_int_eq(set_int_contains(set, VAL), 0);
set_int_delete(set);
#undef VAL
}
END_TEST
START_TEST(test_basic__get_next)
{
int i;
struct set_int *set = set_int_init(0, 1000);
ck_assert_ptr_ne(set, NULL);
for (i = 1 ; i <= 10; ++i)
{
set_int_add(set, i);
}
set_int_add(set, 500);
int val = INT_MIN;
ck_assert_int_eq(set_int_get_next(set, &val), 1);
ck_assert_int_eq(val, 1);
ck_assert_int_eq(set_int_get_next(set, &val), 1);
ck_assert_int_eq(val, 2);
ck_assert_int_eq(set_int_get_next(set, &val), 1);
ck_assert_int_eq(val, 3);
ck_assert_int_eq(set_int_get_next(set, &val), 1);
ck_assert_int_eq(val, 4);
ck_assert_int_eq(set_int_get_next(set, &val), 1);
ck_assert_int_eq(val, 5);
ck_assert_int_eq(set_int_get_next(set, &val), 1);
ck_assert_int_eq(val, 6);
ck_assert_int_eq(set_int_get_next(set, &val), 1);
ck_assert_int_eq(val, 7);
ck_assert_int_eq(set_int_get_next(set, &val), 1);
ck_assert_int_eq(val, 8);
ck_assert_int_eq(set_int_get_next(set, &val), 1);
ck_assert_int_eq(val, 9);
ck_assert_int_eq(set_int_get_next(set, &val), 1);
ck_assert_int_eq(val, 10);
ck_assert_int_eq(set_int_get_next(set, &val), 1);
ck_assert_int_eq(val, 500);
ck_assert_int_eq(set_int_get_next(set, &val), 0);
set_int_delete(set);
}
END_TEST
/******************************************************************************/
Suite *
make_suite_test_set_int(void)
{
Suite *s;
TCase *tc_basic;
s = suite_create("SetInt");
tc_basic = tcase_create("basic");
suite_add_tcase(s, tc_basic);
tcase_add_test(tc_basic, test_basic__bad_args);
tcase_add_test(tc_basic, test_basic__one_to_ten);
tcase_add_test(tc_basic, test_basic__add_remove_all);
tcase_add_test(tc_basic, test_basic__single_element);
tcase_add_test(tc_basic, test_basic__get_next);
return s;
}