From 20e133220e5d1535f278d1fb8c8ea003323ac9a7 Mon Sep 17 00:00:00 2001 From: konn Date: Wed, 11 Jun 2008 01:06:44 +0000 Subject: [PATCH] * Added mix part tests. git-svn-id: svn+ssh://svn.sourceforge.jp/svnroot/modchxj/mod_chxj/branches/sandbox@2706 1a406e8e-add9-4483-a2c8-d8cac5b7c224 --- src/chxj_css.c | 28 ++--- src/qs_parse_string.c | 2 +- test/chxj_css/test_chxj_css.c | 285 ++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 297 insertions(+), 18 deletions(-) diff --git a/src/chxj_css.c b/src/chxj_css.c index 155669a7..b784018a 100644 --- a/src/chxj_css.c +++ b/src/chxj_css.c @@ -254,6 +254,7 @@ s_search_selector_regexp(Doc *doc, request_rec *r, apr_pool_t *pool, css_stylesh do { DBG(r, "start do while"); *strrchr(src, *one) = 0; + DBG(r, "src:[%s] one:[%c]", src, *one); switch (*one) { case '>': /* Child selectors */ DBG(r, "child selectors"); @@ -264,6 +265,8 @@ s_search_selector_regexp(Doc *doc, request_rec *r, apr_pool_t *pool, css_stylesh if (ret) { DBG(r, "continue do while"); node = node->parent; + DBG(r, "new node:[%x]", node); + DBG(r, "new node->prev:[%x]", node->prev); loop = 1; } } @@ -281,7 +284,7 @@ s_search_selector_regexp(Doc *doc, request_rec *r, apr_pool_t *pool, css_stylesh case '+': /* Adjacent sibling selectors */ - DBG(r, "descendant selectors"); + DBG(r, "sibling selectors"); if (chxj_ap_regexec(pattern3, src, pattern3->re_nsub + 1, match, 0) == 0) { DBG(r, "has any parent"); one = chxj_ap_pregsub(pool, "$1",src, pattern3->re_nsub + 1, match); @@ -289,26 +292,17 @@ s_search_selector_regexp(Doc *doc, request_rec *r, apr_pool_t *pool, css_stylesh if (ret) { DBG(r, "continue do while"); loop = 1; - if (*one == '+') { - if (sib_node) { - sib_node = node; - } - node = node->prev; - } - else { - if (sib_node) { - node = sib_node->parent; - sib_node = NULL; - } - else { - node = node->parent; - } - } + node = node->prev; break; } } else { - DBG(r, "prev:[%x]", node->prev); + DBG(r, "now node:[%s][%x]", node->name, node); + if (! node->prev) { + ret_sel = NULL; + goto end_of_search; + } + DBG(r, "prev:[%x] now:[%s]", node->prev, node->name); DBG(r, "prev->name:[%s] src:[%s]", node->prev->name, src); char *ret = s_cmp_now_node_vs_current_style(doc, r, pool, src, pattern4, node->prev); if (ret) { diff --git a/src/qs_parse_string.c b/src/qs_parse_string.c index de99415e..3535eb35 100644 --- a/src/qs_parse_string.c +++ b/src/qs_parse_string.c @@ -403,7 +403,7 @@ qs_dump_node(Doc *doc, Node *node, int indent) (char *)qs_get_node_value(doc,p)); } else { - DBG(doc->r,"%*.*sNode:[%s]\n", indent,indent," ", qs_get_node_name(doc,p)); + DBG(doc->r,"%*.*sNode:[%s] prev:[%x]\n", indent,indent," ", qs_get_node_name(doc,p), p->prev); } for (attr = (Attr *)qs_get_attr(doc,p); attr; attr = (Attr *)qs_get_next_attr(doc,attr)) { DBG(doc->r,"%*.*s ATTR:[%s]\n", indent,indent," ", (char *)qs_get_attr_name(doc,attr)); diff --git a/test/chxj_css/test_chxj_css.c b/test/chxj_css/test_chxj_css.c index 5702368e..1ab3b2d4 100644 --- a/test/chxj_css/test_chxj_css.c +++ b/test/chxj_css/test_chxj_css.c @@ -80,6 +80,13 @@ void test_chxj_css_find_selector_shib_006(); void test_chxj_css_find_selector_shib_007(); void test_chxj_css_find_selector_shib_008(); void test_chxj_css_find_selector_shib_009(); +void test_chxj_css_find_selector_shib_010(); + +/* MIX (p + div > p + hr) */ +void test_chxj_css_find_selector_mix_001(); +void test_chxj_css_find_selector_mix_002(); /* p + div p + hr */ +void test_chxj_css_find_selector_mix_003(); +void test_chxj_css_find_selector_mix_004(); /* pend */ int @@ -137,6 +144,12 @@ main() CU_add_test(css_suite, "test css find_selector with '+' 007", test_chxj_css_find_selector_shib_007); CU_add_test(css_suite, "test css find_selector with '+' 008", test_chxj_css_find_selector_shib_008); CU_add_test(css_suite, "test css find_selector with '+' 009", test_chxj_css_find_selector_shib_009); + CU_add_test(css_suite, "test css find_selector with '+' 010", test_chxj_css_find_selector_shib_010); + + CU_add_test(css_suite, "test css find_selector with 'mix' 001", test_chxj_css_find_selector_mix_001); + CU_add_test(css_suite, "test css find_selector with 'mix' 002", test_chxj_css_find_selector_mix_002); + CU_add_test(css_suite, "test css find_selector with 'mix' 003", test_chxj_css_find_selector_mix_003); + CU_add_test(css_suite, "test css find_selector with 'mix' 004", test_chxj_css_find_selector_mix_004); /* aend */ CU_basic_run_tests(); @@ -2451,6 +2464,278 @@ void test_chxj_css_find_selector_shib_009() fprintf(stderr, "end %s\n", __func__); #undef TEST_STRING } +char *test_chxj_serf_get047(request_rec *r, apr_pool_t *ppool, const char *uri_path) +{ + static char *css = "html,body, hr + p + hr { display: none }"; + + return css; +} +void test_chxj_css_find_selector_shib_010() +{ +#define TEST_STRING "

