summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--test/INDEX1
-rw-r--r--test/Makefile2
-rw-r--r--test/data/number/INDEX5
-rw-r--r--test/data/number/number.dat48
-rw-r--r--test/number.c122
5 files changed, 177 insertions, 1 deletions
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 <stdint.h>
+#include <stdlib.h>
+#include <string.h>
+
+#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 <aliases_file> <filename>\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);
+}
+