char *test_fxb_array_pop() { spec_describe("Push until expansion required"); FxB_Array *array = FxB_Array_create(32); fxb_array_push(array, "1"); fxb_array_push(array, "2"); fxb_array_push(array, "3"); char *value = fxb_array_pop(array); assert_strings_equal(value, "3", "last value"); assert_ints_equal(fxb_array_length(array), 2, "length"); value = fxb_array_pop(array); assert_strings_equal(value, "2", "middle value"); assert_ints_equal(fxb_array_length(array), 1, "length"); value = fxb_array_pop(array); assert_strings_equal(value, "1", "first value"); assert_ints_equal(fxb_array_length(array), 0, "length"); fxb_array_free(array); return NULL; }
char *test_create_array() { spec_describe("Create"); FxB_Array *array = FxB_Array_create(10); assert_ints_equal(fxb_array_length(array), 0, "length"); assert_ints_equal(fxb_array_capacity(array), 10, "capacity"); fxb_array_free(array); return NULL; }
char *test_create_hash() { spec_describe("Create"); HashMap *hash_map = HashMap_create(100); assert_ints_equal(hash_map_capacity(hash_map), 100, "capacity"); assert_ints_equal(hash_map_length(hash_map), 0, "length"); assert_ints_equal(array_capacity(hash_map_values(hash_map)), 100, "values capacity"); assert_ints_equal(array_length(hash_map_values(hash_map)), 0, "values length"); hash_map_free(hash_map); return NULL; }
char *test_fxb_array_set_at_index_bug() { spec_describe("set at index when capactiy starts at 4"); FxB_Array *array = FxB_Array_create(4); fxb_array_set(array, 1, "expressions"); assert_ints_equal(fxb_array_length(array), 2, "length after setting index at 2"); fxb_array_set(array, 0, "arguments"); assert_ints_equal(fxb_array_length(array), 2, "length after setting index at 0"); fxb_array_free(array); return NULL; }
char *test_implicit_method_call_with_parens() { spec_describe("implicit method: print(1)"); FxP_ParserContext *context = parse_string("print(1)\n"); setup_json(); element = json_object_get( json_object_get( json_object_get( json_object_get( json_object_get(expression, "method_call"), "message"), "lookup"), "bit"), "STRING"); assert_strings_equal(json_string_value(element), "print", "message correct"); element = json_object_get( json_object_get( json_object_get( json_array_get( json_object_get( json_object_get(expression, "method_call"), "arguments"), 0), "literal"), "bit"), "INTEGER"); assert_ints_equal(json_integer_value(element), 1, "arguments correct"); cleanup(); return NULL; }
char *test_fxb_array_map() { spec_setup("Map"); FxB_Array *array = FxB_Array_create(2); fxb_array_set(array, 0, "1"); fxb_array_set(array, 1, "two"); FxB_Array *counts = fxb_array_map(array, __count_string); assert_ints_equal(fxb_array_length(array), 2, "length"); assert_ints_equal(*((int *)fxb_array_get(array, 0)), 1, "value at 0"); assert_ints_equal(*((int *)fxb_array_get(array, 1)), 3, "value at 0"); fxb_array_free(array); fxb_array_free(counts); return NULL; }
char *test_operator_method_call() { spec_describe("opreator expression: 1 + 1"); FxP_ParserContext *context = parse_string("1 + 1\n"); setup_json(); element = json_object_get( json_object_get( json_object_get( json_object_get( json_object_get(expression, "method_call"), "receiver"), "literal"), "bit"), "INTEGER"); assert_ints_equal(json_integer_value(element), 1, "receiver correct"); element = json_object_get( json_object_get( json_object_get( json_object_get( json_object_get(expression, "method_call"), "message"), "lookup"), "bit"), "STRING"); assert_strings_equal(json_string_value(element), "+", "message correct"); element = json_object_get( json_object_get( json_object_get( json_array_get( json_object_get( json_object_get(expression, "method_call"), "arguments"), 0), "literal"), "bit"), "INTEGER"); assert_ints_equal(json_integer_value(element), 1, "arguments correct"); cleanup(); return NULL; }
char *test_fxb_array_set_at_index() { spec_describe("set at index, set at index above capacity"); FxB_Array *array = FxB_Array_create(32); fxb_array_set(array, 1, "Gerbil"); assert_ints_equal(fxb_array_length(array), 2, "length after setting index 1"); assert_strings_equal((char *)(fxb_array_get(array, 1)), "Gerbil", "value at index 1"); fxb_array_set(array, 32, "Another Gerbil"); assert_ints_equal(fxb_array_capacity(array), 128, "capacity after setting above current capacity"); assert_ints_equal(fxb_array_length(array), 33, "length"); assert_strings_equal((char *)(fxb_array_get(array, 32)), "Another Gerbil", "value"); fxb_array_free(array); return NULL; }
char *test_fxb_array_push_multiple_times() { spec_describe("Push many times"); FxB_Array *array = FxB_Array_create(32); fxb_array_push(array, "Gerbil"); fxb_array_push(array, "Fish"); fxb_array_push(array, "Human"); assert_ints_equal(fxb_array_length(array), 3, "length"); assert_ints_equal(fxb_array_capacity(array), 32, "capacity"); assert_strings_equal((char *)(fxb_array_at_index(array, 0)), "Gerbil", "value at index 0"); assert_strings_equal((char *)(fxb_array_at_index(array, 1)), "Fish", "value at index 1"); assert_strings_equal((char *)(fxb_array_at_index(array, 2)), "Human", "value at index 2"); fxb_array_free(array); return NULL; }
char *test_fxb_array_push() { spec_describe("Push"); FxB_Array *array = FxB_Array_create(32); fxb_array_push(array, "Gerbil"); assert_ints_equal(fxb_array_length(array), 1, "length"); assert_strings_equal((char *)(fxb_array_at_index(array, 0)), "Gerbil", "value"); fxb_array_free(array); return NULL; }
int main() { init(); begin_test_suite(); mpz_t t1, t2, t3, t4, t5; mpz_init(t1); mpz_init(t2); mpz_init(t3); mpz_init(t4); mpz_init(t5); begin_context("calc_2rest"); begin_test("9"); mpz_set_ui(t1, 9); calc_2rest(t1, t2); assert_ints_equal(mpz_get_ui(t2), 9); begin_test("8"); mpz_set_ui(t1, 8); calc_2rest(t1, t2); assert_ints_equal(mpz_get_ui(t2), 1); begin_test("23492462"); mpz_set_ui(t1, 23492462); calc_2rest(t1, t2); assert_ints_equal(mpz_get_ui(t2), 11746231); end_context(); begin_context("RSA factoring"); begin_test("299 5 53: p"); mpz_set_ui(t1, 299); mpz_set_ui(t2, 5); mpz_set_ui(t3, 53); rsafact(t1, t2, t3, t4, t5); assert_ints_equal(mpz_get_ui(t4), 13); begin_test("299 5 53: q"); assert_ints_equal(mpz_get_ui(t5), 23); begin_test("22 3 7: p"); mpz_set_ui(t1, 22); mpz_set_ui(t2, 3); mpz_set_ui(t3, 7); rsafact(t1, t2, t3, t4, t5); assert_ints_equal(mpz_get_ui(t4), 2); begin_test("22 3 7: q"); assert_ints_equal(mpz_get_ui(t5), 11); end_test_suite(); }
char *test_fxb_array_push_until_expansion() { spec_describe("Push until expansion required"); FxB_Array *array = FxB_Array_create(32); int i; char *num; for (i = 0; i < 33; i++) { num = calloc(4, sizeof(char)); sprintf(num, "%d", i); fxb_array_push(array, num); } assert_ints_equal(fxb_array_length(array), 33, "length"); assert_ints_equal(fxb_array_capacity(array), 128, "capacity"); assert_strings_equal((char *)(fxb_array_at_index(array, 1)), "1", "value at index 1"); assert_strings_equal((char *)(fxb_array_at_index(array, 30)), "30", "value at index 30"); assert_strings_equal((char *)(fxb_array_at_index(array, 32)), "32", "value at index 32"); fxb_array_r_free(array); return NULL; }
char *test_reset_value() { spec_describe("Setting and getting value"); HashMap *hash_map = HashMap_create(10); String *key = String_create("key"); String *value_1 = String_create("value"); String *value_2 = String_create("another value"); hash_map_set(hash_map, key, value_1); hash_map_set(hash_map, key, value_2); assert_equal(hash_map_get(hash_map, key), value_2, "value same"); int index = hash_map_index_for_key(hash_map, key); assert_ints_equal(list_length((List *)hash_map_list_at_index(hash_map, index)), 1, "no duplicates for key in list"); string_free(key); string_free(value_1); string_free(value_2); hash_map_free(hash_map); return NULL; }
char *test_function_with_two_expressions() { // TODO: parser can't handle no terminating \n at end of expressions set /*spec_describe("function two expressions: -> {\n 1 + 1\n print 'word'}");*/ spec_describe("function two expressions: -> {\n 1 + 1\n print 'word'\n}\n"); FxP_ParserContext *context = parse_string("-> {\n 1 + 1\n print 'word'\n}\n"); setup_json(); element = json_object_get( json_object_get(expression, "function_definition"), "expressions"); assert_ints_equal(json_array_size(element), 2, "expressions size correct"); expression = json_object_get( json_object_get(expression, "function_definition"), "expressions"); element = json_object_get( json_object_get( json_object_get( json_object_get( json_object_get( json_array_get( expression, 0), "method_call"), "receiver"), "literal"), "bit"), "INTEGER"); assert_ints_equal(json_integer_value(element), 1, "first expression receiver correct"); element = json_object_get( json_object_get( json_object_get( json_object_get( json_object_get( json_array_get( expression, 0), "method_call"), "message"), "lookup"), "bit"), "STRING"); assert_strings_equal(json_string_value(element), "+", "first expression message correct"); element = json_object_get( json_object_get( json_object_get( json_array_get( json_object_get( json_object_get( json_array_get( expression, 0), "method_call"), "arguments"), 0), "literal"), "bit"), "INTEGER"); assert_ints_equal(json_integer_value(element), 1, "first expression arguments correct"); cleanup(); return NULL; }
char *test_function_with_expression() { spec_describe("function one expression: -> {\n1 + 1\n}"); FxP_ParserContext *context = parse_string("-> {\n1 + 1\n}\n"); setup_json(); element = json_object_get( json_object_get(expression, "function_definition"), "expressions"); assert_ints_equal(json_array_size(element), 1, "expressions size correct"); element = json_object_get( json_object_get( json_object_get( json_object_get( json_object_get( json_array_get( json_object_get( json_object_get(expression, "function_definition"), "expressions"), 0), "method_call"), "receiver"), "literal"), "bit"), "INTEGER"); assert_ints_equal(json_integer_value(element), 1, "first expression receiver correct"); element = json_object_get( json_object_get( json_object_get( json_object_get( json_object_get( json_array_get( json_object_get( json_object_get(expression, "function_definition"), "expressions"), 0), "method_call"), "message"), "lookup"), "bit"), "STRING"); assert_strings_equal(json_string_value(element), "+", "first expression message correct"); element = json_object_get( json_object_get( json_object_get( json_array_get( json_object_get( json_object_get( json_array_get( json_object_get( json_object_get(expression, "function_definition"), "expressions"), 0), "method_call"), "arguments"), 0), "literal"), "bit"), "INTEGER"); assert_ints_equal(json_integer_value(element), 1, "first expression arguments correct"); cleanup(); return NULL; }
char *test_two_expressions() { spec_describe("test order of two expressions: 1 + 1\nprint 'word'"); FxP_ParserContext *context = parse_string("1 + 1\nprint 'word'"); setup_json(); element = json_object_get( json_object_get( json_object_get( json_object_get( json_object_get(expression, "method_call"), "receiver"), "literal"), "bit"), "INTEGER"); assert_ints_equal(json_integer_value(element), 1, "first expression receiver correct"); element = json_object_get( json_object_get( json_object_get( json_object_get( json_object_get(expression, "method_call"), "message"), "lookup"), "bit"), "STRING"); assert_strings_equal(json_string_value(element), "+", "second expression message correct"); element = json_object_get( json_object_get( json_object_get( json_array_get( json_object_get( json_object_get(expression, "method_call"), "arguments"), 0), "literal"), "bit"), "INTEGER"); assert_ints_equal(json_integer_value(element), 1, "second expression arguments correct"); expression = json_array_get(expressions, 1); \ element = json_object_get( json_object_get( json_object_get( json_object_get( json_object_get(expression, "method_call"), "message"), "lookup"), "bit"), "STRING"); assert_strings_equal(json_string_value(element), "print", "first expression message correct"); element = json_object_get( json_object_get( json_object_get( json_array_get( json_object_get( json_object_get(expression, "method_call"), "arguments"), 0), "literal"), "bit"), "STRING"); assert_strings_equal(json_string_value(element), "word", "first expression arguments correct"); cleanup(); return NULL; }