summaryrefslogtreecommitdiff
path: root/test
diff options
context:
space:
mode:
authorJohn Mark Bell <jmb@netsurf-browser.org>2009-02-14 00:06:01 +0000
committerJohn Mark Bell <jmb@netsurf-browser.org>2009-02-14 00:06:01 +0000
commit7ecab92e9a8508c44a758a8ca58defe9a5965bb4 (patch)
tree069accf001b7f948edcbc9d32433002685abc61a /test
parentc9899180b84909a15f3dcc17378a60d4e9e9fc3e (diff)
downloadlibcss-7ecab92e9a8508c44a758a8ca58defe9a5965bb4.tar.gz
libcss-7ecab92e9a8508c44a758a8ca58defe9a5965bb4.tar.bz2
A motley selection of changes. Vague summary:
+ Add config makefile (not that there's anything to configure at present :) + Fix dumping of UNIT_MS to actually use sprintf and not printf + Extend computed style dumping (still loads of properties missing) + Make result buffer larger in select-auto.c -- avoids buffer overflows when there's way more output than expected + Expand expected test output to contain defaulted properties (more of this will be needed once the computed style dumping is complete) + Store interned string pointers in css_select_state. + Intern pseudo class/element names at start of selecting styles for a sheet + Group properties so we know which ones appear in the extension blocks + Fixup unset properties once the cascade has completed + Implement matching of pseudo class/element selectors + Fix setting of background-image and list-style-image when there's no URL. svn path=/trunk/libcss/; revision=6470
Diffstat (limited to 'test')
-rw-r--r--test/data/select/tests1.dat27
-rw-r--r--test/dump.h2
-rw-r--r--test/dump_computed.h301
-rw-r--r--test/select-auto.c10
4 files changed, 334 insertions, 6 deletions
diff --git a/test/data/select/tests1.dat b/test/data/select/tests1.dat
index d8a55b0..5b415f3 100644
--- a/test/data/select/tests1.dat
+++ b/test/data/select/tests1.dat
@@ -12,6 +12,15 @@ div#foo { background-color: #bbc; }
.green { color: #0f0; }
#errors
#expected
+background-attachment: scroll
+background-color: transparent
+background-image: none
+background-position: 0% 0%
+background-repeat: repeat
+border-top-color: #00000000
+border-right-color: #00000000
+border-bottom-color: #00000000
+border-left-color: #00000000
color: #ff000000
display: block
#reset
@@ -24,6 +33,15 @@ div { display: block; }
div { display: inline; }
#errors
#expected
+background-attachment: scroll
+background-color: transparent
+background-image: none
+background-position: 0% 0%
+background-repeat: repeat
+border-top-color: #00000000
+border-right-color: #00000000
+border-bottom-color: #00000000
+border-left-color: #00000000
display: block
#reset
@@ -34,6 +52,15 @@ div { background-color: #000; }
div:active { background-color: #bbc; }
#errors
#expected
+background-attachment: scroll
background-color: #bbbbcc00
+background-image: none
+background-position: 0% 0%
+background-repeat: repeat
+border-top-color: #00000000
+border-right-color: #00000000
+border-bottom-color: #00000000
+border-left-color: #00000000
+display: inline
#reset
diff --git a/test/dump.h b/test/dump.h
index c217565..98ec1bb 100644
--- a/test/dump.h
+++ b/test/dump.h
@@ -436,7 +436,7 @@ static void dump_unit(fixed val, uint32_t unit, char **ptr)
*ptr += sprintf(*ptr, "rad");
break;
case UNIT_MS:
- *ptr += printf(*ptr, "ms");
+ *ptr += sprintf(*ptr, "ms");
break;
case UNIT_S:
*ptr += sprintf(*ptr, "s");
diff --git a/test/dump_computed.h b/test/dump_computed.h
index dda07c1..f573e9d 100644
--- a/test/dump_computed.h
+++ b/test/dump_computed.h
@@ -1,6 +1,141 @@
#include <libcss/computed.h>
#include <libcss/properties.h>
+#include "utils/fpmath.h"
+
+static size_t dump_css_fixed(css_fixed f, char *ptr, size_t len)
+{
+#define ABS(x) (uint32_t)((x) < 0 ? -(x) : (x))
+ uint32_t uintpart = FIXTOINT(ABS(f));
+ /* + 500 to ensure round to nearest (division will truncate) */
+ uint32_t fracpart = ((ABS(f) & 0x3ff) * 1000 + 500) / (1 << 10);
+#undef ABS
+ size_t flen = 0;
+ char tmp[20];
+ size_t tlen = 0;
+ char *buf = ptr;
+
+ if (len == 0)
+ return 0;
+
+ if (f < 0) {
+ buf[0] = '-';
+ buf++;
+ len--;
+ }
+
+ do {
+ tmp[tlen] = "0123456789"[uintpart % 10];
+ tlen++;
+
+ uintpart /= 10;
+ } while (tlen < 20 && uintpart != 0);
+
+ while (tlen > 0 && len > 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 (tlen > 0 && len > 0) {
+ buf[0] = tmp[--tlen];
+ buf++;
+ flen++;
+ len--;
+ }
+
+ while (flen < 3 && len > 0) {
+ buf[0] = '0';
+ buf++;
+ flen++;
+ len--;
+ }
+
+ if (len > 0)
+ buf[0] = '\0';
+
+ return buf - ptr;
+}
+static size_t dump_css_number(css_fixed val, char *ptr, size_t len)
+{
+ if (INTTOFIX(FIXTOINT(val)) == val)
+ return snprintf(ptr, len, "%d", FIXTOINT(val));
+ else
+ return dump_css_fixed(val, ptr, len);
+}
+
+static size_t dump_css_unit(css_fixed val, css_unit unit, char *ptr, size_t len)
+{
+ size_t ret = dump_css_number(val, ptr, len);
+
+ switch (unit) {
+ case CSS_UNIT_PX:
+ ret += snprintf(ptr + ret, len - ret, "px");
+ break;
+ case CSS_UNIT_EX:
+ ret += snprintf(ptr + ret, len - ret, "ex");
+ break;
+ case CSS_UNIT_EM:
+ ret += snprintf(ptr + ret, len - ret, "em");
+ break;
+ case CSS_UNIT_IN:
+ ret += snprintf(ptr + ret, len - ret, "in");
+ break;
+ case CSS_UNIT_CM:
+ ret += snprintf(ptr + ret, len - ret, "cm");
+ break;
+ case CSS_UNIT_MM:
+ ret += snprintf(ptr + ret, len - ret, "mm");
+ break;
+ case CSS_UNIT_PT:
+ ret += snprintf(ptr + ret, len - ret, "pt");
+ break;
+ case CSS_UNIT_PC:
+ ret += snprintf(ptr + ret, len - ret, "pc");
+ break;
+ case CSS_UNIT_PCT:
+ ret += snprintf(ptr + ret, len - ret, "%%");
+ break;
+ case CSS_UNIT_DEG:
+ ret += snprintf(ptr + ret, len - ret, "deg");
+ break;
+ case CSS_UNIT_GRAD:
+ ret += snprintf(ptr + ret, len - ret, "grad");
+ break;
+ case CSS_UNIT_RAD:
+ ret += snprintf(ptr + ret, len - ret, "rad");
+ break;
+ case CSS_UNIT_MS:
+ ret += snprintf(ptr + ret, len - ret, "ms");
+ break;
+ case CSS_UNIT_S:
+ ret += snprintf(ptr + ret, len - ret, "s");
+ break;
+ case CSS_UNIT_HZ:
+ ret += snprintf(ptr + ret, len - ret, "Hz");
+ break;
+ case CSS_UNIT_KHZ:
+ ret += snprintf(ptr + ret, len - ret, "kHz");
+ break;
+ }
+
+ return ret;
+}
+
+
static void dump_computed_style(const css_computed_style *style, char *buf,
size_t *len)
{
@@ -8,6 +143,9 @@ static void dump_computed_style(const css_computed_style *style, char *buf,
size_t wrote = 0;
uint8_t val;
css_color color;
+ const css_string *url;
+ css_fixed len1, len2;
+ css_unit unit1, unit2;
val = css_computed_background_attachment(style);
switch (val) {
@@ -39,6 +177,169 @@ static void dump_computed_style(const css_computed_style *style, char *buf,
ptr += wrote;
*len -= wrote;
+ val = css_computed_background_image(style, &url);
+ if (val == CSS_BACKGROUND_IMAGE_IMAGE && url->data != NULL) {
+ wrote = snprintf(ptr, *len, "background-image: url('%.*s')\n",
+ (int) url->len, url->data);
+ } else if (val == CSS_BACKGROUND_IMAGE_NONE) {
+ wrote = snprintf(ptr, *len, "background-image: none\n");
+ } else {
+ wrote = 0;
+ }
+ ptr += wrote;
+ *len -= wrote;
+
+ val = css_computed_background_position(style, &len1, &unit1,
+ &len2, &unit2);
+ if (val == CSS_BACKGROUND_POSITION_SET) {
+ wrote = snprintf(ptr, *len, "background-position: ");
+ ptr += wrote;
+ *len -= wrote;
+
+ wrote = dump_css_unit(len1, unit1, ptr, *len);
+ ptr += wrote;
+ *len -= wrote;
+
+ wrote = snprintf(ptr, *len, " ");
+ ptr += wrote;
+ *len -= wrote;
+
+ wrote = dump_css_unit(len2, unit2, ptr, *len);
+ ptr += wrote;
+ *len -= wrote;
+
+ wrote = snprintf(ptr, *len, "\n");
+ ptr += wrote;
+ *len -= wrote;
+ }
+
+ val = css_computed_background_repeat(style);
+ switch (val) {
+ case CSS_BACKGROUND_REPEAT_REPEAT_X:
+ wrote = snprintf(ptr, *len, "background-repeat: repeat-x\n");
+ break;
+ case CSS_BACKGROUND_REPEAT_REPEAT_Y:
+ wrote = snprintf(ptr, *len, "background-repeat: repeat-y\n");
+ break;
+ case CSS_BACKGROUND_REPEAT_REPEAT:
+ wrote = snprintf(ptr, *len, "background-repeat: repeat\n");
+ break;
+ case CSS_BACKGROUND_REPEAT_NO_REPEAT:
+ wrote = snprintf(ptr, *len, "background-repeat: no-repeat\n");
+ break;
+ default:
+ wrote = 0;
+ break;
+ }
+ ptr += wrote;
+ *len -= wrote;
+
+ val = css_computed_border_collapse(style);
+ switch (val) {
+ case CSS_BORDER_COLLAPSE_SEPARATE:
+ wrote = snprintf(ptr, *len, "border-collapse: separate\n");
+ break;
+ case CSS_BORDER_COLLAPSE_COLLAPSE:
+ wrote = snprintf(ptr, *len, "border-collapse: collapse\n");
+ break;
+ default:
+ wrote = 0;
+ break;
+ }
+ ptr += wrote;
+ *len -= wrote;
+
+ if (style->uncommon != NULL) {
+ val = css_computed_border_spacing(style, &len1, &unit1,
+ &len2, &unit2);
+ if (val == CSS_BORDER_SPACING_SET) {
+ wrote = snprintf(ptr, *len, "border-spacing: ");
+ ptr += wrote;
+ *len -= wrote;
+
+ wrote = dump_css_unit(len1, unit1, ptr, *len);
+ ptr += wrote;
+ *len -= wrote;
+
+ wrote = snprintf(ptr, *len, " ");
+ ptr += wrote;
+ *len -= wrote;
+
+ wrote = dump_css_unit(len2, unit2, ptr, *len);
+ ptr += wrote;
+ *len -= wrote;
+
+ wrote = snprintf(ptr, *len, "\n");
+ ptr += wrote;
+ *len -= wrote;
+ }
+ }
+
+ val = css_computed_border_top_color(style, &color);
+ switch (val) {
+ case CSS_BORDER_COLOR_TRANSPARENT:
+ wrote = snprintf(ptr, *len, "border-top-color: transparent\n");
+ break;
+ case CSS_BORDER_COLOR_COLOR:
+ wrote = snprintf(ptr, *len, "border-top-color: #%08x\n", color);
+ break;
+ default:
+ wrote = 0;
+ break;
+ }
+ ptr += wrote;
+ *len -= wrote;
+
+ val = css_computed_border_right_color(style, &color);
+ switch (val) {
+ case CSS_BORDER_COLOR_TRANSPARENT:
+ wrote = snprintf(ptr, *len,
+ "border-right-color: transparent\n");
+ break;
+ case CSS_BORDER_COLOR_COLOR:
+ wrote = snprintf(ptr, *len,
+ "border-right-color: #%08x\n", color);
+ break;
+ default:
+ wrote = 0;
+ break;
+ }
+ ptr += wrote;
+ *len -= wrote;
+
+ val = css_computed_border_bottom_color(style, &color);
+ switch (val) {
+ case CSS_BORDER_COLOR_TRANSPARENT:
+ wrote = snprintf(ptr, *len,
+ "border-bottom-color: transparent\n");
+ break;
+ case CSS_BORDER_COLOR_COLOR:
+ wrote = snprintf(ptr, *len,
+ "border-bottom-color: #%08x\n", color);
+ break;
+ default:
+ wrote = 0;
+ break;
+ }
+ ptr += wrote;
+ *len -= wrote;
+
+ val = css_computed_border_left_color(style, &color);
+ switch (val) {
+ case CSS_BORDER_COLOR_TRANSPARENT:
+ wrote = snprintf(ptr, *len, "border-left-color: transparent\n");
+ break;
+ case CSS_BORDER_COLOR_COLOR:
+ wrote = snprintf(ptr, *len,
+ "border-left-color: #%08x\n", color);
+ break;
+ default:
+ wrote = 0;
+ break;
+ }
+ ptr += wrote;
+ *len -= wrote;
+
val = css_computed_color(style, &color);
if (val == CSS_COLOR_COLOR) {
wrote = snprintf(ptr, *len, "color: #%08x\n", color);
diff --git a/test/select-auto.c b/test/select-auto.c
index 75558c4..19af180 100644
--- a/test/select-auto.c
+++ b/test/select-auto.c
@@ -624,11 +624,11 @@ void run_test(line_ctx *ctx, const char *exp, size_t explen)
UNUSED(exp);
- buf = malloc(2 * explen);
+ buf = malloc(8192);
if (buf == NULL) {
assert(0 && "No memory for result data");
}
- buflen = 2 * explen;
+ buflen = 8192;
assert(css_select_ctx_create(myrealloc, NULL, &select) == CSS_OK);
@@ -647,10 +647,10 @@ void run_test(line_ctx *ctx, const char *exp, size_t explen)
dump_computed_style(computed, buf, &buflen);
- if (2 * explen - buflen != explen || memcmp(buf, exp, explen) != 0) {
+ if (8192 - buflen != explen || memcmp(buf, exp, explen) != 0) {
printf("Expected (%zu):\n%.*s\n", explen, (int) explen, exp);
- printf("Result (%zu):\n%.*s\n", 2 * explen - buflen,
- (int) (2 * explen - buflen), buf);
+ printf("Result (%zu):\n%.*s\n", 8192 - buflen,
+ (int) (8192 - buflen), buf);
assert(0 && "Result doesn't match expected");
}