aaa


" + Doc doc; + Node *node; + Node *tmp_node; + Node *node_sv; + css_stylesheet_t *ret; + css_selector_t *sel; + APR_INIT; + chxj_serf_get = test_chxj_serf_get047; + + fprintf(stderr, "start %s\n", __func__); + doc.r = &r; + qs_init_malloc(&doc); + qs_init_root_node(&doc); + doc.parse_mode = PARSE_MODE_CHTML; + + node_sv = node = qs_parse_string(&doc, TEST_STRING, sizeof(TEST_STRING)-1); + tmp_node = node->child; + node = tmp_node; + tmp_node = node->child; + node = tmp_node; + tmp_node = node->next; + node = tmp_node; + tmp_node = node->child; + node = tmp_node; + tmp_node = node->child; + node = tmp_node; + tmp_node = node->child; + node = tmp_node; + tmp_node = node->next; + node = tmp_node; + tmp_node = node->next; + node = tmp_node; + + apr_uri_parse(p, "http://localhost:888/abc", &r.parsed_uri); \ + + ret = chxj_css_parse_from_uri(&r, r.pool, NULL, "/hoge.css"); + CU_ASSERT(ret != NULL); + + sel = chxj_css_find_selector(&doc, ret, node); + CU_ASSERT(sel != NULL); + APR_TERM; + fprintf(stderr, "end %s\n", __func__); +#undef TEST_STRING +} + +/* MIX */ +char *test_chxj_serf_get048(request_rec *r, apr_pool_t *ppool, const char *uri_path) +{ + static char *css = "html,body, p + div > p + hr { display: none }"; + + return css; +} +void test_chxj_css_find_selector_mix_001() +{ +#define TEST_STRING "

aaa


" + Doc doc; + Node *node; + Node *tmp_node; + Node *node_sv; + css_stylesheet_t *ret; + css_selector_t *sel; + APR_INIT; + chxj_serf_get = test_chxj_serf_get048; + + fprintf(stderr, "start %s\n", __func__); + doc.r = &r; + qs_init_malloc(&doc); + qs_init_root_node(&doc); + doc.parse_mode = PARSE_MODE_CHTML; + + node_sv = node = qs_parse_string(&doc, TEST_STRING, sizeof(TEST_STRING)-1); + tmp_node = node->child; /* root -> html */ + node = tmp_node; + tmp_node = node->child; /* html -> head */ + node = tmp_node; + tmp_node = node->next; /* head -> body */ + node = tmp_node; + tmp_node = node->child; /* body -> div */ + node = tmp_node; + tmp_node = node->child; /* div -> p */ + node = tmp_node; + tmp_node = node->next; /* p -> div */ + node = tmp_node; + tmp_node = node->child; /* div -> p */ + node = tmp_node; + tmp_node = node->next; /* p -> hr*/ + node = tmp_node; + qs_dump_node(&doc, node_sv, 0); + + apr_uri_parse(p, "http://localhost:888/abc", &r.parsed_uri); \ + + ret = chxj_css_parse_from_uri(&r, r.pool, NULL, "/hoge.css"); + CU_ASSERT(ret != NULL); + + sel = chxj_css_find_selector(&doc, ret, node); + CU_ASSERT(sel != NULL); + APR_TERM; + fprintf(stderr, "end %s\n", __func__); +#undef TEST_STRING +} +char *test_chxj_serf_get049(request_rec *r, apr_pool_t *ppool, const char *uri_path) +{ + static char *css = "html,body, p + div p + hr { display: none }"; + + return css; +} +void test_chxj_css_find_selector_mix_002() +{ +#define TEST_STRING "

aaa


