/** * Copyright (c) 2026 Dominic Masters * * This software is released under the MIT License. * https://opensource.org/licenses/MIT */ #include "dusktest.h" #include "console/console.h" #include "script/scriptmanager.h" #include "script/module/modulebase.h" #include "util/memory.h" static int console_setup(void **state) { consoleInit(); errorret_t ret = scriptManagerInit(); if(errorIsNotOk(ret)) { errorCatch(ret); return -1; } return 0; } static int console_teardown(void **state) { errorret_t ret = scriptManagerDispose(); if(errorIsNotOk(ret)) errorCatch(ret); consoleDispose(); return 0; } static void test_console_print_joins_stringified_args(void **state) { jerry_value_t result; errorret_t ret = scriptManagerExec( "Console.print('hello', 42, true);", &result ); assert_true(errorIsOk(ret)); jerry_value_free(result); assert_string_equal( CONSOLE.line[CONSOLE_HISTORY_MAX - 1], "hello 42 true" ); assert_int_equal(memoryGetAllocatedCount(), 0); } static void test_console_print_no_args_prints_empty_line(void **state) { jerry_value_t result; errorret_t ret = scriptManagerExec("Console.print();", &result); assert_true(errorIsOk(ret)); jerry_value_free(result); assert_string_equal(CONSOLE.line[CONSOLE_HISTORY_MAX - 1], ""); assert_int_equal(memoryGetAllocatedCount(), 0); } static void test_console_line_count_is_history_max(void **state) { jerry_value_t result; errorret_t ret = scriptManagerExec("Console.lineCount;", &result); assert_true(errorIsOk(ret)); assert_int_equal((int32_t)jerry_value_as_number(result), CONSOLE_HISTORY_MAX); jerry_value_free(result); } static void test_console_get_line_reads_history(void **state) { jerry_value_t result; errorret_t ret = scriptManagerExec( "Console.print('a line'); Console.getLine(Console.lineCount - 1);", &result ); assert_true(errorIsOk(ret)); char_t buf[32]; moduleBaseToString(result, buf, sizeof(buf)); assert_string_equal(buf, "a line"); jerry_value_free(result); } static void test_console_get_line_out_of_range_throws(void **state) { errorret_t ret = scriptManagerExec("Console.getLine(999);", NULL); assert_true(errorIsNotOk(ret)); errorCatch(ret); } static void test_console_visible_defaults_false(void **state) { jerry_value_t result; errorret_t ret = scriptManagerExec("Console.visible;", &result); assert_true(errorIsOk(ret)); assert_false(jerry_value_is_true(result)); jerry_value_free(result); } static void test_console_consume_dirty_clears_flag(void **state) { CONSOLE.dirty = true; jerry_value_t result; errorret_t ret = scriptManagerExec("Console.consumeDirty();", &result); assert_true(errorIsOk(ret)); assert_true(jerry_value_is_true(result)); jerry_value_free(result); assert_false(CONSOLE.dirty); ret = scriptManagerExec("Console.consumeDirty();", &result); assert_true(errorIsOk(ret)); assert_false(jerry_value_is_true(result)); jerry_value_free(result); } int main(void) { assertInit(); const struct CMUnitTest tests[] = { cmocka_unit_test_setup_teardown( test_console_print_joins_stringified_args, console_setup, console_teardown ), cmocka_unit_test_setup_teardown( test_console_print_no_args_prints_empty_line, console_setup, console_teardown ), cmocka_unit_test_setup_teardown( test_console_line_count_is_history_max, console_setup, console_teardown ), cmocka_unit_test_setup_teardown( test_console_get_line_reads_history, console_setup, console_teardown ), cmocka_unit_test_setup_teardown( test_console_get_line_out_of_range_throws, console_setup, console_teardown ), cmocka_unit_test_setup_teardown( test_console_visible_defaults_false, console_setup, console_teardown ), cmocka_unit_test_setup_teardown( test_console_consume_dirty_clears_flag, console_setup, console_teardown ), }; return cmocka_run_group_tests(tests, NULL, NULL); }