All of lore.kernel.org
 help / color / mirror / Atom feed
From: Junio C Hamano <gitster@pobox.com>
To: Pablo Sabater <pabloosabaterr@gmail.com>
Cc: git@vger.kernel.org
Subject: Re: [GSoC PATCH v2] test-lib: print escape sequence names
Date: Wed, 11 Mar 2026 13:49:01 -0700	[thread overview]
Message-ID: <xmqqms0em6rm.fsf@gitster.g> (raw)
In-Reply-To: <20260311031442.11942-1-pabloosabaterr@gmail.com> (Pablo Sabater's message of "Wed, 11 Mar 2026 04:14:42 +0100")

Pablo Sabater <pabloosabaterr@gmail.com> 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 <pabloosabaterr@gmail.com>
> ---
> 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);

      parent reply	other threads:[~2026-03-11 20:49 UTC|newest]

Thread overview: 5+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2026-03-10 18:35 [GSoC PATCH] test-lib: print escape sequence names Pablo Sabater
2026-03-10 18:48 ` Pablo
2026-03-11  3:14 ` [GSoC PATCH v2] " Pablo Sabater
2026-03-11 10:53   ` Pablo
2026-03-11 20:49   ` Junio C Hamano [this message]

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=xmqqms0em6rm.fsf@gitster.g \
    --to=gitster@pobox.com \
    --cc=git@vger.kernel.org \
    --cc=pabloosabaterr@gmail.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.