" + Doc doc; + Node *node; + Node *tmp_node; + Node *node_sv; + css_stylesheet_t *ret; + css_selector_t *sel; + APR_INIT; + chxj_serf_get = test_chxj_serf_get049; + + fprintf(stderr, "start %s\n", __func__); + doc.r = &r; + qs_init_malloc(&doc); + qs_init_root_node(&doc); + doc.parse_mode = PARSE_MODE_CHTML; + + node_sv = node = qs_parse_string(&doc, TEST_STRING, sizeof(TEST_STRING)-1); + tmp_node = node->child; /* root -> html */ + node = tmp_node; + tmp_node = node->child; /* html -> head */ + node = tmp_node; + tmp_node = node->next; /* head -> body */ + node = tmp_node; + tmp_node = node->child; /* body -> div */ + node = tmp_node; + tmp_node = node->child; /* div -> p */ + node = tmp_node; + tmp_node = node->next; /* p -> div */ + node = tmp_node; + tmp_node = node->child; /* div -> p */ + node = tmp_node; + tmp_node = node->next; /* p -> hr*/ + node = tmp_node; + qs_dump_node(&doc, node_sv, 0); + + apr_uri_parse(p, "http://localhost:888/abc", &r.parsed_uri); \ + + ret = chxj_css_parse_from_uri(&r, r.pool, NULL, "/hoge.css"); + CU_ASSERT(ret != NULL); + + sel = chxj_css_find_selector(&doc, ret, node); + CU_ASSERT(sel != NULL); + APR_TERM; + fprintf(stderr, "end %s\n", __func__); +#undef TEST_STRING +} + +char *test_chxj_serf_get050(request_rec *r, apr_pool_t *ppool, const char *uri_path) +{ + static char *css = "html,body, p + div p > hr { display: none }"; + + return css; +} +void test_chxj_css_find_selector_mix_003() +{ +#define TEST_STRING "

aaa


" + Doc doc; + Node *node; + Node *tmp_node; + Node *node_sv; + css_stylesheet_t *ret; + css_selector_t *sel; + APR_INIT; + chxj_serf_get = test_chxj_serf_get050; + + fprintf(stderr, "start %s\n", __func__); + doc.r = &r; + qs_init_malloc(&doc); + qs_init_root_node(&doc); + doc.parse_mode = PARSE_MODE_CHTML; + + node_sv = node = qs_parse_string(&doc, TEST_STRING, sizeof(TEST_STRING)-1); + tmp_node = node->child; /* root -> html */ + node = tmp_node; + tmp_node = node->child; /* html -> head */ + node = tmp_node; + tmp_node = node->next; /* head -> body */ + node = tmp_node; + tmp_node = node->child; /* body -> div */ + node = tmp_node; + tmp_node = node->child; /* div -> p */ + node = tmp_node; + tmp_node = node->next; /* p -> div */ + node = tmp_node; + tmp_node = node->child; /* div -> p */ + node = tmp_node; + tmp_node = node->next; /* p -> hr*/ + node = tmp_node; + qs_dump_node(&doc, node_sv, 0); + + apr_uri_parse(p, "http://localhost:888/abc", &r.parsed_uri); \ + + ret = chxj_css_parse_from_uri(&r, r.pool, NULL, "/hoge.css"); + CU_ASSERT(ret != NULL); + + sel = chxj_css_find_selector(&doc, ret, node); + CU_ASSERT(sel == NULL); + APR_TERM; + fprintf(stderr, "end %s\n", __func__); +#undef TEST_STRING +} +char *test_chxj_serf_get051(request_rec *r, apr_pool_t *ppool, const char *uri_path) +{ + static char *css = "html,body, p > div p + hr { display: none }"; + + return css; +} +void test_chxj_css_find_selector_mix_004() +{ +#define TEST_STRING "

aaa


" + Doc doc; + Node *node; + Node *tmp_node; + Node *node_sv; + css_stylesheet_t *ret; + css_selector_t *sel; + APR_INIT; + chxj_serf_get = test_chxj_serf_get051; + + fprintf(stderr, "start %s\n", __func__); + doc.r = &r; + qs_init_malloc(&doc); + qs_init_root_node(&doc); + doc.parse_mode = PARSE_MODE_CHTML; + + node_sv = node = qs_parse_string(&doc, TEST_STRING, sizeof(TEST_STRING)-1); + tmp_node = node->child; /* root -> html */ + node = tmp_node; + tmp_node = node->child; /* html -> head */ + node = tmp_node; + tmp_node = node->next; /* head -> body */ + node = tmp_node; + tmp_node = node->child; /* body -> div */ + node = tmp_node; + tmp_node = node->child; /* div -> p */ + node = tmp_node; + tmp_node = node->child; /* p -> div */ + node = tmp_node; + tmp_node = node->child; /* div -> p */ + node = tmp_node; + tmp_node = node->next; /* p -> hr */ + node = tmp_node; + qs_dump_node(&doc, node_sv, 0); + + apr_uri_parse(p, "http://localhost:888/abc", &r.parsed_uri); \ + + ret = chxj_css_parse_from_uri(&r, r.pool, NULL, "/hoge.css"); + CU_ASSERT(ret != NULL); + + sel = chxj_css_find_selector(&doc, ret, node); + CU_ASSERT(sel != NULL); + APR_TERM; + fprintf(stderr, "end %s\n", __func__); +#undef TEST_STRING +} /* * vim:ts=2 et */ -- 2.11.0