t/unit-tests: convert ctype tests to use clar
Convert the ctype tests to use the new clar unit testing framework.
Introduce a new function `cl_failf()` that allows us to print a
formatted error message, which we can use to point out which of the
characters was classified incorrectly. This results in output like this
on failure:
# start of suite 1: ctype
not ok 1 - ctype::isspace
---
reason: |
Test failed.
0x0d is classified incorrectly: expected 0, got 1
at:
file: 't/unit-tests/ctype.c'
line: 36
function: 'test_ctype__isspace'
---
ok 2 - ctype::isdigit
ok 3 - ctype::isalpha
ok 4 - ctype::isalnum
ok 5 - ctype::is_glob_special
ok 6 - ctype::is_regex_special
ok 7 - ctype::is_pathspec_magic
ok 8 - ctype::isascii
ok 9 - ctype::islower
ok 10 - ctype::isupper
ok 11 - ctype::iscntrl
ok 12 - ctype::ispunct
ok 13 - ctype::isxdigit
ok 14 - ctype::isprint
Signed-off-by: Patrick Steinhardt <ps@pks.im>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
committed by
Junio C Hamano
parent
d7f0c47964
commit
c9763684ea
2
Makefile
2
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-hashmap
|
||||
|
||||
@@ -1,16 +1,16 @@
|
||||
#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)); \
|
||||
if_test (#class " works") { \
|
||||
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)); \
|
||||
for (int i = 0; i < 256; i++) { \
|
||||
int actual = class(i), expect = !!memchr(string, i, len); \
|
||||
if (actual != expect) \
|
||||
cl_failf("0x%02x is classified incorrectly: expected %d, got %d", \
|
||||
i, expect, actual); \
|
||||
} \
|
||||
cl_assert(!class(EOF)); \
|
||||
} while (0)
|
||||
|
||||
#define DIGIT "0123456789"
|
||||
@@ -31,21 +31,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");
|
||||
TEST_CHAR_CLASS(isdigit, DIGIT);
|
||||
TEST_CHAR_CLASS(isalpha, LOWER UPPER);
|
||||
TEST_CHAR_CLASS(isalnum, LOWER UPPER DIGIT);
|
||||
TEST_CHAR_CLASS(is_glob_special, "*?[\\");
|
||||
TEST_CHAR_CLASS(is_regex_special, "$()*+.?[\\^{|");
|
||||
TEST_CHAR_CLASS(is_pathspec_magic, "!\"#%&',-/:;<=>@_`~");
|
||||
TEST_CHAR_CLASS(isascii, ASCII);
|
||||
TEST_CHAR_CLASS(islower, LOWER);
|
||||
TEST_CHAR_CLASS(isupper, UPPER);
|
||||
TEST_CHAR_CLASS(iscntrl, CNTRL);
|
||||
TEST_CHAR_CLASS(ispunct, PUNCT);
|
||||
TEST_CHAR_CLASS(isxdigit, DIGIT "abcdefABCDEF");
|
||||
TEST_CHAR_CLASS(isprint, LOWER UPPER DIGIT PUNCT " ");
|
||||
|
||||
return test_done();
|
||||
}
|
||||
|
||||
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");
|
||||
}
|
||||
|
||||
void test_ctype__isprint(void)
|
||||
{
|
||||
TEST_CHAR_CLASS(isprint, LOWER UPPER DIGIT PUNCT " ");
|
||||
}
|
||||
@@ -1,3 +1,10 @@
|
||||
#include "git-compat-util.h"
|
||||
#include "clar/clar.h"
|
||||
#include "clar-decls.h"
|
||||
#include "strbuf.h"
|
||||
|
||||
#define cl_failf(fmt, ...) do { \
|
||||
char desc[4096]; \
|
||||
snprintf(desc, sizeof(desc), fmt, __VA_ARGS__); \
|
||||
clar__fail(__FILE__, __func__, __LINE__, "Test failed.", desc, 1); \
|
||||
} while (0)
|
||||
|
||||
Reference in New Issue
Block a user