vtgl

terminal emulator implemented in OpenGL
git clone anongit@rnpnr.xyz:vtgl.git
Log | Files | Refs | Feed | LICENSE

Commit: e357a4d259c41869292a4255dc5ec302d00d614d
Parent: 06e5d79dbf035b94e982cfdf77c0d51a1335a5a3
Author: Randy Palamar
Date:   Fri,  7 Mar 2025 15:41:21 -0700

tests: simplify return values

We don't need to use __FUNCTION__ to get the name, we can just
generate it with the X-macro which is used to fill in the array of
tests.

Diffstat:
Mtests/test.c | 500+++++++++++++++++++++++++++++++++++++------------------------------------------
1 file changed, 232 insertions(+), 268 deletions(-)

diff --git a/tests/test.c b/tests/test.c @@ -1,10 +1,20 @@ /* See LICENSE for copyright details */ #include "test-common.c" -struct test_result { b32 status; const char *info; }; -#define TEST_FN(name) struct test_result name(Term *term, Arena arena) +typedef enum { + FAILURE = 0, + SUCCESS = 1, + UNSUPPORTED = 2, +} TestResult; + +#define TEST_FN(name) TestResult name(Term *term, Arena arena) typedef TEST_FN(Test_Fn); +typedef struct { + Test_Fn *implementation; + s8 name; +} Test; + #define TESTS \ X(csi_embedded_control) \ X(colour_setting) \ @@ -63,8 +73,8 @@ TESTS GHOSTTY_TESTS #undef X -#define X(fn) fn, -static Test_Fn *tests[] = { +#define X(f) {.implementation = f, .name = s8(#f)}, +static Test tests[] = { TESTS GHOSTTY_TESTS }; @@ -73,12 +83,6 @@ static Test_Fn *tests[] = { #define ESC(a) s8("\x1B"#a) #define CSI(a) ESC([a) -enum { - FAILURE = 0, - SUCCESS = 1, - UNSUPPORTED = 2, -}; - static s8 failure_string = s8("\x1B[31mFAILURE\x1B[0m\n"); static s8 success_string = s8("\x1B[32mSUCCESS\x1B[0m\n"); static s8 unsupported_string = s8("\x1B[33mUNSUPPORTED\x1B[0m\n"); @@ -94,8 +98,6 @@ check_cells_equal(Cell *a, Cell *b) static TEST_FN(csi_embedded_control) { - struct test_result result = {.info = __FUNCTION__}; - /* NOTE: print a '1' with default style then start changing the colour, * but backspace within the escape sequence so the cursor is now over the * '1', but then put a newline inside the sequence so that cursor is on @@ -124,20 +126,19 @@ static TEST_FN(csi_embedded_control) .fg = SHADER_PACK_FG(final_style.fg.rgba, final_style.attr), }; - result.status = term->cursor.pos.y == 1 && term->cursor.pos.x == 2; - result.status &= check_cells_equal(&c1, &term->views[term->view_idx].fb.rows[0][0]); - result.status &= check_cells_equal(&c2, &term->views[term->view_idx].fb.rows[1][1]); + TestResult result; + result = term->cursor.pos.y == 1 && term->cursor.pos.x == 2; + result &= check_cells_equal(&c1, &term->views[term->view_idx].fb.rows[0][0]); + result &= check_cells_equal(&c2, &term->views[term->view_idx].fb.rows[1][1]); /* NOTE: we also want to ensure that we cannot split a line in the middle of a CSI */ - LineBuf *lb = &term->views[0].lines; - result.status &= lb->filled == 0 && *lb->buf[lb->widx].start != '2'; + LineBuf *lb = &term->views[0].lines; + result &= lb->filled == 0 && *lb->buf[lb->widx].start != '2'; return result; } static TEST_FN(colour_setting) { - struct test_result result = {.info = __FUNCTION__}; - launder_static_string(term, CSI(8m)); launder_static_string(term, CSI(4m)); launder_static_string(term, CSI(9m)); @@ -153,7 +154,7 @@ static TEST_FN(colour_setting) .bg = SHADER_PACK_BG(((Colour){.r = 75, .g = 63, .b = 42, .a = 0xFF}.rgba), attr), .fg = SHADER_PACK_FG(g_colours.data[3].rgba, attr), }; - result.status = check_cells_equal(&c, term->views[term->view_idx].fb.rows[0]); + TestResult result = check_cells_equal(&c, term->views[term->view_idx].fb.rows[0]); return result; } @@ -161,8 +162,6 @@ static TEST_FN(colour_setting) static TEST_FN(cursor_at_line_boundary) { /* NOTE: Test that lines are not split in the middle of utf-8 characters */ - struct test_result result = {.info = __FUNCTION__}; - s8 long_line = s8alloc(&arena, 8192); mem_clear(long_line.data, ' ', long_line.len); @@ -185,7 +184,7 @@ static TEST_FN(cursor_at_line_boundary) handle_input(term, arena, raw); /* NOTE: ensure line didn't split on red dragon */ - result.status = term->unprocessed_bytes != 0; + TestResult result = term->unprocessed_bytes != 0; long_line.data[0] = red_dragon.data[2]; long_line.data[1] = red_dragon.data[3]; @@ -202,20 +201,18 @@ static TEST_FN(cursor_at_line_boundary) raw = launder_static_string(term, long_line); handle_input(term, arena, raw); - result.status &= line_length(lb->buf) > SPLIT_LONG; + result &= line_length(lb->buf) > SPLIT_LONG; return result; } static TEST_FN(cursor_tabs) { - struct test_result result = {.info = __FUNCTION__}; - /* NOTE: first test advancing to a tabstop */ s8 raw = launder_static_string(term, s8("123\t")); handle_input(term, arena, raw); - result.status = term->cursor.pos.x == (g_tabstop); + TestResult result = term->cursor.pos.x == (g_tabstop); /* NOTE: now test negative tabstop movement and tabstop setting */ launder_static_string(term, s8("12")); @@ -224,15 +221,13 @@ static TEST_FN(cursor_tabs) raw = launder_static_string(term, CSI(2Z)); handle_input(term, arena, raw); - result.status &= term->cursor.pos.x == (g_tabstop); + result &= term->cursor.pos.x == (g_tabstop); return result; } static TEST_FN(cursor_tabs_across_boundary) { - struct test_result result = {.info = __FUNCTION__}; - /* NOTE: clear tabstops then set one beyond multiple boundaries */ launder_static_string(term, CSI(3g)); launder_static_string(term, CSI(1;67H)); @@ -241,7 +236,7 @@ static TEST_FN(cursor_tabs_across_boundary) s8 raw = launder_static_string(term, s8("\t")); handle_input(term, arena, raw); - result.status = term->cursor.pos.x == 66; + TestResult result = term->cursor.pos.x == 66; /* NOTE: now set one exactly on a boundary */ launder_static_string(term, CSI(1;34H)); @@ -250,7 +245,7 @@ static TEST_FN(cursor_tabs_across_boundary) raw = launder_static_string(term, s8("\t")); handle_input(term, arena, raw); - result.status &= term->cursor.pos.x == 33; + result &= term->cursor.pos.x == 33; /* NOTE: now set one right before the previous */ launder_static_string(term, CSI(1;33H)); @@ -259,11 +254,11 @@ static TEST_FN(cursor_tabs_across_boundary) raw = launder_static_string(term, s8("\t")); handle_input(term, arena, raw); - result.status &= term->cursor.pos.x == 32; + result &= term->cursor.pos.x == 32; raw = launder_static_string(term, s8("\t")); handle_input(term, arena, raw); - result.status &= term->cursor.pos.x == 33; + result &= term->cursor.pos.x == 33; /* NOTE: ensure backwards tab works */ launder_static_string(term, CSI(1;34H)); @@ -271,18 +266,17 @@ static TEST_FN(cursor_tabs_across_boundary) launder_static_string(term, CSI(1;66H)); raw = launder_static_string(term, CSI(1Z)); handle_input(term, arena, raw); - result.status &= term->cursor.pos.x == 33; + result &= term->cursor.pos.x == 33; return result; } static TEST_FN(working_ringbuffer) { - struct test_result result = {.info = __FUNCTION__}; RingBuf *rb = &term->views[term->view_idx].log; rb->buf[0] = 0xFE; - result.status = (rb->buf[0] == rb->buf[ rb->cap]) && - (rb->buf[0] == rb->buf[-rb->cap]); + TestResult result = (rb->buf[0] == rb->buf[ rb->cap]) && + (rb->buf[0] == rb->buf[-rb->cap]); return result; } @@ -293,16 +287,15 @@ static TEST_FN(working_ringbuffer) /* NOTE: CBT V-1: Left Beyond First Column */ static TEST_FN(cursor_backwards_tabulation_v1) { - struct test_result result = {.info = __FUNCTION__}; - launder_static_string(term, s8("\n")); launder_static_string(term, CSI(?5W)); launder_static_string(term, CSI(10Z)); s8 raw = launder_static_string(term, s8("A")); handle_input(term, arena, raw); - result.status = term->cursor.pos.x == 1 && term->cursor.pos.y == 1; - result.status &= term->views[term->view_idx].fb.rows[1][0].cp == 'A'; + TestResult result; + result = term->cursor.pos.x == 1 && term->cursor.pos.y == 1; + result &= term->views[term->view_idx].fb.rows[1][0].cp == 'A'; return result; } @@ -310,8 +303,6 @@ static TEST_FN(cursor_backwards_tabulation_v1) /* NOTE: CBT V-2: Left Starting After Tab Stop */ static TEST_FN(cursor_backwards_tabulation_v2) { - struct test_result result = {.info = __FUNCTION__}; - launder_static_string(term, CSI(?5W)); launder_static_string(term, CSI(1;10H)); launder_static_string(term, s8("X")); @@ -319,8 +310,9 @@ static TEST_FN(cursor_backwards_tabulation_v2) s8 raw = launder_static_string(term, s8("A")); handle_input(term, arena, raw); - result.status = term->views[term->view_idx].fb.rows[0][8].cp == 'A'; - result.status &= term->views[term->view_idx].fb.rows[0][9].cp == 'X'; + TestResult result; + result = term->views[term->view_idx].fb.rows[0][8].cp == 'A'; + result &= term->views[term->view_idx].fb.rows[0][9].cp == 'X'; return result; } @@ -328,8 +320,6 @@ static TEST_FN(cursor_backwards_tabulation_v2) /* NOTE: CBT V-3: Left Starting on Tabstop */ static TEST_FN(cursor_backwards_tabulation_v3) { - struct test_result result = {.info = __FUNCTION__}; - launder_static_string(term, CSI(?5W)); launder_static_string(term, CSI(1;9H)); launder_static_string(term, s8("X")); @@ -338,9 +328,10 @@ static TEST_FN(cursor_backwards_tabulation_v3) s8 raw = launder_static_string(term, s8("A")); handle_input(term, arena, raw); - result.status = term->views[term->view_idx].fb.rows[0][0].cp == 'A'; - result.status &= term->views[term->view_idx].fb.rows[0][8].cp == 'X'; - result.status &= term->views[term->view_idx].fb.rows[0][9].cp == ' '; + TestResult result; + result = term->views[term->view_idx].fb.rows[0][0].cp == 'A'; + result &= term->views[term->view_idx].fb.rows[0][8].cp == 'X'; + result &= term->views[term->view_idx].fb.rows[0][9].cp == ' '; return result; } @@ -348,8 +339,7 @@ static TEST_FN(cursor_backwards_tabulation_v3) /* NOTE: CBT V-4: Left Margin with Origin Mode */ static TEST_FN(cursor_backwards_tabulation_v4) { - struct test_result result = {.info = __FUNCTION__}; - result.status = UNSUPPORTED; + TestResult result = UNSUPPORTED; #if 0 launder_static_string(term, CSI(1;1H)); @@ -364,8 +354,9 @@ static TEST_FN(cursor_backwards_tabulation_v4) s8 raw = launder_static_string(term, s8("A")); handle_input(term, arena, raw); - result.status = term->views[term->view_idx].fb.rows[0][2].cp == 'A'; - result.status &= term->views[term->view_idx].fb.rows[0][3].cp == 'X'; + TestResult result; + result = term->views[term->view_idx].fb.rows[0][2].cp == 'A'; + result &= term->views[term->view_idx].fb.rows[0][3].cp == 'X'; #endif return result; @@ -374,8 +365,6 @@ static TEST_FN(cursor_backwards_tabulation_v4) /* NOTE: CUB V-1: Pending Wrap is Unset */ static TEST_FN(cursor_backwards_v1) { - struct test_result result = {.info = __FUNCTION__}; - u8 buffer_store[32]; Stream buffer = {.buf = buffer_store, .cap = sizeof(buffer_store)}; stream_push_s8(&buffer, s8("\x1B[")); @@ -388,10 +377,11 @@ static TEST_FN(cursor_backwards_v1) s8 raw = launder_static_string(term, s8("XYZ")); handle_input(term, arena, raw); - result.status = term->views[term->view_idx].fb.rows[0][term->size.w - 2].cp == 'X'; - result.status &= term->views[term->view_idx].fb.rows[0][term->size.w - 1].cp == 'Y'; - result.status &= term->views[term->view_idx].fb.rows[1][0].cp == 'Z'; - result.status &= term->cursor.pos.y == 1 && term->cursor.pos.x == 1; + TestResult result; + result = term->views[term->view_idx].fb.rows[0][term->size.w - 2].cp == 'X'; + result &= term->views[term->view_idx].fb.rows[0][term->size.w - 1].cp == 'Y'; + result &= term->views[term->view_idx].fb.rows[1][0].cp == 'Z'; + result &= term->cursor.pos.y == 1 && term->cursor.pos.x == 1; return result; } @@ -399,17 +389,16 @@ static TEST_FN(cursor_backwards_v1) /* NOTE: CUB V-2: Leftmost Boundary with Reverse Wrap Disabled */ static TEST_FN(cursor_backwards_v2) { - struct test_result result = {.info = __FUNCTION__}; - launder_static_string(term, CSI(?45l)); launder_static_string(term, s8("A\r\n")); launder_static_string(term, CSI(10D)); s8 raw = launder_static_string(term, s8("B")); handle_input(term, arena, raw); - result.status = term->views[term->view_idx].fb.rows[0][0].cp == 'A'; - result.status &= term->views[term->view_idx].fb.rows[1][0].cp == 'B'; - result.status &= term->cursor.pos.y == 1 && term->cursor.pos.x == 1; + TestResult result; + result = term->views[term->view_idx].fb.rows[0][0].cp == 'A'; + result &= term->views[term->view_idx].fb.rows[1][0].cp == 'B'; + result &= term->cursor.pos.y == 1 && term->cursor.pos.x == 1; return result; } @@ -417,8 +406,7 @@ static TEST_FN(cursor_backwards_v2) /* NOTE: CUB V-3: Reverse Wrap */ static TEST_FN(cursor_backwards_v3) { - struct test_result result = {.info = __FUNCTION__}; - result.status = UNSUPPORTED; + TestResult result = UNSUPPORTED; #if 0 u8 buffer_store[32]; @@ -435,10 +423,11 @@ static TEST_FN(cursor_backwards_v3) s8 raw = launder_static_string(term, s8("X")); handle_input(term, arena, raw); - result.status = term->views[term->view_idx].fb.rows[0][term->size.w - 1].cp == 'X'; - result.status &= term->views[term->view_idx].fb.rows[1][0].cp == 'B'; - result.status &= term->cursor.pos.y == 0 && term->cursor.pos.x == term->size.w - 1; - result.status &= (term->cursor.state & CURSOR_WRAP_NEXT) != 0; + TestResult result; + result = term->views[term->view_idx].fb.rows[0][term->size.w - 1].cp == 'X'; + result &= term->views[term->view_idx].fb.rows[1][0].cp == 'B'; + result &= term->cursor.pos.y == 0 && term->cursor.pos.x == term->size.w - 1; + result &= (term->cursor.state & CURSOR_WRAP_NEXT) != 0; #endif return result; @@ -447,8 +436,7 @@ static TEST_FN(cursor_backwards_v3) /* NOTE: CUB V-4: Extended Reverse Wrap Single Line */ static TEST_FN(cursor_backwards_v4) { - struct test_result result = {.info = __FUNCTION__}; - result.status = UNSUPPORTED; + TestResult result = UNSUPPORTED; #if 0 launder_static_string(term, CSI(?7h)); @@ -458,11 +446,12 @@ static TEST_FN(cursor_backwards_v4) s8 raw = launder_static_string(term, s8("X")); handle_input(term, arena, raw); - result.status = term->views[term->view_idx].fb.rows[0][0].cp == 'A'; - result.status &= term->views[term->view_idx].fb.rows[1][0].cp == 'B'; - result.status &= term->views[term->view_idx].fb.rows[0][term->size.w - 1].cp == 'X'; - result.status &= term->cursor.pos.y == 0 && term->cursor.pos.x == term->size.w - 1; - result.status &= (term->cursor.state & CURSOR_WRAP_NEXT) != 0; + TestResult result; + result = term->views[term->view_idx].fb.rows[0][0].cp == 'A'; + result &= term->views[term->view_idx].fb.rows[1][0].cp == 'B'; + result &= term->views[term->view_idx].fb.rows[0][term->size.w - 1].cp == 'X'; + result &= term->cursor.pos.y == 0 && term->cursor.pos.x == term->size.w - 1; + result &= (term->cursor.state & CURSOR_WRAP_NEXT) != 0; #endif return result; @@ -471,8 +460,7 @@ static TEST_FN(cursor_backwards_v4) /* NOTE: CUB V-5: Extended Reverse Wrap Wraps to Bottom */ static TEST_FN(cursor_backwards_v5) { - struct test_result result = {.info = __FUNCTION__}; - result.status = UNSUPPORTED; + TestResult result = UNSUPPORTED; #if 0 u8 buffer_store[32]; @@ -491,11 +479,12 @@ static TEST_FN(cursor_backwards_v5) s8 raw = launder_static_string(term, s8("X")); handle_input(term, arena, raw); - result.status = term->views[term->view_idx].fb.rows[0][0].cp == 'A'; - result.status &= term->views[term->view_idx].fb.rows[1][0].cp == 'B'; - result.status &= term->views[term->view_idx].fb.rows[2][term->size.w - 1].cp == 'X'; - result.status &= term->cursor.pos.y == 0 && term->cursor.pos.x == term->size.w - 1; - result.status &= (term->cursor.state & CURSOR_WRAP_NEXT) != 0; + TestResult result; + result = term->views[term->view_idx].fb.rows[0][0].cp == 'A'; + result &= term->views[term->view_idx].fb.rows[1][0].cp == 'B'; + result &= term->views[term->view_idx].fb.rows[2][term->size.w - 1].cp == 'X'; + result &= term->cursor.pos.y == 0 && term->cursor.pos.x == term->size.w - 1; + result &= (term->cursor.state & CURSOR_WRAP_NEXT) != 0; #endif return result; @@ -504,8 +493,7 @@ static TEST_FN(cursor_backwards_v5) /* NOTE: CUB V-6: Reverse Wrap Outside of Margins */ static TEST_FN(cursor_backwards_v6) { - struct test_result result = {.info = __FUNCTION__}; - result.status = UNSUPPORTED; + TestResult result = UNSUPPORTED; #if 0 launder_static_string(term, CSI(?45h)); @@ -513,8 +501,9 @@ static TEST_FN(cursor_backwards_v6) s8 raw = launder_static_string(term, s8("\bX")); handle_input(term, arena, raw); - result.status = term->views[term->view_idx].fb.rows[2][0].cp == 'X'; - result.status &= term->cursor.pos.y == 2 && term->cursor.pos.x == 1; + TestResult result; + result = term->views[term->view_idx].fb.rows[2][0].cp == 'X'; + result &= term->cursor.pos.y == 2 && term->cursor.pos.x == 1; #endif return result; @@ -523,8 +512,7 @@ static TEST_FN(cursor_backwards_v6) /* NOTE: CUB V-7: Reverse Wrap with Pending Wrap State */ static TEST_FN(cursor_backwards_v7) { - struct test_result result = {.info = __FUNCTION__}; - result.status = UNSUPPORTED; + TestResult result = UNSUPPORTED; #if 0 u8 buffer_store[32]; @@ -541,13 +529,14 @@ static TEST_FN(cursor_backwards_v7) s8 raw = launder_static_string(term, s8("X")); handle_input(term, arena, raw); - result.status = term->views[term->view_idx].fb.rows[0][term->size.w - 1].cp == 'X'; - result.status &= term->views[term->view_idx].fb.rows[0][term->size.w - 2].cp == 'D'; - result.status &= term->views[term->view_idx].fb.rows[0][term->size.w - 3].cp == 'C'; - result.status &= term->views[term->view_idx].fb.rows[0][term->size.w - 4].cp == 'B'; - result.status &= term->views[term->view_idx].fb.rows[0][term->size.w - 5].cp == 'A'; - result.status &= term->cursor.pos.y == 0 && term->cursor.pos.x == term->size.w - 1; - result.status &= (term->cursor.state & CURSOR_WRAP_NEXT) != 0; + TestResult result; + result = term->views[term->view_idx].fb.rows[0][term->size.w - 1].cp == 'X'; + result &= term->views[term->view_idx].fb.rows[0][term->size.w - 2].cp == 'D'; + result &= term->views[term->view_idx].fb.rows[0][term->size.w - 3].cp == 'C'; + result &= term->views[term->view_idx].fb.rows[0][term->size.w - 4].cp == 'B'; + result &= term->views[term->view_idx].fb.rows[0][term->size.w - 5].cp == 'A'; + result &= term->cursor.pos.y == 0 && term->cursor.pos.x == term->size.w - 1; + result &= (term->cursor.state & CURSOR_WRAP_NEXT) != 0; #endif return result; @@ -556,16 +545,15 @@ static TEST_FN(cursor_backwards_v7) /* NOTE: CUD V-1: Cursor Down */ static TEST_FN(cursor_down_v1) { - struct test_result result = {.info = __FUNCTION__}; - launder_static_string(term, s8("A")); launder_static_string(term, CSI(2B)); s8 raw = launder_static_string(term, s8("X")); handle_input(term, arena, raw); - result.status = term->views[term->view_idx].fb.rows[0][0].cp == 'A'; - result.status &= term->views[term->view_idx].fb.rows[2][1].cp == 'X'; - result.status &= term->cursor.pos.y == 2 && term->cursor.pos.x == 2; + TestResult result; + result = term->views[term->view_idx].fb.rows[0][0].cp == 'A'; + result &= term->views[term->view_idx].fb.rows[2][1].cp == 'X'; + result &= term->cursor.pos.y == 2 && term->cursor.pos.x == 2; return result; } @@ -573,17 +561,16 @@ static TEST_FN(cursor_down_v1) /* NOTE: CUD V-2: Cursor Down Above Bottom Margin */ static TEST_FN(cursor_down_v2) { - struct test_result result = {.info = __FUNCTION__}; - launder_static_string(term, CSI(1;3r)); launder_static_string(term, s8("A")); launder_static_string(term, CSI(5B)); s8 raw = launder_static_string(term, s8("X")); handle_input(term, arena, raw); - result.status = term->views[term->view_idx].fb.rows[0][0].cp == 'A'; - result.status &= term->views[term->view_idx].fb.rows[2][1].cp == 'X'; - result.status &= term->cursor.pos.y == 2 && term->cursor.pos.x == 2; + TestResult result; + result = term->views[term->view_idx].fb.rows[0][0].cp == 'A'; + result &= term->views[term->view_idx].fb.rows[2][1].cp == 'X'; + result &= term->cursor.pos.y == 2 && term->cursor.pos.x == 2; return result; } @@ -591,8 +578,6 @@ static TEST_FN(cursor_down_v2) /* NOTE: CUD V-3: Cursor Down Below Bottom Margin */ static TEST_FN(cursor_down_v3) { - struct test_result result = {.info = __FUNCTION__}; - launder_static_string(term, CSI(1;3r)); launder_static_string(term, s8("A")); launder_static_string(term, CSI(4;1H)); @@ -600,9 +585,10 @@ static TEST_FN(cursor_down_v3) s8 raw = launder_static_string(term, s8("X")); handle_input(term, arena, raw); - result.status = term->views[term->view_idx].fb.rows[0][0].cp == 'A'; - result.status &= term->views[term->view_idx].fb.rows[8][0].cp == 'X'; - result.status &= term->cursor.pos.y == 8 && term->cursor.pos.x == 1; + TestResult result; + result = term->views[term->view_idx].fb.rows[0][0].cp == 'A'; + result &= term->views[term->view_idx].fb.rows[8][0].cp == 'X'; + result &= term->cursor.pos.y == 8 && term->cursor.pos.x == 1; return result; } @@ -610,14 +596,13 @@ static TEST_FN(cursor_down_v3) /* NOTE: CUP V-1: Normal Usage */ static TEST_FN(cursor_position_v1) { - struct test_result result = {.info = __FUNCTION__}; - launder_static_string(term, CSI(2;3H)); s8 raw = launder_static_string(term, s8("A")); handle_input(term, arena, raw); - result.status = term->views[term->view_idx].fb.rows[1][2].cp == 'A'; - result.status &= term->cursor.pos.y == 1 && term->cursor.pos.x == 3; + TestResult result; + result = term->views[term->view_idx].fb.rows[1][2].cp == 'A'; + result &= term->cursor.pos.y == 1 && term->cursor.pos.x == 3; return result; } @@ -625,16 +610,15 @@ static TEST_FN(cursor_position_v1) /* NOTE: CUP V-2: Off the Screen */ static TEST_FN(cursor_position_v2) { - struct test_result result = {.info = __FUNCTION__}; - launder_static_string(term, CSI(500;500H)); s8 raw = launder_static_string(term, s8("A")); handle_input(term, arena, raw); - result.status = term->views[term->view_idx].fb.rows[term->size.h - 1][term->size.w - 1].cp == 'A'; - result.status &= term->cursor.pos.y == (term->size.h - 1); - result.status &= term->cursor.pos.x == (term->size.w - 1); - result.status &= (term->cursor.state & CURSOR_WRAP_NEXT) != 0; + TestResult result; + result = term->views[term->view_idx].fb.rows[term->size.h - 1][term->size.w - 1].cp == 'A'; + result &= term->cursor.pos.y == (term->size.h - 1); + result &= term->cursor.pos.x == (term->size.w - 1); + result &= (term->cursor.state & CURSOR_WRAP_NEXT) != 0; return result; } @@ -642,15 +626,13 @@ static TEST_FN(cursor_position_v2) /* NOTE: CUP V-3: Relative to Origin */ static TEST_FN(cursor_position_v3) { - struct test_result result = {.info = __FUNCTION__}; - launder_static_string(term, CSI(2;3r)); launder_static_string(term, CSI(?6h)); launder_static_string(term, CSI(1;1H)); s8 raw = launder_static_string(term, s8("X")); handle_input(term, arena, raw); - result.status = term->views[term->view_idx].fb.rows[1][0].cp == 'X'; + TestResult result = term->views[term->view_idx].fb.rows[1][0].cp == 'X'; return result; } @@ -658,8 +640,7 @@ static TEST_FN(cursor_position_v3) /* NOTE: CUP V-4: Relative to Origin with Left/Right Margins */ static TEST_FN(cursor_position_v4) { - struct test_result result = {.info = __FUNCTION__}; - result.status = UNSUPPORTED; + TestResult result = UNSUPPORTED; #if 0 launder_static_string(term, CSI(?69h)); @@ -670,7 +651,7 @@ static TEST_FN(cursor_position_v4) s8 raw = launder_static_string(term, s8("X")); handle_input(term, arena, raw); - result.status = term->views[term->view_idx].fb.rows[1][2].cp == 'X'; + TestResult result = term->views[term->view_idx].fb.rows[1][2].cp == 'X'; #endif return result; @@ -679,8 +660,7 @@ static TEST_FN(cursor_position_v4) /* NOTE: CUP V-5: Limits with Scroll Region and Origin Mode */ static TEST_FN(cursor_position_v5) { - struct test_result result = {.info = __FUNCTION__}; - result.status = UNSUPPORTED; + TestResult result = UNSUPPORTED; #if 0 launder_static_string(term, CSI(?69h)); @@ -691,7 +671,7 @@ static TEST_FN(cursor_position_v5) s8 raw = launder_static_string(term, s8("X")); handle_input(term, arena, raw); - result.status = term->views[term->view_idx].fb.rows[2][4].cp == 'X'; + TestResult result = term->views[term->view_idx].fb.rows[2][4].cp == 'X'; #endif return result; @@ -700,8 +680,6 @@ static TEST_FN(cursor_position_v5) /* NOTE: CUP V-6: Pending Wrap is Unset */ static TEST_FN(cursor_position_v6) { - struct test_result result = {.info = __FUNCTION__}; - u8 buffer_store[32]; Stream buffer = {.buf = buffer_store, .cap = sizeof(buffer_store)}; stream_push_s8(&buffer, s8("\x1B[")); @@ -714,9 +692,10 @@ static TEST_FN(cursor_position_v6) s8 raw = launder_static_string(term, s8("X")); handle_input(term, arena, raw); - result.status = term->views[term->view_idx].fb.rows[0][0].cp == 'X'; - result.status &= term->views[term->view_idx].fb.rows[0][term->size.w - 1].cp == 'A'; - result.status &= term->cursor.pos.y == 0 && term->cursor.pos.x == 1; + TestResult result; + result = term->views[term->view_idx].fb.rows[0][0].cp == 'X'; + result &= term->views[term->view_idx].fb.rows[0][term->size.w - 1].cp == 'A'; + result &= term->cursor.pos.y == 0 && term->cursor.pos.x == 1; return result; } @@ -724,17 +703,16 @@ static TEST_FN(cursor_position_v6) /* NOTE: CUU V-1: Cursor Up */ static TEST_FN(cursor_up_v1) { - struct test_result result = {.info = __FUNCTION__}; - launder_static_string(term, CSI(3;1H)); launder_static_string(term, s8("A")); launder_static_string(term, CSI(2A)); s8 raw = launder_static_string(term, s8("X")); handle_input(term, arena, raw); - result.status = term->views[term->view_idx].fb.rows[0][1].cp == 'X'; - result.status &= term->views[term->view_idx].fb.rows[2][0].cp == 'A'; - result.status &= term->cursor.pos.y == 0 && term->cursor.pos.x == 2; + TestResult result; + result = term->views[term->view_idx].fb.rows[0][1].cp == 'X'; + result &= term->views[term->view_idx].fb.rows[2][0].cp == 'A'; + result &= term->cursor.pos.y == 0 && term->cursor.pos.x == 2; return result; } @@ -742,8 +720,6 @@ static TEST_FN(cursor_up_v1) /* NOTE: CUU V-2: Cursor Up Below Top Margin */ static TEST_FN(cursor_up_v2) { - struct test_result result = {.info = __FUNCTION__}; - launder_static_string(term, CSI(2;4r)); launder_static_string(term, CSI(3;1H)); launder_static_string(term, s8("A")); @@ -751,9 +727,10 @@ static TEST_FN(cursor_up_v2) s8 raw = launder_static_string(term, s8("X")); handle_input(term, arena, raw); - result.status = term->views[term->view_idx].fb.rows[1][1].cp == 'X'; - result.status &= term->views[term->view_idx].fb.rows[2][0].cp == 'A'; - result.status &= term->cursor.pos.y == 1 && term->cursor.pos.x == 2; + TestResult result; + result = term->views[term->view_idx].fb.rows[1][1].cp == 'X'; + result &= term->views[term->view_idx].fb.rows[2][0].cp == 'A'; + result &= term->cursor.pos.y == 1 && term->cursor.pos.x == 2; return result; } @@ -761,8 +738,6 @@ static TEST_FN(cursor_up_v2) /* NOTE: CUU V-3: Cursor Up Above Top Margin */ static TEST_FN(cursor_up_v3) { - struct test_result result = {.info = __FUNCTION__}; - launder_static_string(term, CSI(3;5r)); launder_static_string(term, CSI(3;1H)); launder_static_string(term, s8("A")); @@ -771,9 +746,10 @@ static TEST_FN(cursor_up_v3) s8 raw = launder_static_string(term, s8("X")); handle_input(term, arena, raw); - result.status = term->views[term->view_idx].fb.rows[0][0].cp == 'X'; - result.status &= term->views[term->view_idx].fb.rows[2][0].cp == 'A'; - result.status &= term->cursor.pos.y == 0 && term->cursor.pos.x == 1; + TestResult result; + result = term->views[term->view_idx].fb.rows[0][0].cp == 'X'; + result &= term->views[term->view_idx].fb.rows[2][0].cp == 'A'; + result &= term->cursor.pos.y == 0 && term->cursor.pos.x == 1; return result; } @@ -782,20 +758,19 @@ static TEST_FN(cursor_up_v3) /* NOTE: DCH V-1: Simple Delete Character */ static TEST_FN(delete_characters_v1) { - struct test_result result = {.info = __FUNCTION__}; - launder_static_string(term, s8("ABC123")); launder_static_string(term, CSI(3G)); s8 raw = launder_static_string(term, CSI(2P)); handle_input(term, arena, raw); - Row row = term->views[term->view_idx].fb.rows[0]; - result.status = row[0].cp == 'A'; - result.status &= row[1].cp == 'B'; - result.status &= row[2].cp == '2'; - result.status &= row[3].cp == '3'; - result.status &= row[4].cp == ' '; - result.status &= row[5].cp == ' '; + Row row = term->views[term->view_idx].fb.rows[0]; + TestResult result; + result = row[0].cp == 'A'; + result &= row[1].cp == 'B'; + result &= row[2].cp == '2'; + result &= row[3].cp == '3'; + result &= row[4].cp == ' '; + result &= row[5].cp == ' '; return result; } @@ -803,8 +778,6 @@ static TEST_FN(delete_characters_v1) /* NOTE: DCH V-2: SGR State */ static TEST_FN(delete_characters_v2) { - struct test_result result = {.info = __FUNCTION__}; - launder_static_string(term, s8("ABC123")); launder_static_string(term, CSI(3G)); launder_static_string(term, CSI(41m)); @@ -812,17 +785,18 @@ static TEST_FN(delete_characters_v2) handle_input(term, arena, raw); Cell cell = {.cp = ' ', - .bg = SHADER_PACK_BG(g_colours.data[1].rgba, ATTR_NULL), - .fg = SHADER_PACK_FG(g_colours.data[g_colours.fgidx].rgba, ATTR_NULL), + .bg = SHADER_PACK_BG(g_colours.data[1].rgba, ATTR_NULL), + .fg = SHADER_PACK_FG(g_colours.data[g_colours.fgidx].rgba, ATTR_NULL), }; - Row row = term->views[term->view_idx].fb.rows[0]; - result.status = row[0].cp == 'A'; - result.status &= row[1].cp == 'B'; - result.status &= row[2].cp == '2'; - result.status &= row[3].cp == '3'; - result.status &= check_cells_equal(&cell, &row[term->size.w - 2]); - result.status &= check_cells_equal(&cell, &row[term->size.w - 1]); + Row row = term->views[term->view_idx].fb.rows[0]; + TestResult result; + result = row[0].cp == 'A'; + result &= row[1].cp == 'B'; + result &= row[2].cp == '2'; + result &= row[3].cp == '3'; + result &= check_cells_equal(&cell, &row[term->size.w - 2]); + result &= check_cells_equal(&cell, &row[term->size.w - 1]); return result; } @@ -830,8 +804,7 @@ static TEST_FN(delete_characters_v2) /* NOTE: DCH V-3: Outside Left/Right Scroll Region */ static TEST_FN(delete_characters_v3) { - struct test_result result = {.info = __FUNCTION__}; - result.status = UNSUPPORTED; + TestResult result = UNSUPPORTED; #if 0 launder_static_string(term, s8("ABC123")); @@ -841,13 +814,14 @@ static TEST_FN(delete_characters_v3) s8 raw = launder_static_string(term, CSI(P)); handle_input(term, arena, raw); - Row row = term->views[term->view_idx].fb.rows[0]; - result.status = row[0].cp == 'A'; - result.status &= row[1].cp == 'B'; - result.status &= row[2].cp == 'C'; - result.status &= row[3].cp == '1'; - result.status &= row[4].cp == '2'; - result.status &= row[5].cp == '3'; + Row row = term->views[term->view_idx].fb.rows[0]; + TestResult result; + result = row[0].cp == 'A'; + result &= row[1].cp == 'B'; + result &= row[2].cp == 'C'; + result &= row[3].cp == '1'; + result &= row[4].cp == '2'; + result &= row[5].cp == '3'; #endif return result; @@ -856,8 +830,7 @@ static TEST_FN(delete_characters_v3) /* NOTE: DCH V-4: Inside Left/Right Scroll Region */ static TEST_FN(delete_characters_v4) { - struct test_result result = {.info = __FUNCTION__}; - result.status = UNSUPPORTED; + TestResult result = UNSUPPORTED; #if 0 launder_static_string(term, s8("ABC123")); @@ -867,13 +840,14 @@ static TEST_FN(delete_characters_v4) s8 raw = launder_static_string(term, CSI(P)); handle_input(term, arena, raw); - Row row = term->views[term->view_idx].fb.rows[0]; - result.status = row[0].cp == 'A'; - result.status &= row[1].cp == 'B'; - result.status &= row[2].cp == 'C'; - result.status &= row[3].cp == '2'; - result.status &= row[4].cp == ' '; - result.status &= row[5].cp == '3'; + Row row = term->views[term->view_idx].fb.rows[0]; + TestResult result; + result = row[0].cp == 'A'; + result &= row[1].cp == 'B'; + result &= row[2].cp == 'C'; + result &= row[3].cp == '2'; + result &= row[4].cp == ' '; + result &= row[5].cp == '3'; #endif return result; @@ -882,19 +856,18 @@ static TEST_FN(delete_characters_v4) /* NOTE: DCH V-5: Split Wide Character */ static TEST_FN(delete_characters_v5) { - struct test_result result = {.info = __FUNCTION__}; - launder_static_string(term, s8("Ać©‹123")); launder_static_string(term, CSI(3G)); s8 raw = launder_static_string(term, CSI(P)); handle_input(term, arena, raw); - Row row = term->views[term->view_idx].fb.rows[0]; - result.status = row[0].cp == 'A'; - result.status &= row[1].cp == ' '; - result.status &= row[2].cp == '1'; - result.status &= row[3].cp == '2'; - result.status &= row[4].cp == '3'; + Row row = term->views[term->view_idx].fb.rows[0]; + TestResult result; + result = row[0].cp == 'A'; + result &= row[1].cp == ' '; + result &= row[2].cp == '1'; + result &= row[3].cp == '2'; + result &= row[4].cp == '3'; return result; } @@ -902,27 +875,26 @@ static TEST_FN(delete_characters_v5) /* NOTE: DECSTBM V-1: Full Screen */ static TEST_FN(set_top_bottom_margins_v1) { - struct test_result result = {.info = __FUNCTION__}; - launder_static_string(term, s8("ABC\r\nDEF\r\nGHI\r\n")); launder_static_string(term, CSI(r)); s8 raw = launder_static_string(term, CSI(T)); handle_input(term, arena, raw); - Row *rows = term->views[term->view_idx].fb.rows; - result.status = rows[0][0].cp == ' '; - result.status &= rows[0][1].cp == ' '; - result.status &= rows[0][2].cp == ' '; - result.status &= rows[1][0].cp == 'A'; - result.status &= rows[1][1].cp == 'B'; - result.status &= rows[1][2].cp == 'C'; - result.status &= rows[2][0].cp == 'D'; - result.status &= rows[2][1].cp == 'E'; - result.status &= rows[2][2].cp == 'F'; - result.status &= rows[3][0].cp == 'G'; - result.status &= rows[3][1].cp == 'H'; - result.status &= rows[3][2].cp == 'I'; - result.status &= term->cursor.pos.x == 0 && term->cursor.pos.y == 0; + Row *rows = term->views[term->view_idx].fb.rows; + TestResult result; + result = rows[0][0].cp == ' '; + result &= rows[0][1].cp == ' '; + result &= rows[0][2].cp == ' '; + result &= rows[1][0].cp == 'A'; + result &= rows[1][1].cp == 'B'; + result &= rows[1][2].cp == 'C'; + result &= rows[2][0].cp == 'D'; + result &= rows[2][1].cp == 'E'; + result &= rows[2][2].cp == 'F'; + result &= rows[3][0].cp == 'G'; + result &= rows[3][1].cp == 'H'; + result &= rows[3][2].cp == 'I'; + result &= term->cursor.pos.x == 0 && term->cursor.pos.y == 0; return result; } @@ -930,26 +902,25 @@ static TEST_FN(set_top_bottom_margins_v1) /* NOTE: DECSTBM V-2: Top Only */ static TEST_FN(set_top_bottom_margins_v2) { - struct test_result result = {.info = __FUNCTION__}; - launder_static_string(term, s8("ABC\r\nDEF\r\nGHI\r\n")); launder_static_string(term, CSI(2r)); s8 raw = launder_static_string(term, CSI(T)); handle_input(term, arena, raw); - Row *rows = term->views[term->view_idx].fb.rows; - result.status = rows[0][0].cp == 'A'; - result.status &= rows[0][1].cp == 'B'; - result.status &= rows[0][2].cp == 'C'; - result.status &= rows[1][0].cp == ' '; - result.status &= rows[1][1].cp == ' '; - result.status &= rows[1][2].cp == ' '; - result.status &= rows[2][0].cp == 'D'; - result.status &= rows[2][1].cp == 'E'; - result.status &= rows[2][2].cp == 'F'; - result.status &= rows[3][0].cp == 'G'; - result.status &= rows[3][1].cp == 'H'; - result.status &= rows[3][2].cp == 'I'; + Row *rows = term->views[term->view_idx].fb.rows; + TestResult result; + result = rows[0][0].cp == 'A'; + result &= rows[0][1].cp == 'B'; + result &= rows[0][2].cp == 'C'; + result &= rows[1][0].cp == ' '; + result &= rows[1][1].cp == ' '; + result &= rows[1][2].cp == ' '; + result &= rows[2][0].cp == 'D'; + result &= rows[2][1].cp == 'E'; + result &= rows[2][2].cp == 'F'; + result &= rows[3][0].cp == 'G'; + result &= rows[3][1].cp == 'H'; + result &= rows[3][2].cp == 'I'; return result; } @@ -957,23 +928,22 @@ static TEST_FN(set_top_bottom_margins_v2) /* NOTE: DECSTBM V-3: Top and Bottom */ static TEST_FN(set_top_bottom_margins_v3) { - struct test_result result = {.info = __FUNCTION__}; - launder_static_string(term, s8("ABC\r\nDEF\r\nGHI\r\n")); launder_static_string(term, CSI(1;2r)); s8 raw = launder_static_string(term, CSI(T)); handle_input(term, arena, raw); - Row *rows = term->views[term->view_idx].fb.rows; - result.status = rows[0][0].cp == ' '; - result.status &= rows[0][1].cp == ' '; - result.status &= rows[0][2].cp == ' '; - result.status &= rows[1][0].cp == 'A'; - result.status &= rows[1][1].cp == 'B'; - result.status &= rows[1][2].cp == 'C'; - result.status &= rows[2][0].cp == 'G'; - result.status &= rows[2][1].cp == 'H'; - result.status &= rows[2][2].cp == 'I'; + Row *rows = term->views[term->view_idx].fb.rows; + TestResult result; + result = rows[0][0].cp == ' '; + result &= rows[0][1].cp == ' '; + result &= rows[0][2].cp == ' '; + result &= rows[1][0].cp == 'A'; + result &= rows[1][1].cp == 'B'; + result &= rows[1][2].cp == 'C'; + result &= rows[2][0].cp == 'G'; + result &= rows[2][1].cp == 'H'; + result &= rows[2][2].cp == 'I'; return result; } @@ -981,26 +951,25 @@ static TEST_FN(set_top_bottom_margins_v3) /* NOTE: DECSTBM V-4: Top Equal to Bottom */ static TEST_FN(set_top_bottom_margins_v4) { - struct test_result result = {.info = __FUNCTION__}; - launder_static_string(term, s8("ABC\r\nDEF\r\nGHI\r\n")); launder_static_string(term, CSI(2;2r)); s8 raw = launder_static_string(term, CSI(T)); handle_input(term, arena, raw); - Row *rows = term->views[term->view_idx].fb.rows; - result.status = rows[0][0].cp == ' '; - result.status &= rows[0][1].cp == ' '; - result.status &= rows[0][2].cp == ' '; - result.status &= rows[1][0].cp == 'A'; - result.status &= rows[1][1].cp == 'B'; - result.status &= rows[1][2].cp == 'C'; - result.status &= rows[2][0].cp == 'D'; - result.status &= rows[2][1].cp == 'E'; - result.status &= rows[2][2].cp == 'F'; - result.status &= rows[3][0].cp == 'G'; - result.status &= rows[3][1].cp == 'H'; - result.status &= rows[3][2].cp == 'I'; + Row *rows = term->views[term->view_idx].fb.rows; + TestResult result; + result = rows[0][0].cp == ' '; + result &= rows[0][1].cp == ' '; + result &= rows[0][2].cp == ' '; + result &= rows[1][0].cp == 'A'; + result &= rows[1][1].cp == 'B'; + result &= rows[1][2].cp == 'C'; + result &= rows[2][0].cp == 'D'; + result &= rows[2][1].cp == 'E'; + result &= rows[2][2].cp == 'F'; + result &= rows[3][0].cp == 'G'; + result &= rows[3][1].cp == 'H'; + result &= rows[3][2].cp == 'I'; return result; } @@ -1008,14 +977,12 @@ static TEST_FN(set_top_bottom_margins_v4) /* NOTE: DSR V-1: Operating Status */ static TEST_FN(device_status_report_v1) { - struct test_result result = {.info = __FUNCTION__}; - Stream buffer = {.buf = malloc(KB(1)), .cap = KB(1)}; term->child = (iptr)&buffer; s8 raw = launder_static_string(term, CSI(5n)); handle_input(term, arena, raw); - result.status = s8_equal(s8("\x1B[0n"), stream_to_s8(&buffer)); + TestResult result = s8_equal(s8("\x1B[0n"), stream_to_s8(&buffer)); free(buffer.buf); @@ -1025,8 +992,6 @@ static TEST_FN(device_status_report_v1) /* NOTE: DSR V-2: Cursor Position */ static TEST_FN(device_status_report_v2) { - struct test_result result = {.info = __FUNCTION__}; - Stream buffer = {.buf = malloc(KB(1)), .cap = KB(1)}; term->child = (iptr)&buffer; @@ -1034,7 +999,7 @@ static TEST_FN(device_status_report_v2) s8 raw = launder_static_string(term, CSI(6n)); handle_input(term, arena, raw); - result.status = s8_equal(s8("\x1B[2;4R"), stream_to_s8(&buffer)); + TestResult result = s8_equal(s8("\x1B[2;4R"), stream_to_s8(&buffer)); free(buffer.buf); @@ -1061,13 +1026,12 @@ main(void) MemoryBlock term_backing = {.memory = malloc(MB(4)), .size = MB(4)}; /* TODO(rnp): term sizes as part of the tests */ Term *term = place_term_into_memory(term_backing, 24, 80); - struct test_result result = tests[i](term, term->arena_for_frame); - s8 fn = c_str_to_s8((char *)result.info); - stream_push_s8(&log, fn); + TestResult result = tests[i].implementation(term, term->arena_for_frame); + stream_push_s8(&log, tests[i].name); stream_push_s8(&log, s8(":")); - size count = fn.len; + size count = tests[i].name.len; while (count < max_name_len) { stream_push_byte(&log, ' '); count++; } - switch (result.status) { + switch (result) { case FAILURE: stream_push_s8(&log, failure_string); failure_count++; break; case SUCCESS: stream_push_s8(&log, success_string); break; case UNSUPPORTED: stream_push_s8(&log, unsupported_string); break;