From: Junio C Hamano Date: Wed, 11 Mar 2026 20:49:01 GMT Subject: Re: [GSoC PATCH v2] test-lib: print escape sequence names Message-ID: In-Reply-To: <20260311031442.11942-1-pabloosabaterr@gmail.com> Pablo Sabater writes: > When printing expected/actual characters in failed checks, use > their names (\a, \b, \n, ...) instead of their octal representation, > making it easier to read. > > Add tests to test-example-tap.c > Update t0080-unit-test-output.sh to match the desired output > > Teach 'print_one_char()' the equivalent name > > Signed-off-by: Pablo Sabater > --- > Changes from v1: > reverted unrelated test change '\'' to '\\'' in t0080 > > t/helper/test-example-tap.c | 4 +++ > t/t0080-unit-test-output.sh | 52 +++++++++++++++++++++++-------------- > t/unit-tests/test-lib.c | 19 ++++++++++++-- > 3 files changed, 53 insertions(+), 22 deletions(-) Looking good. Will queue. Thanks. > > diff --git a/t/helper/test-example-tap.c b/t/helper/test-example-tap.c > index 229d495ecf..998a1f0b42 100644 > --- a/t/helper/test-example-tap.c > +++ b/t/helper/test-example-tap.c > @@ -63,6 +63,8 @@ static void t_messages(void) > check_str("NULL", NULL); > check_char('a', ==, '\n'); > check_char('\\', ==, '\''); > + check_char('\a', ==, '\v'); > + check_char('\x00', ==, '\x01'); > } > > static void t_empty(void) > @@ -123,6 +125,8 @@ int cmd__example_tap(int argc UNUSED, const char **argv UNUSED) > check_str("NULL", NULL); > check_char('a', ==, '\n'); > check_char('\\', ==, '\''); > + check_char('\a', ==, '\v'); > + check_char('\x00', ==, '\x01'); > } > if_test ("if_test test with no checks") > ; /* nothing */ > diff --git a/t/t0080-unit-test-output.sh b/t/t0080-unit-test-output.sh > index 3db10f095c..66838a00b2 100755 > --- a/t/t0080-unit-test-output.sh > +++ b/t/t0080-unit-test-output.sh > @@ -6,10 +6,10 @@ test_description='Test the output of the unit test framework' > > test_expect_success 'TAP output from unit tests' - <<\EOT > cat >expect <<-EOF && > - # BUG: check outside of test at t/helper/test-example-tap.c:75 > + # BUG: check outside of test at t/helper/test-example-tap.c:77 > ok 1 - passing test > ok 2 - passing test and assertion return 1 > - # check "1 == 2" failed at t/helper/test-example-tap.c:79 > + # check "1 == 2" failed at t/helper/test-example-tap.c:81 > # left: 1 > # right: 2 > not ok 3 - failing test > @@ -34,53 +34,65 @@ test_expect_success 'TAP output from unit tests' - <<\EOT > not ok 15 - failing check after TEST_TODO() > ok 16 - failing check after TEST_TODO() returns 0 > # check "!strcmp("\thello\\\\", "there\"\n")" failed at t/helper/test-example-tap.c:62 > - # left: "\011hello\\\\" > - # right: "there\"\012" > + # left: "\thello\\\\" > + # right: "there\"\n" > # check "!strcmp("NULL", NULL)" failed at t/helper/test-example-tap.c:63 > # left: "NULL" > # right: NULL > # check "'a' == '\n'" failed at t/helper/test-example-tap.c:64 > # left: 'a' > - # right: '\012' > + # right: '\n' > # check "'\\\\' == '\\''" failed at t/helper/test-example-tap.c:65 > # left: '\\\\' > # right: '\\'' > + # check "'\a' == '\v'" failed at t/helper/test-example-tap.c:66 > + # left: '\a' > + # right: '\v' > + # check "'\x00' == '\x01'" failed at t/helper/test-example-tap.c:67 > + # left: '\000' > + # right: '\001' > not ok 17 - messages from failing string and char comparison > - # BUG: test has no checks at t/helper/test-example-tap.c:94 > + # BUG: test has no checks at t/helper/test-example-tap.c:96 > not ok 18 - test with no checks > ok 19 - test with no checks returns 0 > ok 20 - if_test passing test > - # check "1 == 2" failed at t/helper/test-example-tap.c:100 > + # check "1 == 2" failed at t/helper/test-example-tap.c:102 > # left: 1 > # right: 2 > not ok 21 - if_test failing test > not ok 22 - if_test passing TEST_TODO() # TODO > - # todo check 'check(1)' succeeded at t/helper/test-example-tap.c:104 > + # todo check 'check(1)' succeeded at t/helper/test-example-tap.c:106 > not ok 23 - if_test failing TEST_TODO() > - # check "0" failed at t/helper/test-example-tap.c:106 > + # check "0" failed at t/helper/test-example-tap.c:108 > # skipping test - missing prerequisite > - # skipping check '1' at t/helper/test-example-tap.c:108 > + # skipping check '1' at t/helper/test-example-tap.c:110 > ok 24 - if_test test_skip() # SKIP > # skipping test - missing prerequisite > ok 25 - if_test test_skip() inside TEST_TODO() # SKIP > - # check "0" failed at t/helper/test-example-tap.c:113 > + # check "0" failed at t/helper/test-example-tap.c:115 > not ok 26 - if_test TEST_TODO() after failing check > - # check "0" failed at t/helper/test-example-tap.c:119 > + # check "0" failed at t/helper/test-example-tap.c:121 > not ok 27 - if_test failing check after TEST_TODO() > - # check "!strcmp("\thello\\\\", "there\"\n")" failed at t/helper/test-example-tap.c:122 > - # left: "\011hello\\\\" > - # right: "there\"\012" > - # check "!strcmp("NULL", NULL)" failed at t/helper/test-example-tap.c:123 > + # check "!strcmp("\thello\\\\", "there\"\n")" failed at t/helper/test-example-tap.c:124 > + # left: "\thello\\\\" > + # right: "there\"\n" > + # check "!strcmp("NULL", NULL)" failed at t/helper/test-example-tap.c:125 > # left: "NULL" > # right: NULL > - # check "'a' == '\n'" failed at t/helper/test-example-tap.c:124 > + # check "'a' == '\n'" failed at t/helper/test-example-tap.c:126 > # left: 'a' > - # right: '\012' > - # check "'\\\\' == '\\''" failed at t/helper/test-example-tap.c:125 > + # right: '\n' > + # check "'\\\\' == '\\''" failed at t/helper/test-example-tap.c:127 > # left: '\\\\' > # right: '\\'' > + # check "'\a' == '\v'" failed at t/helper/test-example-tap.c:128 > + # left: '\a' > + # right: '\v' > + # check "'\x00' == '\x01'" failed at t/helper/test-example-tap.c:129 > + # left: '\000' > + # right: '\001' > not ok 28 - if_test messages from failing string and char comparison > - # BUG: test has no checks at t/helper/test-example-tap.c:127 > + # BUG: test has no checks at t/helper/test-example-tap.c:131 > not ok 29 - if_test test with no checks > 1..29 > EOF > diff --git a/t/unit-tests/test-lib.c b/t/unit-tests/test-lib.c > index 87e1f5c201..72ee20a06f 100644 > --- a/t/unit-tests/test-lib.c > +++ b/t/unit-tests/test-lib.c > @@ -396,8 +396,23 @@ int check_uint_loc(const char *loc, const char *check, int ok, > static void print_one_char(char ch, char quote) > { > if ((unsigned char)ch < 0x20u || ch == 0x7f) { > - /* TODO: improve handling of \a, \b, \f ... */ > - printf("\\%03o", (unsigned char)ch); > + char esc; > + switch (ch) { > + case '\a': esc = 'a'; break; > + case '\b': esc = 'b'; break; > + case '\t': esc = 't'; break; > + case '\n': esc = 'n'; break; > + case '\v': esc = 'v'; break; > + case '\f': esc = 'f'; break; > + case '\r': esc = 'r'; break; > + default: esc = 0; break; > + } > + if (esc) { > + putc('\\', stdout); > + putc(esc, stdout); > + } else { > + printf("\\%03o", (unsigned char)ch); > + } > } else { > if (ch == '\\' || ch == quote) > putc('\\', stdout);