diff options
Diffstat (limited to 'tests/hgstack.c')
-rw-r--r-- | tests/hgstack.c | 370 |
1 files changed, 308 insertions, 62 deletions
diff --git a/tests/hgstack.c b/tests/hgstack.c index d1d8b86..c5c3027 100644 --- a/tests/hgstack.c +++ b/tests/hgstack.c @@ -24,74 +24,320 @@ #ifdef HAVE_CONFIG_H #include "config.h" #endif - -#include <hieroglyph/hgobject.h> #include <hieroglyph/hgstack.h> +#include <hieroglyph/hgobject.h> #include <hieroglyph/vm.h> +#include "main.h" -int -main(int argc, - char **argv) -{ - hg_vm_t *vm; - hg_stack_t *stack; - hg_object_t *obj; - gint i = 1; +hg_vm_t *vm; +hg_stack_t *obj; +void +setup(void) +{ vm = hg_vm_new(); - stack = hg_stack_new(vm, 10); - hg_stack_dump(vm, stack); - obj = hg_object_integer_new(vm, i++); - hg_stack_push(stack, obj); - hg_stack_dump(vm, stack); - obj = hg_object_integer_new(vm, i++); - hg_stack_push(stack, obj); - hg_stack_dump(vm, stack); - obj = hg_object_integer_new(vm, i++); - hg_stack_push(stack, obj); - obj = hg_object_integer_new(vm, i++); - hg_stack_push(stack, obj); - obj = hg_object_integer_new(vm, i++); - hg_stack_push(stack, obj); - hg_stack_dump(vm, stack); - hg_stack_pop(stack); - hg_stack_dump(vm, stack); - obj = hg_object_integer_new(vm, i++); - hg_stack_push(stack, obj); - hg_stack_dump(vm, stack); - hg_stack_roll(stack, 3, 2); - hg_stack_dump(vm, stack); - obj = hg_object_integer_new(vm, i++); - hg_stack_push(stack, obj); - hg_stack_dump(vm, stack); - hg_stack_roll(stack, 3, -2); - hg_stack_dump(vm, stack); - hg_stack_roll(stack, 6, 2); - hg_stack_dump(vm, stack); - hg_stack_pop(stack); - hg_stack_pop(stack); - hg_stack_pop(stack); - hg_stack_pop(stack); - hg_stack_pop(stack); - hg_stack_pop(stack); - hg_stack_dump(vm, stack); - - i = 1; - do { - obj = hg_object_integer_new(vm, i++); - } while (hg_stack_push(stack, obj)); - printf("%d\n", i); - hg_stack_dump(vm, stack); - hg_stack_roll(stack, 3, 2); - hg_stack_dump(vm, stack); - hg_stack_roll(stack, 3, -2); - hg_stack_dump(vm, stack); - hg_stack_roll(stack, 10, -2); - hg_stack_dump(vm, stack); - - hg_stack_free(vm, stack); +} + +void +teardown(void) +{ hg_vm_destroy(vm); +} + +/* stack */ +TDEF (hg_stack_new) +{ + gboolean flag; + + obj = hg_stack_new(vm, 10); + + fail_unless(obj != NULL, "Failed to create a stack object"); + fail_unless(obj->stack_depth == 10, "the stack depth isn't expected depth."); + + hg_stack_free(vm, obj); + + /* disable stacktrace */ + if (hg_is_stacktrace_enabled) + flag = hg_is_stacktrace_enabled(); + hg_use_stacktrace(FALSE); + /* disable warnings */ + hg_quiet_warning_messages(TRUE); + + obj = hg_stack_new(vm, 0); + + if (hg_is_stacktrace_enabled) + hg_use_stacktrace(flag); + hg_quiet_warning_messages(FALSE); + + fail_unless(obj == NULL, "depth must be more than 0"); +} +TEND + +TDEF (hg_stack_free) +{ + /* nothing to check here particularly */ +} +TEND + +TDEF (hg_stack_push) +{ + hg_object_t *obj2; + gboolean flag, retval; + + obj = hg_stack_new(vm, 1); + + fail_unless(obj != NULL, "Failed to create a stack object"); + + obj2 = hg_object_boolean_new(vm, TRUE); + fail_unless(obj2 != NULL, "Failed to create a boolean object"); + + fail_unless(hg_stack_push(obj, obj2), "Failed to push an object to stack"); + + /* disable stacktrace */ + if (hg_is_stacktrace_enabled) + flag = hg_is_stacktrace_enabled(); + hg_use_stacktrace(FALSE); + /* disable warnings */ + hg_quiet_warning_messages(TRUE); + + retval = hg_stack_push(obj, obj2); + + if (hg_is_stacktrace_enabled) + hg_use_stacktrace(flag); + hg_quiet_warning_messages(FALSE); + + fail_unless(!retval, "Object has to be unable to be pushed."); + + hg_stack_free(vm, obj); + hg_object_free(vm, obj2); +} +TEND + +TDEF (hg_stack_pop) +{ + hg_object_t *obj2, *obj3; + gboolean flag; + + obj = hg_stack_new(vm, 10); + + fail_unless(obj != NULL, "Failed to create a stack object"); + + obj2 = hg_object_boolean_new(vm, TRUE); + fail_unless(obj2 != NULL, "Failed to create a boolean object"); + + fail_unless(hg_stack_push(obj, obj2), "Failed to push an object to stack"); + + fail_unless((obj3 = hg_stack_pop(obj)) != NULL, "Failed to pop an object from stack"); + fail_unless(obj2 == obj3, "Failed to pop an object from stack (verifying)"); + + /* disable stacktrace */ + if (hg_is_stacktrace_enabled) + flag = hg_is_stacktrace_enabled(); + hg_use_stacktrace(FALSE); + /* disable warnings */ + hg_quiet_warning_messages(TRUE); + + obj3 = hg_stack_pop(obj); + + if (hg_is_stacktrace_enabled) + hg_use_stacktrace(flag); + hg_quiet_warning_messages(FALSE); + + fail_unless(obj3 == NULL, "stack has to be empty."); + + hg_stack_free(vm, obj); + hg_object_free(vm, obj2); +} +TEND + +TDEF (hg_stack_length) +{ + hg_object_t *obj2; + + obj = hg_stack_new(vm, 10); + + fail_unless(obj != NULL, "Failed to create a stack object"); + fail_unless(hg_stack_length(obj) == 0, "stack has to be empty."); + + obj2 = hg_object_boolean_new(vm, TRUE); + fail_unless(obj2 != NULL, "Failed to create a boolean object"); + + fail_unless(hg_stack_push(obj, obj2), "Failed to push an object to stack"); + fail_unless(hg_stack_length(obj) == 1, "Failed to get current depth"); + + hg_stack_free(vm, obj); + hg_object_free(vm, obj2); +} +TEND + +TDEF (hg_stack_clear) +{ + hg_object_t *obj2; + + obj = hg_stack_new(vm, 10); + + fail_unless(obj != NULL, "Failed to create a stack object"); + + obj2 = hg_object_boolean_new(vm, TRUE); + fail_unless(obj2 != NULL, "Failed to create a boolean object"); + + fail_unless(hg_stack_push(obj, obj2), "Failed to push an object to stack"); + fail_unless(hg_stack_length(obj) == 1, "Failed to get current depth"); + + hg_stack_clear(obj); + + fail_unless(hg_stack_length(obj) == 0, "Failed to clear the stack"); + + hg_stack_free(vm, obj); + hg_object_free(vm, obj2); +} +TEND + +TDEF (hg_stack_index) +{ + hg_object_t *obj2, *obj3, *obj4; + gboolean flag; + + obj = hg_stack_new(vm, 10); + + fail_unless(obj != NULL, "Failed to create a stack object"); + + /* disable stacktrace */ + if (hg_is_stacktrace_enabled) + flag = hg_is_stacktrace_enabled(); + hg_use_stacktrace(FALSE); + /* disable warnings */ + hg_quiet_warning_messages(TRUE); + + obj2 = hg_stack_index(obj, 0); + + if (hg_is_stacktrace_enabled) + hg_use_stacktrace(flag); + hg_quiet_warning_messages(FALSE); + + fail_unless(obj2 == NULL, "index has to be less than the amount of the objects in the stack."); + + obj2 = hg_object_boolean_new(vm, TRUE); + fail_unless(obj2 != NULL, "Failed to create a boolean object"); + + hg_stack_push(obj, obj2); + obj3 = hg_stack_index(obj, 0); + fail_unless(obj2 == obj3, "gotten object isn't an expected object"); + + obj3 = hg_object_integer_new(vm, 10); + fail_unless(obj3 != NULL, "Failed to create an integer object"); + + hg_stack_push(obj, obj3); + obj4 = hg_stack_index(obj, 0); + fail_unless(obj3 == obj4, "gotten object isn't an expected object (integer)"); + obj4 = hg_stack_index(obj, 1); + fail_unless(obj4 == obj2, "gotten object isn't an expected object (boolean)"); + + hg_stack_free(vm, obj); + hg_object_free(vm, obj2); + hg_object_free(vm, obj3); +} +TEND + +TDEF (hg_stack_roll) +{ + hg_object_t *obj2, *obj3, *obj4, *obj5; + gboolean flag, retval; + + obj = hg_stack_new(vm, 1); + fail_unless(obj != NULL, "Failed to create a stack object"); + + /* disable stacktrace */ + if (hg_is_stacktrace_enabled) + flag = hg_is_stacktrace_enabled(); + hg_use_stacktrace(FALSE); + /* disable warnings */ + hg_quiet_warning_messages(TRUE); + + retval = hg_stack_roll(obj, 2, 1); + + if (hg_is_stacktrace_enabled) + hg_use_stacktrace(flag); + hg_quiet_warning_messages(FALSE); + + fail_unless(!retval, "block has to be less than the stack size"); + + hg_stack_free(vm, obj); + + obj = hg_stack_new(vm, 10); + fail_unless(obj != NULL, "Failed to create a stack object"); + + obj2 = hg_object_boolean_new(vm, TRUE); + obj3 = hg_object_integer_new(vm, 1); + obj4 = hg_object_mark_new(vm); + obj5 = hg_object_boolean_new(vm, FALSE); + fail_unless(obj2 != NULL, "Failed to create a boolean object"); + fail_unless(obj3 != NULL, "Failed to create an integer object"); + fail_unless(obj4 != NULL, "Failed to create a mark object"); + fail_unless(obj5 != NULL, "Failed to create a boolean object"); + + hg_stack_push(obj, obj2); + hg_stack_push(obj, obj3); + fail_unless(hg_stack_roll(obj, 0, 1), "Failed to roll the objects"); + fail_unless(hg_stack_index(obj, 0) == obj3, "Failed to verify after rolling (integer) n_blocks == 0"); + fail_unless(hg_stack_index(obj, 1) == obj2, "Failed to verify after rolling (boolean) n_blocks == 0"); + + fail_unless(hg_stack_roll(obj, 2, 0), "Failed to roll the objects"); + fail_unless(hg_stack_index(obj, 0) == obj3, "Failed to verify after rolling (integer) n_times == 0"); + fail_unless(hg_stack_index(obj, 1) == obj2, "Failed to verify after rolling (boolean) n_times == 0"); + + hg_stack_push(obj, obj4); + fail_unless(hg_stack_roll(obj, 3, 2), "Failed to roll the objects"); + fail_unless(hg_stack_index(obj, 0) == obj2, "Failed to verify after rolling (boolean)"); + fail_unless(hg_stack_index(obj, 1) == obj4, "Failed to verify after rolling (mark)"); + fail_unless(hg_stack_index(obj, 2) == obj3, "Failed to verify after rolling (integer)"); + + hg_stack_push(obj, obj5); + fail_unless(hg_stack_roll(obj, 3, -2), "Failed to roll the objects"); + fail_unless(hg_stack_index(obj, 0) == obj2, "Failed to verify after rolling (boolean)"); + fail_unless(hg_stack_index(obj, 1) == obj4, "Failed to verify after rolling (mark)"); + fail_unless(hg_stack_index(obj, 2) == obj5, "Failed to verify after rolling (boolean)"); + fail_unless(hg_stack_index(obj, 3) == obj3, "Failed to verify after rolling (integer)"); + + fail_unless(hg_stack_roll(obj, 4, 3), "Failed to roll the objects"); + fail_unless(hg_stack_index(obj, 0) == obj3, "Failed to verify after rolling (integer)"); + fail_unless(hg_stack_index(obj, 1) == obj2, "Failed to verify after rolling (boolean)"); + fail_unless(hg_stack_index(obj, 2) == obj4, "Failed to verify after rolling (mark)"); + fail_unless(hg_stack_index(obj, 3) == obj5, "Failed to verify after rolling (boolean)"); + + hg_stack_free(vm, obj); + hg_object_free(vm, obj2); + hg_object_free(vm, obj3); + hg_object_free(vm, obj4); +} +TEND + +TDEF (hg_stack_dump) +{ + g_print("FIXME: %s\n", __FUNCTION__); +} +TEND + +/************************************************************/ +Suite * +hieroglyph_suite(void) +{ + Suite *s = suite_create("hg_stack_t"); + TCase *tc = tcase_create("Generic Functionalities"); + + tcase_add_checked_fixture(tc, setup, teardown); + T (hg_stack_new); + T (hg_stack_free); + T (hg_stack_push); + T (hg_stack_pop); + T (hg_stack_clear); + T (hg_stack_length); + T (hg_stack_index); + T (hg_stack_roll); + T (hg_stack_dump); + + suite_add_tcase(s, tc); - return 0; + return s; } |