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:
M | tests/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;