From f235d82dccb499f1af06e7ef3e1d7b9b57c12014 Mon Sep 17 00:00:00 2001 From: John Mark Bell Date: Sun, 23 Nov 2008 10:29:16 +0000 Subject: Some kind of testsuite for number parsing. It appears that negative values are broken, at least. svn path=/trunk/libcss/; revision=5763 --- test/INDEX | 1 + test/Makefile | 2 +- test/data/number/INDEX | 5 ++ test/data/number/number.dat | 48 +++++++++++++++++ test/number.c | 122 ++++++++++++++++++++++++++++++++++++++++++++ 5 files changed, 177 insertions(+), 1 deletion(-) create mode 100644 test/data/number/INDEX create mode 100644 test/data/number/number.dat create mode 100644 test/number.c (limited to 'test') diff --git a/test/INDEX b/test/INDEX index 91031c8..6808b46 100644 --- a/test/INDEX +++ b/test/INDEX @@ -6,6 +6,7 @@ libcss Library initialisation/finalisation csdetect Character set detection csdetect lex Lexing css lex-auto Automated lexer tests lex +number Conversion of numbers to fixed point number parse Parsing (core syntax) css css21 Parsing (CSS2.1 specifics) css diff --git a/test/Makefile b/test/Makefile index 4874633..e7aeb67 100644 --- a/test/Makefile +++ b/test/Makefile @@ -35,7 +35,7 @@ d := $(DIR) CFLAGS := $(CFLAGS) -I$(TOP)/src/ -I$(d) # Tests -TESTS_$(d) := csdetect css21 lex lex-auto libcss parse +TESTS_$(d) := csdetect css21 lex lex-auto libcss number parse TESTS_$(d) := $(TESTS_$(d)) # Items for top-level makefile to use diff --git a/test/data/number/INDEX b/test/data/number/INDEX new file mode 100644 index 0000000..0b159c7 --- /dev/null +++ b/test/data/number/INDEX @@ -0,0 +1,5 @@ +# Index file for generic CSS content +# +# Test Description + +number.dat Number tests diff --git a/test/data/number/number.dat b/test/data/number/number.dat new file mode 100644 index 0000000..0aeb6d0 --- /dev/null +++ b/test/data/number/number.dat @@ -0,0 +1,48 @@ +#data +1 +#expected +1 +#reset + +#data +.0 +#expected +.0 +#reset + +#data +.5 +#expected +.5 +#reset + +#data +.999 +#expected +.999 +#reset + +#data +2097151 +#expected +2097151 +#reset + +#data +2097152 +#expected +2097151.999 +#reset + +#data +-2097152 +#expected +-2097152 +#reset + +#data +-2097153 +#expected +-2097152.999 +#reset + diff --git a/test/number.c b/test/number.c new file mode 100644 index 0000000..87dcbcd --- /dev/null +++ b/test/number.c @@ -0,0 +1,122 @@ +#include +#include +#include + +#include "utils/utils.h" + +#include "testutils.h" + +typedef struct line_ctx { + size_t buflen; + size_t bufused; + uint8_t *buf; + + size_t explen; + char exp[256]; + + bool indata; + bool inexp; +} line_ctx; + +static bool handle_line(const char *data, size_t datalen, void *pw); +static void run_test(const uint8_t *data, size_t len, + const char *exp, size_t explen); + +int main(int argc, char **argv) +{ + line_ctx ctx; + + if (argc != 3) { + printf("Usage: %s \n", argv[0]); + return 1; + } + + ctx.buflen = parse_filesize(argv[2]); + if (ctx.buflen == 0) + return 1; + + ctx.buf = malloc(ctx.buflen); + if (ctx.buf == NULL) { + printf("Failed allocating %u bytes\n", + (unsigned int) ctx.buflen); + return 1; + } + + ctx.buf[0] = '\0'; + ctx.bufused = 0; + ctx.explen = 0; + ctx.indata = false; + ctx.inexp = false; + + assert(parse_testfile(argv[2], handle_line, &ctx) == true); + + /* and run final test */ + if (ctx.bufused > 0) + run_test(ctx.buf, ctx.bufused, ctx.exp, ctx.explen); + + free(ctx.buf); + + printf("PASS\n"); + + return 0; +} + +bool handle_line(const char *data, size_t datalen, void *pw) +{ + line_ctx *ctx = (line_ctx *) pw; + + if (data[0] == '#') { + if (ctx->inexp) { + /* This marks end of testcase, so run it */ + + run_test(ctx->buf, ctx->bufused, + ctx->exp, ctx->explen); + + ctx->buf[0] = '\0'; + ctx->bufused = 0; + + ctx->explen = 0; + } + + if (ctx->indata && strncasecmp(data+1, "expected", 8) == 0) { + ctx->indata = false; + ctx->inexp = true; + } else if (!ctx->indata) { + ctx->indata = (strncasecmp(data+1, "data", 4) == 0); + ctx->inexp = (strncasecmp(data+1, "expected", 8) == 0); + } else { + memcpy(ctx->buf + ctx->bufused, data, datalen); + ctx->bufused += datalen; + } + } else { + if (ctx->indata) { + memcpy(ctx->buf + ctx->bufused, data, datalen); + ctx->bufused += datalen; + } + if (ctx->inexp) { + if (data[datalen - 1] == '\n') + datalen -= 1; + + memcpy(ctx->exp, data, datalen); + ctx->explen = datalen; + } + } + + return true; +} + +void run_test(const uint8_t *data, size_t len, const char *exp, size_t explen) +{ + css_string in = { (uint8_t *) data, len }; + size_t consumed; + fixed result; + + UNUSED(exp); + UNUSED(explen); + + result = number_from_css_string(&in, &consumed); + + /** \todo some kind of verification of the result */ + printf("%d\n", result); +} + -- cgit v1.2.3