mirror of
https://github.com/bkthomps/Containers.git
synced 2025-11-16 12:34:47 +00:00
Add more testing (#23)
Increase code coverage so that other than the out-of-memory conditions, the code is entirely covered. Some areas of the code have been tweaked for performance optimizations. Bug fix! A bug has been identified and fixed in the unordered_multiset data structure in the unordered_multiset_remove_all function. This bug would occur when more than one entry exists in the bucket in which the element is occupying, and that element had a count of more than one.
This commit is contained in:
@@ -184,7 +184,7 @@ int forward_list_add_last(forward_list me, void *const data)
|
|||||||
*/
|
*/
|
||||||
static bool forward_list_is_illegal_input(forward_list me, const int index)
|
static bool forward_list_is_illegal_input(forward_list me, const int index)
|
||||||
{
|
{
|
||||||
return index < 0 || index >= me->item_count || me->item_count == 0;
|
return index < 0 || index >= me->item_count;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@@ -253,7 +253,7 @@ int list_add_last(list me, void *const data)
|
|||||||
*/
|
*/
|
||||||
static bool list_is_illegal_input(list me, const int index)
|
static bool list_is_illegal_input(list me, const int index)
|
||||||
{
|
{
|
||||||
return index < 0 || index >= me->item_count || me->item_count == 0;
|
return index < 0 || index >= me->item_count;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@@ -389,7 +389,7 @@ bool unordered_multiset_remove_all(unordered_multiset me, void *const key)
|
|||||||
if (unordered_multiset_is_equal(me, traverse->next, hash, key)) {
|
if (unordered_multiset_is_equal(me, traverse->next, hash, key)) {
|
||||||
struct node *const backup = traverse->next;
|
struct node *const backup = traverse->next;
|
||||||
traverse->next = traverse->next->next;
|
traverse->next = traverse->next->next;
|
||||||
me->size -= traverse->count;
|
me->size -= backup->count;
|
||||||
free(backup->key);
|
free(backup->key);
|
||||||
free(backup);
|
free(backup);
|
||||||
me->used--;
|
me->used--;
|
||||||
|
|||||||
11
src/vector.c
11
src/vector.c
@@ -99,7 +99,8 @@ bool vector_is_empty(vector me)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Sets the space of the buffer.
|
* Sets the space of the buffer. Assumes that size is at least the same as the
|
||||||
|
* amount of items currently in the vector.
|
||||||
*/
|
*/
|
||||||
static int vector_set_space(vector me, const int size)
|
static int vector_set_space(vector me, const int size)
|
||||||
{
|
{
|
||||||
@@ -109,9 +110,6 @@ static int vector_set_space(vector me, const int size)
|
|||||||
}
|
}
|
||||||
me->data = temp;
|
me->data = temp;
|
||||||
me->item_capacity = size;
|
me->item_capacity = size;
|
||||||
if (me->item_capacity < me->item_count) {
|
|
||||||
me->item_count = me->item_capacity;
|
|
||||||
}
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -240,7 +238,7 @@ int vector_add_last(vector me, void *const data)
|
|||||||
*/
|
*/
|
||||||
static bool vector_is_illegal_input(vector me, const int index)
|
static bool vector_is_illegal_input(vector me, const int index)
|
||||||
{
|
{
|
||||||
return index < 0 || index >= me->item_count || me->item_count == 0;
|
return index < 0 || index >= me->item_count;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -398,9 +396,8 @@ int vector_get_last(void *const data, vector me)
|
|||||||
*/
|
*/
|
||||||
int vector_clear(vector me)
|
int vector_clear(vector me)
|
||||||
{
|
{
|
||||||
const int ret = vector_set_space(me, START_SPACE);
|
|
||||||
me->item_count = 0;
|
me->item_count = 0;
|
||||||
return ret;
|
return vector_set_space(me, START_SPACE);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@@ -3,6 +3,8 @@
|
|||||||
|
|
||||||
void test_array(void)
|
void test_array(void)
|
||||||
{
|
{
|
||||||
|
assert(!array_init(-1, sizeof(int)));
|
||||||
|
assert(!array_init(1, 0));
|
||||||
array me = array_init(10, sizeof(int));
|
array me = array_init(10, sizeof(int));
|
||||||
assert(me);
|
assert(me);
|
||||||
assert(array_size(me) == 10);
|
assert(array_size(me) == 10);
|
||||||
@@ -31,6 +33,9 @@ void test_array(void)
|
|||||||
for (int i = 0; i < 10; i++) {
|
for (int i = 0; i < 10; i++) {
|
||||||
assert(data[i] == i);
|
assert(data[i] == i);
|
||||||
}
|
}
|
||||||
|
int get = 0xdeadbeef;
|
||||||
|
assert(array_set(me, -1, &get) == -EINVAL);
|
||||||
|
assert(array_get(&get, me, -1) == -EINVAL);
|
||||||
me = array_destroy(me);
|
me = array_destroy(me);
|
||||||
assert(!me);
|
assert(!me);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -3,6 +3,7 @@
|
|||||||
|
|
||||||
void test_deque(void)
|
void test_deque(void)
|
||||||
{
|
{
|
||||||
|
assert(!deque_init(0));
|
||||||
int val[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
|
int val[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
|
||||||
deque me = deque_init(sizeof(int));
|
deque me = deque_init(sizeof(int));
|
||||||
assert(me);
|
assert(me);
|
||||||
|
|||||||
@@ -3,6 +3,7 @@
|
|||||||
|
|
||||||
void test_forward_list(void)
|
void test_forward_list(void)
|
||||||
{
|
{
|
||||||
|
assert(!forward_list_init(0));
|
||||||
int val[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
|
int val[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
|
||||||
forward_list me = forward_list_init(sizeof(int));
|
forward_list me = forward_list_init(sizeof(int));
|
||||||
assert(me);
|
assert(me);
|
||||||
|
|||||||
10
tst/list.c
10
tst/list.c
@@ -3,6 +3,7 @@
|
|||||||
|
|
||||||
void test_list(void)
|
void test_list(void)
|
||||||
{
|
{
|
||||||
|
assert(!list_init(0));
|
||||||
int val[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
|
int val[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
|
||||||
list me = list_init(sizeof(int));
|
list me = list_init(sizeof(int));
|
||||||
assert(me);
|
assert(me);
|
||||||
@@ -34,8 +35,9 @@ void test_list(void)
|
|||||||
for (int i = 0; i < 3; i++) {
|
for (int i = 0; i < 3; i++) {
|
||||||
assert(10 - i == trimmed[i]);
|
assert(10 - i == trimmed[i]);
|
||||||
}
|
}
|
||||||
|
int index = list_size(me);
|
||||||
int add = 3;
|
int add = 3;
|
||||||
list_add_last(me, &add);
|
list_add_at(me, index, &add);
|
||||||
add = -1;
|
add = -1;
|
||||||
list_add_at(me, 1, &add);
|
list_add_at(me, 1, &add);
|
||||||
add = -2;
|
add = -2;
|
||||||
@@ -63,6 +65,12 @@ void test_list(void)
|
|||||||
list_remove_first(me);
|
list_remove_first(me);
|
||||||
list_remove_at(me, 2);
|
list_remove_at(me, 2);
|
||||||
list_remove_last(me);
|
list_remove_last(me);
|
||||||
|
get = 34;
|
||||||
|
list_add_at(me, 0, &get);
|
||||||
|
int first = 0xdeadbeef;
|
||||||
|
list_get_first(&first, me);
|
||||||
|
assert(first == get);
|
||||||
|
list_remove_first(me);
|
||||||
assert(list_size(me) == 3);
|
assert(list_size(me) == 3);
|
||||||
get = 345;
|
get = 345;
|
||||||
list_get_first(&get, me);
|
list_get_first(&get, me);
|
||||||
|
|||||||
416
tst/map.c
416
tst/map.c
@@ -10,6 +10,9 @@ static int compare_int(const void *const one, const void *const two)
|
|||||||
|
|
||||||
void test_map(void)
|
void test_map(void)
|
||||||
{
|
{
|
||||||
|
assert(!map_init(0, sizeof(int), compare_int));
|
||||||
|
assert(!map_init(sizeof(int), 0, compare_int));
|
||||||
|
assert(!map_init(sizeof(int), sizeof(int), NULL));
|
||||||
map me = map_init(sizeof(int), sizeof(int), compare_int);
|
map me = map_init(sizeof(int), sizeof(int), compare_int);
|
||||||
assert(me);
|
assert(me);
|
||||||
assert(map_size(me) == 0);
|
assert(map_size(me) == 0);
|
||||||
@@ -117,4 +120,417 @@ void test_map(void)
|
|||||||
assert(map_is_empty(me));
|
assert(map_is_empty(me));
|
||||||
me = map_destroy(me);
|
me = map_destroy(me);
|
||||||
assert(!me);
|
assert(!me);
|
||||||
|
me = map_init(sizeof(int), sizeof(int), compare_int);
|
||||||
|
assert(me);
|
||||||
|
// left-left
|
||||||
|
key = 5;
|
||||||
|
map_put(me, &key, &num);
|
||||||
|
key = 3;
|
||||||
|
map_put(me, &key, &num);
|
||||||
|
key = 1;
|
||||||
|
map_put(me, &key, &num);
|
||||||
|
key = 0xdeadbeef;
|
||||||
|
map_contains(me, &key);
|
||||||
|
map_clear(me);
|
||||||
|
// right-right
|
||||||
|
key = 1;
|
||||||
|
map_put(me, &key, &num);
|
||||||
|
key = 3;
|
||||||
|
map_put(me, &key, &num);
|
||||||
|
key = 5;
|
||||||
|
map_put(me, &key, &num);
|
||||||
|
key = 0xdeadbeef;
|
||||||
|
map_contains(me, &key);
|
||||||
|
map_clear(me);
|
||||||
|
// left-right
|
||||||
|
key = 5;
|
||||||
|
map_put(me, &key, &num);
|
||||||
|
key = 1;
|
||||||
|
map_put(me, &key, &num);
|
||||||
|
key = 3;
|
||||||
|
map_put(me, &key, &num);
|
||||||
|
key = 0xdeadbeef;
|
||||||
|
map_contains(me, &key);
|
||||||
|
map_clear(me);
|
||||||
|
// right-left
|
||||||
|
key = 1;
|
||||||
|
map_put(me, &key, &num);
|
||||||
|
key = 5;
|
||||||
|
map_put(me, &key, &num);
|
||||||
|
key = 3;
|
||||||
|
map_put(me, &key, &num);
|
||||||
|
key = 0xdeadbeef;
|
||||||
|
map_contains(me, &key);
|
||||||
|
map_clear(me);
|
||||||
|
// Two children edge case.
|
||||||
|
key = 8;
|
||||||
|
map_put(me, &key, &num);
|
||||||
|
key = 5;
|
||||||
|
map_put(me, &key, &num);
|
||||||
|
key = 11;
|
||||||
|
map_put(me, &key, &num);
|
||||||
|
key = 2;
|
||||||
|
map_put(me, &key, &num);
|
||||||
|
key = 6;
|
||||||
|
map_put(me, &key, &num);
|
||||||
|
key = 10;
|
||||||
|
map_put(me, &key, &num);
|
||||||
|
key = 15;
|
||||||
|
map_put(me, &key, &num);
|
||||||
|
key = 1;
|
||||||
|
map_put(me, &key, &num);
|
||||||
|
key = 3;
|
||||||
|
map_put(me, &key, &num);
|
||||||
|
key = 4;
|
||||||
|
map_put(me, &key, &num);
|
||||||
|
key = 7;
|
||||||
|
map_put(me, &key, &num);
|
||||||
|
key = 9;
|
||||||
|
map_put(me, &key, &num);
|
||||||
|
key = 12;
|
||||||
|
map_put(me, &key, &num);
|
||||||
|
key = 13;
|
||||||
|
map_put(me, &key, &num);
|
||||||
|
key = 16;
|
||||||
|
map_put(me, &key, &num);
|
||||||
|
key = 14;
|
||||||
|
map_put(me, &key, &num);
|
||||||
|
map_clear(me);
|
||||||
|
// Two children edge case.
|
||||||
|
key = 8;
|
||||||
|
map_put(me, &key, &num);
|
||||||
|
key = 4;
|
||||||
|
map_put(me, &key, &num);
|
||||||
|
key = 12;
|
||||||
|
map_put(me, &key, &num);
|
||||||
|
key = 2;
|
||||||
|
map_put(me, &key, &num);
|
||||||
|
key = 6;
|
||||||
|
map_put(me, &key, &num);
|
||||||
|
key = 10;
|
||||||
|
map_put(me, &key, &num);
|
||||||
|
key = 15;
|
||||||
|
map_put(me, &key, &num);
|
||||||
|
key = 1;
|
||||||
|
map_put(me, &key, &num);
|
||||||
|
key = 3;
|
||||||
|
map_put(me, &key, &num);
|
||||||
|
key = 5;
|
||||||
|
map_put(me, &key, &num);
|
||||||
|
key = 7;
|
||||||
|
map_put(me, &key, &num);
|
||||||
|
key = 9;
|
||||||
|
map_put(me, &key, &num);
|
||||||
|
key = 11;
|
||||||
|
map_put(me, &key, &num);
|
||||||
|
key = 13;
|
||||||
|
map_put(me, &key, &num);
|
||||||
|
key = 16;
|
||||||
|
map_put(me, &key, &num);
|
||||||
|
key = 14;
|
||||||
|
map_put(me, &key, &num);
|
||||||
|
map_clear(me);
|
||||||
|
// Add a lot of items.
|
||||||
|
int count = 0;
|
||||||
|
bool flip = false;
|
||||||
|
for (int i = 1234; i < 82400; i++) {
|
||||||
|
key = i % 765;
|
||||||
|
const bool is_already_present = map_contains(me, &key);
|
||||||
|
map_put(me, &key, &num);
|
||||||
|
const bool is_now_present = map_contains(me, &key);
|
||||||
|
assert(is_now_present);
|
||||||
|
if (!is_already_present && is_now_present) {
|
||||||
|
count++;
|
||||||
|
}
|
||||||
|
if (i == 1857 && !flip) {
|
||||||
|
i *= -1;
|
||||||
|
flip = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
assert(count == map_size(me));
|
||||||
|
map_put(me, &key, &num);
|
||||||
|
map_destroy(me);
|
||||||
|
me = map_init(sizeof(int), sizeof(int), compare_int);
|
||||||
|
assert(map_size(me) == 0);
|
||||||
|
assert(map_is_empty(me));
|
||||||
|
key = 4;
|
||||||
|
map_put(me, &key, &num);
|
||||||
|
assert(map_size(me) == 1);
|
||||||
|
map_put(me, &key, &num);
|
||||||
|
assert(map_size(me) == 1);
|
||||||
|
assert(!map_is_empty(me));
|
||||||
|
assert(map_contains(me, &key));
|
||||||
|
key = 7;
|
||||||
|
assert(!map_contains(me, &key));
|
||||||
|
map_put(me, &key, &num);
|
||||||
|
assert(map_size(me) == 2);
|
||||||
|
assert(map_contains(me, &key));
|
||||||
|
int c[10] = {5, 9, 4, -5, 0, 6, 1, 5, 7, 2};
|
||||||
|
for (int i = 0; i < 10; i++) {
|
||||||
|
map_put(me, &c[i], &num);
|
||||||
|
assert(map_contains(me, &c[i]));
|
||||||
|
}
|
||||||
|
assert(map_size(me) == 9);
|
||||||
|
for (int i = 0; i < 10; i++) {
|
||||||
|
assert(map_contains(me, &c[i]));
|
||||||
|
}
|
||||||
|
for (int i = -100; i < 100; i++) {
|
||||||
|
bool contains = false;
|
||||||
|
for (int j = 0; j < 10; j++) {
|
||||||
|
if (c[j] == i) {
|
||||||
|
contains = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
assert(map_contains(me, &i) == contains);
|
||||||
|
}
|
||||||
|
num = -3;
|
||||||
|
assert(!map_remove(me, &num));
|
||||||
|
assert(map_size(me) == 9);
|
||||||
|
assert(!map_contains(me, &num));
|
||||||
|
num = 6;
|
||||||
|
assert(map_remove(me, &num));
|
||||||
|
assert(map_size(me) == 8);
|
||||||
|
assert(!map_contains(me, &num));
|
||||||
|
num = 4;
|
||||||
|
assert(map_remove(me, &num));
|
||||||
|
assert(map_size(me) == 7);
|
||||||
|
assert(!map_contains(me, &num));
|
||||||
|
num = 7;
|
||||||
|
assert(map_remove(me, &num));
|
||||||
|
assert(map_size(me) == 6);
|
||||||
|
assert(!map_contains(me, &num));
|
||||||
|
num = 9;
|
||||||
|
assert(map_remove(me, &num));
|
||||||
|
assert(map_size(me) == 5);
|
||||||
|
assert(!map_contains(me, &num));
|
||||||
|
num = -5;
|
||||||
|
assert(map_remove(me, &num));
|
||||||
|
assert(map_size(me) == 4);
|
||||||
|
assert(!map_contains(me, &num));
|
||||||
|
num = 0;
|
||||||
|
assert(map_remove(me, &num));
|
||||||
|
assert(map_size(me) == 3);
|
||||||
|
assert(!map_contains(me, &num));
|
||||||
|
num = 1;
|
||||||
|
assert(map_remove(me, &num));
|
||||||
|
assert(map_size(me) == 2);
|
||||||
|
assert(!map_contains(me, &num));
|
||||||
|
num = 5;
|
||||||
|
assert(map_remove(me, &num));
|
||||||
|
assert(map_size(me) == 1);
|
||||||
|
assert(!map_contains(me, &num));
|
||||||
|
num = 2;
|
||||||
|
assert(map_remove(me, &num));
|
||||||
|
assert(map_size(me) == 0);
|
||||||
|
assert(!map_contains(me, &num));
|
||||||
|
// Add a lot of items and remove individually.
|
||||||
|
for (int i = 5000; i < 6000; i++) {
|
||||||
|
map_put(me, &i, &num);
|
||||||
|
assert(map_contains(me, &i));
|
||||||
|
}
|
||||||
|
assert(map_size(me) == 1000);
|
||||||
|
for (int i = 5000; i < 5500; i++) {
|
||||||
|
map_remove(me, &i);
|
||||||
|
assert(!map_contains(me, &i));
|
||||||
|
}
|
||||||
|
assert(map_size(me) == 500);
|
||||||
|
assert(!map_is_empty(me));
|
||||||
|
map_clear(me);
|
||||||
|
assert(map_size(me) == 0);
|
||||||
|
assert(map_is_empty(me));
|
||||||
|
// Add a lot of items and clear.
|
||||||
|
for (int i = 5000; i < 6000; i++) {
|
||||||
|
map_put(me, &i, &num);
|
||||||
|
assert(map_contains(me, &i));
|
||||||
|
}
|
||||||
|
assert(map_size(me) == 1000);
|
||||||
|
map_clear(me);
|
||||||
|
int p = 0xdeadbeef;
|
||||||
|
assert(!map_remove(me, &p));
|
||||||
|
assert(map_size(me) == 0);
|
||||||
|
assert(map_is_empty(me));
|
||||||
|
me = map_destroy(me);
|
||||||
|
assert(!me);
|
||||||
|
// Create odd shape graph.
|
||||||
|
me = map_init(sizeof(int), sizeof(int), compare_int);
|
||||||
|
key = 10;
|
||||||
|
map_put(me, &key, &num);
|
||||||
|
key = 5;
|
||||||
|
map_put(me, &key, &num);
|
||||||
|
key = 15;
|
||||||
|
map_put(me, &key, &num);
|
||||||
|
key = 3;
|
||||||
|
map_put(me, &key, &num);
|
||||||
|
key = 8;
|
||||||
|
map_put(me, &key, &num);
|
||||||
|
key = 12;
|
||||||
|
map_put(me, &key, &num);
|
||||||
|
key = 18;
|
||||||
|
map_put(me, &key, &num);
|
||||||
|
key = 12;
|
||||||
|
map_remove(me, &key);
|
||||||
|
key = 5;
|
||||||
|
map_remove(me, &key);
|
||||||
|
key = 3;
|
||||||
|
map_remove(me, &key);
|
||||||
|
key = 8;
|
||||||
|
map_remove(me, &key);
|
||||||
|
map_clear(me);
|
||||||
|
// Allocate many nodes.
|
||||||
|
for (int i = 8123; i < 12314; i += 3) {
|
||||||
|
map_put(me, &i, &num);
|
||||||
|
assert(map_contains(me, &i));
|
||||||
|
}
|
||||||
|
for (int i = 13000; i > 8000; i--) {
|
||||||
|
map_remove(me, &i);
|
||||||
|
assert(!map_contains(me, &i));
|
||||||
|
}
|
||||||
|
map_clear(me);
|
||||||
|
// Create another odd shape graph.
|
||||||
|
key = 20;
|
||||||
|
map_put(me, &key, &num);
|
||||||
|
key = 10;
|
||||||
|
map_put(me, &key, &num);
|
||||||
|
key = 40;
|
||||||
|
map_put(me, &key, &num);
|
||||||
|
key = 5;
|
||||||
|
map_put(me, &key, &num);
|
||||||
|
key = 15;
|
||||||
|
map_put(me, &key, &num);
|
||||||
|
key = 30;
|
||||||
|
map_put(me, &key, &num);
|
||||||
|
key = 50;
|
||||||
|
map_put(me, &key, &num);
|
||||||
|
key = 25;
|
||||||
|
map_put(me, &key, &num);
|
||||||
|
key = 35;
|
||||||
|
map_put(me, &key, &num);
|
||||||
|
key = 36;
|
||||||
|
map_put(me, &key, &num);
|
||||||
|
key = 34;
|
||||||
|
map_put(me, &key, &num);
|
||||||
|
key = 33;
|
||||||
|
map_put(me, &key, &num);
|
||||||
|
key = 32;
|
||||||
|
map_put(me, &key, &num);
|
||||||
|
key = 30;
|
||||||
|
map_remove(me, &key);
|
||||||
|
key = 32;
|
||||||
|
assert(map_contains(me, &key));
|
||||||
|
map_clear(me);
|
||||||
|
// One sided tree.
|
||||||
|
key = 10;
|
||||||
|
map_put(me, &key, &num);
|
||||||
|
key = 9;
|
||||||
|
map_put(me, &key, &num);
|
||||||
|
key = 8;
|
||||||
|
map_put(me, &key, &num);
|
||||||
|
key = 7;
|
||||||
|
map_put(me, &key, &num);
|
||||||
|
key = 8;
|
||||||
|
map_remove(me, &key);
|
||||||
|
key = 7;
|
||||||
|
assert(map_contains(me, &key));
|
||||||
|
map_destroy(me);
|
||||||
|
// Replace two sided two children.
|
||||||
|
me = map_init(sizeof(int), sizeof(int), compare_int);
|
||||||
|
key = 5;
|
||||||
|
map_put(me, &key, &num);
|
||||||
|
key = 1;
|
||||||
|
map_put(me, &key, &num);
|
||||||
|
key = 6;
|
||||||
|
map_put(me, &key, &num);
|
||||||
|
key = -1;
|
||||||
|
map_put(me, &key, &num);
|
||||||
|
key = 3;
|
||||||
|
map_put(me, &key, &num);
|
||||||
|
key = 7;
|
||||||
|
map_put(me, &key, &num);
|
||||||
|
key = -2;
|
||||||
|
map_put(me, &key, &num);
|
||||||
|
key = 0;
|
||||||
|
map_put(me, &key, &num);
|
||||||
|
key = 2;
|
||||||
|
map_put(me, &key, &num);
|
||||||
|
key = 4;
|
||||||
|
map_put(me, &key, &num);
|
||||||
|
key = 1;
|
||||||
|
map_remove(me, &key);
|
||||||
|
assert(!map_contains(me, &key));
|
||||||
|
map_clear(me);
|
||||||
|
key = 5;
|
||||||
|
map_put(me, &key, &num);
|
||||||
|
key = 1;
|
||||||
|
map_put(me, &key, &num);
|
||||||
|
key = 6;
|
||||||
|
map_put(me, &key, &num);
|
||||||
|
key = -1;
|
||||||
|
map_put(me, &key, &num);
|
||||||
|
key = 3;
|
||||||
|
map_put(me, &key, &num);
|
||||||
|
key = 7;
|
||||||
|
map_put(me, &key, &num);
|
||||||
|
key = -2;
|
||||||
|
map_put(me, &key, &num);
|
||||||
|
key = 0;
|
||||||
|
map_put(me, &key, &num);
|
||||||
|
key = 4;
|
||||||
|
map_put(me, &key, &num);
|
||||||
|
key = 1;
|
||||||
|
map_remove(me, &key);
|
||||||
|
assert(!map_contains(me, &key));
|
||||||
|
me = map_destroy(me);
|
||||||
|
assert(!me);
|
||||||
|
me = map_init(sizeof(int), sizeof(int), compare_int);
|
||||||
|
for (int i = 4817; i > -2983; i -= 11) {
|
||||||
|
map_put(me, &i, &num);
|
||||||
|
assert(map_contains(me, &i));
|
||||||
|
}
|
||||||
|
for (int i = -432; i < 3849; i += 7) {
|
||||||
|
map_remove(me, &i);
|
||||||
|
assert(!map_contains(me, &i));
|
||||||
|
}
|
||||||
|
map_clear(me);
|
||||||
|
key = 5;
|
||||||
|
map_put(me, &key, &num);
|
||||||
|
key = 7;
|
||||||
|
map_put(me, &key, &num);
|
||||||
|
key = 5;
|
||||||
|
map_remove(me, &key);
|
||||||
|
map_clear(me);
|
||||||
|
// Two children edge case other side.
|
||||||
|
key = 8;
|
||||||
|
map_put(me, &key, &num);
|
||||||
|
key = 4;
|
||||||
|
map_put(me, &key, &num);
|
||||||
|
key = 12;
|
||||||
|
map_put(me, &key, &num);
|
||||||
|
key = 2;
|
||||||
|
map_put(me, &key, &num);
|
||||||
|
key = 6;
|
||||||
|
map_put(me, &key, &num);
|
||||||
|
key = 10;
|
||||||
|
map_put(me, &key, &num);
|
||||||
|
key = 16;
|
||||||
|
map_put(me, &key, &num);
|
||||||
|
key = 1;
|
||||||
|
map_put(me, &key, &num);
|
||||||
|
key = 3;
|
||||||
|
map_put(me, &key, &num);
|
||||||
|
key = 5;
|
||||||
|
map_put(me, &key, &num);
|
||||||
|
key = 7;
|
||||||
|
map_put(me, &key, &num);
|
||||||
|
key = 9;
|
||||||
|
map_put(me, &key, &num);
|
||||||
|
key = 11;
|
||||||
|
map_put(me, &key, &num);
|
||||||
|
key = 15;
|
||||||
|
map_put(me, &key, &num);
|
||||||
|
key = 17;
|
||||||
|
map_put(me, &key, &num);
|
||||||
|
key = 13;
|
||||||
|
map_put(me, &key, &num);
|
||||||
|
map_clear(me);
|
||||||
|
assert(!map_get(&value, me, &key));
|
||||||
}
|
}
|
||||||
|
|||||||
435
tst/multimap.c
435
tst/multimap.c
@@ -10,6 +10,10 @@ static int compare_int(const void *const one, const void *const two)
|
|||||||
|
|
||||||
void test_multimap(void)
|
void test_multimap(void)
|
||||||
{
|
{
|
||||||
|
assert(!multimap_init(0, sizeof(int), compare_int, compare_int));
|
||||||
|
assert(!multimap_init(sizeof(int), 0, compare_int, compare_int));
|
||||||
|
assert(!multimap_init(sizeof(int), sizeof(int), NULL, compare_int));
|
||||||
|
assert(!multimap_init(sizeof(int), sizeof(int), compare_int, NULL));
|
||||||
multimap me = multimap_init(sizeof(int), sizeof(int),
|
multimap me = multimap_init(sizeof(int), sizeof(int),
|
||||||
compare_int, compare_int);
|
compare_int, compare_int);
|
||||||
assert(me);
|
assert(me);
|
||||||
@@ -146,4 +150,435 @@ void test_multimap(void)
|
|||||||
assert(multimap_size(me) == 1);
|
assert(multimap_size(me) == 1);
|
||||||
me = multimap_destroy(me);
|
me = multimap_destroy(me);
|
||||||
assert(!me);
|
assert(!me);
|
||||||
|
me = multimap_init(sizeof(int), sizeof(int), compare_int, compare_int);
|
||||||
|
assert(me);
|
||||||
|
// left-left
|
||||||
|
key = 5;
|
||||||
|
multimap_put(me, &key, &num);
|
||||||
|
key = 3;
|
||||||
|
multimap_put(me, &key, &num);
|
||||||
|
key = 1;
|
||||||
|
multimap_put(me, &key, &num);
|
||||||
|
key = 0xdeadbeef;
|
||||||
|
multimap_contains(me, &key);
|
||||||
|
multimap_clear(me);
|
||||||
|
// right-right
|
||||||
|
key = 1;
|
||||||
|
multimap_put(me, &key, &num);
|
||||||
|
key = 3;
|
||||||
|
multimap_put(me, &key, &num);
|
||||||
|
key = 5;
|
||||||
|
multimap_put(me, &key, &num);
|
||||||
|
key = 0xdeadbeef;
|
||||||
|
multimap_contains(me, &key);
|
||||||
|
multimap_clear(me);
|
||||||
|
// left-right
|
||||||
|
key = 5;
|
||||||
|
multimap_put(me, &key, &num);
|
||||||
|
key = 1;
|
||||||
|
multimap_put(me, &key, &num);
|
||||||
|
key = 3;
|
||||||
|
multimap_put(me, &key, &num);
|
||||||
|
key = 0xdeadbeef;
|
||||||
|
multimap_contains(me, &key);
|
||||||
|
multimap_clear(me);
|
||||||
|
// right-left
|
||||||
|
key = 1;
|
||||||
|
multimap_put(me, &key, &num);
|
||||||
|
key = 5;
|
||||||
|
multimap_put(me, &key, &num);
|
||||||
|
key = 3;
|
||||||
|
multimap_put(me, &key, &num);
|
||||||
|
key = 0xdeadbeef;
|
||||||
|
multimap_contains(me, &key);
|
||||||
|
multimap_clear(me);
|
||||||
|
// Two children edge case.
|
||||||
|
key = 8;
|
||||||
|
multimap_put(me, &key, &num);
|
||||||
|
key = 5;
|
||||||
|
multimap_put(me, &key, &num);
|
||||||
|
key = 11;
|
||||||
|
multimap_put(me, &key, &num);
|
||||||
|
key = 2;
|
||||||
|
multimap_put(me, &key, &num);
|
||||||
|
key = 6;
|
||||||
|
multimap_put(me, &key, &num);
|
||||||
|
key = 10;
|
||||||
|
multimap_put(me, &key, &num);
|
||||||
|
key = 15;
|
||||||
|
multimap_put(me, &key, &num);
|
||||||
|
key = 1;
|
||||||
|
multimap_put(me, &key, &num);
|
||||||
|
key = 3;
|
||||||
|
multimap_put(me, &key, &num);
|
||||||
|
key = 4;
|
||||||
|
multimap_put(me, &key, &num);
|
||||||
|
key = 7;
|
||||||
|
multimap_put(me, &key, &num);
|
||||||
|
key = 9;
|
||||||
|
multimap_put(me, &key, &num);
|
||||||
|
key = 12;
|
||||||
|
multimap_put(me, &key, &num);
|
||||||
|
key = 13;
|
||||||
|
multimap_put(me, &key, &num);
|
||||||
|
key = 16;
|
||||||
|
multimap_put(me, &key, &num);
|
||||||
|
key = 14;
|
||||||
|
multimap_put(me, &key, &num);
|
||||||
|
multimap_clear(me);
|
||||||
|
// Two children edge case.
|
||||||
|
key = 8;
|
||||||
|
multimap_put(me, &key, &num);
|
||||||
|
key = 4;
|
||||||
|
multimap_put(me, &key, &num);
|
||||||
|
key = 12;
|
||||||
|
multimap_put(me, &key, &num);
|
||||||
|
key = 2;
|
||||||
|
multimap_put(me, &key, &num);
|
||||||
|
key = 6;
|
||||||
|
multimap_put(me, &key, &num);
|
||||||
|
key = 10;
|
||||||
|
multimap_put(me, &key, &num);
|
||||||
|
key = 15;
|
||||||
|
multimap_put(me, &key, &num);
|
||||||
|
key = 1;
|
||||||
|
multimap_put(me, &key, &num);
|
||||||
|
key = 3;
|
||||||
|
multimap_put(me, &key, &num);
|
||||||
|
key = 5;
|
||||||
|
multimap_put(me, &key, &num);
|
||||||
|
key = 7;
|
||||||
|
multimap_put(me, &key, &num);
|
||||||
|
key = 9;
|
||||||
|
multimap_put(me, &key, &num);
|
||||||
|
key = 11;
|
||||||
|
multimap_put(me, &key, &num);
|
||||||
|
key = 13;
|
||||||
|
multimap_put(me, &key, &num);
|
||||||
|
key = 16;
|
||||||
|
multimap_put(me, &key, &num);
|
||||||
|
key = 14;
|
||||||
|
multimap_put(me, &key, &num);
|
||||||
|
multimap_clear(me);
|
||||||
|
// Add a lot of items.
|
||||||
|
count = 0;
|
||||||
|
bool flip = false;
|
||||||
|
for (int i = 1234; i < 82400; i++) {
|
||||||
|
key = i % 765;
|
||||||
|
multimap_put(me, &key, &num);
|
||||||
|
assert(multimap_contains(me, &key));
|
||||||
|
count++;
|
||||||
|
if (i == 1857 && !flip) {
|
||||||
|
i *= -1;
|
||||||
|
flip = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
assert(count == multimap_size(me));
|
||||||
|
multimap_put(me, &key, &num);
|
||||||
|
multimap_destroy(me);
|
||||||
|
me = multimap_init(sizeof(int), sizeof(int), compare_int, compare_int);
|
||||||
|
assert(multimap_size(me) == 0);
|
||||||
|
assert(multimap_is_empty(me));
|
||||||
|
key = 4;
|
||||||
|
multimap_put(me, &key, &num);
|
||||||
|
assert(multimap_size(me) == 1);
|
||||||
|
multimap_put(me, &key, &num);
|
||||||
|
assert(multimap_size(me) == 2);
|
||||||
|
assert(!multimap_is_empty(me));
|
||||||
|
assert(multimap_contains(me, &key));
|
||||||
|
key = 7;
|
||||||
|
assert(!multimap_contains(me, &key));
|
||||||
|
multimap_put(me, &key, &num);
|
||||||
|
assert(multimap_size(me) == 3);
|
||||||
|
assert(multimap_contains(me, &key));
|
||||||
|
int c[10] = {5, 9, 4, -5, 0, 6, 1, 5, 7, 2};
|
||||||
|
for (int i = 0; i < 10; i++) {
|
||||||
|
multimap_put(me, &c[i], &value);
|
||||||
|
assert(multimap_contains(me, &c[i]));
|
||||||
|
}
|
||||||
|
assert(multimap_size(me) == 13);
|
||||||
|
for (int i = 0; i < 10; i++) {
|
||||||
|
assert(multimap_contains(me, &c[i]));
|
||||||
|
}
|
||||||
|
for (int i = -100; i < 100; i++) {
|
||||||
|
bool contains = false;
|
||||||
|
for (int j = 0; j < 10; j++) {
|
||||||
|
if (c[j] == i) {
|
||||||
|
contains = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
assert(multimap_contains(me, &i) == contains);
|
||||||
|
}
|
||||||
|
num = -3;
|
||||||
|
assert(!multimap_remove(me, &num, &value));
|
||||||
|
assert(multimap_size(me) == 13);
|
||||||
|
assert(!multimap_contains(me, &num));
|
||||||
|
num = 6;
|
||||||
|
assert(multimap_remove(me, &num, &value));
|
||||||
|
assert(multimap_size(me) == 12);
|
||||||
|
assert(!multimap_contains(me, &num));
|
||||||
|
num = 4;
|
||||||
|
assert(multimap_remove(me, &num, &value));
|
||||||
|
assert(multimap_size(me) == 11);
|
||||||
|
assert(multimap_contains(me, &num));
|
||||||
|
num = 7;
|
||||||
|
assert(multimap_remove(me, &num, &value));
|
||||||
|
assert(multimap_size(me) == 10);
|
||||||
|
assert(multimap_contains(me, &num));
|
||||||
|
num = 9;
|
||||||
|
assert(multimap_remove(me, &num, &value));
|
||||||
|
assert(multimap_size(me) == 9);
|
||||||
|
assert(!multimap_contains(me, &num));
|
||||||
|
num = -5;
|
||||||
|
assert(multimap_remove(me, &num, &value));
|
||||||
|
assert(multimap_size(me) == 8);
|
||||||
|
assert(!multimap_contains(me, &num));
|
||||||
|
num = 0;
|
||||||
|
assert(multimap_remove(me, &num, &value));
|
||||||
|
assert(multimap_size(me) == 7);
|
||||||
|
assert(!multimap_contains(me, &num));
|
||||||
|
num = 1;
|
||||||
|
assert(multimap_remove(me, &num, &value));
|
||||||
|
assert(multimap_size(me) == 6);
|
||||||
|
assert(!multimap_contains(me, &num));
|
||||||
|
num = 5;
|
||||||
|
assert(multimap_remove(me, &num, &value));
|
||||||
|
assert(multimap_size(me) == 5);
|
||||||
|
assert(multimap_contains(me, &num));
|
||||||
|
num = 2;
|
||||||
|
assert(multimap_remove(me, &num, &value));
|
||||||
|
assert(multimap_size(me) == 4);
|
||||||
|
assert(!multimap_contains(me, &num));
|
||||||
|
multimap_clear(me);
|
||||||
|
// Add a lot of items and remove individually.
|
||||||
|
value = 37;
|
||||||
|
for (int i = 5000; i < 6000; i++) {
|
||||||
|
multimap_put(me, &i, &value);
|
||||||
|
assert(multimap_contains(me, &i));
|
||||||
|
}
|
||||||
|
assert(multimap_size(me) == 1000);
|
||||||
|
for (int i = 5000; i < 5500; i++) {
|
||||||
|
multimap_remove(me, &i, &value);
|
||||||
|
assert(!multimap_contains(me, &i));
|
||||||
|
}
|
||||||
|
assert(multimap_size(me) == 500);
|
||||||
|
assert(!multimap_is_empty(me));
|
||||||
|
multimap_clear(me);
|
||||||
|
assert(multimap_size(me) == 0);
|
||||||
|
assert(multimap_is_empty(me));
|
||||||
|
// Add a lot of items and clear.
|
||||||
|
for (int i = 5000; i < 6000; i++) {
|
||||||
|
multimap_put(me, &i, &num);
|
||||||
|
assert(multimap_contains(me, &i));
|
||||||
|
}
|
||||||
|
assert(multimap_size(me) == 1000);
|
||||||
|
multimap_clear(me);
|
||||||
|
int p = 0xdeadbeef;
|
||||||
|
assert(!multimap_remove(me, &p, &value));
|
||||||
|
assert(multimap_size(me) == 0);
|
||||||
|
assert(multimap_is_empty(me));
|
||||||
|
me = multimap_destroy(me);
|
||||||
|
assert(!me);
|
||||||
|
// Create odd shape graph.
|
||||||
|
me = multimap_init(sizeof(int), sizeof(int), compare_int, compare_int);
|
||||||
|
key = 10;
|
||||||
|
multimap_put(me, &key, &num);
|
||||||
|
key = 5;
|
||||||
|
multimap_put(me, &key, &num);
|
||||||
|
key = 15;
|
||||||
|
multimap_put(me, &key, &num);
|
||||||
|
key = 3;
|
||||||
|
multimap_put(me, &key, &num);
|
||||||
|
key = 8;
|
||||||
|
multimap_put(me, &key, &num);
|
||||||
|
key = 12;
|
||||||
|
multimap_put(me, &key, &num);
|
||||||
|
key = 18;
|
||||||
|
multimap_put(me, &key, &num);
|
||||||
|
key = 12;
|
||||||
|
multimap_remove(me, &key, &value);
|
||||||
|
key = 5;
|
||||||
|
multimap_remove(me, &key, &value);
|
||||||
|
key = 3;
|
||||||
|
multimap_remove(me, &key, &value);
|
||||||
|
key = 8;
|
||||||
|
multimap_remove(me, &key, &value);
|
||||||
|
multimap_clear(me);
|
||||||
|
// Allocate many nodes.
|
||||||
|
value = 54;
|
||||||
|
for (int i = 8123; i < 12314; i += 3) {
|
||||||
|
multimap_put(me, &i, &value);
|
||||||
|
assert(multimap_contains(me, &i));
|
||||||
|
}
|
||||||
|
for (int i = 13000; i > 8000; i--) {
|
||||||
|
multimap_remove(me, &i, &value);
|
||||||
|
assert(!multimap_contains(me, &i));
|
||||||
|
}
|
||||||
|
multimap_clear(me);
|
||||||
|
// Create another odd shape graph.
|
||||||
|
key = 20;
|
||||||
|
multimap_put(me, &key, &num);
|
||||||
|
key = 10;
|
||||||
|
multimap_put(me, &key, &num);
|
||||||
|
key = 40;
|
||||||
|
multimap_put(me, &key, &num);
|
||||||
|
key = 5;
|
||||||
|
multimap_put(me, &key, &num);
|
||||||
|
key = 15;
|
||||||
|
multimap_put(me, &key, &num);
|
||||||
|
key = 30;
|
||||||
|
multimap_put(me, &key, &num);
|
||||||
|
key = 50;
|
||||||
|
multimap_put(me, &key, &num);
|
||||||
|
key = 25;
|
||||||
|
multimap_put(me, &key, &num);
|
||||||
|
key = 35;
|
||||||
|
multimap_put(me, &key, &num);
|
||||||
|
key = 36;
|
||||||
|
multimap_put(me, &key, &num);
|
||||||
|
key = 34;
|
||||||
|
multimap_put(me, &key, &num);
|
||||||
|
key = 33;
|
||||||
|
multimap_put(me, &key, &num);
|
||||||
|
key = 32;
|
||||||
|
multimap_put(me, &key, &num);
|
||||||
|
key = 30;
|
||||||
|
multimap_remove(me, &key, &value);
|
||||||
|
key = 32;
|
||||||
|
assert(multimap_contains(me, &key));
|
||||||
|
multimap_clear(me);
|
||||||
|
// One sided tree.
|
||||||
|
key = 10;
|
||||||
|
multimap_put(me, &key, &num);
|
||||||
|
key = 9;
|
||||||
|
multimap_put(me, &key, &num);
|
||||||
|
key = 8;
|
||||||
|
multimap_put(me, &key, &num);
|
||||||
|
key = 7;
|
||||||
|
multimap_put(me, &key, &num);
|
||||||
|
key = 8;
|
||||||
|
multimap_remove(me, &key, &value);
|
||||||
|
key = 7;
|
||||||
|
assert(multimap_contains(me, &key));
|
||||||
|
multimap_destroy(me);
|
||||||
|
// Replace two sided two children.
|
||||||
|
me = multimap_init(sizeof(int), sizeof(int), compare_int, compare_int);
|
||||||
|
key = 5;
|
||||||
|
multimap_put(me, &key, &num);
|
||||||
|
key = 1;
|
||||||
|
multimap_put(me, &key, &num);
|
||||||
|
key = 6;
|
||||||
|
multimap_put(me, &key, &num);
|
||||||
|
key = -1;
|
||||||
|
multimap_put(me, &key, &num);
|
||||||
|
key = 3;
|
||||||
|
multimap_put(me, &key, &num);
|
||||||
|
key = 7;
|
||||||
|
multimap_put(me, &key, &num);
|
||||||
|
key = -2;
|
||||||
|
multimap_put(me, &key, &num);
|
||||||
|
key = 0;
|
||||||
|
multimap_put(me, &key, &num);
|
||||||
|
key = 2;
|
||||||
|
multimap_put(me, &key, &num);
|
||||||
|
key = 4;
|
||||||
|
multimap_put(me, &key, &num);
|
||||||
|
key = 1;
|
||||||
|
multimap_remove_all(me, &key);
|
||||||
|
assert(!multimap_contains(me, &key));
|
||||||
|
multimap_clear(me);
|
||||||
|
key = 5;
|
||||||
|
multimap_put(me, &key, &num);
|
||||||
|
key = 1;
|
||||||
|
multimap_put(me, &key, &num);
|
||||||
|
key = 6;
|
||||||
|
multimap_put(me, &key, &num);
|
||||||
|
key = -1;
|
||||||
|
multimap_put(me, &key, &num);
|
||||||
|
key = 3;
|
||||||
|
multimap_put(me, &key, &num);
|
||||||
|
key = 7;
|
||||||
|
multimap_put(me, &key, &num);
|
||||||
|
key = -2;
|
||||||
|
multimap_put(me, &key, &num);
|
||||||
|
key = 0;
|
||||||
|
multimap_put(me, &key, &num);
|
||||||
|
key = 4;
|
||||||
|
multimap_put(me, &key, &num);
|
||||||
|
key = 1;
|
||||||
|
multimap_remove_all(me, &key);
|
||||||
|
assert(!multimap_contains(me, &key));
|
||||||
|
me = multimap_destroy(me);
|
||||||
|
assert(!me);
|
||||||
|
me = multimap_init(sizeof(int), sizeof(int), compare_int, compare_int);
|
||||||
|
value = 97;
|
||||||
|
for (int i = 4817; i > -2983; i -= 11) {
|
||||||
|
multimap_put(me, &i, &value);
|
||||||
|
assert(multimap_contains(me, &i));
|
||||||
|
}
|
||||||
|
for (int i = -432; i < 3849; i += 7) {
|
||||||
|
multimap_remove(me, &i, &value);
|
||||||
|
assert(!multimap_contains(me, &i));
|
||||||
|
}
|
||||||
|
multimap_clear(me);
|
||||||
|
key = 5;
|
||||||
|
multimap_put(me, &key, &num);
|
||||||
|
key = 7;
|
||||||
|
multimap_put(me, &key, &num);
|
||||||
|
key = 5;
|
||||||
|
multimap_remove(me, &key, &value);
|
||||||
|
multimap_clear(me);
|
||||||
|
// Two children edge case other side.
|
||||||
|
key = 8;
|
||||||
|
multimap_put(me, &key, &num);
|
||||||
|
key = 4;
|
||||||
|
multimap_put(me, &key, &num);
|
||||||
|
key = 12;
|
||||||
|
multimap_put(me, &key, &num);
|
||||||
|
key = 2;
|
||||||
|
multimap_put(me, &key, &num);
|
||||||
|
key = 6;
|
||||||
|
multimap_put(me, &key, &num);
|
||||||
|
key = 10;
|
||||||
|
multimap_put(me, &key, &num);
|
||||||
|
key = 16;
|
||||||
|
multimap_put(me, &key, &num);
|
||||||
|
key = 1;
|
||||||
|
multimap_put(me, &key, &num);
|
||||||
|
key = 3;
|
||||||
|
multimap_put(me, &key, &num);
|
||||||
|
key = 5;
|
||||||
|
multimap_put(me, &key, &num);
|
||||||
|
key = 7;
|
||||||
|
multimap_put(me, &key, &num);
|
||||||
|
key = 9;
|
||||||
|
multimap_put(me, &key, &num);
|
||||||
|
key = 11;
|
||||||
|
multimap_put(me, &key, &num);
|
||||||
|
key = 15;
|
||||||
|
multimap_put(me, &key, &num);
|
||||||
|
key = 17;
|
||||||
|
multimap_put(me, &key, &num);
|
||||||
|
key = 13;
|
||||||
|
multimap_put(me, &key, &num);
|
||||||
|
multimap_clear(me);
|
||||||
|
assert(multimap_count(me, &key) == 0);
|
||||||
|
assert(!multimap_remove_all(me, &key));
|
||||||
|
// Edge case.
|
||||||
|
me = multimap_init(sizeof(int), sizeof(int), compare_int, compare_int);
|
||||||
|
value = 17;
|
||||||
|
key = 5;
|
||||||
|
multimap_put(me, &key, &value);
|
||||||
|
key = 3;
|
||||||
|
multimap_put(me, &key, &value);
|
||||||
|
key = 7;
|
||||||
|
multimap_put(me, &key, &value);
|
||||||
|
key = 2;
|
||||||
|
multimap_put(me, &key, &value);
|
||||||
|
key = 6;
|
||||||
|
multimap_put(me, &key, &value);
|
||||||
|
key = 9;
|
||||||
|
multimap_put(me, &key, &value);
|
||||||
|
key = 3;
|
||||||
|
multimap_remove(me, &key, &value);
|
||||||
}
|
}
|
||||||
|
|||||||
413
tst/multiset.c
413
tst/multiset.c
@@ -10,6 +10,8 @@ static int compare_int(const void *const one, const void *const two)
|
|||||||
|
|
||||||
void test_multiset(void)
|
void test_multiset(void)
|
||||||
{
|
{
|
||||||
|
assert(!multiset_init(0, compare_int));
|
||||||
|
assert(!multiset_init(sizeof(int), NULL));
|
||||||
multiset me = multiset_init(sizeof(int), compare_int);
|
multiset me = multiset_init(sizeof(int), compare_int);
|
||||||
assert(me);
|
assert(me);
|
||||||
assert(multiset_size(me) == 0);
|
assert(multiset_size(me) == 0);
|
||||||
@@ -135,4 +137,415 @@ void test_multiset(void)
|
|||||||
assert(multiset_size(me) == 1);
|
assert(multiset_size(me) == 1);
|
||||||
me = multiset_destroy(me);
|
me = multiset_destroy(me);
|
||||||
assert(!me);
|
assert(!me);
|
||||||
|
me = multiset_init(sizeof(int), compare_int);
|
||||||
|
assert(me);
|
||||||
|
// left-left
|
||||||
|
key = 5;
|
||||||
|
multiset_put(me, &key);
|
||||||
|
key = 3;
|
||||||
|
multiset_put(me, &key);
|
||||||
|
key = 1;
|
||||||
|
multiset_put(me, &key);
|
||||||
|
key = 0xdeadbeef;
|
||||||
|
multiset_contains(me, &key);
|
||||||
|
multiset_clear(me);
|
||||||
|
// right-right
|
||||||
|
key = 1;
|
||||||
|
multiset_put(me, &key);
|
||||||
|
key = 3;
|
||||||
|
multiset_put(me, &key);
|
||||||
|
key = 5;
|
||||||
|
multiset_put(me, &key);
|
||||||
|
key = 0xdeadbeef;
|
||||||
|
multiset_contains(me, &key);
|
||||||
|
multiset_clear(me);
|
||||||
|
// left-right
|
||||||
|
key = 5;
|
||||||
|
multiset_put(me, &key);
|
||||||
|
key = 1;
|
||||||
|
multiset_put(me, &key);
|
||||||
|
key = 3;
|
||||||
|
multiset_put(me, &key);
|
||||||
|
key = 0xdeadbeef;
|
||||||
|
multiset_contains(me, &key);
|
||||||
|
multiset_clear(me);
|
||||||
|
// right-left
|
||||||
|
key = 1;
|
||||||
|
multiset_put(me, &key);
|
||||||
|
key = 5;
|
||||||
|
multiset_put(me, &key);
|
||||||
|
key = 3;
|
||||||
|
multiset_put(me, &key);
|
||||||
|
key = 0xdeadbeef;
|
||||||
|
multiset_contains(me, &key);
|
||||||
|
multiset_clear(me);
|
||||||
|
// Two children edge case.
|
||||||
|
key = 8;
|
||||||
|
multiset_put(me, &key);
|
||||||
|
key = 5;
|
||||||
|
multiset_put(me, &key);
|
||||||
|
key = 11;
|
||||||
|
multiset_put(me, &key);
|
||||||
|
key = 2;
|
||||||
|
multiset_put(me, &key);
|
||||||
|
key = 6;
|
||||||
|
multiset_put(me, &key);
|
||||||
|
key = 10;
|
||||||
|
multiset_put(me, &key);
|
||||||
|
key = 15;
|
||||||
|
multiset_put(me, &key);
|
||||||
|
key = 1;
|
||||||
|
multiset_put(me, &key);
|
||||||
|
key = 3;
|
||||||
|
multiset_put(me, &key);
|
||||||
|
key = 4;
|
||||||
|
multiset_put(me, &key);
|
||||||
|
key = 7;
|
||||||
|
multiset_put(me, &key);
|
||||||
|
key = 9;
|
||||||
|
multiset_put(me, &key);
|
||||||
|
key = 12;
|
||||||
|
multiset_put(me, &key);
|
||||||
|
key = 13;
|
||||||
|
multiset_put(me, &key);
|
||||||
|
key = 16;
|
||||||
|
multiset_put(me, &key);
|
||||||
|
key = 14;
|
||||||
|
multiset_put(me, &key);
|
||||||
|
multiset_clear(me);
|
||||||
|
// Two children edge case.
|
||||||
|
key = 8;
|
||||||
|
multiset_put(me, &key);
|
||||||
|
key = 4;
|
||||||
|
multiset_put(me, &key);
|
||||||
|
key = 12;
|
||||||
|
multiset_put(me, &key);
|
||||||
|
key = 2;
|
||||||
|
multiset_put(me, &key);
|
||||||
|
key = 6;
|
||||||
|
multiset_put(me, &key);
|
||||||
|
key = 10;
|
||||||
|
multiset_put(me, &key);
|
||||||
|
key = 15;
|
||||||
|
multiset_put(me, &key);
|
||||||
|
key = 1;
|
||||||
|
multiset_put(me, &key);
|
||||||
|
key = 3;
|
||||||
|
multiset_put(me, &key);
|
||||||
|
key = 5;
|
||||||
|
multiset_put(me, &key);
|
||||||
|
key = 7;
|
||||||
|
multiset_put(me, &key);
|
||||||
|
key = 9;
|
||||||
|
multiset_put(me, &key);
|
||||||
|
key = 11;
|
||||||
|
multiset_put(me, &key);
|
||||||
|
key = 13;
|
||||||
|
multiset_put(me, &key);
|
||||||
|
key = 16;
|
||||||
|
multiset_put(me, &key);
|
||||||
|
key = 14;
|
||||||
|
multiset_put(me, &key);
|
||||||
|
multiset_clear(me);
|
||||||
|
// Add a lot of items.
|
||||||
|
int count = 0;
|
||||||
|
bool flip = false;
|
||||||
|
for (int i = 1234; i < 82400; i++) {
|
||||||
|
key = i % 765;
|
||||||
|
multiset_put(me, &key);
|
||||||
|
assert(multiset_contains(me, &key));
|
||||||
|
count++;
|
||||||
|
if (i == 1857 && !flip) {
|
||||||
|
i *= -1;
|
||||||
|
flip = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
assert(count == multiset_size(me));
|
||||||
|
multiset_contains(me, &key);
|
||||||
|
multiset_destroy(me);
|
||||||
|
me = multiset_init(sizeof(int), compare_int);
|
||||||
|
assert(multiset_size(me) == 0);
|
||||||
|
assert(multiset_is_empty(me));
|
||||||
|
key = 4;
|
||||||
|
multiset_put(me, &key);
|
||||||
|
assert(multiset_size(me) == 1);
|
||||||
|
multiset_put(me, &key);
|
||||||
|
assert(multiset_size(me) == 2);
|
||||||
|
assert(!multiset_is_empty(me));
|
||||||
|
assert(multiset_contains(me, &key));
|
||||||
|
key = 7;
|
||||||
|
assert(!multiset_contains(me, &key));
|
||||||
|
multiset_put(me, &key);
|
||||||
|
assert(multiset_size(me) == 3);
|
||||||
|
assert(multiset_contains(me, &key));
|
||||||
|
int c[10] = {5, 9, 4, -5, 0, 6, 1, 5, 7, 2};
|
||||||
|
for (int i = 0; i < 10; i++) {
|
||||||
|
multiset_put(me, &c[i]);
|
||||||
|
assert(multiset_contains(me, &c[i]));
|
||||||
|
}
|
||||||
|
assert(multiset_size(me) == 13);
|
||||||
|
for (int i = 0; i < 10; i++) {
|
||||||
|
assert(multiset_contains(me, &c[i]));
|
||||||
|
}
|
||||||
|
for (int i = -100; i < 100; i++) {
|
||||||
|
bool contains = false;
|
||||||
|
for (int j = 0; j < 10; j++) {
|
||||||
|
if (c[j] == i) {
|
||||||
|
contains = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
assert(multiset_contains(me, &i) == contains);
|
||||||
|
}
|
||||||
|
num = -3;
|
||||||
|
assert(!multiset_remove(me, &num));
|
||||||
|
assert(multiset_size(me) == 13);
|
||||||
|
assert(!multiset_contains(me, &num));
|
||||||
|
num = 6;
|
||||||
|
assert(multiset_remove(me, &num));
|
||||||
|
assert(multiset_size(me) == 12);
|
||||||
|
assert(!multiset_contains(me, &num));
|
||||||
|
num = 4;
|
||||||
|
assert(multiset_remove(me, &num));
|
||||||
|
assert(multiset_size(me) == 11);
|
||||||
|
assert(multiset_contains(me, &num));
|
||||||
|
num = 7;
|
||||||
|
assert(multiset_remove(me, &num));
|
||||||
|
assert(multiset_size(me) == 10);
|
||||||
|
assert(multiset_contains(me, &num));
|
||||||
|
num = 9;
|
||||||
|
assert(multiset_remove(me, &num));
|
||||||
|
assert(multiset_size(me) == 9);
|
||||||
|
assert(!multiset_contains(me, &num));
|
||||||
|
num = -5;
|
||||||
|
assert(multiset_remove(me, &num));
|
||||||
|
assert(multiset_size(me) == 8);
|
||||||
|
assert(!multiset_contains(me, &num));
|
||||||
|
num = 0;
|
||||||
|
assert(multiset_remove(me, &num));
|
||||||
|
assert(multiset_size(me) == 7);
|
||||||
|
assert(!multiset_contains(me, &num));
|
||||||
|
num = 1;
|
||||||
|
assert(multiset_remove(me, &num));
|
||||||
|
assert(multiset_size(me) == 6);
|
||||||
|
assert(!multiset_contains(me, &num));
|
||||||
|
num = 5;
|
||||||
|
assert(multiset_remove(me, &num));
|
||||||
|
assert(multiset_size(me) == 5);
|
||||||
|
assert(multiset_contains(me, &num));
|
||||||
|
num = 2;
|
||||||
|
assert(multiset_remove(me, &num));
|
||||||
|
assert(multiset_size(me) == 4);
|
||||||
|
assert(!multiset_contains(me, &num));
|
||||||
|
multiset_clear(me);
|
||||||
|
// Add a lot of items and remove individually.
|
||||||
|
for (int i = 5000; i < 6000; i++) {
|
||||||
|
multiset_put(me, &i);
|
||||||
|
assert(multiset_contains(me, &i));
|
||||||
|
}
|
||||||
|
assert(multiset_size(me) == 1000);
|
||||||
|
for (int i = 5000; i < 5500; i++) {
|
||||||
|
multiset_remove(me, &i);
|
||||||
|
assert(!multiset_contains(me, &i));
|
||||||
|
}
|
||||||
|
assert(multiset_size(me) == 500);
|
||||||
|
assert(!multiset_is_empty(me));
|
||||||
|
multiset_clear(me);
|
||||||
|
assert(multiset_size(me) == 0);
|
||||||
|
assert(multiset_is_empty(me));
|
||||||
|
// Add a lot of items and clear.
|
||||||
|
for (int i = 5000; i < 6000; i++) {
|
||||||
|
multiset_put(me, &i);
|
||||||
|
assert(multiset_contains(me, &i));
|
||||||
|
}
|
||||||
|
assert(multiset_size(me) == 1000);
|
||||||
|
multiset_clear(me);
|
||||||
|
int p = 0xdeadbeef;
|
||||||
|
assert(!multiset_remove(me, &p));
|
||||||
|
assert(multiset_size(me) == 0);
|
||||||
|
assert(multiset_is_empty(me));
|
||||||
|
me = multiset_destroy(me);
|
||||||
|
assert(!me);
|
||||||
|
// Create odd shape graph.
|
||||||
|
me = multiset_init(sizeof(int), compare_int);
|
||||||
|
key = 10;
|
||||||
|
multiset_put(me, &key);
|
||||||
|
key = 5;
|
||||||
|
multiset_put(me, &key);
|
||||||
|
key = 15;
|
||||||
|
multiset_put(me, &key);
|
||||||
|
key = 3;
|
||||||
|
multiset_put(me, &key);
|
||||||
|
key = 8;
|
||||||
|
multiset_put(me, &key);
|
||||||
|
key = 12;
|
||||||
|
multiset_put(me, &key);
|
||||||
|
key = 18;
|
||||||
|
multiset_put(me, &key);
|
||||||
|
key = 12;
|
||||||
|
multiset_remove(me, &key);
|
||||||
|
key = 5;
|
||||||
|
multiset_remove(me, &key);
|
||||||
|
key = 3;
|
||||||
|
multiset_remove(me, &key);
|
||||||
|
key = 8;
|
||||||
|
multiset_remove(me, &key);
|
||||||
|
multiset_clear(me);
|
||||||
|
// Allocate many nodes.
|
||||||
|
for (int i = 8123; i < 12314; i += 3) {
|
||||||
|
multiset_put(me, &i);
|
||||||
|
assert(multiset_contains(me, &i));
|
||||||
|
}
|
||||||
|
for (int i = 13000; i > 8000; i--) {
|
||||||
|
multiset_remove(me, &i);
|
||||||
|
assert(!multiset_contains(me, &i));
|
||||||
|
}
|
||||||
|
multiset_clear(me);
|
||||||
|
// Create another odd shape graph.
|
||||||
|
key = 20;
|
||||||
|
multiset_put(me, &key);
|
||||||
|
key = 10;
|
||||||
|
multiset_put(me, &key);
|
||||||
|
key = 40;
|
||||||
|
multiset_put(me, &key);
|
||||||
|
key = 5;
|
||||||
|
multiset_put(me, &key);
|
||||||
|
key = 15;
|
||||||
|
multiset_put(me, &key);
|
||||||
|
key = 30;
|
||||||
|
multiset_put(me, &key);
|
||||||
|
key = 50;
|
||||||
|
multiset_put(me, &key);
|
||||||
|
key = 25;
|
||||||
|
multiset_put(me, &key);
|
||||||
|
key = 35;
|
||||||
|
multiset_put(me, &key);
|
||||||
|
key = 36;
|
||||||
|
multiset_put(me, &key);
|
||||||
|
key = 34;
|
||||||
|
multiset_put(me, &key);
|
||||||
|
key = 33;
|
||||||
|
multiset_put(me, &key);
|
||||||
|
key = 32;
|
||||||
|
multiset_put(me, &key);
|
||||||
|
key = 30;
|
||||||
|
multiset_remove(me, &key);
|
||||||
|
key = 32;
|
||||||
|
assert(multiset_contains(me, &key));
|
||||||
|
multiset_clear(me);
|
||||||
|
// One sided tree.
|
||||||
|
key = 10;
|
||||||
|
multiset_put(me, &key);
|
||||||
|
key = 9;
|
||||||
|
multiset_put(me, &key);
|
||||||
|
key = 8;
|
||||||
|
multiset_put(me, &key);
|
||||||
|
key = 7;
|
||||||
|
multiset_put(me, &key);
|
||||||
|
key = 8;
|
||||||
|
multiset_remove(me, &key);
|
||||||
|
key = 7;
|
||||||
|
assert(multiset_contains(me, &key));
|
||||||
|
multiset_destroy(me);
|
||||||
|
// Replace two sided two children.
|
||||||
|
me = multiset_init(sizeof(int), compare_int);
|
||||||
|
key = 5;
|
||||||
|
multiset_put(me, &key);
|
||||||
|
key = 1;
|
||||||
|
multiset_put(me, &key);
|
||||||
|
key = 6;
|
||||||
|
multiset_put(me, &key);
|
||||||
|
key = -1;
|
||||||
|
multiset_put(me, &key);
|
||||||
|
key = 3;
|
||||||
|
multiset_put(me, &key);
|
||||||
|
key = 7;
|
||||||
|
multiset_put(me, &key);
|
||||||
|
key = -2;
|
||||||
|
multiset_put(me, &key);
|
||||||
|
key = 0;
|
||||||
|
multiset_put(me, &key);
|
||||||
|
key = 2;
|
||||||
|
multiset_put(me, &key);
|
||||||
|
key = 4;
|
||||||
|
multiset_put(me, &key);
|
||||||
|
key = 1;
|
||||||
|
multiset_remove(me, &key);
|
||||||
|
assert(!multiset_contains(me, &key));
|
||||||
|
multiset_clear(me);
|
||||||
|
key = 5;
|
||||||
|
multiset_put(me, &key);
|
||||||
|
key = 1;
|
||||||
|
multiset_put(me, &key);
|
||||||
|
key = 6;
|
||||||
|
multiset_put(me, &key);
|
||||||
|
key = -1;
|
||||||
|
multiset_put(me, &key);
|
||||||
|
key = 3;
|
||||||
|
multiset_put(me, &key);
|
||||||
|
key = 7;
|
||||||
|
multiset_put(me, &key);
|
||||||
|
key = -2;
|
||||||
|
multiset_put(me, &key);
|
||||||
|
key = 0;
|
||||||
|
multiset_put(me, &key);
|
||||||
|
key = 4;
|
||||||
|
multiset_put(me, &key);
|
||||||
|
key = 1;
|
||||||
|
multiset_remove(me, &key);
|
||||||
|
assert(!multiset_contains(me, &key));
|
||||||
|
me = multiset_destroy(me);
|
||||||
|
assert(!me);
|
||||||
|
me = multiset_init(sizeof(int), compare_int);
|
||||||
|
for (int i = 4817; i > -2983; i -= 11) {
|
||||||
|
multiset_put(me, &i);
|
||||||
|
assert(multiset_contains(me, &i));
|
||||||
|
}
|
||||||
|
for (int i = -432; i < 3849; i += 7) {
|
||||||
|
multiset_remove(me, &i);
|
||||||
|
assert(!multiset_contains(me, &i));
|
||||||
|
}
|
||||||
|
multiset_clear(me);
|
||||||
|
key = 5;
|
||||||
|
multiset_put(me, &key);
|
||||||
|
key = 7;
|
||||||
|
multiset_put(me, &key);
|
||||||
|
key = 5;
|
||||||
|
multiset_remove(me, &key);
|
||||||
|
multiset_clear(me);
|
||||||
|
// Two children edge case other side.
|
||||||
|
key = 8;
|
||||||
|
multiset_put(me, &key);
|
||||||
|
key = 4;
|
||||||
|
multiset_put(me, &key);
|
||||||
|
key = 12;
|
||||||
|
multiset_put(me, &key);
|
||||||
|
key = 2;
|
||||||
|
multiset_put(me, &key);
|
||||||
|
key = 6;
|
||||||
|
multiset_put(me, &key);
|
||||||
|
key = 10;
|
||||||
|
multiset_put(me, &key);
|
||||||
|
key = 16;
|
||||||
|
multiset_put(me, &key);
|
||||||
|
key = 1;
|
||||||
|
multiset_put(me, &key);
|
||||||
|
key = 3;
|
||||||
|
multiset_put(me, &key);
|
||||||
|
key = 5;
|
||||||
|
multiset_put(me, &key);
|
||||||
|
key = 7;
|
||||||
|
multiset_put(me, &key);
|
||||||
|
key = 9;
|
||||||
|
multiset_put(me, &key);
|
||||||
|
key = 11;
|
||||||
|
multiset_put(me, &key);
|
||||||
|
key = 15;
|
||||||
|
multiset_put(me, &key);
|
||||||
|
key = 17;
|
||||||
|
multiset_put(me, &key);
|
||||||
|
key = 13;
|
||||||
|
multiset_put(me, &key);
|
||||||
|
multiset_clear(me);
|
||||||
|
assert(multiset_count(me, &key) == 0);
|
||||||
|
assert(!multiset_remove_all(me, &key));
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -55,11 +55,16 @@ bool stub_priority_queue_pop(void *const data, priority_queue me)
|
|||||||
|
|
||||||
void test_priority_queue(void)
|
void test_priority_queue(void)
|
||||||
{
|
{
|
||||||
|
assert(!priority_queue_init(0, compare_int));
|
||||||
|
assert(!priority_queue_init(sizeof(int), NULL));
|
||||||
priority_queue me = priority_queue_init(sizeof(int), compare_int);
|
priority_queue me = priority_queue_init(sizeof(int), compare_int);
|
||||||
assert(me);
|
assert(me);
|
||||||
assert(priority_queue_size(me) == 0);
|
assert(priority_queue_size(me) == 0);
|
||||||
assert(priority_queue_is_empty(me));
|
assert(priority_queue_is_empty(me));
|
||||||
int item = 5;
|
int item = 0xdeadbeef;
|
||||||
|
assert(!priority_queue_pop(&item, me));
|
||||||
|
assert(item == 0xdeadbeef);
|
||||||
|
item = 5;
|
||||||
stub_priority_queue_push(me, &item);
|
stub_priority_queue_push(me, &item);
|
||||||
item = 2;
|
item = 2;
|
||||||
stub_priority_queue_push(me, &item);
|
stub_priority_queue_push(me, &item);
|
||||||
|
|||||||
@@ -3,6 +3,7 @@
|
|||||||
|
|
||||||
void test_queue(void)
|
void test_queue(void)
|
||||||
{
|
{
|
||||||
|
assert(!queue_init(0));
|
||||||
int val[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
|
int val[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
|
||||||
queue me = queue_init(sizeof(int));
|
queue me = queue_init(sizeof(int));
|
||||||
assert(me);
|
assert(me);
|
||||||
|
|||||||
53
tst/set.c
53
tst/set.c
@@ -114,6 +114,8 @@ static int compare_int(const void *const one, const void *const two)
|
|||||||
|
|
||||||
void test_set(void)
|
void test_set(void)
|
||||||
{
|
{
|
||||||
|
assert(!set_init(0, compare_int));
|
||||||
|
assert(!set_init(sizeof(int), NULL));
|
||||||
set me = set_init(sizeof(int), compare_int);
|
set me = set_init(sizeof(int), compare_int);
|
||||||
assert(me);
|
assert(me);
|
||||||
int key;
|
int key;
|
||||||
@@ -476,4 +478,55 @@ void test_set(void)
|
|||||||
assert(!stub_set_contains(me, &key));
|
assert(!stub_set_contains(me, &key));
|
||||||
me = stub_set_destroy(me);
|
me = stub_set_destroy(me);
|
||||||
assert(!me);
|
assert(!me);
|
||||||
|
me = set_init(sizeof(int), compare_int);
|
||||||
|
for (int i = 4817; i > -2983; i -= 11) {
|
||||||
|
stub_set_put(me, &i);
|
||||||
|
assert(stub_set_contains(me, &i));
|
||||||
|
}
|
||||||
|
for (int i = -432; i < 3849; i += 7) {
|
||||||
|
stub_set_remove(me, &i);
|
||||||
|
assert(!stub_set_contains(me, &i));
|
||||||
|
}
|
||||||
|
stub_set_clear(me);
|
||||||
|
key = 5;
|
||||||
|
stub_set_put(me, &key);
|
||||||
|
key = 7;
|
||||||
|
stub_set_put(me, &key);
|
||||||
|
key = 5;
|
||||||
|
stub_set_remove(me, &key);
|
||||||
|
stub_set_clear(me);
|
||||||
|
// Two children edge case other side.
|
||||||
|
key = 8;
|
||||||
|
stub_set_put(me, &key);
|
||||||
|
key = 4;
|
||||||
|
stub_set_put(me, &key);
|
||||||
|
key = 12;
|
||||||
|
stub_set_put(me, &key);
|
||||||
|
key = 2;
|
||||||
|
stub_set_put(me, &key);
|
||||||
|
key = 6;
|
||||||
|
stub_set_put(me, &key);
|
||||||
|
key = 10;
|
||||||
|
stub_set_put(me, &key);
|
||||||
|
key = 16;
|
||||||
|
stub_set_put(me, &key);
|
||||||
|
key = 1;
|
||||||
|
stub_set_put(me, &key);
|
||||||
|
key = 3;
|
||||||
|
stub_set_put(me, &key);
|
||||||
|
key = 5;
|
||||||
|
stub_set_put(me, &key);
|
||||||
|
key = 7;
|
||||||
|
stub_set_put(me, &key);
|
||||||
|
key = 9;
|
||||||
|
stub_set_put(me, &key);
|
||||||
|
key = 11;
|
||||||
|
stub_set_put(me, &key);
|
||||||
|
key = 15;
|
||||||
|
stub_set_put(me, &key);
|
||||||
|
key = 17;
|
||||||
|
stub_set_put(me, &key);
|
||||||
|
key = 13;
|
||||||
|
stub_set_put(me, &key);
|
||||||
|
stub_set_clear(me);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -3,6 +3,7 @@
|
|||||||
|
|
||||||
void test_stack(void)
|
void test_stack(void)
|
||||||
{
|
{
|
||||||
|
assert(!stack_init(0));
|
||||||
int val[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
|
int val[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
|
||||||
stack me = stack_init(sizeof(int));
|
stack me = stack_init(sizeof(int));
|
||||||
assert(me);
|
assert(me);
|
||||||
|
|||||||
@@ -18,10 +18,19 @@ static unsigned long hash_int(const void *const key)
|
|||||||
return hash;
|
return hash;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static unsigned long bad_hash_int(const void *const key)
|
||||||
|
{
|
||||||
|
return 5;
|
||||||
|
}
|
||||||
|
|
||||||
void test_unordered_map(void)
|
void test_unordered_map(void)
|
||||||
{
|
{
|
||||||
|
assert(!unordered_map_init(0, sizeof(int), hash_int, compare_int));
|
||||||
|
assert(!unordered_map_init(sizeof(int), 0, hash_int, compare_int));
|
||||||
|
assert(!unordered_map_init(sizeof(int), sizeof(int), NULL, compare_int));
|
||||||
|
assert(!unordered_map_init(sizeof(int), sizeof(int), hash_int, NULL));
|
||||||
unordered_map me = unordered_map_init(sizeof(int), sizeof(int),
|
unordered_map me = unordered_map_init(sizeof(int), sizeof(int),
|
||||||
hash_int, compare_int);
|
hash_int, compare_int);
|
||||||
assert(unordered_map_size(me) == 0);
|
assert(unordered_map_size(me) == 0);
|
||||||
assert(unordered_map_is_empty(me));
|
assert(unordered_map_is_empty(me));
|
||||||
int key = 4;
|
int key = 4;
|
||||||
@@ -129,5 +138,27 @@ void test_unordered_map(void)
|
|||||||
assert(unordered_map_size(me) == 0);
|
assert(unordered_map_size(me) == 0);
|
||||||
assert(unordered_map_is_empty(me));
|
assert(unordered_map_is_empty(me));
|
||||||
me = unordered_map_destroy(me);
|
me = unordered_map_destroy(me);
|
||||||
assert(me == NULL);
|
assert(!me);
|
||||||
|
me = unordered_map_init(sizeof(int), sizeof(int), bad_hash_int,
|
||||||
|
compare_int);
|
||||||
|
num = 1;
|
||||||
|
unordered_map_put(me, &num, &num);
|
||||||
|
num = 2;
|
||||||
|
unordered_map_put(me, &num, &num);
|
||||||
|
num = 3;
|
||||||
|
unordered_map_put(me, &num, &num);
|
||||||
|
num = 4;
|
||||||
|
unordered_map_put(me, &num, &num);
|
||||||
|
assert(unordered_map_size(me) == 4);
|
||||||
|
unordered_map_put(me, &num, &num);
|
||||||
|
assert(unordered_map_size(me) == 4);
|
||||||
|
assert(unordered_map_remove(me, &num));
|
||||||
|
assert(!unordered_map_remove(me, &num));
|
||||||
|
assert(unordered_map_size(me) == 3);
|
||||||
|
unordered_map_rehash(me);
|
||||||
|
assert(unordered_map_size(me) == 3);
|
||||||
|
key = 5;
|
||||||
|
value = 0xdeadbeef;
|
||||||
|
assert(!unordered_map_get(&value, me, &key));
|
||||||
|
assert(value == 0xdeadbeef);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -18,8 +18,23 @@ static unsigned long hash_int(const void *const key)
|
|||||||
return hash;
|
return hash;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static unsigned long bad_hash_int(const void *const key)
|
||||||
|
{
|
||||||
|
return 5;
|
||||||
|
}
|
||||||
|
|
||||||
void test_unordered_multimap(void)
|
void test_unordered_multimap(void)
|
||||||
{
|
{
|
||||||
|
assert(!unordered_multimap_init(0, sizeof(int), hash_int, compare_int,
|
||||||
|
compare_int));
|
||||||
|
assert(!unordered_multimap_init(sizeof(int), 0, hash_int, compare_int,
|
||||||
|
compare_int));
|
||||||
|
assert(!unordered_multimap_init(sizeof(int), sizeof(int), NULL, compare_int,
|
||||||
|
compare_int));
|
||||||
|
assert(!unordered_multimap_init(sizeof(int), sizeof(int), hash_int, NULL,
|
||||||
|
compare_int));
|
||||||
|
assert(!unordered_multimap_init(sizeof(int), sizeof(int), hash_int,
|
||||||
|
compare_int, NULL));
|
||||||
unordered_multimap me =
|
unordered_multimap me =
|
||||||
unordered_multimap_init(sizeof(int), sizeof(int), hash_int,
|
unordered_multimap_init(sizeof(int), sizeof(int), hash_int,
|
||||||
compare_int, compare_int);
|
compare_int, compare_int);
|
||||||
@@ -160,4 +175,72 @@ void test_unordered_multimap(void)
|
|||||||
assert(unordered_multimap_size(me) == 1);
|
assert(unordered_multimap_size(me) == 1);
|
||||||
me = unordered_multimap_destroy(me);
|
me = unordered_multimap_destroy(me);
|
||||||
assert(!me);
|
assert(!me);
|
||||||
|
me = unordered_multimap_init(sizeof(int), sizeof(int), bad_hash_int,
|
||||||
|
compare_int, compare_int);
|
||||||
|
key = 1;
|
||||||
|
unordered_multimap_put(me, &key, &value);
|
||||||
|
key = 2;
|
||||||
|
unordered_multimap_put(me, &key, &value);
|
||||||
|
key = 3;
|
||||||
|
unordered_multimap_put(me, &key, &value);
|
||||||
|
assert(unordered_multimap_size(me) == 3);
|
||||||
|
unordered_multimap_put(me, &key, &value);
|
||||||
|
assert(unordered_multimap_size(me) == 4);
|
||||||
|
key = 4;
|
||||||
|
unordered_multimap_put(me, &key, &value);
|
||||||
|
assert(unordered_multimap_size(me) == 5);
|
||||||
|
assert(unordered_multimap_remove(me, &key, &value));
|
||||||
|
assert(!unordered_multimap_remove(me, &key, &value));
|
||||||
|
assert(unordered_multimap_size(me) == 4);
|
||||||
|
unordered_multimap_rehash(me);
|
||||||
|
assert(unordered_multimap_size(me) == 4);
|
||||||
|
me = unordered_multimap_init(sizeof(int), sizeof(int), bad_hash_int,
|
||||||
|
compare_int, compare_int);
|
||||||
|
key = 1;
|
||||||
|
unordered_multimap_put(me, &key, &value);
|
||||||
|
key = 2;
|
||||||
|
unordered_multimap_put(me, &key, &value);
|
||||||
|
key = 3;
|
||||||
|
unordered_multimap_put(me, &key, &value);
|
||||||
|
assert(unordered_multimap_size(me) == 3);
|
||||||
|
unordered_multimap_put(me, &key, &value);
|
||||||
|
assert(unordered_multimap_size(me) == 4);
|
||||||
|
key = 4;
|
||||||
|
unordered_multimap_put(me, &key, &value);
|
||||||
|
assert(unordered_multimap_size(me) == 5);
|
||||||
|
assert(unordered_multimap_remove_all(me, &key));
|
||||||
|
assert(!unordered_multimap_remove_all(me, &key));
|
||||||
|
assert(unordered_multimap_size(me) == 4);
|
||||||
|
unordered_multimap_rehash(me);
|
||||||
|
assert(unordered_multimap_size(me) == 4);
|
||||||
|
unordered_multimap_clear(me);
|
||||||
|
assert(unordered_multimap_size(me) == 0);
|
||||||
|
assert(!unordered_multimap_remove_all(me, &key));
|
||||||
|
assert(unordered_multimap_size(me) == 0);
|
||||||
|
me = unordered_multimap_init(sizeof(int), sizeof(int), bad_hash_int,
|
||||||
|
compare_int, compare_int);
|
||||||
|
key = 1;
|
||||||
|
value = 10;
|
||||||
|
unordered_multimap_put(me, &key, &value);
|
||||||
|
key = 2;
|
||||||
|
value = 11;
|
||||||
|
unordered_multimap_put(me, &key, &value);
|
||||||
|
key = 3;
|
||||||
|
value = 12;
|
||||||
|
unordered_multimap_put(me, &key, &value);
|
||||||
|
key = 4;
|
||||||
|
value = 14;
|
||||||
|
unordered_multimap_put(me, &key, &value);
|
||||||
|
key = 3;
|
||||||
|
value = 13;
|
||||||
|
unordered_multimap_put(me, &key, &value);
|
||||||
|
unordered_multimap_get_start(me, &key);
|
||||||
|
value = 20;
|
||||||
|
unordered_multimap_get_next(&value, me);
|
||||||
|
assert(value == 12);
|
||||||
|
unordered_multimap_get_next(&value, me);
|
||||||
|
assert(value == 13);
|
||||||
|
value = 30;
|
||||||
|
assert(!unordered_multimap_get_next(&value, me));
|
||||||
|
assert(value == 30);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -18,8 +18,16 @@ static unsigned long hash_int(const void *const key)
|
|||||||
return hash;
|
return hash;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static unsigned long bad_hash_int(const void *const key)
|
||||||
|
{
|
||||||
|
return 5;
|
||||||
|
}
|
||||||
|
|
||||||
void test_unordered_multiset(void)
|
void test_unordered_multiset(void)
|
||||||
{
|
{
|
||||||
|
assert(!unordered_multiset_init(0, hash_int, compare_int));
|
||||||
|
assert(!unordered_multiset_init(sizeof(int), NULL, compare_int));
|
||||||
|
assert(!unordered_multiset_init(sizeof(int), hash_int, NULL));
|
||||||
unordered_multiset me =
|
unordered_multiset me =
|
||||||
unordered_multiset_init(sizeof(int), hash_int, compare_int);
|
unordered_multiset_init(sizeof(int), hash_int, compare_int);
|
||||||
assert(me);
|
assert(me);
|
||||||
@@ -148,4 +156,44 @@ void test_unordered_multiset(void)
|
|||||||
assert(unordered_multiset_size(me) == 1);
|
assert(unordered_multiset_size(me) == 1);
|
||||||
me = unordered_multiset_destroy(me);
|
me = unordered_multiset_destroy(me);
|
||||||
assert(!me);
|
assert(!me);
|
||||||
|
me = unordered_multiset_init(sizeof(int), bad_hash_int, compare_int);
|
||||||
|
num = 1;
|
||||||
|
unordered_multiset_put(me, &num);
|
||||||
|
num = 2;
|
||||||
|
unordered_multiset_put(me, &num);
|
||||||
|
num = 3;
|
||||||
|
unordered_multiset_put(me, &num);
|
||||||
|
assert(unordered_multiset_size(me) == 3);
|
||||||
|
unordered_multiset_put(me, &num);
|
||||||
|
assert(unordered_multiset_size(me) == 4);
|
||||||
|
num = 4;
|
||||||
|
unordered_multiset_put(me, &num);
|
||||||
|
assert(unordered_multiset_size(me) == 5);
|
||||||
|
assert(unordered_multiset_remove(me, &num));
|
||||||
|
assert(!unordered_multiset_remove(me, &num));
|
||||||
|
assert(unordered_multiset_size(me) == 4);
|
||||||
|
unordered_multiset_rehash(me);
|
||||||
|
assert(unordered_multiset_size(me) == 4);
|
||||||
|
me = unordered_multiset_init(sizeof(int), bad_hash_int, compare_int);
|
||||||
|
num = 1;
|
||||||
|
unordered_multiset_put(me, &num);
|
||||||
|
num = 2;
|
||||||
|
unordered_multiset_put(me, &num);
|
||||||
|
num = 3;
|
||||||
|
unordered_multiset_put(me, &num);
|
||||||
|
assert(unordered_multiset_size(me) == 3);
|
||||||
|
unordered_multiset_put(me, &num);
|
||||||
|
assert(unordered_multiset_size(me) == 4);
|
||||||
|
num = 4;
|
||||||
|
unordered_multiset_put(me, &num);
|
||||||
|
assert(unordered_multiset_size(me) == 5);
|
||||||
|
assert(unordered_multiset_remove_all(me, &num));
|
||||||
|
assert(!unordered_multiset_remove_all(me, &num));
|
||||||
|
assert(unordered_multiset_size(me) == 4);
|
||||||
|
unordered_multiset_rehash(me);
|
||||||
|
assert(unordered_multiset_size(me) == 4);
|
||||||
|
unordered_multiset_clear(me);
|
||||||
|
assert(unordered_multiset_size(me) == 0);
|
||||||
|
assert(!unordered_multiset_remove_all(me, &num));
|
||||||
|
assert(unordered_multiset_size(me) == 0);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -18,8 +18,16 @@ static unsigned long hash_int(const void *const key)
|
|||||||
return hash;
|
return hash;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static unsigned long bad_hash_int(const void *const key)
|
||||||
|
{
|
||||||
|
return 5;
|
||||||
|
}
|
||||||
|
|
||||||
void test_unordered_set(void)
|
void test_unordered_set(void)
|
||||||
{
|
{
|
||||||
|
assert(!unordered_set_init(0, hash_int, compare_int));
|
||||||
|
assert(!unordered_set_init(sizeof(int), NULL, compare_int));
|
||||||
|
assert(!unordered_set_init(sizeof(int), hash_int, NULL));
|
||||||
unordered_set me = unordered_set_init(sizeof(int), hash_int, compare_int);
|
unordered_set me = unordered_set_init(sizeof(int), hash_int, compare_int);
|
||||||
assert(me);
|
assert(me);
|
||||||
assert(unordered_set_size(me) == 0);
|
assert(unordered_set_size(me) == 0);
|
||||||
@@ -125,4 +133,21 @@ void test_unordered_set(void)
|
|||||||
assert(unordered_set_is_empty(me));
|
assert(unordered_set_is_empty(me));
|
||||||
me = unordered_set_destroy(me);
|
me = unordered_set_destroy(me);
|
||||||
assert(!me);
|
assert(!me);
|
||||||
|
me = unordered_set_init(sizeof(int), bad_hash_int, compare_int);
|
||||||
|
num = 1;
|
||||||
|
unordered_set_put(me, &num);
|
||||||
|
num = 2;
|
||||||
|
unordered_set_put(me, &num);
|
||||||
|
num = 3;
|
||||||
|
unordered_set_put(me, &num);
|
||||||
|
num = 4;
|
||||||
|
unordered_set_put(me, &num);
|
||||||
|
assert(unordered_set_size(me) == 4);
|
||||||
|
unordered_set_put(me, &num);
|
||||||
|
assert(unordered_set_size(me) == 4);
|
||||||
|
assert(unordered_set_remove(me, &num));
|
||||||
|
assert(!unordered_set_remove(me, &num));
|
||||||
|
assert(unordered_set_size(me) == 3);
|
||||||
|
unordered_set_rehash(me);
|
||||||
|
assert(unordered_set_size(me) == 3);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -63,6 +63,7 @@ static void test_vector_dynamic(void)
|
|||||||
|
|
||||||
void test_vector(void)
|
void test_vector(void)
|
||||||
{
|
{
|
||||||
|
assert(!vector_init(0));
|
||||||
int val[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
|
int val[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
|
||||||
vector me = vector_init(sizeof(int));
|
vector me = vector_init(sizeof(int));
|
||||||
assert(me);
|
assert(me);
|
||||||
@@ -158,6 +159,7 @@ void test_vector(void)
|
|||||||
assert(arr[0] == -5);
|
assert(arr[0] == -5);
|
||||||
assert(arr[1] == -6);
|
assert(arr[1] == -6);
|
||||||
assert(arr[2] == -7);
|
assert(arr[2] == -7);
|
||||||
|
assert(vector_reserve(me, 100) == 0);
|
||||||
assert(vector_set_at(me, 4, &set) == -EINVAL);
|
assert(vector_set_at(me, 4, &set) == -EINVAL);
|
||||||
assert(vector_get_at(&set, me, 4) == -EINVAL);
|
assert(vector_get_at(&set, me, 4) == -EINVAL);
|
||||||
assert(vector_remove_at(me, 4) == -EINVAL);
|
assert(vector_remove_at(me, 4) == -EINVAL);
|
||||||
@@ -167,6 +169,11 @@ void test_vector(void)
|
|||||||
assert(vector_remove_at(me, -1) == -EINVAL);
|
assert(vector_remove_at(me, -1) == -EINVAL);
|
||||||
assert(vector_add_at(me, -1, &set) == -EINVAL);
|
assert(vector_add_at(me, -1, &set) == -EINVAL);
|
||||||
vector_clear(me);
|
vector_clear(me);
|
||||||
|
for (int i = 0; i < 32; i++) {
|
||||||
|
vector_add_last(me, &i);
|
||||||
|
}
|
||||||
|
vector_clear(me);
|
||||||
|
assert(vector_capacity(me) == 8);
|
||||||
assert(vector_size(me) == 0);
|
assert(vector_size(me) == 0);
|
||||||
assert(vector_is_empty(me));
|
assert(vector_is_empty(me));
|
||||||
assert(vector_remove_first(me) == -EINVAL);
|
assert(vector_remove_first(me) == -EINVAL);
|
||||||
|
|||||||
Reference in New Issue
Block a user