More refactoring

This commit is contained in:
Leonardo Vencovsky committed 2023-01-19 15:37:44 +01:00
1 parent e4d58db474
commit 71fd0b8ad5
86 files changed
+9149 -315

No files matched your search

+22 -14
View File
@@ -1,6 +1,14 @@
#include <inttypes.h>
#include <stdio.h>
#define CMC_EXT_FALLTHROUGH
#define CMC_EXT_INIT
#define CMC_EXT_ITER
#define CMC_EXT_NODE
#define CMC_EXT_SEQ
#define CMC_EXT_SETF
#define CMC_EXT_STR
#include "unt_bitset.h"
#include "unt_deque.h"
#include "unt_hashbidimap.h"
@@ -10,15 +18,15 @@
#include "unt_hashset.h"
#include "unt_heap.h"
#include "unt_intervalheap.h"
// #include "unt_linkedlist.h"
#include "unt_linkedlist.h"
#include "unt_list.h"
#include "unt_queue.h"
// #include "unt_sortedlist.h"
#include "unt_sortedlist.h"
#include "unt_stack.h"
// #include "unt_treemap.h"
// #include "unt_treeset.h"
#include "unt_treemap.h"
#include "unt_treeset.h"
// #include "unt_foreach.h"
#include "unt_foreach.h"
#include "cmc/utl/assert.h"
#include "cmc/utl/timer.h"
@@ -70,22 +78,22 @@ int main(void)
cmc_run(CMCHeapIter, units, tests);
cmc_run(CMCIntervalHeap, units, tests);
cmc_run(CMCIntervalHeapIter, units, tests);
// cmc_run(CMCLinkedList, units, tests);
// cmc_run(CMCLinkedListIter, units, tests);
cmc_run(CMCLinkedList, units, tests);
cmc_run(CMCLinkedListIter, units, tests);
cmc_run(CMCList, units, tests);
cmc_run(CMCListIter, units, tests);
cmc_run(CMCQueue, units, tests);
cmc_run(CMCQueueIter, units, tests);
// cmc_run(CMCSortedList, units, tests);
// cmc_run(CMCSortedListIter, units, tests);
cmc_run(CMCSortedList, units, tests);
cmc_run(CMCSortedListIter, units, tests);
cmc_run(CMCStack, units, tests);
cmc_run(CMCStackIter, units, tests);
// cmc_run(CMCTreeMap, units, tests);
// cmc_run(CMCTreeMapIter, units, tests);
// cmc_run(CMCTreeSet, units, tests);
// cmc_run(CMCTreeSetIter, units, tests);
cmc_run(CMCTreeMap, units, tests);
cmc_run(CMCTreeMapIter, units, tests);
cmc_run(CMCTreeSet, units, tests);
cmc_run(CMCTreeSetIter, units, tests);
// cmc_run(ForEach, units, tests);
cmc_run(ForEach, units, tests);
cmc_timer_stop(timer);
-3
View File
@@ -5,9 +5,6 @@
#define PFX bs
#define SNAME bitset
#define CMC_EXT_BITSET_INIT
#define CMC_EXT_BITSET_ITER
#define CMC_EXT_BITSET_STR
#include "cmc/bitset.h"
struct cmc_alloc_node *bs_alloc_node =
-3
View File
@@ -6,9 +6,6 @@
#define V size_t
#define PFX d
#define SNAME deque
#define CMC_EXT_DEQUE_INIT
#define CMC_EXT_DEQUE_ITER
#define CMC_EXT_DEQUE_STR
#include "cmc/deque.h"
struct deque_fval *d_fval = &(struct deque_fval){
+474
View File
@@ -0,0 +1,474 @@
#ifndef CMC_TESTS_UNT_UTL_FOREACH_H
#define CMC_TESTS_UNT_UTL_FOREACH_H
CMC_CREATE_UNIT(ForEach, true, {
// CMC_CREATE_TEST(CMC<BitSet>, {
// struct bitset *bs = bs_new(10000);
// // WIP
// bs_free(bs);
// });
CMC_CREATE_TEST(CMC<Deque>, {
struct deque *d = d_new(10000, &(struct deque_fval){ .cmp = cmc_size_cmp,
.cpy = NULL,
.str = cmc_size_str,
.free = NULL,
.hash = cmc_size_hash,
.pri = cmc_size_cmp });
for (size_t i = 1; i <= 10000; i++)
d_push_back(d, i);
size_t sum = 0;
CMC_FOREACH (d, deque, it, d)
{
sum += d_iter_value(&it);
}
cmc_assert_equals(size_t, 50005000, sum);
sum = 0;
CMC_FOREACH_REV (d, deque, it, d)
{
sum += d_iter_value(&it);
}
cmc_assert_equals(size_t, 50005000, sum);
d_free(d);
});
// CMC_CREATE_TEST(CMC<HashBidiMap>, {
// struct hashbidimap *hbm =
// hbm_new(10000, 0.7,
// &(struct hashbidimap_fkey){ .cmp = cmc_size_cmp,
// .cpy = NULL,
// .str = cmc_size_str,
// .free = NULL,
// .hash = cmc_size_hash,
// .pri = cmc_size_cmp },
// &(struct hashbidimap_fval){ .cmp = cmc_size_cmp,
// .cpy = NULL,
// .str = cmc_size_str,
// .free = NULL,
// .hash = cmc_size_hash,
// .pri = cmc_size_cmp });
// // WIP
// hbm_free(hbm);
// });
CMC_CREATE_TEST(CMC<HashMap>, {
struct hashmap *hm = hm_new(10000, 0.6,
&(struct hashmap_fkey){ .cmp = cmc_size_cmp,
.cpy = NULL,
.str = cmc_size_str,
.free = NULL,
.hash = cmc_size_hash,
.pri = cmc_size_cmp },
&(struct hashmap_fval){ .cmp = cmc_size_cmp,
.cpy = NULL,
.str = cmc_size_str,
.free = NULL,
.hash = cmc_size_hash,
.pri = cmc_size_cmp });
for (size_t i = 1; i <= 10000; i++)
hm_insert(hm, i, i);
size_t sumk = 0;
size_t sumv = 0;
CMC_FOREACH (hm, hashmap, it, hm)
{
sumk += hm_iter_key(&it);
sumv += hm_iter_value(&it);
}
cmc_assert_equals(size_t, 50005000, sumk);
cmc_assert_equals(size_t, 50005000, sumv);
sumk = 0;
sumv = 0;
CMC_FOREACH_REV (hm, hashmap, it, hm)
{
sumk += hm_iter_key(&it);
sumv += hm_iter_value(&it);
}
cmc_assert_equals(size_t, 50005000, sumk);
cmc_assert_equals(size_t, 50005000, sumv);
hm_free(hm);
});
CMC_CREATE_TEST(CMC<HashMultiMap>, {
struct hashmultimap *hmm = hmm_new(10000, 0.6,
&(struct hashmultimap_fkey){ .cmp = cmc_size_cmp,
.cpy = NULL,
.str = cmc_size_str,
.free = NULL,
.hash = cmc_size_hash,
.pri = cmc_size_cmp },
&(struct hashmultimap_fval){ .cmp = cmc_size_cmp,
.cpy = NULL,
.str = cmc_size_str,
.free = NULL,
.hash = cmc_size_hash,
.pri = cmc_size_cmp });
for (size_t i = 1; i <= 10000; i++)
hmm_insert(hmm, i, i);
size_t sumk = 0;
size_t sumv = 0;
CMC_FOREACH (hmm, hashmultimap, it, hmm)
{
sumk += hmm_iter_key(&it);
sumv += hmm_iter_value(&it);
}
cmc_assert_equals(size_t, 50005000, sumk);
cmc_assert_equals(size_t, 50005000, sumv);
sumk = 0;
sumv = 0;
CMC_FOREACH_REV (hmm, hashmultimap, it, hmm)
{
sumk += hmm_iter_key(&it);
sumv += hmm_iter_value(&it);
}
cmc_assert_equals(size_t, 50005000, sumk);
cmc_assert_equals(size_t, 50005000, sumv);
hmm_free(hmm);
});
CMC_CREATE_TEST(CMC<HashMultiSet>, {
struct hashmultiset *hms = hms_new(10000, 0.6,
&(struct hashmultiset_fval){ .cmp = cmc_size_cmp,
.cpy = NULL,
.str = cmc_size_str,
.free = NULL,
.hash = cmc_size_hash,
.pri = cmc_size_cmp });
for (size_t i = 1; i <= 10000; i++)
hms_insert_many(hms, i, i);
size_t sumk = 0;
size_t sumv = 0;
CMC_FOREACH (hms, hashmultiset, it, hms)
{
sumk += hms_iter_value(&it);
sumv += hms_iter_multiplicity(&it);
}
cmc_assert_equals(size_t, 50005000, sumk);
cmc_assert_equals(size_t, 50005000, sumv);
sumk = 0;
sumv = 0;
CMC_FOREACH_REV (hms, hashmultiset, it, hms)
{
sumk += hms_iter_value(&it);
sumv += hms_iter_multiplicity(&it);
}
cmc_assert_equals(size_t, 50005000, sumk);
cmc_assert_equals(size_t, 50005000, sumv);
hms_free(hms);
});
CMC_CREATE_TEST(CMC<HashSet>, {
struct hashset *hs = hs_new(10000, 0.6,
&(struct hashset_fval){ .cmp = cmc_size_cmp,
.cpy = NULL,
.str = cmc_size_str,
.free = NULL,
.hash = cmc_size_hash,
.pri = cmc_size_cmp });
for (size_t i = 1; i <= 10000; i++)
hs_insert(hs, i);
size_t sumv = 0;
CMC_FOREACH (hs, hashset, it, hs)
{
sumv += hs_iter_value(&it);
}
cmc_assert_equals(size_t, 50005000, sumv);
sumv = 0;
CMC_FOREACH_REV (hs, hashset, it, hs)
{
sumv += hs_iter_value(&it);
}
cmc_assert_equals(size_t, 50005000, sumv);
hs_free(hs);
});
CMC_CREATE_TEST(CMC<Heap>, {
struct heap *h = h_new(10000, CMC_MAX_HEAP,
&(struct heap_fval){ .cmp = cmc_size_cmp,
.cpy = NULL,
.str = cmc_size_str,
.free = NULL,
.hash = cmc_size_hash,
.pri = cmc_size_cmp });
for (size_t i = 1; i <= 10000; i++)
h_insert(h, i);
size_t sumv = 0;
CMC_FOREACH (h, heap, it, h)
{
sumv += h_iter_value(&it);
}
cmc_assert_equals(size_t, 50005000, sumv);
sumv = 0;
CMC_FOREACH_REV (h, heap, it, h)
{
sumv += h_iter_value(&it);
}
cmc_assert_equals(size_t, 50005000, sumv);
h_free(h);
});
CMC_CREATE_TEST(CMC<IntervalHeap>, {
struct intervalheap *ih = ih_new(10000, &(struct intervalheap_fval){ .cmp = cmc_size_cmp,
.cpy = NULL,
.str = cmc_size_str,
.free = NULL,
.hash = cmc_size_hash,
.pri = cmc_size_cmp });
for (size_t i = 1; i <= 10000; i++)
ih_insert(ih, i);
size_t sumv = 0;
CMC_FOREACH (ih, intervalheap, it, ih)
{
sumv += ih_iter_value(&it);
}
cmc_assert_equals(size_t, 50005000, sumv);
sumv = 0;
CMC_FOREACH_REV (ih, intervalheap, it, ih)
{
sumv += ih_iter_value(&it);
}
cmc_assert_equals(size_t, 50005000, sumv);
ih_free(ih);
});
CMC_CREATE_TEST(CMC<LinkedList>, {
struct linkedlist *ll = ll_new(&(struct linkedlist_fval){ .cmp = cmc_size_cmp,
.cpy = NULL,
.str = cmc_size_str,
.free = NULL,
.hash = cmc_size_hash,
.pri = cmc_size_cmp });
for (size_t i = 1; i <= 10000; i++)
ll_push_back(ll, i);
size_t sumv = 0;
CMC_FOREACH (ll, linkedlist, it, ll)
{
sumv += ll_iter_value(&it);
}
cmc_assert_equals(size_t, 50005000, sumv);
sumv = 0;
CMC_FOREACH_REV (ll, linkedlist, it, ll)
{
sumv += ll_iter_value(&it);
}
cmc_assert_equals(size_t, 50005000, sumv);
ll_free(ll);
});
CMC_CREATE_TEST(CMC<List>, {
struct list *l = l_new(10000, &(struct list_fval){ .cmp = cmc_size_cmp,
.cpy = NULL,
.str = cmc_size_str,
.free = NULL,
.hash = cmc_size_hash,
.pri = cmc_size_cmp });
for (size_t i = 1; i <= 10000; i++)
l_push_back(l, i);
size_t sumv = 0;
CMC_FOREACH (l, list, it, l)
{
sumv += l_iter_value(&it);
}
cmc_assert_equals(size_t, 50005000, sumv);
sumv = 0;
CMC_FOREACH_REV (l, list, it, l)
{
sumv += l_iter_value(&it);
}
cmc_assert_equals(size_t, 50005000, sumv);
l_free(l);
});
CMC_CREATE_TEST(CMC<Queue>, {
struct queue *q = q_new(10000, &(struct queue_fval){ .cmp = cmc_size_cmp,
.cpy = NULL,
.str = cmc_size_str,
.free = NULL,
.hash = cmc_size_hash,
.pri = cmc_size_cmp });
for (size_t i = 1; i <= 10000; i++)
q_enqueue(q, i);
size_t sumv = 0;
CMC_FOREACH (q, queue, it, q)
{
sumv += q_iter_value(&it);
}
cmc_assert_equals(size_t, 50005000, sumv);
sumv = 0;
CMC_FOREACH_REV (q, queue, it, q)
{
sumv += q_iter_value(&it);
}
cmc_assert_equals(size_t, 50005000, sumv);
q_free(q);
});
CMC_CREATE_TEST(CMC<SortedList>, {
struct sortedlist *sl = sl_new(10000, &(struct sortedlist_fval){ .cmp = cmc_size_cmp,
.cpy = NULL,
.str = cmc_size_str,
.free = NULL,
.hash = cmc_size_hash,
.pri = cmc_size_cmp });
for (size_t i = 1; i <= 10000; i++)
sl_insert(sl, i);
size_t sumv = 0;
CMC_FOREACH (sl, sortedlist, it, sl)
{
sumv += sl_iter_value(&it);
}
cmc_assert_equals(size_t, 50005000, sumv);
sumv = 0;
CMC_FOREACH_REV (sl, sortedlist, it, sl)
{
sumv += sl_iter_value(&it);
}
cmc_assert_equals(size_t, 50005000, sumv);
sl_free(sl);
});
CMC_CREATE_TEST(CMC<Stack>, {
struct stack *s = s_new(10000, &(struct stack_fval){ .cmp = cmc_size_cmp,
.cpy = NULL,
.str = cmc_size_str,
.free = NULL,
.hash = cmc_size_hash,
.pri = cmc_size_cmp });
for (size_t i = 1; i <= 10000; i++)
s_push(s, i);
size_t sumv = 0;
CMC_FOREACH (s, stack, it, s)
{
sumv += s_iter_value(&it);
}
cmc_assert_equals(size_t, 50005000, sumv);
sumv = 0;
CMC_FOREACH_REV (s, stack, it, s)
{
sumv += s_iter_value(&it);
}
cmc_assert_equals(size_t, 50005000, sumv);
s_free(s);
});
CMC_CREATE_TEST(CMC<TreeMap>, {
struct treemap *tm = tm_new(&(struct treemap_fkey){ .cmp = cmc_size_cmp,
.cpy = NULL,
.str = cmc_size_str,
.free = NULL,
.hash = cmc_size_hash,
.pri = cmc_size_cmp },
&(struct treemap_fval){ .cmp = cmc_size_cmp,
.cpy = NULL,
.str = cmc_size_str,
.free = NULL,
.hash = cmc_size_hash,
.pri = cmc_size_cmp });
for (size_t i = 1; i <= 10000; i++)
tm_insert(tm, i, i);
size_t sumk = 0;
size_t sumv = 0;
CMC_FOREACH (tm, treemap, it, tm)
{
sumk += tm_iter_key(&it);
sumv += tm_iter_value(&it);
}
cmc_assert_equals(size_t, 50005000, sumk);
cmc_assert_equals(size_t, 50005000, sumv);
sumk = 0;
sumv = 0;
CMC_FOREACH_REV (tm, treemap, it, tm)
{
sumk += tm_iter_key(&it);
sumv += tm_iter_value(&it);
}
cmc_assert_equals(size_t, 50005000, sumk);
cmc_assert_equals(size_t, 50005000, sumv);
tm_free(tm);
});
CMC_CREATE_TEST(CMC<TreeSet>, {
struct treeset *ts = ts_new(&(struct treeset_fval){ .cmp = cmc_size_cmp,
.cpy = NULL,
.str = cmc_size_str,
.free = NULL,
.hash = cmc_size_hash,
.pri = cmc_size_cmp });
for (size_t i = 1; i <= 10000; i++)
ts_insert(ts, i);
size_t sumv = 0;
CMC_FOREACH (ts, treeset, it, ts)
{
sumv += ts_iter_value(&it);
}
cmc_assert_equals(size_t, 50005000, sumv);
sumv = 0;
CMC_FOREACH_REV (ts, treeset, it, ts)
{
sumv += ts_iter_value(&it);
}
cmc_assert_equals(size_t, 50005000, sumv);
ts_free(ts);
});
});
#endif /* CMC_TESTS_UNT_UTL_FOREACH_H */
-3
View File
@@ -7,9 +7,6 @@
#define K size_t
#define PFX hbm
#define SNAME hashbidimap
#define CMC_EXT_HASHBIDIMAP_INIT
#define CMC_EXT_HASHBIDIMAP_ITER
#define CMC_EXT_HASHBIDIMAP_STR
#include "cmc/hashbidimap.h"
struct hashbidimap_fkey *hbm_fkey = &(struct hashbidimap_fkey){
-3
View File
@@ -7,9 +7,6 @@
#define K size_t
#define PFX hm
#define SNAME hashmap
#define CMC_EXT_HASHMAP_INIT
#define CMC_EXT_HASHMAP_ITER
#define CMC_EXT_HASHMAP_STR
#include "cmc/hashmap.h"
struct hashmap_fkey *hm_fkey = &(struct hashmap_fkey){
-3
View File
@@ -7,9 +7,6 @@
#define K size_t
#define PFX hmm
#define SNAME hashmultimap
#define CMC_EXT_HASHMULTIMAP_INIT
#define CMC_EXT_HASHMULTIMAP_ITER
#define CMC_EXT_HASHMULTIMAP_STR
#include "cmc/hashmultimap.h"
struct hashmultimap_fkey *hmm_fkey = &(struct hashmultimap_fkey){
-4
View File
@@ -6,10 +6,6 @@
#define V size_t
#define PFX hms
#define SNAME hashmultiset
#define CMC_EXT_HASHMULTISET_INIT
#define CMC_EXT_HASHMULTISET_ITER
#define CMC_EXT_HASHMULTISET_SETF
#define CMC_EXT_HASHMULTISET_STR
#include "cmc/hashmultiset.h"
struct hashmultiset_fval *hms_fval = &(struct hashmultiset_fval){
-4
View File
@@ -6,10 +6,6 @@
#define V size_t
#define PFX hs
#define SNAME hashset
#define CMC_EXT_HASHSET_INIT
#define CMC_EXT_HASHSET_ITER
#define CMC_EXT_HASHSET_SETF
#define CMC_EXT_HASHSET_STR
#include "cmc/hashset.h"
struct hashset_fval *hs_fval = &(struct hashset_fval){
-3
View File
@@ -6,9 +6,6 @@
#define V size_t
#define PFX h
#define SNAME heap
#define CMC_EXT_HEAP_INIT
#define CMC_EXT_HEAP_ITER
#define CMC_EXT_HEAP_STR
#include "cmc/heap.h"
struct heap_fval *h_fval = &(struct heap_fval){
-3
View File
@@ -6,9 +6,6 @@
#define V size_t
#define PFX ih
#define SNAME intervalheap
#define CMC_EXT_INTERVALHEAP_INIT
#define CMC_EXT_INTERVALHEAP_ITER
#define CMC_EXT_INTERVALHEAP_STR
#include "cmc/intervalheap.h"
struct intervalheap_fval *ih_fval = &(struct intervalheap_fval){
+817
View File
@@ -0,0 +1,817 @@
#ifndef CMC_TESTS_UNT_LINKEDLIST_H
#define CMC_TESTS_UNT_LINKEDLIST_H
#include "utl.h"
#define V size_t
#define PFX ll
#define SNAME linkedlist
#include "cmc/linkedlist.h"
struct linkedlist_fval *ll_fval = &(struct linkedlist_fval){
.cmp = cmc_size_cmp, .cpy = NULL, .str = cmc_size_str, .free = NULL, .hash = cmc_size_hash, .pri = cmc_size_cmp
};
CMC_CREATE_UNIT(CMCLinkedList, true, {
CMC_CREATE_TEST(new, {
struct linkedlist *ll = ll_new(ll_fval);
cmc_assert_not_equals(ptr, NULL, ll);
cmc_assert_equals(size_t, 0, ll_count(ll));
cmc_assert_equals(ptr, NULL, ll->head);
cmc_assert_equals(ptr, NULL, ll->tail);
ll_free(ll);
});
CMC_CREATE_TEST(clear[count capacity], {
struct linkedlist *ll = ll_new(ll_fval);
cmc_assert_not_equals(ptr, NULL, ll);
for (size_t i = 0; i < 50; i++)
ll_push_back(ll, i);
cmc_assert_equals(size_t, 50, ll_count(ll));
ll_clear(ll);
cmc_assert_equals(size_t, 0, ll_count(ll));
ll_free(ll);
});
CMC_CREATE_TEST(clear[count = 0], {
struct linkedlist *ll = ll_new(ll_fval);
cmc_assert_not_equals(ptr, NULL, ll);
ll_clear(ll);
cmc_assert_equals(size_t, 0, ll_count(ll));
ll_free(ll);
});
CMC_CREATE_TEST(push_front[count], {
struct linkedlist *ll = ll_new(ll_fval);
cmc_assert_not_equals(ptr, NULL, ll);
ll_push_front(ll, 1);
cmc_assert_not_equals(ptr, NULL, ll->head);
cmc_assert_not_equals(ptr, NULL, ll->tail);
cmc_assert_equals(size_t, 1, ll_count(ll));
ll_free(ll);
});
CMC_CREATE_TEST(push_front[item preservation], {
struct linkedlist *ll = ll_new(ll_fval);
cmc_assert_not_equals(ptr, NULL, ll);
for (size_t i = 0; i < 200; i++)
ll_push_front(ll, i);
for (size_t i = 0; i < ll_count(ll); i++)
cmc_assert_equals(size_t, ll_get(ll, i), ll_count(ll) - i - 1);
ll_free(ll);
});
CMC_CREATE_TEST(flags, {
struct linkedlist *ll = ll_new(ll_fval);
cmc_assert_not_equals(ptr, NULL, ll);
cmc_assert_equals(int32_t, CMC_FLAG_OK, ll_flag(ll));
// clear
ll->flag = CMC_FLAG_ERROR;
ll_clear(ll);
cmc_assert_equals(int32_t, CMC_FLAG_OK, ll_flag(ll));
// customize
ll->flag = CMC_FLAG_ERROR;
ll_customize(ll, NULL, NULL);
cmc_assert_equals(int32_t, CMC_FLAG_OK, ll_flag(ll));
// push_front
ll->flag = CMC_FLAG_ERROR;
cmc_assert(ll_push_front(ll, 10));
cmc_assert_equals(int32_t, CMC_FLAG_OK, ll_flag(ll));
// push_at
ll->flag = CMC_FLAG_ERROR;
cmc_assert(ll_push_at(ll, 10, 1));
cmc_assert_equals(int32_t, CMC_FLAG_OK, ll_flag(ll));
cmc_assert(!ll_push_at(ll, 10, 300));
cmc_assert_equals(int32_t, CMC_FLAG_RANGE, ll_flag(ll));
// push_back
ll->flag = CMC_FLAG_ERROR;
cmc_assert(ll_push_back(ll, 10));
cmc_assert_equals(int32_t, CMC_FLAG_OK, ll_flag(ll));
ll_clear(ll);
// pop_front
ll->flag = CMC_FLAG_ERROR;
cmc_assert(!ll_pop_front(ll));
cmc_assert_equals(int32_t, CMC_FLAG_EMPTY, ll_flag(ll));
cmc_assert(ll_push_back(ll, 10));
cmc_assert(ll_pop_front(ll));
cmc_assert_equals(int32_t, CMC_FLAG_OK, ll_flag(ll));
// pop_at
cmc_assert(!ll_pop_at(ll, 0));
cmc_assert_equals(int32_t, CMC_FLAG_EMPTY, ll_flag(ll));
cmc_assert(ll_push_front(ll, 10));
cmc_assert(!ll_pop_at(ll, 1));
cmc_assert_equals(int32_t, CMC_FLAG_RANGE, ll_flag(ll));
cmc_assert(ll_pop_at(ll, 0));
cmc_assert_equals(int32_t, CMC_FLAG_OK, ll_flag(ll));
// pop_back
ll->flag = CMC_FLAG_ERROR;
cmc_assert(!ll_pop_front(ll));
cmc_assert_equals(int32_t, CMC_FLAG_EMPTY, ll_flag(ll));
cmc_assert(ll_push_back(ll, 10));
cmc_assert(ll_pop_front(ll));
cmc_assert_equals(int32_t, CMC_FLAG_OK, ll_flag(ll));
ll_clear(ll);
// front
ll_front(ll);
cmc_assert_equals(int32_t, CMC_FLAG_EMPTY, ll_flag(ll));
cmc_assert(ll_push_front(ll, 10));
ll->flag = CMC_FLAG_ERROR;
ll_front(ll);
cmc_assert_equals(int32_t, CMC_FLAG_OK, ll_flag(ll));
ll_clear(ll);
// back
ll_back(ll);
cmc_assert_equals(int32_t, CMC_FLAG_EMPTY, ll_flag(ll));
cmc_assert(ll_push_front(ll, 10));
ll->flag = CMC_FLAG_ERROR;
ll_back(ll);
cmc_assert_equals(int32_t, CMC_FLAG_OK, ll_flag(ll));
ll_clear(ll);
// get get_ref
ll_get(ll, 0);
cmc_assert_equals(int32_t, CMC_FLAG_EMPTY, ll_flag(ll));
ll->flag = CMC_FLAG_ERROR;
ll_get_ref(ll, 0);
cmc_assert_equals(int32_t, CMC_FLAG_EMPTY, ll_flag(ll));
cmc_assert(ll_push_at(ll, 10, 0));
ll->flag = CMC_FLAG_ERROR;
ll_get(ll, 0);
cmc_assert_equals(int32_t, CMC_FLAG_OK, ll_flag(ll));
ll_get(ll, 1);
cmc_assert_equals(int32_t, CMC_FLAG_RANGE, ll_flag(ll));
ll_get_ref(ll, 0);
cmc_assert_equals(int32_t, CMC_FLAG_OK, ll_flag(ll));
ll_get_ref(ll, 1);
cmc_assert_equals(int32_t, CMC_FLAG_RANGE, ll_flag(ll));
// contains
cmc_assert(ll_contains(ll, 10));
cmc_assert_equals(int32_t, CMC_FLAG_OK, ll_flag(ll));
// copy_of
ll->flag = CMC_FLAG_ERROR;
struct linkedlist *ll2 = ll_copy_of(ll);
cmc_assert_equals(int32_t, CMC_FLAG_OK, ll_flag(ll));
cmc_assert_equals(int32_t, CMC_FLAG_OK, ll_flag(ll2));
// equals
ll->flag = CMC_FLAG_ERROR;
ll2->flag = CMC_FLAG_ERROR;
cmc_assert(ll_equals(ll, ll2));
cmc_assert_equals(int32_t, CMC_FLAG_OK, ll_flag(ll));
cmc_assert_equals(int32_t, CMC_FLAG_OK, ll_flag(ll2));
ll_clear(ll);
// get_node
struct linkedlist_node *n = ll_get_node(ll, 0);
cmc_assert_equals(int32_t, CMC_FLAG_EMPTY, ll_flag(ll));
cmc_assert(ll_push_at(ll, 10, 0));
n = ll_get_node(ll, 0);
cmc_assert_equals(int32_t, CMC_FLAG_OK, ll_flag(ll));
n = ll_get_node(ll, 1);
cmc_assert_equals(int32_t, CMC_FLAG_RANGE, ll_flag(ll));
// functions relative to node
ll_clear(ll);
cmc_assert(ll_push_front(ll, 10));
n = ll_get_node(ll, 0);
cmc_assert_not_equals(ptr, NULL, n);
// add_next
ll->flag = CMC_FLAG_ERROR;
cmc_assert(ll_add_next(ll, n, 11));
cmc_assert_equals(int32_t, CMC_FLAG_OK, ll_flag(ll));
// add_prev
ll->flag = CMC_FLAG_ERROR;
cmc_assert(ll_add_prev(ll, n, 9));
cmc_assert_equals(int32_t, CMC_FLAG_OK, ll_flag(ll));
// del_next
n = ll_next_node(n);
cmc_assert(!ll_del_next(ll, n));
cmc_assert_equals(int32_t, CMC_FLAG_INVALID, ll_flag(ll));
n = ll_prev_node(n);
cmc_assert(ll_del_next(ll, n));
cmc_assert_equals(int32_t, CMC_FLAG_OK, ll_flag(ll));
// del_prev
n = ll_prev_node(n);
cmc_assert(!ll_del_prev(ll, n));
cmc_assert_equals(int32_t, CMC_FLAG_INVALID, ll_flag(ll));
n = ll_next_node(n);
cmc_assert(ll_del_prev(ll, n));
cmc_assert_equals(int32_t, CMC_FLAG_OK, ll_flag(ll));
// del_curr
ll->flag = CMC_FLAG_ERROR;
cmc_assert(ll_del_curr(ll, n));
cmc_assert_equals(int32_t, CMC_FLAG_OK, ll_flag(ll));
ll_free(ll);
ll_free(ll2);
});
CMC_CREATE_TEST(callbacks, {
struct linkedlist *ll = ll_new_custom(ll_fval, NULL, callbacks);
cmc_assert_not_equals(ptr, NULL, ll);
total_create = 0;
total_read = 0;
total_update = 0;
total_delete = 0;
total_resize = 0;
cmc_assert(ll_push_front(ll, 10));
cmc_assert_equals(int32_t, 1, total_create);
cmc_assert(ll_push_back(ll, 10));
cmc_assert_equals(int32_t, 2, total_create);
cmc_assert(ll_push_at(ll, 10, 1));
cmc_assert_equals(int32_t, 3, total_create);
cmc_assert(ll_pop_at(ll, 1));
cmc_assert_equals(int32_t, 1, total_delete);
cmc_assert(ll_pop_front(ll));
cmc_assert_equals(int32_t, 2, total_delete);
cmc_assert(ll_pop_back(ll));
cmc_assert_equals(int32_t, 3, total_delete);
cmc_assert(ll_push_back(ll, 10));
cmc_assert_equals(int32_t, 4, total_create);
cmc_assert_equals(size_t, 10, ll_front(ll));
cmc_assert_equals(int32_t, 1, total_read);
cmc_assert_equals(size_t, 10, ll_back(ll));
cmc_assert_equals(int32_t, 2, total_read);
cmc_assert_equals(size_t, 10, ll_get(ll, 0));
cmc_assert_equals(int32_t, 3, total_read);
cmc_assert_not_equals(ptr, NULL, ll_get_ref(ll, 0));
cmc_assert_equals(int32_t, 4, total_read);
cmc_assert(ll_contains(ll, 10));
cmc_assert_equals(int32_t, 5, total_read);
cmc_assert_equals(int32_t, 4, total_create);
cmc_assert_equals(int32_t, 5, total_read);
cmc_assert_equals(int32_t, 0, total_update);
cmc_assert_equals(int32_t, 3, total_delete);
cmc_assert_equals(int32_t, 0, total_resize);
ll_customize(ll, NULL, NULL);
cmc_assert_equals(ptr, NULL, ll->callbacks);
ll_clear(ll);
cmc_assert(ll_push_front(ll, 10));
cmc_assert(ll_push_back(ll, 10));
cmc_assert(ll_push_at(ll, 10, 1));
cmc_assert(ll_pop_at(ll, 1));
cmc_assert(ll_pop_front(ll));
cmc_assert(ll_pop_back(ll));
cmc_assert(ll_push_back(ll, 10));
cmc_assert_equals(size_t, 10, ll_front(ll));
cmc_assert_equals(size_t, 10, ll_back(ll));
cmc_assert_equals(size_t, 10, ll_get(ll, 0));
cmc_assert_not_equals(ptr, NULL, ll_get_ref(ll, 0));
cmc_assert(ll_contains(ll, 10));
cmc_assert_equals(int32_t, 4, total_create);
cmc_assert_equals(int32_t, 5, total_read);
cmc_assert_equals(int32_t, 0, total_update);
cmc_assert_equals(int32_t, 3, total_delete);
cmc_assert_equals(int32_t, 0, total_resize);
cmc_assert_equals(ptr, NULL, ll->callbacks);
ll_free(ll);
total_create = 0;
total_read = 0;
total_update = 0;
total_delete = 0;
total_resize = 0;
});
});
CMC_CREATE_UNIT(CMCLinkedListIter, true, {
CMC_CREATE_TEST(PFX##_iter_start(), {
struct linkedlist *ll = ll_new(ll_fval);
cmc_assert_not_equals(ptr, NULL, ll);
struct linkedlist_iter it = ll_iter_start(ll);
cmc_assert_equals(ptr, ll, it.target);
cmc_assert_equals(ptr, NULL, it.cursor);
cmc_assert_equals(size_t, 0, it.index);
cmc_assert_equals(bool, true, it.start);
cmc_assert_equals(bool, true, it.end);
cmc_assert(ll_iter_at_start(&it));
cmc_assert(ll_iter_at_end(&it));
cmc_assert(ll_push_front(ll, 1));
cmc_assert(ll_push_front(ll, 2));
it = ll_iter_start(ll);
cmc_assert_equals(size_t, 0, it.index);
cmc_assert_equals(bool, false, it.end);
cmc_assert_equals(ptr, ll->head, it.cursor);
ll_free(ll);
});
CMC_CREATE_TEST(PFX##_iter_end(), {
struct linkedlist *ll = ll_new(ll_fval);
cmc_assert_not_equals(ptr, NULL, ll);
struct linkedlist_iter it = ll_iter_end(ll);
cmc_assert_equals(ptr, ll, it.target);
cmc_assert_equals(ptr, NULL, it.cursor);
cmc_assert_equals(size_t, 0, it.index);
cmc_assert_equals(bool, true, it.start);
cmc_assert_equals(bool, true, it.end);
cmc_assert(ll_iter_at_start(&it));
cmc_assert(ll_iter_at_end(&it));
cmc_assert(ll_push_back(ll, 1));
cmc_assert(ll_push_back(ll, 2));
cmc_assert(ll_push_back(ll, 3));
it = ll_iter_end(ll);
cmc_assert_equals(size_t, ll->count - 1, it.index);
cmc_assert_equals(ptr, ll->tail, it.cursor);
cmc_assert_equals(bool, false, it.start);
ll_free(ll);
});
CMC_CREATE_TEST(PFX##_iter_at_start(), {
struct linkedlist *ll = ll_new(ll_fval);
cmc_assert_not_equals(ptr, NULL, ll);
struct linkedlist_iter it = ll_iter_start(ll);
// Empty checks
cmc_assert(ll_iter_at_start(&it));
it = ll_iter_end(ll);
cmc_assert(ll_iter_at_start(&it));
// Non-empty checks
cmc_assert(ll_push_back(ll, 1));
it = ll_iter_end(ll);
cmc_assert(!ll_iter_at_start(&it));
it = ll_iter_start(ll);
cmc_assert(ll_iter_at_start(&it));
ll_clear(ll);
cmc_assert(ll_push_front(ll, 1));
it = ll_iter_end(ll);
cmc_assert(!ll_iter_at_start(&it));
it = ll_iter_start(ll);
cmc_assert(ll_iter_at_start(&it));
ll_free(ll);
});
CMC_CREATE_TEST(PFX##_iter_at_end(), {
struct linkedlist *ll = ll_new(ll_fval);
cmc_assert_not_equals(ptr, NULL, ll);
struct linkedlist_iter it = ll_iter_start(ll);
// Empty check
cmc_assert(ll_iter_at_end(&it));
it = ll_iter_end(ll);
cmc_assert(ll_iter_at_end(&it));
// Non-empty checks
cmc_assert(ll_push_back(ll, 1));
it = ll_iter_end(ll);
cmc_assert(ll_iter_at_end(&it));
it = ll_iter_start(ll);
cmc_assert(!ll_iter_at_end(&it));
ll_clear(ll);
cmc_assert(ll_push_front(ll, 1));
it = ll_iter_end(ll);
cmc_assert(ll_iter_at_end(&it));
it = ll_iter_start(ll);
cmc_assert(!ll_iter_at_end(&it));
ll_free(ll);
});
CMC_CREATE_TEST(PFX##_iter_to_start(), {
struct linkedlist *ll = ll_new(ll_fval);
cmc_assert_not_equals(ptr, NULL, ll);
struct linkedlist_iter it = ll_iter_start(ll);
cmc_assert(!ll_iter_to_start(&it));
for (size_t i = 1; i <= 100; i++)
{
if (i % 2 == 0)
ll_push_back(ll, i);
else
ll_push_front(ll, i);
}
cmc_assert_equals(size_t, 100, ll->count);
it = ll_iter_end(ll);
cmc_assert(!ll_iter_at_start(&it));
cmc_assert(ll_iter_at_end(&it));
cmc_assert_equals(size_t, 100, ll_iter_value(&it));
cmc_assert(ll_iter_to_start(&it));
cmc_assert(ll_iter_at_start(&it));
cmc_assert(!ll_iter_at_end(&it));
cmc_assert_equals(size_t, 99, ll_iter_value(&it));
ll_free(ll);
});
CMC_CREATE_TEST(PFX##_iter_to_end(), {
struct linkedlist *ll = ll_new(ll_fval);
cmc_assert_not_equals(ptr, NULL, ll);
struct linkedlist_iter it = ll_iter_end(ll);
cmc_assert(!ll_iter_to_end(&it));
for (size_t i = 1; i <= 100; i++)
{
if (i % 2 == 0)
ll_push_back(ll, i);
else
ll_push_front(ll, i);
}
it = ll_iter_start(ll);
cmc_assert(ll_iter_at_start(&it));
cmc_assert(!ll_iter_at_end(&it));
cmc_assert_equals(size_t, 99, ll_iter_value(&it));
cmc_assert(ll_iter_to_end(&it));
cmc_assert(!ll_iter_at_start(&it));
cmc_assert(ll_iter_at_end(&it));
cmc_assert_equals(size_t, 100, ll_iter_value(&it));
ll_free(ll);
});
CMC_CREATE_TEST(PFX##_iter_next(), {
struct linkedlist *ll = ll_new(ll_fval);
cmc_assert_not_equals(ptr, NULL, ll);
struct linkedlist_iter it = ll_iter_start(ll);
cmc_assert(!ll_iter_next(&it));
for (size_t i = 1; i <= 1000; i++)
{
if (i % 2 == 0)
ll_push_back(ll, i);
else
ll_push_front(ll, i);
}
size_t sum = 0;
for (it = ll_iter_start(ll); !ll_iter_at_end(&it); ll_iter_next(&it))
{
sum += ll_iter_value(&it);
}
cmc_assert_equals(size_t, 500500, sum);
sum = 0;
ll_iter_to_start(&it);
do
{
sum += ll_iter_value(&it);
} while (ll_iter_next(&it));
cmc_assert_equals(size_t, 500500, sum);
ll_free(ll);
});
CMC_CREATE_TEST(PFX##_iter_prev(), {
struct linkedlist *ll = ll_new(ll_fval);
cmc_assert_not_equals(ptr, NULL, ll);
struct linkedlist_iter it = ll_iter_end(ll);
cmc_assert(!ll_iter_prev(&it));
for (size_t i = 1; i <= 1000; i++)
{
if (i % 2 == 0)
ll_push_back(ll, i);
else
ll_push_front(ll, i);
}
size_t sum = 0;
for (it = ll_iter_end(ll); !ll_iter_at_start(&it); ll_iter_prev(&it))
{
sum += ll_iter_value(&it);
}
cmc_assert_equals(size_t, 500500, sum);
sum = 0;
ll_iter_to_end(&it);
do
{
sum += ll_iter_value(&it);
} while (ll_iter_prev(&it));
cmc_assert_equals(size_t, 500500, sum);
ll_free(ll);
});
CMC_CREATE_TEST(PFX##_iter_advance(), {
struct linkedlist *ll = ll_new(ll_fval);
cmc_assert_not_equals(ptr, NULL, ll);
struct linkedlist_iter it = ll_iter_start(ll);
cmc_assert(!ll_iter_advance(&it, 1));
for (size_t i = 0; i <= 1000; i++)
{
if (i % 2 == 0)
ll_push_back(ll, i); // will sum all even numbers
else
ll_push_back(ll, 0);
}
it = ll_iter_start(ll);
cmc_assert(!ll_iter_advance(&it, 0));
cmc_assert(!ll_iter_advance(&it, ll->count));
size_t sum = 0;
for (it = ll_iter_start(ll);;)
{
sum += ll_iter_value(&it);
if (!ll_iter_advance(&it, 2))
break;
}
cmc_assert_equals(size_t, 250500, sum);
ll_iter_to_start(&it);
cmc_assert(ll_iter_advance(&it, ll->count - 1));
ll_free(ll);
});
CMC_CREATE_TEST(PFX##_iter_rewind(), {
struct linkedlist *ll = ll_new(ll_fval);
cmc_assert_not_equals(ptr, NULL, ll);
struct linkedlist_iter it = ll_iter_end(ll);
cmc_assert(!ll_iter_rewind(&it, 1));
for (size_t i = 0; i <= 1000; i++)
{
if (i % 2 == 0)
ll_push_front(ll, i); // will sum all even numbers
else
ll_push_front(ll, 0);
}
it = ll_iter_end(ll);
cmc_assert(!ll_iter_rewind(&it, 0));
cmc_assert(!ll_iter_rewind(&it, ll->count));
size_t sum = 0;
for (it = ll_iter_end(ll);;)
{
sum += ll_iter_value(&it);
if (!ll_iter_rewind(&it, 2))
break;
}
cmc_assert_equals(size_t, 250500, sum);
ll_iter_to_end(&it);
cmc_assert(ll_iter_rewind(&it, ll->count - 1));
ll_free(ll);
});
CMC_CREATE_TEST(PFX##_iter_go_to(), {
struct linkedlist *ll = ll_new(ll_fval);
cmc_assert_not_equals(ptr, NULL, ll);
struct linkedlist_iter it = ll_iter_end(ll);
cmc_assert(!ll_iter_go_to(&it, 0));
it = ll_iter_start(ll);
cmc_assert(!ll_iter_go_to(&it, 0));
for (size_t i = 0; i <= 1000; i++)
ll_push_back(ll, i);
it = ll_iter_start(ll);
size_t sum = 0;
for (size_t i = 0; i < 1001; i++)
{
ll_iter_go_to(&it, i);
sum += ll_iter_value(&it);
}
cmc_assert_equals(size_t, 500500, sum);
sum = 0;
for (size_t i = 1001; i > 0; i--)
{
cmc_assert(ll_iter_go_to(&it, i - 1));
sum += ll_iter_value(&it);
}
cmc_assert_equals(size_t, 500500, sum);
sum = 0;
for (size_t i = 0; i < 1001; i += 100)
{
cmc_assert(ll_iter_go_to(&it, i));
cmc_assert_equals(size_t, i, ll_iter_index(&it));
sum += ll_iter_value(&it);
}
cmc_assert_equals(size_t, 5500, sum);
ll_free(ll);
});
CMC_CREATE_TEST(PFX##_iter_value(), {
struct linkedlist *ll = ll_new(ll_fval);
cmc_assert_not_equals(ptr, NULL, ll);
struct linkedlist_iter it = ll_iter_end(ll);
cmc_assert_equals(size_t, (size_t){ 0 }, ll_iter_value(&it));
cmc_assert(ll_push_back(ll, 10));
it = ll_iter_start(ll);
cmc_assert_equals(size_t, 10, ll_iter_value(&it));
ll_free(ll);
});
CMC_CREATE_TEST(PFX##_iter_rvalue(), {
struct linkedlist *ll = ll_new(ll_fval);
cmc_assert_not_equals(ptr, NULL, ll);
struct linkedlist_iter it = ll_iter_end(ll);
cmc_assert_equals(ptr, NULL, ll_iter_rvalue(&it));
cmc_assert(ll_push_back(ll, 10));
it = ll_iter_start(ll);
cmc_assert_not_equals(ptr, NULL, ll_iter_rvalue(&it));
cmc_assert_equals(size_t, 10, *ll_iter_rvalue(&it));
ll_free(ll);
});
CMC_CREATE_TEST(PFX##_iter_index(), {
struct linkedlist *ll = ll_new(ll_fval);
cmc_assert_not_equals(ptr, NULL, ll);
for (size_t i = 0; i <= 1000; i++)
ll_push_back(ll, i);
struct linkedlist_iter it = ll_iter_start(ll);
for (size_t i = 0; i < 1001; i++)
{
cmc_assert_equals(size_t, i, ll_iter_index(&it));
ll_iter_next(&it);
}
it = ll_iter_end(ll);
for (size_t i = 1001; i > 0; i--)
{
cmc_assert_equals(size_t, i - 1, ll_iter_index(&it));
ll_iter_prev(&it);
}
ll_free(ll);
});
});
#ifdef CMC_TEST_MAIN
int main(void)
{
int result = CMCLinkedList() + CMCLinkedListIter();
printf(" +---------------------------------------------------------------+");
printf("\n");
printf(" | CMCLinkedList Suit : %-43s |\n", result == 0 ? "PASSED" : "FAILED");
printf(" +---------------------------------------------------------------+");
printf("\n\n\n");
return result;
}
#endif
#endif /* CMC_TESTS_UNT_CMC_INKEDLIST_H */
-4
View File
@@ -6,10 +6,6 @@
#define V size_t
#define PFX l
#define SNAME list
#define CMC_EXT_LIST_INIT
#define CMC_EXT_LIST_ITER
#define CMC_EXT_LIST_SEQ
#define CMC_EXT_LIST_STR
#include "cmc/list.h"
struct list_fval *l_fval = &(struct list_fval){
-3
View File
@@ -6,9 +6,6 @@
#define V size_t
#define PFX q
#define SNAME queue
#define CMC_EXT_QUEUE_INIT
#define CMC_EXT_QUEUE_ITER
#define CMC_EXT_QUEUE_STR
#include "cmc/queue.h"
struct queue_fval *q_fval = &(struct queue_fval){
+717
View File
@@ -0,0 +1,717 @@
#ifndef CMC_TESTS_UNT_SORTEDLIST_H
#define CMC_TESTS_UNT_SORTEDLIST_H
#include "utl.h"
#define V size_t
#define PFX sl
#define SNAME sortedlist
#include "cmc/sortedlist.h"
struct sortedlist_fval *sl_fval = &(struct sortedlist_fval){
.cmp = cmc_size_cmp, .cpy = NULL, .str = cmc_size_str, .free = NULL, .hash = cmc_size_hash, .pri = cmc_size_cmp
};
CMC_CREATE_UNIT(CMCSortedList, true, {
CMC_CREATE_TEST(new, {
struct sortedlist *sl = sl_new(1000000, sl_fval);
cmc_assert_not_equals(ptr, NULL, sl);
cmc_assert_not_equals(ptr, NULL, sl->buffer);
cmc_assert_equals(size_t, 1000000, sl_capacity(sl));
cmc_assert_equals(size_t, 0, sl_count(sl));
cmc_assert_not_equals(ptr, NULL, sl->buffer);
sl_free(sl);
});
CMC_CREATE_TEST(new[capacity = 0], {
struct sortedlist *sl = sl_new(0, sl_fval);
cmc_assert_equals(ptr, NULL, sl);
});
CMC_CREATE_TEST(new[capacity = UINT64_MAX], {
struct sortedlist *sl = sl_new(UINT64_MAX, sl_fval);
cmc_assert_equals(ptr, NULL, sl);
});
CMC_CREATE_TEST(clear[count capacity], {
struct sortedlist *sl = sl_new(100, sl_fval);
cmc_assert_not_equals(ptr, NULL, sl);
for (size_t i = 0; i < 50; i++)
cmc_assert(sl_insert(sl, i));
cmc_assert_equals(size_t, 50, sl_count(sl));
sl_clear(sl);
cmc_assert_equals(size_t, 0, sl_count(sl));
cmc_assert_equals(size_t, 100, sl_capacity(sl));
sl_free(sl);
});
CMC_CREATE_TEST(buffer_growth[capacity = 1], {
struct sortedlist *sl = sl_new(1, sl_fval);
cmc_assert_not_equals(ptr, NULL, sl);
for (size_t i = 0; i < 50; i++)
cmc_assert(sl_insert(sl, i));
sl_sort(sl);
cmc_assert_equals(size_t, 50, sl_count(sl));
cmc_assert_array_sorted_any(size_t, sl->buffer, cmc_size_cmp, 0, sl->count - 1);
sl_free(sl);
});
CMC_CREATE_TEST(insert, {
struct sortedlist *sl = sl_new(100, sl_fval);
cmc_assert_not_equals(ptr, NULL, sl);
cmc_assert(sl_insert(sl, 1));
sl_free(sl);
});
CMC_CREATE_TEST(remove, {
struct sortedlist *sl = sl_new(100, sl_fval);
cmc_assert_not_equals(ptr, NULL, sl);
cmc_assert(sl_insert(sl, 32));
cmc_assert(sl_remove(sl, 0));
sl_free(sl);
});
CMC_CREATE_TEST(remove[count = 0], {
struct sortedlist *sl = sl_new(100, sl_fval);
cmc_assert_not_equals(ptr, NULL, sl);
cmc_assert(!sl_remove(sl, 0));
sl_free(sl);
});
CMC_CREATE_TEST(remove[out of range], {
struct sortedlist *sl = sl_new(100, sl_fval);
cmc_assert_not_equals(ptr, NULL, sl);
cmc_assert(sl_insert(sl, 32));
cmc_assert(!sl_remove(sl, 2));
sl_free(sl);
});
CMC_CREATE_TEST(index_of, {
struct sortedlist *sl = sl_new(1, sl_fval);
cmc_assert_not_equals(ptr, NULL, sl);
for (size_t i = 0; i < 20; i++)
cmc_assert(sl_insert(sl, i % 10));
/* 0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9 */
cmc_assert_equals(size_t, 4, sl_index_of(sl, 2, true));
cmc_assert_equals(size_t, 5, sl_index_of(sl, 2, false));
cmc_assert_equals(size_t, 0, sl_index_of(sl, 0, true));
cmc_assert_equals(size_t, 1, sl_index_of(sl, 0, false));
cmc_assert(sl_remove(sl, 0));
cmc_assert_equals(size_t, 0, sl_index_of(sl, 0, true));
cmc_assert_equals(size_t, 0, sl_index_of(sl, 0, false));
cmc_assert(sl_remove(sl, 0));
cmc_assert_equals(size_t, sl_count(sl), sl_index_of(sl, 0, true));
cmc_assert_equals(size_t, sl_count(sl), sl_index_of(sl, 0, false));
sl_free(sl);
});
CMC_CREATE_TEST(flags, {
struct sortedlist *sl = sl_new(100, sl_fval);
cmc_assert_not_equals(ptr, NULL, sl);
cmc_assert_equals(int32_t, CMC_FLAG_OK, sl_flag(sl));
// clear
sl->flag = CMC_FLAG_ERROR;
sl_clear(sl);
cmc_assert_equals(int32_t, CMC_FLAG_OK, sl_flag(sl));
// customize
sl->flag = CMC_FLAG_ERROR;
sl_customize(sl, NULL, NULL);
cmc_assert_equals(int32_t, CMC_FLAG_OK, sl_flag(sl));
// insert
sl->flag = CMC_FLAG_ERROR;
cmc_assert(sl_insert(sl, 10));
cmc_assert_equals(int32_t, CMC_FLAG_OK, sl_flag(sl));
// remove
cmc_assert(!sl_remove(sl, 2));
cmc_assert_equals(int32_t, CMC_FLAG_RANGE, sl_flag(sl));
cmc_assert(sl_remove(sl, 0));
cmc_assert_equals(int32_t, CMC_FLAG_OK, sl_flag(sl));
cmc_assert(!sl_remove(sl, 0));
cmc_assert_equals(int32_t, CMC_FLAG_EMPTY, sl_flag(sl));
// max min
sl->flag = CMC_FLAG_ERROR;
cmc_assert_equals(size_t, (size_t){ 0 }, sl_max(sl));
cmc_assert_equals(int32_t, CMC_FLAG_EMPTY, sl_flag(sl));
sl->flag = CMC_FLAG_ERROR;
cmc_assert_equals(size_t, (size_t){ 0 }, sl_min(sl));
cmc_assert_equals(int32_t, CMC_FLAG_EMPTY, sl_flag(sl));
cmc_assert(sl_insert(sl, 1));
sl->flag = CMC_FLAG_ERROR;
cmc_assert_equals(size_t, 1, sl_max(sl));
cmc_assert_equals(int32_t, CMC_FLAG_OK, sl_flag(sl));
sl->flag = CMC_FLAG_ERROR;
cmc_assert_equals(size_t, 1, sl_min(sl));
cmc_assert_equals(int32_t, CMC_FLAG_OK, sl_flag(sl));
// get
sl->flag = CMC_FLAG_ERROR;
sl_get(sl, 1);
cmc_assert_equals(int32_t, CMC_FLAG_RANGE, sl_flag(sl));
sl_get(sl, 0);
cmc_assert_equals(int32_t, CMC_FLAG_OK, sl_flag(sl));
cmc_assert(sl_remove(sl, 0));
sl_get(sl, 0);
cmc_assert_equals(int32_t, CMC_FLAG_EMPTY, sl_flag(sl));
// index_of
cmc_assert(sl_insert(sl, 1));
sl_index_of(sl, 1, false);
cmc_assert_equals(int32_t, CMC_FLAG_OK, sl_flag(sl));
// contains
cmc_assert(sl_contains(sl, 1));
cmc_assert_equals(int32_t, CMC_FLAG_OK, sl_flag(sl));
// sort
sl->flag = CMC_FLAG_ERROR;
sl_sort(sl);
cmc_assert_equals(int32_t, CMC_FLAG_OK, sl_flag(sl));
// copy_of
sl->flag = CMC_FLAG_ERROR;
struct sortedlist *sl2 = sl_copy_of(sl);
cmc_assert_equals(int32_t, CMC_FLAG_OK, sl_flag(sl));
cmc_assert_equals(int32_t, CMC_FLAG_OK, sl_flag(sl2));
// equals
sl->flag = CMC_FLAG_ERROR;
sl2->flag = CMC_FLAG_ERROR;
cmc_assert(sl_equals(sl, sl2));
cmc_assert_equals(int32_t, CMC_FLAG_OK, sl_flag(sl));
cmc_assert_equals(int32_t, CMC_FLAG_OK, sl_flag(sl2));
sl_free(sl);
sl_free(sl2);
});
CMC_CREATE_TEST(callbacks, {
struct sortedlist *sl = sl_new_custom(100, sl_fval, NULL, callbacks);
cmc_assert_not_equals(ptr, NULL, sl);
total_create = 0;
total_read = 0;
total_update = 0;
total_delete = 0;
total_resize = 0;
cmc_assert(sl_insert(sl, 10));
cmc_assert_equals(int32_t, 1, total_create);
cmc_assert(sl_remove(sl, 0));
cmc_assert_equals(int32_t, 1, total_delete);
cmc_assert(sl_insert(sl, 1));
cmc_assert(sl_insert(sl, 0));
cmc_assert_equals(int32_t, 3, total_create);
cmc_assert_equals(size_t, 1, sl_max(sl));
cmc_assert_equals(int32_t, 1, total_read);
cmc_assert_equals(size_t, 0, sl_min(sl));
cmc_assert_equals(int32_t, 2, total_read);
cmc_assert_equals(size_t, 0, sl_get(sl, 0));
cmc_assert_equals(int32_t, 3, total_read);
cmc_assert_equals(size_t, 0, sl_index_of(sl, 0, true));
cmc_assert_equals(int32_t, 4, total_read);
cmc_assert(sl_contains(sl, 1));
cmc_assert_equals(int32_t, 5, total_read);
cmc_assert(sl_resize(sl, 1000));
cmc_assert_equals(int32_t, 1, total_resize);
cmc_assert(sl_resize(sl, 50));
cmc_assert_equals(int32_t, 2, total_resize);
cmc_assert_equals(int32_t, 3, total_create);
cmc_assert_equals(int32_t, 5, total_read);
cmc_assert_equals(int32_t, 0, total_update);
cmc_assert_equals(int32_t, 1, total_delete);
cmc_assert_equals(int32_t, 2, total_resize);
sl_customize(sl, NULL, NULL);
sl_clear(sl);
cmc_assert(sl_insert(sl, 10));
cmc_assert(sl_remove(sl, 0));
cmc_assert(sl_insert(sl, 1));
cmc_assert(sl_insert(sl, 0));
cmc_assert_equals(size_t, 1, sl_max(sl));
cmc_assert_equals(size_t, 0, sl_min(sl));
cmc_assert_equals(size_t, 0, sl_get(sl, 0));
cmc_assert_equals(size_t, 0, sl_index_of(sl, 0, true));
cmc_assert(sl_contains(sl, 1));
cmc_assert_equals(int32_t, 3, total_create);
cmc_assert_equals(int32_t, 5, total_read);
cmc_assert_equals(int32_t, 0, total_update);
cmc_assert_equals(int32_t, 1, total_delete);
cmc_assert_equals(int32_t, 2, total_resize);
cmc_assert_equals(ptr, NULL, sl->callbacks);
sl_free(sl);
total_create = 0;
total_read = 0;
total_update = 0;
total_delete = 0;
total_resize = 0;
});
});
CMC_CREATE_UNIT(CMCSortedListIter, true, {
CMC_CREATE_TEST(PFX##_iter_start(), {
struct sortedlist *sl = sl_new(100, sl_fval);
cmc_assert_not_equals(ptr, NULL, sl);
struct sortedlist_iter it = sl_iter_start(sl);
cmc_assert_equals(ptr, sl, it.target);
cmc_assert_equals(size_t, 0, it.cursor);
cmc_assert_equals(bool, true, it.start);
cmc_assert_equals(bool, true, it.end);
cmc_assert(sl_iter_at_start(&it));
cmc_assert(sl_iter_at_end(&it));
cmc_assert(sl_insert(sl, 1));
cmc_assert(sl_insert(sl, 2));
it = sl_iter_start(sl);
cmc_assert_equals(size_t, 0, it.cursor);
cmc_assert_equals(bool, false, it.end);
sl_free(sl);
});
CMC_CREATE_TEST(PFX##_iter_end(), {
struct sortedlist *sl = sl_new(100, sl_fval);
cmc_assert_not_equals(ptr, NULL, sl);
struct sortedlist_iter it = sl_iter_end(sl);
cmc_assert_equals(ptr, sl, it.target);
cmc_assert_equals(size_t, 0, it.cursor);
cmc_assert_equals(bool, true, it.start);
cmc_assert_equals(bool, true, it.end);
cmc_assert(sl_iter_at_start(&it));
cmc_assert(sl_iter_at_end(&it));
cmc_assert(sl_insert(sl, 1));
cmc_assert(sl_insert(sl, 2));
cmc_assert(sl_insert(sl, 3));
it = sl_iter_end(sl);
cmc_assert_equals(size_t, sl->count - 1, it.cursor);
cmc_assert_equals(bool, false, it.start);
sl_free(sl);
});
CMC_CREATE_TEST(PFX##_iter_at_start(), {
struct sortedlist *sl = sl_new(100, sl_fval);
cmc_assert_not_equals(ptr, NULL, sl);
struct sortedlist_iter it = sl_iter_start(sl);
// Empty checks
cmc_assert(sl_iter_at_start(&it));
it = sl_iter_end(sl);
cmc_assert(sl_iter_at_start(&it));
// Non-empty checks
cmc_assert(sl_insert(sl, 1));
it = sl_iter_end(sl);
cmc_assert(!sl_iter_at_start(&it));
it = sl_iter_start(sl);
cmc_assert(sl_iter_at_start(&it));
sl_free(sl);
});
CMC_CREATE_TEST(PFX##_iter_at_end(), {
struct sortedlist *sl = sl_new(100, sl_fval);
cmc_assert_not_equals(ptr, NULL, sl);
struct sortedlist_iter it = sl_iter_start(sl);
// Empty check
cmc_assert(sl_iter_at_end(&it));
it = sl_iter_end(sl);
cmc_assert(sl_iter_at_end(&it));
// Non-empty checks
cmc_assert(sl_insert(sl, 1));
it = sl_iter_end(sl);
cmc_assert(sl_iter_at_end(&it));
it = sl_iter_start(sl);
cmc_assert(!sl_iter_at_end(&it));
sl_free(sl);
});
CMC_CREATE_TEST(PFX##_iter_to_start(), {
struct sortedlist *sl = sl_new(100, sl_fval);
cmc_assert_not_equals(ptr, NULL, sl);
struct sortedlist_iter it = sl_iter_start(sl);
cmc_assert(!sl_iter_to_start(&it));
for (size_t i = 1; i <= 100; i++)
sl_insert(sl, i);
cmc_assert_equals(size_t, 100, sl->count);
it = sl_iter_end(sl);
cmc_assert(!sl_iter_at_start(&it));
cmc_assert(sl_iter_at_end(&it));
cmc_assert_equals(size_t, 100, sl_iter_value(&it));
cmc_assert(sl_iter_to_start(&it));
cmc_assert(sl_iter_at_start(&it));
cmc_assert(!sl_iter_at_end(&it));
cmc_assert_equals(size_t, 1, sl_iter_value(&it));
sl_free(sl);
});
CMC_CREATE_TEST(PFX##_iter_to_end(), {
struct sortedlist *sl = sl_new(100, sl_fval);
cmc_assert_not_equals(ptr, NULL, sl);
struct sortedlist_iter it = sl_iter_end(sl);
cmc_assert(!sl_iter_to_end(&it));
for (size_t i = 1; i <= 100; i++)
sl_insert(sl, i);
it = sl_iter_start(sl);
cmc_assert(sl_iter_at_start(&it));
cmc_assert(!sl_iter_at_end(&it));
cmc_assert_equals(size_t, 1, sl_iter_value(&it));
cmc_assert(sl_iter_to_end(&it));
cmc_assert(!sl_iter_at_start(&it));
cmc_assert(sl_iter_at_end(&it));
cmc_assert_equals(size_t, 100, sl_iter_value(&it));
sl_free(sl);
});
CMC_CREATE_TEST(PFX##_iter_next(), {
struct sortedlist *sl = sl_new(100, sl_fval);
cmc_assert_not_equals(ptr, NULL, sl);
struct sortedlist_iter it = sl_iter_start(sl);
cmc_assert(!sl_iter_next(&it));
for (size_t i = 1; i <= 1000; i++)
sl_insert(sl, i);
size_t sum = 0;
for (it = sl_iter_start(sl); !sl_iter_at_end(&it); sl_iter_next(&it))
{
sum += sl_iter_value(&it);
}
cmc_assert_equals(size_t, 500500, sum);
sum = 0;
sl_iter_to_start(&it);
do
{
sum += sl_iter_value(&it);
} while (sl_iter_next(&it));
cmc_assert_equals(size_t, 500500, sum);
sl_free(sl);
});
CMC_CREATE_TEST(PFX##_iter_prev(), {
struct sortedlist *sl = sl_new(100, sl_fval);
cmc_assert_not_equals(ptr, NULL, sl);
struct sortedlist_iter it = sl_iter_end(sl);
cmc_assert(!sl_iter_prev(&it));
for (size_t i = 1; i <= 1000; i++)
sl_insert(sl, i);
size_t sum = 0;
for (it = sl_iter_end(sl); !sl_iter_at_start(&it); sl_iter_prev(&it))
{
sum += sl_iter_value(&it);
}
cmc_assert_equals(size_t, 500500, sum);
sum = 0;
sl_iter_to_end(&it);
do
{
sum += sl_iter_value(&it);
} while (sl_iter_prev(&it));
cmc_assert_equals(size_t, 500500, sum);
sl_free(sl);
});
CMC_CREATE_TEST(PFX##_iter_advance(), {
struct sortedlist *sl = sl_new(100, sl_fval);
cmc_assert_not_equals(ptr, NULL, sl);
struct sortedlist_iter it = sl_iter_start(sl);
cmc_assert(!sl_iter_advance(&it, 1));
for (size_t i = 0; i <= 1000; i++)
sl_insert(sl, i);
it = sl_iter_start(sl);
cmc_assert(!sl_iter_advance(&it, 0));
cmc_assert(!sl_iter_advance(&it, sl->count));
size_t sum = 0;
for (it = sl_iter_start(sl);;)
{
sum += sl_iter_value(&it);
if (!sl_iter_advance(&it, 2))
break;
}
cmc_assert_equals(size_t, 250500, sum);
sl_iter_to_start(&it);
cmc_assert(sl_iter_advance(&it, sl->count - 1));
sl_free(sl);
});
CMC_CREATE_TEST(PFX##_iter_rewind(), {
struct sortedlist *sl = sl_new(100, sl_fval);
cmc_assert_not_equals(ptr, NULL, sl);
struct sortedlist_iter it = sl_iter_end(sl);
cmc_assert(!sl_iter_rewind(&it, 1));
for (size_t i = 0; i <= 1000; i++)
sl_insert(sl, i);
it = sl_iter_end(sl);
cmc_assert(!sl_iter_rewind(&it, 0));
cmc_assert(!sl_iter_rewind(&it, sl->count));
size_t sum = 0;
for (it = sl_iter_end(sl);;)
{
sum += sl_iter_value(&it);
if (!sl_iter_rewind(&it, 2))
break;
}
cmc_assert_equals(size_t, 250500, sum);
sl_iter_to_end(&it);
cmc_assert(sl_iter_rewind(&it, sl->count - 1));
sl_free(sl);
});
CMC_CREATE_TEST(PFX##_iter_go_to(), {
struct sortedlist *sl = sl_new(100, sl_fval);
cmc_assert_not_equals(ptr, NULL, sl);
struct sortedlist_iter it = sl_iter_end(sl);
cmc_assert(!sl_iter_go_to(&it, 0));
it = sl_iter_start(sl);
cmc_assert(!sl_iter_go_to(&it, 0));
for (size_t i = 0; i <= 1000; i++)
sl_insert(sl, i);
it = sl_iter_start(sl);
size_t sum = 0;
for (size_t i = 0; i < 1001; i++)
{
sl_iter_go_to(&it, i);
sum += sl_iter_value(&it);
}
cmc_assert_equals(size_t, 500500, sum);
sum = 0;
for (size_t i = 1001; i > 0; i--)
{
cmc_assert(sl_iter_go_to(&it, i - 1));
sum += sl_iter_value(&it);
}
cmc_assert_equals(size_t, 500500, sum);
sum = 0;
for (size_t i = 0; i < 1001; i += 100)
{
cmc_assert(sl_iter_go_to(&it, i));
cmc_assert_equals(size_t, i, sl_iter_index(&it));
sum += sl_iter_value(&it);
}
cmc_assert_equals(size_t, 5500, sum);
sl_free(sl);
});
CMC_CREATE_TEST(PFX##_iter_value(), {
struct sortedlist *sl = sl_new(100, sl_fval);
cmc_assert_not_equals(ptr, NULL, sl);
struct sortedlist_iter it = sl_iter_end(sl);
cmc_assert_equals(size_t, (size_t){ 0 }, sl_iter_value(&it));
cmc_assert(sl_insert(sl, 10));
it = sl_iter_start(sl);
cmc_assert_equals(size_t, 10, sl_iter_value(&it));
sl_free(sl);
});
CMC_CREATE_TEST(PFX##_iter_index(), {
struct sortedlist *sl = sl_new(100, sl_fval);
cmc_assert_not_equals(ptr, NULL, sl);
for (size_t i = 0; i <= 1000; i++)
sl_insert(sl, i);
struct sortedlist_iter it = sl_iter_start(sl);
for (size_t i = 0; i < 1001; i++)
{
cmc_assert_equals(size_t, i, sl_iter_index(&it));
sl_iter_next(&it);
}
it = sl_iter_end(sl);
for (size_t i = 1001; i > 0; i--)
{
cmc_assert_equals(size_t, i - 1, sl_iter_index(&it));
sl_iter_prev(&it);
}
sl_free(sl);
});
});
#ifdef CMC_TEST_MAIN
int main(void)
{
int result = CMCSortedList() + CMCSortedListIter();
printf(" +---------------------------------------------------------------+");
printf("\n");
printf(" | CMCSortedList Suit : %-43s |\n", result == 0 ? "PASSED" : "FAILED");
printf(" +---------------------------------------------------------------+");
printf("\n\n\n");
return result;
}
#endif
#endif /* CMC_TESTS_UNT_SORTEDLIST_H */
-3
View File
@@ -6,9 +6,6 @@
#define V size_t
#define PFX s
#define SNAME stack
#define CMC_EXT_STACK_INIT
#define CMC_EXT_STACK_ITER
#define CMC_EXT_STACK_STR
#include "cmc/stack.h"
struct stack_fval *s_fval = &(struct stack_fval){
+674
View File
@@ -0,0 +1,674 @@
#ifndef CMC_TESTS_UNT_TREEMAP_H
#define CMC_TESTS_UNT_TREEMAP_H
#include "utl.h"
#define V size_t
#define K size_t
#define PFX tm
#define SNAME treemap
#include "cmc/treemap.h"
struct treemap_fkey *tm_fkey = &(struct treemap_fkey){
.cmp = cmc_size_cmp, .cpy = NULL, .str = cmc_size_str, .free = NULL, .hash = cmc_size_hash, .pri = cmc_size_cmp
};
struct treemap_fval *tm_fval = &(struct treemap_fval){
.cmp = cmc_size_cmp, .cpy = NULL, .str = cmc_size_str, .free = NULL, .hash = cmc_size_hash, .pri = cmc_size_cmp
};
CMC_CREATE_UNIT(CMCTreeMap, true, {
CMC_CREATE_TEST(new, {
struct treemap *map = tm_new(tm_fkey, tm_fval);
cmc_assert_not_equals(ptr, NULL, map);
tm_free(map);
});
CMC_CREATE_TEST(clear[count], {
struct treemap *map = tm_new(tm_fkey, tm_fval);
cmc_assert_not_equals(ptr, NULL, map);
for (size_t i = 0; i < 50; i++)
tm_insert(map, i, i);
cmc_assert_equals(size_t, 50, tm_count(map));
tm_clear(map);
cmc_assert_equals(size_t, 0, tm_count(map));
cmc_assert_equals(ptr, NULL, map->root);
tm_free(map);
});
CMC_CREATE_TEST(flags, {
struct treemap *map = tm_new(tm_fkey, tm_fval);
cmc_assert_not_equals(ptr, NULL, map);
cmc_assert_equals(int32_t, CMC_FLAG_OK, tm_flag(map));
// clear
map->flag = CMC_FLAG_ERROR;
tm_clear(map);
cmc_assert_equals(int32_t, CMC_FLAG_OK, tm_flag(map));
// insert
map->flag = CMC_FLAG_ERROR;
cmc_assert(tm_insert(map, 1, 1));
cmc_assert_equals(int32_t, CMC_FLAG_OK, tm_flag(map));
cmc_assert(!tm_insert(map, 1, 2));
cmc_assert_equals(int32_t, CMC_FLAG_DUPLICATE, tm_flag(map));
// update
cmc_assert(!tm_update(map, 2, 2, NULL));
cmc_assert_equals(int32_t, CMC_FLAG_NOT_FOUND, tm_flag(map));
cmc_assert(tm_update(map, 1, 2, NULL));
cmc_assert_equals(int32_t, CMC_FLAG_OK, tm_flag(map));
// remove
cmc_assert(!tm_remove(map, 2, NULL));
cmc_assert_equals(int32_t, CMC_FLAG_NOT_FOUND, tm_flag(map));
cmc_assert(tm_remove(map, 1, NULL));
cmc_assert_equals(int32_t, CMC_FLAG_OK, tm_flag(map));
cmc_assert(!tm_remove(map, 1, NULL));
cmc_assert_equals(int32_t, CMC_FLAG_EMPTY, tm_flag(map));
// max min
map->flag = CMC_FLAG_ERROR;
cmc_assert(!tm_max(map, NULL, NULL));
cmc_assert_equals(int32_t, CMC_FLAG_EMPTY, tm_flag(map));
map->flag = CMC_FLAG_ERROR;
cmc_assert(!tm_min(map, NULL, NULL));
cmc_assert_equals(int32_t, CMC_FLAG_EMPTY, tm_flag(map));
cmc_assert(tm_insert(map, 1, 1));
map->flag = CMC_FLAG_ERROR;
cmc_assert(tm_max(map, NULL, NULL));
cmc_assert_equals(int32_t, CMC_FLAG_OK, tm_flag(map));
map->flag = CMC_FLAG_ERROR;
cmc_assert(tm_min(map, NULL, NULL));
cmc_assert_equals(int32_t, CMC_FLAG_OK, tm_flag(map));
// get get_ref
tm_get(map, 2);
cmc_assert_equals(int32_t, CMC_FLAG_NOT_FOUND, tm_flag(map));
tm_get(map, 1);
cmc_assert_equals(int32_t, CMC_FLAG_OK, tm_flag(map));
tm_get_ref(map, 2);
cmc_assert_equals(int32_t, CMC_FLAG_NOT_FOUND, tm_flag(map));
tm_get_ref(map, 1);
cmc_assert_equals(int32_t, CMC_FLAG_OK, tm_flag(map));
cmc_assert(tm_remove(map, 1, NULL));
map->flag = CMC_FLAG_ERROR;
tm_get(map, 1);
cmc_assert_equals(int32_t, CMC_FLAG_EMPTY, tm_flag(map));
map->flag = CMC_FLAG_ERROR;
tm_get_ref(map, 1);
cmc_assert_equals(int32_t, CMC_FLAG_EMPTY, tm_flag(map));
for (size_t i = 0; i < 100; i++)
cmc_assert(tm_insert(map, i, i));
// copy_of
map->flag = CMC_FLAG_ERROR;
struct treemap *map2 = tm_copy_of(map);
cmc_assert_equals(int32_t, CMC_FLAG_OK, tm_flag(map));
cmc_assert_equals(int32_t, CMC_FLAG_OK, tm_flag(map2));
// equals
map->flag = CMC_FLAG_ERROR;
map2->flag = CMC_FLAG_ERROR;
cmc_assert(tm_equals(map, map2));
cmc_assert_equals(int32_t, CMC_FLAG_OK, tm_flag(map));
cmc_assert_equals(int32_t, CMC_FLAG_OK, tm_flag(map2));
tm_free(map);
tm_free(map2);
});
CMC_CREATE_TEST(callbacks, {
struct treemap *map = tm_new_custom(tm_fkey, tm_fval, NULL, callbacks);
cmc_assert_not_equals(ptr, NULL, map);
total_create = 0;
total_read = 0;
total_update = 0;
total_delete = 0;
total_resize = 0;
cmc_assert(tm_insert(map, 1, 10));
cmc_assert_equals(int32_t, 1, total_create);
cmc_assert(tm_update(map, 1, 2, NULL));
cmc_assert_equals(int32_t, 1, total_update);
cmc_assert(tm_remove(map, 1, NULL));
cmc_assert_equals(int32_t, 1, total_delete);
cmc_assert(tm_insert(map, 1, 2));
cmc_assert_equals(int32_t, 2, total_create);
cmc_assert(tm_max(map, NULL, NULL));
cmc_assert_equals(int32_t, 1, total_read);
cmc_assert(tm_min(map, NULL, NULL));
cmc_assert_equals(int32_t, 2, total_read);
cmc_assert_equals(size_t, 2, tm_get(map, 1));
cmc_assert_equals(int32_t, 3, total_read);
cmc_assert_not_equals(ptr, NULL, tm_get_ref(map, 1));
cmc_assert_equals(int32_t, 4, total_read);
cmc_assert(tm_contains(map, 1));
cmc_assert_equals(int32_t, 5, total_read);
cmc_assert_equals(int32_t, 2, total_create);
cmc_assert_equals(int32_t, 5, total_read);
cmc_assert_equals(int32_t, 1, total_update);
cmc_assert_equals(int32_t, 1, total_delete);
cmc_assert_equals(int32_t, 0, total_resize);
tm_customize(map, NULL, NULL);
tm_clear(map);
cmc_assert(tm_insert(map, 1, 10));
cmc_assert(tm_update(map, 1, 2, NULL));
cmc_assert(tm_remove(map, 1, NULL));
cmc_assert(tm_insert(map, 1, 2));
cmc_assert(tm_max(map, NULL, NULL));
cmc_assert(tm_min(map, NULL, NULL));
cmc_assert_equals(size_t, 2, tm_get(map, 1));
cmc_assert_not_equals(ptr, NULL, tm_get_ref(map, 1));
cmc_assert(tm_contains(map, 1));
cmc_assert_equals(int32_t, 2, total_create);
cmc_assert_equals(int32_t, 5, total_read);
cmc_assert_equals(int32_t, 1, total_update);
cmc_assert_equals(int32_t, 1, total_delete);
cmc_assert_equals(int32_t, 0, total_resize);
cmc_assert_equals(ptr, NULL, map->callbacks);
total_create = 0;
total_read = 0;
total_update = 0;
total_delete = 0;
total_resize = 0;
tm_free(map);
});
});
CMC_CREATE_UNIT(CMCTreeMapIter, true, {
CMC_CREATE_TEST(PFX##_iter_start(), {
struct treemap *map = tm_new(tm_fkey, tm_fval);
cmc_assert_not_equals(ptr, NULL, map);
struct treemap_iter it = tm_iter_start(map);
cmc_assert_equals(ptr, map, it.target);
cmc_assert_equals(ptr, NULL, it.cursor);
cmc_assert_equals(ptr, NULL, it.first);
cmc_assert_equals(ptr, NULL, it.last);
cmc_assert_equals(size_t, 0, it.index);
cmc_assert_equals(bool, true, it.start);
cmc_assert_equals(bool, true, it.end);
cmc_assert(tm_iter_at_start(&it));
cmc_assert(tm_iter_at_end(&it));
cmc_assert(tm_insert(map, 1, 1));
cmc_assert(tm_insert(map, 2, 2));
cmc_assert(tm_insert(map, 3, 3));
it = tm_iter_start(map);
cmc_assert_equals(size_t, 0, it.index);
cmc_assert_equals(size_t, 1, it.cursor->key);
cmc_assert_equals(size_t, 1, it.first->key);
cmc_assert_equals(size_t, 3, it.last->key);
cmc_assert_equals(bool, false, it.end);
tm_free(map);
});
CMC_CREATE_TEST(PFX##_iter_end(), {
struct treemap *map = tm_new(tm_fkey, tm_fval);
cmc_assert_not_equals(ptr, NULL, map);
struct treemap_iter it = tm_iter_end(map);
cmc_assert_equals(ptr, map, it.target);
cmc_assert_equals(ptr, NULL, it.cursor);
cmc_assert_equals(ptr, NULL, it.first);
cmc_assert_equals(ptr, NULL, it.last);
cmc_assert_equals(size_t, 0, it.index);
cmc_assert_equals(bool, true, it.start);
cmc_assert_equals(bool, true, it.end);
cmc_assert(tm_iter_at_start(&it));
cmc_assert(tm_iter_at_end(&it));
cmc_assert(tm_insert(map, 1, 1));
cmc_assert(tm_insert(map, 2, 2));
cmc_assert(tm_insert(map, 3, 3));
it = tm_iter_end(map);
cmc_assert_equals(size_t, map->count - 1, it.index);
cmc_assert_equals(size_t, 3, it.cursor->key);
cmc_assert_equals(size_t, 1, it.first->key);
cmc_assert_equals(size_t, 3, it.last->key);
cmc_assert_equals(bool, false, it.start);
tm_free(map);
});
CMC_CREATE_TEST(PFX##_iter_at_start(), {
struct treemap *map = tm_new(tm_fkey, tm_fval);
cmc_assert_not_equals(ptr, NULL, map);
struct treemap_iter it = tm_iter_start(map);
// Empty checks
cmc_assert(tm_iter_at_start(&it));
it = tm_iter_end(map);
cmc_assert(tm_iter_at_start(&it));
// Non-empty checks
cmc_assert(tm_insert(map, 1, 1));
cmc_assert(tm_insert(map, 2, 2));
it = tm_iter_end(map);
cmc_assert(!tm_iter_at_start(&it));
it = tm_iter_start(map);
cmc_assert(tm_iter_at_start(&it));
tm_free(map);
});
CMC_CREATE_TEST(PFX##_iter_at_end(), {
struct treemap *map = tm_new(tm_fkey, tm_fval);
cmc_assert_not_equals(ptr, NULL, map);
struct treemap_iter it = tm_iter_start(map);
// Empty check
cmc_assert(tm_iter_at_end(&it));
it = tm_iter_end(map);
cmc_assert(tm_iter_at_end(&it));
// Non-empty checks
cmc_assert(tm_insert(map, 1, 1));
cmc_assert(tm_insert(map, 2, 2));
it = tm_iter_end(map);
cmc_assert(tm_iter_at_end(&it));
it = tm_iter_start(map);
cmc_assert(!tm_iter_at_end(&it));
tm_free(map);
});
CMC_CREATE_TEST(PFX##_iter_to_start(), {
struct treemap *map = tm_new(tm_fkey, tm_fval);
cmc_assert_not_equals(ptr, NULL, map);
struct treemap_iter it = tm_iter_start(map);
cmc_assert(!tm_iter_to_start(&it));
for (size_t i = 1; i <= 100; i++)
tm_insert(map, i, i);
cmc_assert_equals(size_t, 100, map->count);
it = tm_iter_end(map);
cmc_assert(!tm_iter_at_start(&it));
cmc_assert(tm_iter_at_end(&it));
cmc_assert_equals(size_t, 100, tm_iter_value(&it));
cmc_assert(tm_iter_to_start(&it));
cmc_assert(tm_iter_at_start(&it));
cmc_assert(!tm_iter_at_end(&it));
cmc_assert_equals(size_t, 1, tm_iter_value(&it));
tm_free(map);
});
CMC_CREATE_TEST(PFX##_iter_to_end(), {
struct treemap *map = tm_new(tm_fkey, tm_fval);
cmc_assert_not_equals(ptr, NULL, map);
struct treemap_iter it = tm_iter_end(map);
cmc_assert(!tm_iter_to_end(&it));
for (size_t i = 1; i <= 100; i++)
tm_insert(map, i, i);
it = tm_iter_start(map);
cmc_assert(tm_iter_at_start(&it));
cmc_assert(!tm_iter_at_end(&it));
cmc_assert_equals(size_t, 1, tm_iter_value(&it));
cmc_assert(tm_iter_to_end(&it));
cmc_assert(!tm_iter_at_start(&it));
cmc_assert(tm_iter_at_end(&it));
cmc_assert_equals(size_t, 100, tm_iter_value(&it));
tm_free(map);
});
CMC_CREATE_TEST(PFX##_iter_next(), {
struct treemap *map = tm_new(tm_fkey, tm_fval);
cmc_assert_not_equals(ptr, NULL, map);
struct treemap_iter it = tm_iter_start(map);
cmc_assert(!tm_iter_next(&it));
for (size_t i = 1; i <= 1000; i++)
tm_insert(map, i, i);
size_t sum = 0;
for (it = tm_iter_start(map); !tm_iter_at_end(&it); tm_iter_next(&it))
{
sum += tm_iter_value(&it);
}
cmc_assert_equals(size_t, 500500, sum);
sum = 0;
tm_iter_to_start(&it);
do
{
sum += tm_iter_value(&it);
} while (tm_iter_next(&it));
cmc_assert_equals(size_t, 500500, sum);
tm_free(map);
});
CMC_CREATE_TEST(PFX##_iter_prev(), {
struct treemap *map = tm_new(tm_fkey, tm_fval);
cmc_assert_not_equals(ptr, NULL, map);
struct treemap_iter it = tm_iter_end(map);
cmc_assert(!tm_iter_prev(&it));
for (size_t i = 1; i <= 1000; i++)
tm_insert(map, i, i);
size_t sum = 0;
for (it = tm_iter_end(map); !tm_iter_at_start(&it); tm_iter_prev(&it))
{
sum += tm_iter_value(&it);
}
cmc_assert_equals(size_t, 500500, sum);
sum = 0;
tm_iter_to_end(&it);
do
{
sum += tm_iter_value(&it);
} while (tm_iter_prev(&it));
cmc_assert_equals(size_t, 500500, sum);
tm_free(map);
});
CMC_CREATE_TEST(PFX##_iter_advance(), {
struct treemap *map = tm_new(tm_fkey, tm_fval);
cmc_assert_not_equals(ptr, NULL, map);
struct treemap_iter it = tm_iter_start(map);
cmc_assert(!tm_iter_advance(&it, 1));
for (size_t i = 0; i <= 1000; i++)
tm_insert(map, i, i);
it = tm_iter_start(map);
cmc_assert(!tm_iter_advance(&it, 0));
cmc_assert(!tm_iter_advance(&it, map->count));
size_t sum = 0;
for (it = tm_iter_start(map);;)
{
sum += tm_iter_value(&it);
if (!tm_iter_advance(&it, 2))
break;
}
cmc_assert_equals(size_t, 250500, sum);
tm_iter_to_start(&it);
cmc_assert(tm_iter_advance(&it, map->count - 1));
tm_free(map);
});
CMC_CREATE_TEST(PFX##_iter_rewind(), {
struct treemap *map = tm_new(tm_fkey, tm_fval);
cmc_assert_not_equals(ptr, NULL, map);
struct treemap_iter it = tm_iter_end(map);
cmc_assert(!tm_iter_rewind(&it, 1));
for (size_t i = 0; i <= 1000; i++)
tm_insert(map, i, i);
it = tm_iter_end(map);
cmc_assert(!tm_iter_rewind(&it, 0));
cmc_assert(!tm_iter_rewind(&it, map->count));
size_t sum = 0;
for (it = tm_iter_end(map);;)
{
sum += tm_iter_value(&it);
if (!tm_iter_rewind(&it, 2))
break;
}
cmc_assert_equals(size_t, 250500, sum);
tm_iter_to_end(&it);
cmc_assert(tm_iter_rewind(&it, map->count - 1));
tm_free(map);
});
CMC_CREATE_TEST(PFX##_iter_go_to(), {
struct treemap *map = tm_new(tm_fkey, tm_fval);
cmc_assert_not_equals(ptr, NULL, map);
struct treemap_iter it = tm_iter_end(map);
cmc_assert(!tm_iter_go_to(&it, 0));
it = tm_iter_start(map);
cmc_assert(!tm_iter_go_to(&it, 0));
for (size_t i = 0; i <= 1000; i++)
tm_insert(map, i, i);
it = tm_iter_start(map);
size_t sum = 0;
for (size_t i = 0; i < 1001; i++)
{
tm_iter_go_to(&it, i);
sum += tm_iter_value(&it);
}
cmc_assert_equals(size_t, 500500, sum);
sum = 0;
for (size_t i = 1001; i > 0; i--)
{
cmc_assert(tm_iter_go_to(&it, i - 1));
sum += tm_iter_value(&it);
}
cmc_assert_equals(size_t, 500500, sum);
sum = 0;
for (size_t i = 0; i < 1001; i += 100)
{
cmc_assert(tm_iter_go_to(&it, i));
cmc_assert_equals(size_t, i, tm_iter_index(&it));
sum += tm_iter_value(&it);
}
cmc_assert_equals(size_t, 5500, sum);
tm_free(map);
});
CMC_CREATE_TEST(PFX##_iter_key(), {
struct treemap *map = tm_new(tm_fkey, tm_fval);
cmc_assert_not_equals(ptr, NULL, map);
struct treemap_iter it = tm_iter_end(map);
cmc_assert_equals(size_t, (size_t){ 0 }, tm_iter_key(&it));
cmc_assert(tm_insert(map, 10, 10));
it = tm_iter_start(map);
cmc_assert_equals(size_t, 10, tm_iter_key(&it));
tm_free(map);
});
CMC_CREATE_TEST(PFX##_iter_value(), {
struct treemap *map = tm_new(tm_fkey, tm_fval);
cmc_assert_not_equals(ptr, NULL, map);
struct treemap_iter it = tm_iter_end(map);
cmc_assert_equals(size_t, (size_t){ 0 }, tm_iter_value(&it));
cmc_assert(tm_insert(map, 10, 10));
it = tm_iter_start(map);
cmc_assert_equals(size_t, 10, tm_iter_value(&it));
tm_free(map);
});
CMC_CREATE_TEST(PFX##_iter_rvalue(), {
struct treemap *map = tm_new(tm_fkey, tm_fval);
cmc_assert_not_equals(ptr, NULL, map);
struct treemap_iter it = tm_iter_end(map);
cmc_assert_equals(ptr, NULL, tm_iter_rvalue(&it));
cmc_assert(tm_insert(map, 10, 10));
it = tm_iter_start(map);
cmc_assert_not_equals(ptr, NULL, tm_iter_rvalue(&it));
cmc_assert_equals(size_t, 10, *tm_iter_rvalue(&it));
tm_free(map);
});
CMC_CREATE_TEST(PFX##_iter_index(), {
struct treemap *map = tm_new(tm_fkey, tm_fval);
cmc_assert_not_equals(ptr, NULL, map);
for (size_t i = 0; i <= 1000; i++)
tm_insert(map, i, i);
struct treemap_iter it = tm_iter_start(map);
for (size_t i = 0; i < 1001; i++)
{
cmc_assert_equals(size_t, i, tm_iter_index(&it));
tm_iter_next(&it);
}
it = tm_iter_end(map);
for (size_t i = 1001; i > 0; i--)
{
cmc_assert_equals(size_t, i - 1, tm_iter_index(&it));
tm_iter_prev(&it);
}
tm_free(map);
});
});
#ifdef CMC_TEST_MAIN
int main(void)
{
int result = CMCTreeMap() + CMCTreeMapIter();
printf(" +---------------------------------------------------------------+");
printf("\n");
printf(" | CMCTreeMap Suit : %-46s |\n", result == 0 ? "PASSED" : "FAILED");
printf(" +---------------------------------------------------------------+");
printf("\n\n\n");
return result;
}
#endif
#endif /* CMC_TESTS_UNT_TREEMAP_H */
+588
View File
@@ -0,0 +1,588 @@
#ifndef CMC_TESTS_UNT_TREESET_H
#define CMC_TESTS_UNT_TREESET_H
#include "utl.h"
#define V size_t
#define PFX ts
#define SNAME treeset
#include "cmc/treeset.h"
struct treeset_fval *ts_fval = &(struct treeset_fval){
.cmp = cmc_size_cmp, .cpy = NULL, .str = cmc_size_str, .free = NULL, .hash = cmc_size_hash, .pri = cmc_size_cmp
};
CMC_CREATE_UNIT(CMCTreeSet, true, {
CMC_CREATE_TEST(new, {
struct treeset *set = ts_new(ts_fval);
cmc_assert_not_equals(ptr, NULL, set);
ts_free(set);
});
CMC_CREATE_TEST(clear[count], {
struct treeset *set = ts_new(ts_fval);
cmc_assert_not_equals(ptr, NULL, set);
for (size_t i = 0; i < 50; i++)
ts_insert(set, i);
cmc_assert_equals(size_t, 50, ts_count(set));
ts_clear(set);
cmc_assert_equals(size_t, 0, ts_count(set));
cmc_assert_equals(ptr, NULL, set->root);
ts_free(set);
});
CMC_CREATE_TEST(flags, {
struct treeset *set = ts_new(ts_fval);
cmc_assert_not_equals(ptr, NULL, set);
cmc_assert_equals(int32_t, CMC_FLAG_OK, ts_flag(set));
// clear
set->flag = CMC_FLAG_ERROR;
ts_clear(set);
cmc_assert_equals(int32_t, CMC_FLAG_OK, ts_flag(set));
// insert
set->flag = CMC_FLAG_ERROR;
cmc_assert(ts_insert(set, 1));
cmc_assert_equals(int32_t, CMC_FLAG_OK, ts_flag(set));
cmc_assert(!ts_insert(set, 1));
cmc_assert_equals(int32_t, CMC_FLAG_DUPLICATE, ts_flag(set));
// remove
cmc_assert(!ts_remove(set, 2));
cmc_assert_equals(int32_t, CMC_FLAG_NOT_FOUND, ts_flag(set));
cmc_assert(ts_remove(set, 1));
cmc_assert_equals(int32_t, CMC_FLAG_OK, ts_flag(set));
cmc_assert(!ts_remove(set, 1));
cmc_assert_equals(int32_t, CMC_FLAG_EMPTY, ts_flag(set));
// max min
set->flag = CMC_FLAG_ERROR;
cmc_assert(!ts_max(set, NULL));
cmc_assert_equals(int32_t, CMC_FLAG_EMPTY, ts_flag(set));
set->flag = CMC_FLAG_ERROR;
cmc_assert(!ts_min(set, NULL));
cmc_assert_equals(int32_t, CMC_FLAG_EMPTY, ts_flag(set));
cmc_assert(ts_insert(set, 1));
set->flag = CMC_FLAG_ERROR;
cmc_assert(ts_max(set, NULL));
cmc_assert_equals(int32_t, CMC_FLAG_OK, ts_flag(set));
set->flag = CMC_FLAG_ERROR;
cmc_assert(ts_min(set, NULL));
cmc_assert_equals(int32_t, CMC_FLAG_OK, ts_flag(set));
// copy_of
set->flag = CMC_FLAG_ERROR;
struct treeset *set2 = ts_copy_of(set);
cmc_assert_equals(int32_t, CMC_FLAG_OK, ts_flag(set));
cmc_assert_equals(int32_t, CMC_FLAG_OK, ts_flag(set2));
// equals
set->flag = CMC_FLAG_ERROR;
set2->flag = CMC_FLAG_ERROR;
cmc_assert(ts_equals(set, set2));
cmc_assert_equals(int32_t, CMC_FLAG_OK, ts_flag(set));
cmc_assert_equals(int32_t, CMC_FLAG_OK, ts_flag(set2));
ts_free(set);
ts_free(set2);
});
CMC_CREATE_TEST(callbacks, {
struct treeset *set = ts_new_custom(ts_fval, NULL, callbacks);
cmc_assert_not_equals(ptr, NULL, set);
total_create = 0;
total_read = 0;
total_update = 0;
total_delete = 0;
total_resize = 0;
cmc_assert(ts_insert(set, 10));
cmc_assert_equals(int32_t, 1, total_create);
cmc_assert(ts_remove(set, 10));
cmc_assert_equals(int32_t, 1, total_delete);
cmc_assert(ts_insert(set, 1));
cmc_assert_equals(int32_t, 2, total_create);
cmc_assert(ts_max(set, NULL));
cmc_assert_equals(int32_t, 1, total_read);
cmc_assert(ts_min(set, NULL));
cmc_assert_equals(int32_t, 2, total_read);
cmc_assert(ts_contains(set, 1));
cmc_assert_equals(int32_t, 3, total_read);
cmc_assert_equals(int32_t, 2, total_create);
cmc_assert_equals(int32_t, 3, total_read);
cmc_assert_equals(int32_t, 0, total_update);
cmc_assert_equals(int32_t, 1, total_delete);
cmc_assert_equals(int32_t, 0, total_resize);
ts_customize(set, NULL, NULL);
ts_clear(set);
cmc_assert(ts_insert(set, 10));
cmc_assert(ts_remove(set, 10));
cmc_assert(ts_insert(set, 1));
cmc_assert(ts_max(set, NULL));
cmc_assert(ts_min(set, NULL));
cmc_assert(ts_contains(set, 1));
cmc_assert_equals(int32_t, 2, total_create);
cmc_assert_equals(int32_t, 3, total_read);
cmc_assert_equals(int32_t, 0, total_update);
cmc_assert_equals(int32_t, 1, total_delete);
cmc_assert_equals(int32_t, 0, total_resize);
cmc_assert_equals(ptr, NULL, set->callbacks);
total_create = 0;
total_read = 0;
total_update = 0;
total_delete = 0;
total_resize = 0;
ts_free(set);
});
});
CMC_CREATE_UNIT(CMCTreeSetIter, true, {
CMC_CREATE_TEST(PFX##_iter_start(), {
struct treeset *set = ts_new(ts_fval);
cmc_assert_not_equals(ptr, NULL, set);
struct treeset_iter it = ts_iter_start(set);
cmc_assert_equals(ptr, set, it.target);
cmc_assert_equals(ptr, NULL, it.cursor);
cmc_assert_equals(ptr, NULL, it.first);
cmc_assert_equals(ptr, NULL, it.last);
cmc_assert_equals(size_t, 0, it.index);
cmc_assert_equals(bool, true, it.start);
cmc_assert_equals(bool, true, it.end);
cmc_assert(ts_iter_at_start(&it));
cmc_assert(ts_iter_at_end(&it));
cmc_assert(ts_insert(set, 1));
cmc_assert(ts_insert(set, 2));
cmc_assert(ts_insert(set, 3));
it = ts_iter_start(set);
cmc_assert_equals(size_t, 0, it.index);
cmc_assert_equals(size_t, 1, it.cursor->value);
cmc_assert_equals(size_t, 1, it.first->value);
cmc_assert_equals(size_t, 3, it.last->value);
cmc_assert_equals(bool, false, it.end);
ts_free(set);
});
CMC_CREATE_TEST(PFX##_iter_end(), {
struct treeset *set = ts_new(ts_fval);
cmc_assert_not_equals(ptr, NULL, set);
struct treeset_iter it = ts_iter_end(set);
cmc_assert_equals(ptr, set, it.target);
cmc_assert_equals(ptr, NULL, it.cursor);
cmc_assert_equals(ptr, NULL, it.first);
cmc_assert_equals(ptr, NULL, it.last);
cmc_assert_equals(size_t, 0, it.index);
cmc_assert_equals(bool, true, it.start);
cmc_assert_equals(bool, true, it.end);
cmc_assert(ts_iter_at_start(&it));
cmc_assert(ts_iter_at_end(&it));
cmc_assert(ts_insert(set, 1));
cmc_assert(ts_insert(set, 2));
cmc_assert(ts_insert(set, 3));
it = ts_iter_end(set);
cmc_assert_equals(size_t, set->count - 1, it.index);
cmc_assert_equals(size_t, 3, it.cursor->value);
cmc_assert_equals(size_t, 1, it.first->value);
cmc_assert_equals(size_t, 3, it.last->value);
cmc_assert_equals(bool, false, it.start);
ts_free(set);
});
CMC_CREATE_TEST(PFX##_iter_at_start(), {
struct treeset *set = ts_new(ts_fval);
cmc_assert_not_equals(ptr, NULL, set);
struct treeset_iter it = ts_iter_start(set);
// Empty checks
cmc_assert(ts_iter_at_start(&it));
it = ts_iter_end(set);
cmc_assert(ts_iter_at_start(&it));
// Non-empty checks
cmc_assert(ts_insert(set, 1));
cmc_assert(ts_insert(set, 2));
it = ts_iter_end(set);
cmc_assert(!ts_iter_at_start(&it));
it = ts_iter_start(set);
cmc_assert(ts_iter_at_start(&it));
ts_free(set);
});
CMC_CREATE_TEST(PFX##_iter_at_end(), {
struct treeset *set = ts_new(ts_fval);
cmc_assert_not_equals(ptr, NULL, set);
struct treeset_iter it = ts_iter_start(set);
// Empty check
cmc_assert(ts_iter_at_end(&it));
it = ts_iter_end(set);
cmc_assert(ts_iter_at_end(&it));
// Non-empty checks
cmc_assert(ts_insert(set, 1));
cmc_assert(ts_insert(set, 2));
it = ts_iter_end(set);
cmc_assert(ts_iter_at_end(&it));
it = ts_iter_start(set);
cmc_assert(!ts_iter_at_end(&it));
ts_free(set);
});
CMC_CREATE_TEST(PFX##_iter_to_start(), {
struct treeset *set = ts_new(ts_fval);
cmc_assert_not_equals(ptr, NULL, set);
struct treeset_iter it = ts_iter_start(set);
cmc_assert(!ts_iter_to_start(&it));
for (size_t i = 1; i <= 100; i++)
ts_insert(set, i);
cmc_assert_equals(size_t, 100, set->count);
it = ts_iter_end(set);
cmc_assert(!ts_iter_at_start(&it));
cmc_assert(ts_iter_at_end(&it));
cmc_assert_equals(size_t, 100, ts_iter_value(&it));
cmc_assert(ts_iter_to_start(&it));
cmc_assert(ts_iter_at_start(&it));
cmc_assert(!ts_iter_at_end(&it));
cmc_assert_equals(size_t, 1, ts_iter_value(&it));
ts_free(set);
});
CMC_CREATE_TEST(PFX##_iter_to_end(), {
struct treeset *set = ts_new(ts_fval);
cmc_assert_not_equals(ptr, NULL, set);
struct treeset_iter it = ts_iter_end(set);
cmc_assert(!ts_iter_to_end(&it));
for (size_t i = 1; i <= 100; i++)
ts_insert(set, i);
it = ts_iter_start(set);
cmc_assert(ts_iter_at_start(&it));
cmc_assert(!ts_iter_at_end(&it));
cmc_assert_equals(size_t, 1, ts_iter_value(&it));
cmc_assert(ts_iter_to_end(&it));
cmc_assert(!ts_iter_at_start(&it));
cmc_assert(ts_iter_at_end(&it));
cmc_assert_equals(size_t, 100, ts_iter_value(&it));
ts_free(set);
});
CMC_CREATE_TEST(PFX##_iter_next(), {
struct treeset *set = ts_new(ts_fval);
cmc_assert_not_equals(ptr, NULL, set);
struct treeset_iter it = ts_iter_start(set);
cmc_assert(!ts_iter_next(&it));
for (size_t i = 1; i <= 1000; i++)
ts_insert(set, i);
size_t sum = 0;
for (it = ts_iter_start(set); !ts_iter_at_end(&it); ts_iter_next(&it))
{
sum += ts_iter_value(&it);
}
cmc_assert_equals(size_t, 500500, sum);
sum = 0;
ts_iter_to_start(&it);
do
{
sum += ts_iter_value(&it);
} while (ts_iter_next(&it));
cmc_assert_equals(size_t, 500500, sum);
ts_free(set);
});
CMC_CREATE_TEST(PFX##_iter_prev(), {
struct treeset *set = ts_new(ts_fval);
cmc_assert_not_equals(ptr, NULL, set);
struct treeset_iter it = ts_iter_end(set);
cmc_assert(!ts_iter_prev(&it));
for (size_t i = 1; i <= 1000; i++)
ts_insert(set, i);
size_t sum = 0;
for (it = ts_iter_end(set); !ts_iter_at_start(&it); ts_iter_prev(&it))
{
sum += ts_iter_value(&it);
}
cmc_assert_equals(size_t, 500500, sum);
sum = 0;
ts_iter_to_end(&it);
do
{
sum += ts_iter_value(&it);
} while (ts_iter_prev(&it));
cmc_assert_equals(size_t, 500500, sum);
ts_free(set);
});
CMC_CREATE_TEST(PFX##_iter_advance(), {
struct treeset *set = ts_new(ts_fval);
cmc_assert_not_equals(ptr, NULL, set);
struct treeset_iter it = ts_iter_start(set);
cmc_assert(!ts_iter_advance(&it, 1));
for (size_t i = 0; i <= 1000; i++)
ts_insert(set, i);
it = ts_iter_start(set);
cmc_assert(!ts_iter_advance(&it, 0));
cmc_assert(!ts_iter_advance(&it, set->count));
size_t sum = 0;
for (it = ts_iter_start(set);;)
{
sum += ts_iter_value(&it);
if (!ts_iter_advance(&it, 2))
break;
}
cmc_assert_equals(size_t, 250500, sum);
ts_iter_to_start(&it);
cmc_assert(ts_iter_advance(&it, set->count - 1));
ts_free(set);
});
CMC_CREATE_TEST(PFX##_iter_rewind(), {
struct treeset *set = ts_new(ts_fval);
cmc_assert_not_equals(ptr, NULL, set);
struct treeset_iter it = ts_iter_end(set);
cmc_assert(!ts_iter_rewind(&it, 1));
for (size_t i = 0; i <= 1000; i++)
ts_insert(set, i);
it = ts_iter_end(set);
cmc_assert(!ts_iter_rewind(&it, 0));
cmc_assert(!ts_iter_rewind(&it, set->count));
size_t sum = 0;
for (it = ts_iter_end(set);;)
{
sum += ts_iter_value(&it);
if (!ts_iter_rewind(&it, 2))
break;
}
cmc_assert_equals(size_t, 250500, sum);
ts_iter_to_end(&it);
cmc_assert(ts_iter_rewind(&it, set->count - 1));
ts_free(set);
});
CMC_CREATE_TEST(PFX##_iter_go_to(), {
struct treeset *set = ts_new(ts_fval);
cmc_assert_not_equals(ptr, NULL, set);
struct treeset_iter it = ts_iter_end(set);
cmc_assert(!ts_iter_go_to(&it, 0));
it = ts_iter_start(set);
cmc_assert(!ts_iter_go_to(&it, 0));
for (size_t i = 0; i <= 1000; i++)
ts_insert(set, i);
it = ts_iter_start(set);
size_t sum = 0;
for (size_t i = 0; i < 1001; i++)
{
ts_iter_go_to(&it, i);
sum += ts_iter_value(&it);
}
cmc_assert_equals(size_t, 500500, sum);
sum = 0;
for (size_t i = 1001; i > 0; i--)
{
cmc_assert(ts_iter_go_to(&it, i - 1));
sum += ts_iter_value(&it);
}
cmc_assert_equals(size_t, 500500, sum);
sum = 0;
for (size_t i = 0; i < 1001; i += 100)
{
cmc_assert(ts_iter_go_to(&it, i));
cmc_assert_equals(size_t, i, ts_iter_index(&it));
sum += ts_iter_value(&it);
}
cmc_assert_equals(size_t, 5500, sum);
ts_free(set);
});
CMC_CREATE_TEST(PFX##_iter_value(), {
struct treeset *set = ts_new(ts_fval);
cmc_assert_not_equals(ptr, NULL, set);
struct treeset_iter it = ts_iter_end(set);
cmc_assert_equals(size_t, (size_t){ 0 }, ts_iter_value(&it));
cmc_assert(ts_insert(set, 10));
it = ts_iter_start(set);
cmc_assert_equals(size_t, 10, ts_iter_value(&it));
ts_free(set);
});
CMC_CREATE_TEST(PFX##_iter_index(), {
struct treeset *set = ts_new(ts_fval);
cmc_assert_not_equals(ptr, NULL, set);
for (size_t i = 0; i <= 1000; i++)
ts_insert(set, i);
struct treeset_iter it = ts_iter_start(set);
for (size_t i = 0; i < 1001; i++)
{
cmc_assert_equals(size_t, i, ts_iter_index(&it));
ts_iter_next(&it);
}
it = ts_iter_end(set);
for (size_t i = 1001; i > 0; i--)
{
cmc_assert_equals(size_t, i - 1, ts_iter_index(&it));
ts_iter_prev(&it);
}
ts_free(set);
});
});
#ifdef CMC_TEST_MAIN
int main(void)
{
int result = CMCTreeSet() + CMCTreeSetIter();
printf(" +---------------------------------------------------------------+");
printf("\n");
printf(" | CMCTreeSet Suit : %-46s |\n", result == 0 ? "PASSED" : "FAILED");
printf(" +---------------------------------------------------------------+");
printf("\n\n\n");
return result;
}
#endif
#endif /* CMC_TESTS_UNT_TREESET_H */