git/list[1] front-page[2] threads[3] people[4] search[5] about
 

[PATCH v2 0/4] t-ctype: simplify unit test definitions

From
René Scharfe <l.s.r@web.de>
Date
Mar 3, 2024, 10:13 UTC
Message-ID
<20240303101330.20187-1-l.s.r@web.de>
In-Reply-To
<20240225112722.89221-1-l.s.r@web.de>

Simplify the ctype unit tests to allow combining specification strings in any order and no longer require repeating class names.

Changes since v1:
* Added checks to guard string length calculation using sizeof.
* Kept the definition string in the error output.
* Added patches 2 and 3 with further cosmetic changes.
* Dropped the last patch with the huge output for now, as it needs
  further thought.
  t-ctype: allow NUL anywhere in the specification string
  t-ctype: simplify EOF check
  t-ctype: align output of i
  t-ctype: avoid duplicating class names
 t/unit-tests/t-ctype.c | 81 ++++++++++++++----------------------------
 1 file changed, 27 insertions(+), 54 deletions(-)
Range-Diff gegen v1:
1:  ae9b5468db ! 1:  28fba8bda9 t-ctype: allow NUL anywhere in the specification string
    @@ Commit message
         if we ever want to support more character classes that contain it.
         Getting the string size using sizeof only works in a macro and with a
    -    string constant, but that's exactly what we have and I don't see it
    -    changing anytime soon.
    +    string constant.  Use ARRAY_SIZE and compile-time checks to make sure we
    +    are not passed a string pointer.
      ## t/unit-tests/t-ctype.c ##
     @@
    @@ t/unit-tests/t-ctype.c
      /* Macro to test a character type */
      #define TEST_CTYPE_FUNC(func, string) \
      static void test_ctype_##func(void) { \
    ++	size_t len = ARRAY_SIZE(string) - 1 + \
    ++		BUILD_ASSERT_OR_ZERO(ARRAY_SIZE(string) > 0) + \
    ++		BUILD_ASSERT_OR_ZERO(sizeof(string[0]) == sizeof(char)); \
      	for (int i = 0; i < 256; i++) { \
     -		if (!check_int(func(i), ==, is_in(string, i))) \
    -+		int expect = !!memchr(string, i, sizeof(string) - 1); \
    -+		if (!check_int(func(i), ==, expect)) \
    ++		if (!check_int(func(i), ==, !!memchr(string, i, len))) \
      			test_msg("       i: 0x%02x", i); \
      	} \
      	if (!check(!func(EOF))) \
-:  ---------- > 2:  1eab0d289c t-ctype: simplify EOF check
-:  ---------- > 3:  901312e980 t-ctype: align output of i
2:  688e6b6cb5 ! 4:  5dac51cfeb t-ctype: avoid duplicating class names
    @@ t/unit-tests/t-ctype.c
     -/* Macro to test a character type */
     -#define TEST_CTYPE_FUNC(func, string) \
     -static void test_ctype_##func(void) { \
    --	for (int i = 0; i < 256; i++) { \
    --		int expect = !!memchr(string, i, sizeof(string) - 1); \
    --		if (!check_int(func(i), ==, expect)) \
    --			test_msg("       i: 0x%02x", i); \
    --	} \
    --	if (!check(!func(EOF))) \
     +#define TEST_CHAR_CLASS(class, string) do { \
    + 	size_t len = ARRAY_SIZE(string) - 1 + \
    + 		BUILD_ASSERT_OR_ZERO(ARRAY_SIZE(string) > 0) + \
    + 		BUILD_ASSERT_OR_ZERO(sizeof(string[0]) == sizeof(char)); \
    +-	for (int i = 0; i < 256; i++) { \
    +-		if (!check_int(func(i), ==, !!memchr(string, i, len))) \
    +-			test_msg("      i: 0x%02x", i); \
     +	int skip = test__run_begin(); \
     +	if (!skip) { \
     +		for (int i = 0; i < 256; i++) { \
    -+			int expect = !!memchr(string, i, sizeof(string) - 1); \
    -+			if (!check_int(class(i), ==, expect)) \
    -+				test_msg("       i: 0x%02x", i); \
    ++			if (!check_int(class(i), ==, !!memchr(string, i, len)))\
    ++				test_msg("      i: 0x%02x", i); \
     +		} \
    -+		if (!check(!class(EOF))) \
    - 			test_msg("      i: 0x%02x (EOF)", EOF); \
    ++		check(!class(EOF)); \
    + 	} \
    +-	check(!func(EOF)); \
     -}
     -
     -#define TEST_CHAR_CLASS(class) TEST(test_ctype_##class(), #class " works")
    -+	} \
     +	test__run_end(!skip, TEST_LOCATION(), #class " works"); \
     +} while (0)

3: caf2acbd09 < -: ---------- t-ctype: do one test per class and char -- 2.44.0

Previous: Junio C HamanoNext: René Scharfe
Message 20 of 30 in “t-ctype: simplify unit test definitions”
  1. 0/3 t-ctype: simplify unit test definitionsRené Scharfe, Feb 25, 2024
  2. 1/3 t-ctype: allow NUL anywhere in the specification stringRené Scharfe, Feb 25, 2024
  3. Eric SunshineFeb 25, 2024
  4. René ScharfeFeb 25, 2024
  5. Eric SunshineFeb 25, 2024
  6. Jeff KingFeb 25, 2024
  7. Eric SunshineFeb 25, 2024
  8. 2/3 t-ctype: avoid duplicating class namesRené Scharfe, Feb 25, 2024
  9. 3/3 t-ctype: do one test per class and charRené Scharfe, Feb 25, 2024
  10. Christian CouderFeb 26, 2024
  11. René ScharfeFeb 26, 2024
  12. Junio C HamanoFeb 26, 2024
  13. Josh SteadmonFeb 26, 2024
  14. Christian CouderFeb 27, 2024
  15. René ScharfeMar 2, 2024
  16. Christian CouderMar 4, 2024
  17. René ScharfeMar 6, 2024
  18. Josh SteadmonMar 4, 2024
  19. Junio C HamanoMar 4, 2024
  20. 0/4 t-ctype: simplify unit test definitionsRené Scharfe, Mar 3, 2024
  21. 2/4 t-ctype: simplify EOF checkRené Scharfe, Mar 3, 2024
  22. 3/4 t-ctype: align output of iRené Scharfe, Mar 3, 2024
  23. 4/4 t-ctype: avoid duplicating class namesRené Scharfe, Mar 3, 2024
  24. Phillip WoodMar 4, 2024
  25. René ScharfeMar 6, 2024
  26. Phillip WoodMar 8, 2024
  27. Phillip WoodMar 9, 2024
  28. René ScharfeMar 10, 2024
  29. 1/4 t-ctype: allow NUL anywhere in the specification stringRené Scharfe, Mar 3, 2024
  30. Christian CouderMar 4, 2024

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.