summaryrefslogtreecommitdiff
path: root/test
diff options
context:
space:
mode:
authorJohn Mark Bell <jmb@netsurf-browser.org>2009-01-17 08:59:41 +0000
committerJohn Mark Bell <jmb@netsurf-browser.org>2009-01-17 08:59:41 +0000
commit4cf242c54358603dd983a0f49de265351f34455a (patch)
tree578f2cef0f60beb5a6dca19df7e3a1ca2eca4ea9 /test
parent715f2617dffdcede45af45e5e849cb83f67745b4 (diff)
downloadlibcss-4cf242c54358603dd983a0f49de265351f34455a.tar.gz
libcss-4cf242c54358603dd983a0f49de265351f34455a.tar.bz2
Use our own printing routine, rather than relying on snprintf to do the right thing wrt rounding.
Update test data in line with this. That said, it would appear that values <=-(2^21) get truncated to -2097151.999. This probably wants investigating. svn path=/trunk/libcss/; revision=6111
Diffstat (limited to 'test')
-rw-r--r--test/data/number/number.dat9
-rw-r--r--test/number.c69
2 files changed, 72 insertions, 6 deletions
diff --git a/test/data/number/number.dat b/test/data/number/number.dat
index 48ecc20..1004f55 100644
--- a/test/data/number/number.dat
+++ b/test/data/number/number.dat
@@ -28,12 +28,10 @@
2097151.000
#reset
-# Test INT_MAX + 1. Note that, in converting the result to float,
-# we'll end up with INT_MAX + 1 as the output.
#data
2097152
#expected
-2097152.000
+2097151.999
#reset
#data
@@ -66,16 +64,17 @@
-2097151.000
#reset
+# TODO: should these next two not result in INT_MIN?
#data
-2097152
#expected
--2097152.000
+-2097151.999
#reset
#data
-2097153
#expected
--2097152.000
+-2097151.999
#reset
#data
diff --git a/test/number.c b/test/number.c
index 39aa494..1f4f9d9 100644
--- a/test/number.c
+++ b/test/number.c
@@ -21,6 +21,7 @@ typedef struct 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);
+static void print_fixed(char *buf, size_t len, fixed f);
int main(int argc, char **argv)
{
@@ -117,10 +118,76 @@ void run_test(const uint8_t *data, size_t len, const char *exp, size_t explen)
result = number_from_css_string(&in, false, &consumed);
- snprintf(buf, sizeof buf, "%.3f", FIXTOFLT(result));
+ print_fixed(buf, sizeof(buf), result);
printf("got: %s expected: %.*s\n", buf, (int) explen, exp);
assert(strncmp(buf, exp, explen) == 0);
}
+void print_fixed(char *buf, size_t len, fixed f)
+{
+#define ABS(x) ((x) < 0 ? -(x) : (x))
+ uint32_t uintpart = FIXTOINT(ABS(f));
+ uint32_t fracpart = ((ABS(f) & 0x3ff) * 1000) / (1 << 10);
+#undef ABS
+ size_t flen = 0;
+ char tmp[20];
+ size_t tlen = 0;
+
+ if (len == 0)
+ return;
+
+ if (f < 0) {
+ buf[0] = '-';
+ buf++;
+ len--;
+ }
+
+ do {
+ tmp[tlen] = "0123456789"[uintpart % 10];
+ tlen++;
+
+ uintpart /= 10;
+ } while (tlen < 20 && uintpart != 0);
+
+ while (len > 0 && tlen > 0) {
+ buf[0] = tmp[--tlen];
+ buf++;
+ len--;
+ }
+
+ if (len > 0) {
+ buf[0] = '.';
+ buf++;
+ len--;
+ }
+
+ do {
+ tmp[tlen] = "0123456789"[fracpart % 10];
+ tlen++;
+
+ fracpart /= 10;
+ } while (tlen < 20 && fracpart != 0);
+
+ while (len > 0 && tlen > 0) {
+ buf[0] = tmp[--tlen];
+ buf++;
+ len--;
+ flen++;
+ }
+
+ while (len > 0 && flen < 3) {
+ buf[0] = '0';
+ buf++;
+ len--;
+ flen++;
+ }
+
+ if (len > 0) {
+ buf[0] = '\0';
+ buf++;
+ len--;
+ }
+}
+