ctype: add a test for character class macros and functions

This commit is contained in:
Lephenixnoir 2021-05-18 11:42:37 +02:00
parent daa7ff43ca
commit 194a65c663
Signed by: Lephenixnoir
GPG Key ID: 1BBA026E13FC0495
7 changed files with 235 additions and 35 deletions

View File

@ -21,7 +21,8 @@ set(SOURCES
src/widgets/flog.c
src/widgets/gscreen.c
# ctype
src/ctype/trivialties.c
src/ctype/charprops.c
src/ctype/classes.c
# string
src/string/memarray.c
src/string/core.c

View File

@ -8,9 +8,8 @@
#include <ft/test.h>
/* ctype */
extern ft_test ft_ctype_trivial_success;
extern ft_test ft_ctype_trivial_failure;
extern ft_test ft_ctype_trivial_empty;
extern ft_test ft_ctype_macros;
extern ft_test ft_ctype_functions;
/* string */
extern ft_test ft_string_memset;

134
src/ctype/charprops.c Normal file
View File

@ -0,0 +1,134 @@
#include <ft/test.h>
#include <ft/all-tests.h>
#include "charprops.h"
uint16_t charprops[128] = {
CP_CNTRL,
CP_CNTRL,
CP_CNTRL,
CP_CNTRL,
CP_CNTRL,
CP_CNTRL,
CP_CNTRL,
CP_CNTRL,
CP_CNTRL,
CP_CNTRL | CP_SPACE | CP_BLANK,
CP_CNTRL | CP_SPACE,
CP_CNTRL | CP_SPACE,
CP_CNTRL | CP_SPACE,
CP_CNTRL | CP_SPACE,
CP_CNTRL,
CP_CNTRL,
CP_CNTRL,
CP_CNTRL,
CP_CNTRL,
CP_CNTRL,
CP_CNTRL,
CP_CNTRL,
CP_CNTRL,
CP_CNTRL,
CP_CNTRL,
CP_CNTRL,
CP_CNTRL,
CP_CNTRL,
CP_CNTRL,
CP_CNTRL,
CP_CNTRL,
CP_CNTRL,
CP_PRINT | CP_SPACE | CP_BLANK,
CP_PRINT | CP_GRAPH | CP_PUNCT,
CP_PRINT | CP_GRAPH | CP_PUNCT,
CP_PRINT | CP_GRAPH | CP_PUNCT,
CP_PRINT | CP_GRAPH | CP_PUNCT,
CP_PRINT | CP_GRAPH | CP_PUNCT,
CP_PRINT | CP_GRAPH | CP_PUNCT,
CP_PRINT | CP_GRAPH | CP_PUNCT,
CP_PRINT | CP_GRAPH | CP_PUNCT,
CP_PRINT | CP_GRAPH | CP_PUNCT,
CP_PRINT | CP_GRAPH | CP_PUNCT,
CP_PRINT | CP_GRAPH | CP_PUNCT,
CP_PRINT | CP_GRAPH | CP_PUNCT,
CP_PRINT | CP_GRAPH | CP_PUNCT,
CP_PRINT | CP_GRAPH | CP_PUNCT,
CP_PRINT | CP_GRAPH | CP_PUNCT,
CP_PRINT | CP_GRAPH | CP_ALNUM | CP_DIGIT | CP_XDIGIT,
CP_PRINT | CP_GRAPH | CP_ALNUM | CP_DIGIT | CP_XDIGIT,
CP_PRINT | CP_GRAPH | CP_ALNUM | CP_DIGIT | CP_XDIGIT,
CP_PRINT | CP_GRAPH | CP_ALNUM | CP_DIGIT | CP_XDIGIT,
CP_PRINT | CP_GRAPH | CP_ALNUM | CP_DIGIT | CP_XDIGIT,
CP_PRINT | CP_GRAPH | CP_ALNUM | CP_DIGIT | CP_XDIGIT,
CP_PRINT | CP_GRAPH | CP_ALNUM | CP_DIGIT | CP_XDIGIT,
CP_PRINT | CP_GRAPH | CP_ALNUM | CP_DIGIT | CP_XDIGIT,
CP_PRINT | CP_GRAPH | CP_ALNUM | CP_DIGIT | CP_XDIGIT,
CP_PRINT | CP_GRAPH | CP_ALNUM | CP_DIGIT | CP_XDIGIT,
CP_PRINT | CP_GRAPH | CP_PUNCT,
CP_PRINT | CP_GRAPH | CP_PUNCT,
CP_PRINT | CP_GRAPH | CP_PUNCT,
CP_PRINT | CP_GRAPH | CP_PUNCT,
CP_PRINT | CP_GRAPH | CP_PUNCT,
CP_PRINT | CP_GRAPH | CP_PUNCT,
CP_PRINT | CP_GRAPH | CP_PUNCT,
CP_PRINT | CP_GRAPH | CP_ALNUM | CP_ALPHA | CP_UPPER | CP_XDIGIT,
CP_PRINT | CP_GRAPH | CP_ALNUM | CP_ALPHA | CP_UPPER | CP_XDIGIT,
CP_PRINT | CP_GRAPH | CP_ALNUM | CP_ALPHA | CP_UPPER | CP_XDIGIT,
CP_PRINT | CP_GRAPH | CP_ALNUM | CP_ALPHA | CP_UPPER | CP_XDIGIT,
CP_PRINT | CP_GRAPH | CP_ALNUM | CP_ALPHA | CP_UPPER | CP_XDIGIT,
CP_PRINT | CP_GRAPH | CP_ALNUM | CP_ALPHA | CP_UPPER | CP_XDIGIT,
CP_PRINT | CP_GRAPH | CP_ALNUM | CP_ALPHA | CP_UPPER,
CP_PRINT | CP_GRAPH | CP_ALNUM | CP_ALPHA | CP_UPPER,
CP_PRINT | CP_GRAPH | CP_ALNUM | CP_ALPHA | CP_UPPER,
CP_PRINT | CP_GRAPH | CP_ALNUM | CP_ALPHA | CP_UPPER,
CP_PRINT | CP_GRAPH | CP_ALNUM | CP_ALPHA | CP_UPPER,
CP_PRINT | CP_GRAPH | CP_ALNUM | CP_ALPHA | CP_UPPER,
CP_PRINT | CP_GRAPH | CP_ALNUM | CP_ALPHA | CP_UPPER,
CP_PRINT | CP_GRAPH | CP_ALNUM | CP_ALPHA | CP_UPPER,
CP_PRINT | CP_GRAPH | CP_ALNUM | CP_ALPHA | CP_UPPER,
CP_PRINT | CP_GRAPH | CP_ALNUM | CP_ALPHA | CP_UPPER,
CP_PRINT | CP_GRAPH | CP_ALNUM | CP_ALPHA | CP_UPPER,
CP_PRINT | CP_GRAPH | CP_ALNUM | CP_ALPHA | CP_UPPER,
CP_PRINT | CP_GRAPH | CP_ALNUM | CP_ALPHA | CP_UPPER,
CP_PRINT | CP_GRAPH | CP_ALNUM | CP_ALPHA | CP_UPPER,
CP_PRINT | CP_GRAPH | CP_ALNUM | CP_ALPHA | CP_UPPER,
CP_PRINT | CP_GRAPH | CP_ALNUM | CP_ALPHA | CP_UPPER,
CP_PRINT | CP_GRAPH | CP_ALNUM | CP_ALPHA | CP_UPPER,
CP_PRINT | CP_GRAPH | CP_ALNUM | CP_ALPHA | CP_UPPER,
CP_PRINT | CP_GRAPH | CP_ALNUM | CP_ALPHA | CP_UPPER,
CP_PRINT | CP_GRAPH | CP_ALNUM | CP_ALPHA | CP_UPPER,
CP_PRINT | CP_GRAPH | CP_PUNCT,
CP_PRINT | CP_GRAPH | CP_PUNCT,
CP_PRINT | CP_GRAPH | CP_PUNCT,
CP_PRINT | CP_GRAPH | CP_PUNCT,
CP_PRINT | CP_GRAPH | CP_PUNCT,
CP_PRINT | CP_GRAPH | CP_PUNCT,
CP_PRINT | CP_GRAPH | CP_ALNUM | CP_ALPHA | CP_LOWER | CP_XDIGIT,
CP_PRINT | CP_GRAPH | CP_ALNUM | CP_ALPHA | CP_LOWER | CP_XDIGIT,
CP_PRINT | CP_GRAPH | CP_ALNUM | CP_ALPHA | CP_LOWER | CP_XDIGIT,
CP_PRINT | CP_GRAPH | CP_ALNUM | CP_ALPHA | CP_LOWER | CP_XDIGIT,
CP_PRINT | CP_GRAPH | CP_ALNUM | CP_ALPHA | CP_LOWER | CP_XDIGIT,
CP_PRINT | CP_GRAPH | CP_ALNUM | CP_ALPHA | CP_LOWER | CP_XDIGIT,
CP_PRINT | CP_GRAPH | CP_ALNUM | CP_ALPHA | CP_LOWER,
CP_PRINT | CP_GRAPH | CP_ALNUM | CP_ALPHA | CP_LOWER,
CP_PRINT | CP_GRAPH | CP_ALNUM | CP_ALPHA | CP_LOWER,
CP_PRINT | CP_GRAPH | CP_ALNUM | CP_ALPHA | CP_LOWER,
CP_PRINT | CP_GRAPH | CP_ALNUM | CP_ALPHA | CP_LOWER,
CP_PRINT | CP_GRAPH | CP_ALNUM | CP_ALPHA | CP_LOWER,
CP_PRINT | CP_GRAPH | CP_ALNUM | CP_ALPHA | CP_LOWER,
CP_PRINT | CP_GRAPH | CP_ALNUM | CP_ALPHA | CP_LOWER,
CP_PRINT | CP_GRAPH | CP_ALNUM | CP_ALPHA | CP_LOWER,
CP_PRINT | CP_GRAPH | CP_ALNUM | CP_ALPHA | CP_LOWER,
CP_PRINT | CP_GRAPH | CP_ALNUM | CP_ALPHA | CP_LOWER,
CP_PRINT | CP_GRAPH | CP_ALNUM | CP_ALPHA | CP_LOWER,
CP_PRINT | CP_GRAPH | CP_ALNUM | CP_ALPHA | CP_LOWER,
CP_PRINT | CP_GRAPH | CP_ALNUM | CP_ALPHA | CP_LOWER,
CP_PRINT | CP_GRAPH | CP_ALNUM | CP_ALPHA | CP_LOWER,
CP_PRINT | CP_GRAPH | CP_ALNUM | CP_ALPHA | CP_LOWER,
CP_PRINT | CP_GRAPH | CP_ALNUM | CP_ALPHA | CP_LOWER,
CP_PRINT | CP_GRAPH | CP_ALNUM | CP_ALPHA | CP_LOWER,
CP_PRINT | CP_GRAPH | CP_ALNUM | CP_ALPHA | CP_LOWER,
CP_PRINT | CP_GRAPH | CP_ALNUM | CP_ALPHA | CP_LOWER,
CP_PRINT | CP_GRAPH | CP_PUNCT,
CP_PRINT | CP_GRAPH | CP_PUNCT,
CP_PRINT | CP_GRAPH | CP_PUNCT,
CP_PRINT | CP_GRAPH | CP_PUNCT,
CP_CNTRL,
};

29
src/ctype/charprops.h Normal file
View File

@ -0,0 +1,29 @@
//---
// ctype.charprops: Utilities to validate properties of groups of characters
//
// These utilities simply factor in the common code in ctype macro vs function
// tests, and in a way implement the ctype specification in a naive way in
// order to compare results.
//---
#ifndef _CTYPE_CHARPROPS_H
#define _CTYPE_CHARPROPS_H
#include <gint/defs/types.h>
#define CP_CNTRL 0x0001
#define CP_PRINT 0x0002
#define CP_SPACE 0x0004
#define CP_BLANK 0x0008
#define CP_GRAPH 0x0010
#define CP_PUNCT 0x0020
#define CP_ALNUM 0x0040
#define CP_ALPHA 0x0080
#define CP_UPPER 0x0100
#define CP_LOWER 0x0200
#define CP_DIGIT 0x0400
#define CP_XDIGIT 0x0800
extern uint16_t charprops[128];
#endif /* _CTYPE_CHARPROPS_H */

66
src/ctype/classes.c Normal file
View File

@ -0,0 +1,66 @@
#include <ft/test.h>
#include <ft/all-tests.h>
#include <ctype.h>
#include "charprops.h"
static void _ctype_macros(ft_test *t)
{
for(int c = 0; c < 128; c++) {
ft_assert(t, (isalnum(c) != 0) == ((charprops[c] & CP_ALNUM) != 0));
ft_assert(t, (isalpha(c) != 0) == ((charprops[c] & CP_ALPHA) != 0));
ft_assert(t, (isblank(c) != 0) == ((charprops[c] & CP_BLANK) != 0));
ft_assert(t, (iscntrl(c) != 0) == ((charprops[c] & CP_CNTRL) != 0));
ft_assert(t, (isdigit(c) != 0) == ((charprops[c] & CP_DIGIT) != 0));
ft_assert(t, (islower(c) != 0) == ((charprops[c] & CP_LOWER) != 0));
ft_assert(t, (isgraph(c) != 0) == ((charprops[c] & CP_GRAPH) != 0));
ft_assert(t, (ispunct(c) != 0) == ((charprops[c] & CP_PUNCT) != 0));
ft_assert(t, (isprint(c) != 0) == ((charprops[c] & CP_PRINT) != 0));
ft_assert(t, (isspace(c) != 0) == ((charprops[c] & CP_SPACE) != 0));
ft_assert(t, (isupper(c) != 0) == ((charprops[c] & CP_UPPER) != 0));
ft_assert(t, (isxdigit(c) != 0) == ((charprops[c] & CP_XDIGIT) != 0));
}
}
ft_test ft_ctype_macros = {
.name = "Macro versions of functions",
.function = _ctype_macros,
};
#undef isalnum
#undef isalpha
#undef isblank
#undef iscntrl
#undef isdigit
#undef islower
#undef isgraph
#undef ispunct
#undef isprint
#undef isspace
#undef isupper
#undef isxdigit
#undef tolower
#undef toupper
static void _ctype_functions(ft_test *t)
{
for(int c = 0; c < 128; c++) {
ft_assert(t, (isalnum(c) != 0) == ((charprops[c] & CP_ALNUM) != 0));
ft_assert(t, (isalpha(c) != 0) == ((charprops[c] & CP_ALPHA) != 0));
ft_assert(t, (isblank(c) != 0) == ((charprops[c] & CP_BLANK) != 0));
ft_assert(t, (iscntrl(c) != 0) == ((charprops[c] & CP_CNTRL) != 0));
ft_assert(t, (isdigit(c) != 0) == ((charprops[c] & CP_DIGIT) != 0));
ft_assert(t, (islower(c) != 0) == ((charprops[c] & CP_LOWER) != 0));
ft_assert(t, (isgraph(c) != 0) == ((charprops[c] & CP_GRAPH) != 0));
ft_assert(t, (ispunct(c) != 0) == ((charprops[c] & CP_PUNCT) != 0));
ft_assert(t, (isprint(c) != 0) == ((charprops[c] & CP_PRINT) != 0));
ft_assert(t, (isspace(c) != 0) == ((charprops[c] & CP_SPACE) != 0));
ft_assert(t, (isupper(c) != 0) == ((charprops[c] & CP_UPPER) != 0));
ft_assert(t, (isxdigit(c) != 0) == ((charprops[c] & CP_XDIGIT) != 0));
}
}
ft_test ft_ctype_functions = {
.name = "Pure functions",
.function = _ctype_functions,
};

View File

@ -1,28 +0,0 @@
#include <ft/test.h>
#include <ft/all-tests.h>
static void _ctype_trivial_success(ft_test *t)
{
ft_assert(t, 1);
ft_assert(t, 1);
}
ft_test ft_ctype_trivial_success = {
.name = "Trivialty (always succeeds)",
.function = _ctype_trivial_success,
};
static void _ctype_trivial_failure(ft_test *t)
{
ft_assert(t, 0);
}
ft_test ft_ctype_trivial_failure = {
.name = "Trivialty (always fails)",
.function = _ctype_trivial_failure,
};
ft_test ft_ctype_trivial_empty = {
.name = "Trivialty (no function)",
.function = NULL,
};

View File

@ -14,9 +14,8 @@
ft_list headers_libc[] = {
{ "<ctype.h>", (ft_test*[]){
&ft_ctype_trivial_success,
&ft_ctype_trivial_failure,
&ft_ctype_trivial_empty,
&ft_ctype_macros,
&ft_ctype_functions,
NULL,
}},
{ "<locale.h>", NULL },