#include #include #include #include #include <9p.h> #include "common.h" #include "collection.h" #include "function.h" #include "array.h" #include "unittest.h" typedef struct Range { int min; int max; int current; } Range; typedef struct TestArray { Range range; Array *array; Array *stack; } TestArray; static void *testarray_setup(void) { int i; TestArray *data = (TestArray *)emalloc_fs(sizeof(*data)); data->range.min = 0; data->range.max = 20; data->range.current = 0; data->array = array_new(); for(i = data->range.min; i <= data->range.max; ++i) { array_add(data->array, (void *)i); } data->stack = array_new(); for(i = data->range.min; i <= data->range.max; ++i) { array_push(data->stack, (void *)i); } return data; } static void testarray_teardown(void *data) { TestArray *testarray = (TestArray *)data; assert_valid(testarray); array_free(testarray->array); array_free(testarray->stack); free(data); } static collection_do_ret testarray_add_each(void *p, void *arg) { int i = (int)p; Range *range = (Range *)arg; if(i != range->current || i < range->min || i > range->max) { range->current = -1; return COLLECTION_DO_STOP; } ++(range->current); return COLLECTION_DO_CONTINUE; } static bool testarray_add(void *data) { int i; TestArray *testarray = (TestArray *)data; Array *array = testarray->array; Range *range = &(testarray->range); assert_valid(array); assert_valid(range); test_assert(array_size(array) == (range->max - range->min + 1)); array_do(array, testarray_add_each, range); test_assert_false(range->current == -1); for(i = 0; i <= (range->max - range->min); ++i) { test_assert(((int)array_at(array, i)) == (i + range->min)); } return true; } static bool integer_identity(void *p, void *arg) { return ((int)p) == ((int)arg); } static bool testarray_find(void *data) { int i; int result; TestArray *testarray = (TestArray *)data; Array *array = testarray->array; Range *range = &(testarray->range); assert_valid(array); assert_valid(range); for(i = range->max; i >= range->min; --i) { test_assert(array_detect(array, integer_identity, (void **)&result, (void *)i)); test_assert(array_detect(array, integer_identity, nil, (void *)i)); test_assert(result == i); } for(i = range->max + 1; i < range->max + 20; ++i) { test_assert_false(array_detect(array, integer_identity, (void **)&result, (void *)i)); test_assert_false(array_detect(array, integer_identity, nil, (void *)i)); test_assert(((void *)result) == nil); } return true; } static bool testarray_clear(void *data) { TestArray *testarray = (TestArray *)data; Array *array = testarray->array; assert_valid(array); array_clear(array); test_assert(array_size(array) == 0); return true; } static bool testarray_stack(void *data) { int current; Array *stack; TestArray *testarray = (TestArray *)data; assert_valid(testarray); stack = testarray->stack; assert_valid(stack); for(current = testarray->range.max; array_notempty(stack); --current) { test_assert((int)array_pop(testarray->stack) == current); } return true; } bool testarray_resize(void *data) { int i; TestArray *testarray = (TestArray *)data; Array *array = testarray->array; Range *range = &(testarray->range); array_resize(array, 5); test_assert(array_size(array) == 5); for(i = 0; i < 5; ++i) { test_assert((int)array_at(array, i) == (i + range->min)); } return true; } bool testarray_put(void *data) { TestArray *testarray = (TestArray *)data; Array *array = testarray->array; array_put(array, 0, (void *)3); test_assert((int)array_at(array, 0) == 3); return true; } static TestFixure testarray_fixure = { .setup = testarray_setup, .teardown = testarray_teardown }; static TestCaseNamePair testarray_testcases[] = { testcasenamepair_make(testarray_add), testcasenamepair_make(testarray_find), testcasenamepair_make(testarray_clear), testcasenamepair_make(testarray_resize), testcasenamepair_make(testarray_put), testcasenamepair_make(testarray_stack) }; AbstractTest *testarray_testsuite(void) { return (AbstractTest *) testsuite_make("testarray", testarray_testcases, static_array_length(testarray_testcases), &testarray_fixure); }