diff mbox series

[v5,9/9] t/unit-tests: convert ctype tests to use clar

Message ID ca09d19fd51cd4b3072b339f483b6b6d6e467b56.1723791831.git.ps@pks.im (mailing list archive)
State Superseded
Headers show
Series Introduce clar testing framework | expand

Commit Message

Patrick Steinhardt Aug. 16, 2024, 7:05 a.m. UTC
Convert the ctype tests to use the new clar unit testing framework.

Signed-off-by: Patrick Steinhardt <ps@pks.im>
---
 Makefile                            |  2 +-
 t/unit-tests/{t-ctype.c => ctype.c} | 71 +++++++++++++++++++++++------
 2 files changed, 59 insertions(+), 14 deletions(-)
 rename t/unit-tests/{t-ctype.c => ctype.c} (71%)

Comments

Phillip Wood Aug. 16, 2024, 1:38 p.m. UTC | #1
Hi Patrick

On 16/08/2024 08:05, Patrick Steinhardt wrote:
>   #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)); \
> -	int skip = test__run_begin(); \
> -	if (!skip) { \
> -		for (int i = 0; i < 256; i++) { \
> -			if (!check_int(class(i), ==, !!memchr(string, i, len)))\
> -				test_msg("      i: 0x%02x", i); \
> -		} \
> -		check(!class(EOF)); \
> -	} \
> -	test__run_end(!skip, TEST_LOCATION(), #class " works"); \
> +	for (int i = 0; i < 256; i++) \
> +		cl_assert_equal_i(class(i), !!memchr(string, i, len)); \

If this fails how are we supposed to know which character it was checking?

Thanks

Phillip

> +	cl_assert(!class(EOF)); \
>   } while (0)
>   
>   #define DIGIT "0123456789"
> @@ -33,21 +27,72 @@
>   	"\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f" \
>   	"\x7f"
>   
> -int cmd_main(int argc, const char **argv) {
> +void test_ctype__isspace(void)
> +{
>   	TEST_CHAR_CLASS(isspace, " \n\r\t");
> +}
> +
> +void test_ctype__isdigit(void)
> +{
>   	TEST_CHAR_CLASS(isdigit, DIGIT);
> +}
> +
> +void test_ctype__isalpha(void)
> +{
>   	TEST_CHAR_CLASS(isalpha, LOWER UPPER);
> +}
> +
> +void test_ctype__isalnum(void)
> +{
>   	TEST_CHAR_CLASS(isalnum, LOWER UPPER DIGIT);
> +}
> +
> +void test_ctype__is_glob_special(void)
> +{
>   	TEST_CHAR_CLASS(is_glob_special, "*?[\\");
> +}
> +
> +void test_ctype__is_regex_special(void)
> +{
>   	TEST_CHAR_CLASS(is_regex_special, "$()*+.?[\\^{|");
> +}
> +
> +void test_ctype__is_pathspec_magic(void)
> +{
>   	TEST_CHAR_CLASS(is_pathspec_magic, "!\"#%&',-/:;<=>@_`~");
> +}
> +
> +void test_ctype__isascii(void)
> +{
>   	TEST_CHAR_CLASS(isascii, ASCII);
> +}
> +
> +void test_ctype__islower(void)
> +{
>   	TEST_CHAR_CLASS(islower, LOWER);
> +}
> +
> +void test_ctype__isupper(void)
> +{
>   	TEST_CHAR_CLASS(isupper, UPPER);
> +}
> +
> +void test_ctype__iscntrl(void)
> +{
>   	TEST_CHAR_CLASS(iscntrl, CNTRL);
> +}
> +
> +void test_ctype__ispunct(void)
> +{
>   	TEST_CHAR_CLASS(ispunct, PUNCT);
> +}
> +
> +void test_ctype__isxdigit(void)
> +{
>   	TEST_CHAR_CLASS(isxdigit, DIGIT "abcdefABCDEF");
> -	TEST_CHAR_CLASS(isprint, LOWER UPPER DIGIT PUNCT " ");
> +}
>   
> -	return test_done();
> +void test_ctype__isprint(void)
> +{
> +	TEST_CHAR_CLASS(isprint, LOWER UPPER DIGIT PUNCT " ");
>   }
Junio C Hamano Aug. 18, 2024, 6:39 a.m. UTC | #2
Patrick Steinhardt <ps@pks.im> writes:

> Convert the ctype tests to use the new clar unit testing framework.
>
> Signed-off-by: Patrick Steinhardt <ps@pks.im>
> ---
>  Makefile                            |  2 +-
>  t/unit-tests/{t-ctype.c => ctype.c} | 71 +++++++++++++++++++++++------
>  2 files changed, 59 insertions(+), 14 deletions(-)
>  rename t/unit-tests/{t-ctype.c => ctype.c} (71%)

In 'next' we use the if_test stuff to simplify the ctype unit tests.
This gives a good example to illustrate the strengths and weakness
of these approaches.  I resolved the conflict in 'seen' with this
topic in favor of clar tests so that it becomes easier to compare.

>  #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)); \
> -	int skip = test__run_begin(); \
> -	if (!skip) { \
> -		for (int i = 0; i < 256; i++) { \
> -			if (!check_int(class(i), ==, !!memchr(string, i, len)))\
> -				test_msg("      i: 0x%02x", i); \
> -		} \
> -		check(!class(EOF)); \
> -	} \
> -	test__run_end(!skip, TEST_LOCATION(), #class " works"); \
> +	for (int i = 0; i < 256; i++) \
> +		cl_assert_equal_i(class(i), !!memchr(string, i, len)); \
> +	cl_assert(!class(EOF)); \
>  } while (0)
Patrick Steinhardt Aug. 20, 2024, 12:59 p.m. UTC | #3
On Fri, Aug 16, 2024 at 02:38:30PM +0100, Phillip Wood wrote:
> Hi Patrick
> 
> On 16/08/2024 08:05, Patrick Steinhardt wrote:
> >   #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)); \
> > -	int skip = test__run_begin(); \
> > -	if (!skip) { \
> > -		for (int i = 0; i < 256; i++) { \
> > -			if (!check_int(class(i), ==, !!memchr(string, i, len)))\
> > -				test_msg("      i: 0x%02x", i); \
> > -		} \
> > -		check(!class(EOF)); \
> > -	} \
> > -	test__run_end(!skip, TEST_LOCATION(), #class " works"); \
> > +	for (int i = 0; i < 256; i++) \
> > +		cl_assert_equal_i(class(i), !!memchr(string, i, len)); \
> 
> If this fails how are we supposed to know which character it was checking?
> 
> Thanks

I'll introduce a new function `cl_failf()` that allows us to print
information like this.

Patrick
diff mbox series

Patch

diff --git a/Makefile b/Makefile
index b0c9a79c55..000eca9f86 100644
--- a/Makefile
+++ b/Makefile
@@ -1336,13 +1336,13 @@  THIRD_PARTY_SOURCES += sha1dc/%
 THIRD_PARTY_SOURCES += $(UNIT_TEST_DIR)/clar/%
 THIRD_PARTY_SOURCES += $(UNIT_TEST_DIR)/clar/clar/%
 
+UNIT_TESTS_SUITES += ctype
 UNIT_TESTS_SUITES += strvec
 UNIT_TESTS_PROG = $(UNIT_TEST_BIN)/unit-tests$(X)
 UNIT_TESTS_OBJS = $(patsubst %,$(UNIT_TEST_DIR)/%.o,$(UNIT_TESTS_SUITES))
 UNIT_TESTS_OBJS += $(UNIT_TEST_DIR)/clar/clar.o
 UNIT_TESTS_OBJS += $(UNIT_TEST_DIR)/unit-test.o
 
-UNIT_TEST_PROGRAMS += t-ctype
 UNIT_TEST_PROGRAMS += t-example-decorate
 UNIT_TEST_PROGRAMS += t-hash
 UNIT_TEST_PROGRAMS += t-mem-pool
diff --git a/t/unit-tests/t-ctype.c b/t/unit-tests/ctype.c
similarity index 71%
rename from t/unit-tests/t-ctype.c
rename to t/unit-tests/ctype.c
index d6ac1fe678..311df3a539 100644
--- a/t/unit-tests/t-ctype.c
+++ b/t/unit-tests/ctype.c
@@ -1,18 +1,12 @@ 
-#include "test-lib.h"
+#include "unit-test.h"
 
 #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)); \
-	int skip = test__run_begin(); \
-	if (!skip) { \
-		for (int i = 0; i < 256; i++) { \
-			if (!check_int(class(i), ==, !!memchr(string, i, len)))\
-				test_msg("      i: 0x%02x", i); \
-		} \
-		check(!class(EOF)); \
-	} \
-	test__run_end(!skip, TEST_LOCATION(), #class " works"); \
+	for (int i = 0; i < 256; i++) \
+		cl_assert_equal_i(class(i), !!memchr(string, i, len)); \
+	cl_assert(!class(EOF)); \
 } while (0)
 
 #define DIGIT "0123456789"
@@ -33,21 +27,72 @@ 
 	"\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f" \
 	"\x7f"
 
-int cmd_main(int argc, const char **argv) {
+void test_ctype__isspace(void)
+{
 	TEST_CHAR_CLASS(isspace, " \n\r\t");
+}
+
+void test_ctype__isdigit(void)
+{
 	TEST_CHAR_CLASS(isdigit, DIGIT);
+}
+
+void test_ctype__isalpha(void)
+{
 	TEST_CHAR_CLASS(isalpha, LOWER UPPER);
+}
+
+void test_ctype__isalnum(void)
+{
 	TEST_CHAR_CLASS(isalnum, LOWER UPPER DIGIT);
+}
+
+void test_ctype__is_glob_special(void)
+{
 	TEST_CHAR_CLASS(is_glob_special, "*?[\\");
+}
+
+void test_ctype__is_regex_special(void)
+{
 	TEST_CHAR_CLASS(is_regex_special, "$()*+.?[\\^{|");
+}
+
+void test_ctype__is_pathspec_magic(void)
+{
 	TEST_CHAR_CLASS(is_pathspec_magic, "!\"#%&',-/:;<=>@_`~");
+}
+
+void test_ctype__isascii(void)
+{
 	TEST_CHAR_CLASS(isascii, ASCII);
+}
+
+void test_ctype__islower(void)
+{
 	TEST_CHAR_CLASS(islower, LOWER);
+}
+
+void test_ctype__isupper(void)
+{
 	TEST_CHAR_CLASS(isupper, UPPER);
+}
+
+void test_ctype__iscntrl(void)
+{
 	TEST_CHAR_CLASS(iscntrl, CNTRL);
+}
+
+void test_ctype__ispunct(void)
+{
 	TEST_CHAR_CLASS(ispunct, PUNCT);
+}
+
+void test_ctype__isxdigit(void)
+{
 	TEST_CHAR_CLASS(isxdigit, DIGIT "abcdefABCDEF");
-	TEST_CHAR_CLASS(isprint, LOWER UPPER DIGIT PUNCT " ");
+}
 
-	return test_done();
+void test_ctype__isprint(void)
+{
+	TEST_CHAR_CLASS(isprint, LOWER UPPER DIGIT PUNCT " ");
 }