diff --git a/tests/symbols.c b/tests/symbols.c index ae1d9b5..7392b12 100644 --- a/tests/symbols.c +++ b/tests/symbols.c @@ -58,16 +58,107 @@ MunitResult test_symbol_add_reference(const MunitParameter params[], void *data) symbol_table_alloc(&table); ast_node_t *reference = root->children[3]->children[1]->children[0]->children[0]; + munit_assert_int(reference->id, ==, NODE_LABEL_REFERENCE); munit_assert_size(table->len, ==, 0); + error_t *err = symbol_table_update(table, reference); munit_assert_null(err); - symbol_t *symbol = symbol_table_lookup(table, "test"); munit_assert_size(table->len, ==, 1); + + symbol_t *symbol = symbol_table_lookup(table, "test"); munit_assert_not_null(symbol); munit_assert_int(SYMBOL_REFERENCE, ==, symbol->kind); munit_assert_ptr_equal(reference, symbol->node); munit_assert_string_equal(symbol->name, "test"); + symbol_table_free(table); + ast_node_free(root); + tokenlist_free(list); + return MUNIT_OK; +} + +MunitResult test_symbol_add_label(const MunitParameter params[], void *data) { + (void)params; + (void)data; + ast_node_t *root; + tokenlist_t *list; + symbol_table_t *table = nullptr; + symbols_setup_test(&root, &list, "tests/input/symbols.asm"); + symbol_table_alloc(&table); + + ast_node_t *label = root->children[2]; + munit_assert_int(label->id, ==, NODE_LABEL); + munit_assert_size(table->len, ==, 0); + + error_t *err = symbol_table_update(table, label); + munit_assert_null(err); + munit_assert_size(table->len, ==, 1); + + symbol_t *symbol = symbol_table_lookup(table, "test"); + munit_assert_not_null(symbol); + munit_assert_int(SYMBOL_LOCAL, ==, symbol->kind); + munit_assert_ptr_equal(label, symbol->node); + munit_assert_string_equal(symbol->name, "test"); + + symbol_table_free(table); + ast_node_free(root); + tokenlist_free(list); + return MUNIT_OK; +} + +MunitResult test_symbol_add_import(const MunitParameter params[], void *data) { + (void)params; + (void)data; + ast_node_t *root; + tokenlist_t *list; + symbol_table_t *table = nullptr; + symbols_setup_test(&root, &list, "tests/input/symbols.asm"); + symbol_table_alloc(&table); + + ast_node_t *import_directive = root->children[0]->children[1]; + munit_assert_int(import_directive->id, ==, NODE_IMPORT_DIRECTIVE); + munit_assert_size(table->len, ==, 0); + + error_t *err = symbol_table_update(table, import_directive); + munit_assert_null(err); + munit_assert_size(table->len, ==, 1); + + symbol_t *symbol = symbol_table_lookup(table, "test"); + munit_assert_not_null(symbol); + munit_assert_int(SYMBOL_IMPORT, ==, symbol->kind); + munit_assert_ptr_equal(import_directive, symbol->node); + munit_assert_string_equal(symbol->name, "test"); + + symbol_table_free(table); + ast_node_free(root); + tokenlist_free(list); + return MUNIT_OK; +} + +MunitResult test_symbol_add_export(const MunitParameter params[], void *data) { + (void)params; + (void)data; + ast_node_t *root; + tokenlist_t *list; + symbol_table_t *table = nullptr; + symbols_setup_test(&root, &list, "tests/input/symbols.asm"); + symbol_table_alloc(&table); + + ast_node_t *export_directive = root->children[1]->children[1]; + munit_assert_int(export_directive->id, ==, NODE_EXPORT_DIRECTIVE); + munit_assert_size(table->len, ==, 0); + + error_t *err = symbol_table_update(table, export_directive); + munit_assert_null(err); + munit_assert_size(table->len, ==, 1); + + symbol_t *symbol = symbol_table_lookup(table, "test"); + munit_assert_not_null(symbol); + munit_assert_int(SYMBOL_EXPORT, ==, symbol->kind); + munit_assert_ptr_equal(export_directive, symbol->node); + munit_assert_string_equal(symbol->name, "test"); + + symbol_table_free(table); ast_node_free(root); tokenlist_free(list); return MUNIT_OK; @@ -77,5 +168,8 @@ MunitTest symbols_tests[] = { {"/table_alloc", test_symbol_table_alloc, nullptr, nullptr, MUNIT_TEST_OPTION_NONE, nullptr}, {"/table_lookup_empty", test_symbol_table_lookup_empty, nullptr, nullptr, MUNIT_TEST_OPTION_NONE, nullptr}, {"/add_reference", test_symbol_add_reference, nullptr, nullptr, MUNIT_TEST_OPTION_NONE, nullptr}, + {"/add_label", test_symbol_add_label, nullptr, nullptr, MUNIT_TEST_OPTION_NONE, nullptr}, + {"/add_import", test_symbol_add_import, nullptr, nullptr, MUNIT_TEST_OPTION_NONE, nullptr}, + {"/add_export", test_symbol_add_export, nullptr, nullptr, MUNIT_TEST_OPTION_NONE, nullptr}, {nullptr, nullptr, nullptr, nullptr, MUNIT_TEST_OPTION_NONE, nullptr} };