Message ID | ca09d19fd51cd4b3072b339f483b6b6d6e467b56.1723791831.git.ps@pks.im (mailing list archive) |
---|---|
State | Superseded |
Headers | show |
Series | Introduce clar testing framework | expand |
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 " "); > }
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)
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 --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 " "); }
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%)