selector_node->name = one_selector;
selector_node->line = nl_counter;
selector_node->value2 = apr_pstrdup(doc->pool, "");
- vv += pass_len;
- if (*vv == '{') vv++;
- selector_node->value1 = scss_trim(doc->pool, s_cut_before_block_closer(doc, vv, &pass_len, &nl_counter));
- s_get_property_list(doc, selector_node, selector_node->value1);
s_add_child_node(doc, atnode, selector_node);
vv += pass_len;
- vv = scss_trim(doc->pool, vv);
- if (*vv == '}') vv++;
+ if (*vv != ';') {
+ if (*vv == '{') vv++;
+ selector_node->value1 = scss_trim(doc->pool, s_cut_before_block_closer(doc, vv, &pass_len, &nl_counter));
+ s_get_property_list(doc, selector_node, selector_node->value1);
+ vv += pass_len;
+ vv = scss_trim(doc->pool, vv);
+ if (*vv == '}') vv++;
+ }
+ else {
+ selector_node->value1 = apr_pstrdup(doc->pool, "");
+ }
one_selector = s_get_one_selector(doc, vv, &pass_len, &nl_counter);
}
}
selector_node->line = nl_counter;
selector_node->type = SCSSTYPE_SELECTOR;
selector_node->name = one_selector;
- s += pass_len;
- if (*s == '{') s++;
- selector_node->value1 = scss_trim(doc->pool, s_cut_before_block_closer(doc, s, &pass_len, &nl_counter));
- s_get_property_list(doc, selector_node, selector_node->value1);
s_add_child_node(doc, doc->rootNode, selector_node);
- s += pass_len + 1;
+ s += pass_len;
+ if (*s != ';') {
+ if (*s == '{') s++;
+ selector_node->value1 = scss_trim(doc->pool, s_cut_before_block_closer(doc, s, &pass_len, &nl_counter));
+ s_get_property_list(doc, selector_node, selector_node->value1);
+ s += pass_len + 1;
+ }
+ else {
+ selector_node->value1 = apr_pstrdup(doc->pool, "");
+ }
}
}
if (! *s) break;
while(*s) {
PASS_COMMENT(s, &counter);
JUDGE_STRINGS(s);
- if (! sq && !dq && *s == '{') {
+ if (! sq && !dq && (*s == '{' || *s == ';')) {
break;
}
s++;
void test_selector_001();
+void test_selector_002();
+void test_selector_003();
+void test_selector_004();
+void test_selector_005();
+void test_selector_006();
/* pend */
int
CU_initialize_registry();
atkeyword_suite = CU_add_suite("test Simple CSS(is based CSS2 but not CSS2) Parser", NULL, NULL);
CU_add_test(atkeyword_suite, "selector 001", test_selector_001);
+ CU_add_test(atkeyword_suite, "selector 002", test_selector_002);
+ CU_add_test(atkeyword_suite, "selector 003", test_selector_003);
+ CU_add_test(atkeyword_suite, "selector 004", test_selector_004);
+ CU_add_test(atkeyword_suite, "selector 005", test_selector_005);
+ CU_add_test(atkeyword_suite, "selector 006", test_selector_006);
/* aend */
CU_basic_run_tests();
fprintf(stderr, "end %s\n", __func__);
#undef TEST_STRING
}
+void test_selector_002()
+{
+#define TEST_STRING "a1\n{ aaa:bbb; }"
+ SCSSDocPtr_t doc;
+ apr_pool_t *pool;
+
+ fprintf(stderr, "start %s\n", __func__);
+ apr_initialize();
+ apr_pool_create(&pool, NULL);
+
+ doc = scss_create_doc(pool);
+ scss_parser(doc, pool, TEST_STRING);
+
+ CU_ASSERT_OR_GOTO_END(doc != NULL);
+ CU_ASSERT_OR_GOTO_END(doc->rootNode != NULL);
+ CU_ASSERT_OR_GOTO_END(doc->rootNode->type == SCSSTYPE_STYLESHEET);
+ CU_ASSERT_OR_GOTO_END(doc->rootNode->child != NULL);
+ CU_ASSERT_OR_GOTO_END(doc->rootNode->child->name != NULL);
+ CU_ASSERT_OR_GOTO_END(strcasecmp(doc->rootNode->child->name, "<sentinel>") == 0);
+ CU_ASSERT_OR_GOTO_END(doc->rootNode->child->next != NULL);
+ CU_ASSERT_OR_GOTO_END(doc->rootNode->child->next->type == SCSSTYPE_SELECTOR);
+ CU_ASSERT_OR_GOTO_END(doc->rootNode->child->next->name != NULL);
+ CU_ASSERT_OR_GOTO_END(strcasecmp(doc->rootNode->child->next->name, "a1") == 0);
+ CU_ASSERT_OR_GOTO_END(strcasecmp(doc->rootNode->child->next->value1, "aaa:bbb;") == 0);
+ CU_ASSERT_OR_GOTO_END(doc->rootNode->child->next->next == doc->rootNode->child);
+ CU_ASSERT_OR_GOTO_END(doc->rootNode->child->next->ref == &doc->rootNode->child->next);
+
+ CU_ASSERT_OR_GOTO_END(doc->rootNode->child->next->child != NULL);
+ CU_ASSERT_OR_GOTO_END(doc->rootNode->child->next->child->name != NULL);
+ CU_ASSERT_STRING_EQUAL_OR_GOTO_END(doc->rootNode->child->next->child->name, "<sentinel>");
+ CU_ASSERT_OR_GOTO_END(doc->rootNode->child->next->child->next != NULL);
+ CU_ASSERT_OR_GOTO_END(doc->rootNode->child->next->child->next->name != NULL);
+ CU_ASSERT_OR_GOTO_END(doc->rootNode->child->next->child->next->type == SCSSTYPE_PROPERTY);
+ CU_ASSERT_STRING_EQUAL_OR_GOTO_END(doc->rootNode->child->next->child->next->name, "aaa");
+ CU_ASSERT_STRING_EQUAL_OR_GOTO_END(doc->rootNode->child->next->child->next->value1, "bbb");
+
+
+end:
+ apr_terminate();
+ fprintf(stderr, "end %s\n", __func__);
+#undef TEST_STRING
+}
+void test_selector_003()
+{
+#define TEST_STRING "\na1\n{ aaa:bbb; }"
+ SCSSDocPtr_t doc;
+ apr_pool_t *pool;
+
+ fprintf(stderr, "start %s\n", __func__);
+ apr_initialize();
+ apr_pool_create(&pool, NULL);
+
+ doc = scss_create_doc(pool);
+ scss_parser(doc, pool, TEST_STRING);
+
+ CU_ASSERT_OR_GOTO_END(doc != NULL);
+ CU_ASSERT_OR_GOTO_END(doc->rootNode != NULL);
+ CU_ASSERT_OR_GOTO_END(doc->rootNode->type == SCSSTYPE_STYLESHEET);
+ CU_ASSERT_OR_GOTO_END(doc->rootNode->child != NULL);
+ CU_ASSERT_OR_GOTO_END(doc->rootNode->child->name != NULL);
+ CU_ASSERT_OR_GOTO_END(strcasecmp(doc->rootNode->child->name, "<sentinel>") == 0);
+ CU_ASSERT_OR_GOTO_END(doc->rootNode->child->next != NULL);
+ CU_ASSERT_OR_GOTO_END(doc->rootNode->child->next->type == SCSSTYPE_SELECTOR);
+ CU_ASSERT_OR_GOTO_END(doc->rootNode->child->next->name != NULL);
+ CU_ASSERT_OR_GOTO_END(strcasecmp(doc->rootNode->child->next->name, "a1") == 0);
+ CU_ASSERT_OR_GOTO_END(strcasecmp(doc->rootNode->child->next->value1, "aaa:bbb;") == 0);
+ CU_ASSERT_OR_GOTO_END(doc->rootNode->child->next->next == doc->rootNode->child);
+ CU_ASSERT_OR_GOTO_END(doc->rootNode->child->next->ref == &doc->rootNode->child->next);
+
+ CU_ASSERT_OR_GOTO_END(doc->rootNode->child->next->child != NULL);
+ CU_ASSERT_OR_GOTO_END(doc->rootNode->child->next->child->name != NULL);
+ CU_ASSERT_STRING_EQUAL_OR_GOTO_END(doc->rootNode->child->next->child->name, "<sentinel>");
+ CU_ASSERT_OR_GOTO_END(doc->rootNode->child->next->child->next != NULL);
+ CU_ASSERT_OR_GOTO_END(doc->rootNode->child->next->child->next->name != NULL);
+ CU_ASSERT_OR_GOTO_END(doc->rootNode->child->next->child->next->type == SCSSTYPE_PROPERTY);
+ CU_ASSERT_STRING_EQUAL_OR_GOTO_END(doc->rootNode->child->next->child->next->name, "aaa");
+ CU_ASSERT_STRING_EQUAL_OR_GOTO_END(doc->rootNode->child->next->child->next->value1, "bbb");
+
+
+end:
+ apr_terminate();
+ fprintf(stderr, "end %s\n", __func__);
+#undef TEST_STRING
+}
+void test_selector_004()
+{
+#define TEST_STRING "\na1\n{\naaa:bbb;\n}"
+ SCSSDocPtr_t doc;
+ apr_pool_t *pool;
+
+ fprintf(stderr, "start %s\n", __func__);
+ apr_initialize();
+ apr_pool_create(&pool, NULL);
+
+ doc = scss_create_doc(pool);
+ scss_parser(doc, pool, TEST_STRING);
+
+ CU_ASSERT_OR_GOTO_END(doc != NULL);
+ CU_ASSERT_OR_GOTO_END(doc->rootNode != NULL);
+ CU_ASSERT_OR_GOTO_END(doc->rootNode->type == SCSSTYPE_STYLESHEET);
+ CU_ASSERT_OR_GOTO_END(doc->rootNode->child != NULL);
+ CU_ASSERT_OR_GOTO_END(doc->rootNode->child->name != NULL);
+ CU_ASSERT_OR_GOTO_END(strcasecmp(doc->rootNode->child->name, "<sentinel>") == 0);
+ CU_ASSERT_OR_GOTO_END(doc->rootNode->child->next != NULL);
+ CU_ASSERT_OR_GOTO_END(doc->rootNode->child->next->type == SCSSTYPE_SELECTOR);
+ CU_ASSERT_OR_GOTO_END(doc->rootNode->child->next->name != NULL);
+ CU_ASSERT_OR_GOTO_END(strcasecmp(doc->rootNode->child->next->name, "a1") == 0);
+ CU_ASSERT_OR_GOTO_END(strcasecmp(doc->rootNode->child->next->value1, "aaa:bbb;") == 0);
+ CU_ASSERT_OR_GOTO_END(doc->rootNode->child->next->next == doc->rootNode->child);
+ CU_ASSERT_OR_GOTO_END(doc->rootNode->child->next->ref == &doc->rootNode->child->next);
+
+ CU_ASSERT_OR_GOTO_END(doc->rootNode->child->next->child != NULL);
+ CU_ASSERT_OR_GOTO_END(doc->rootNode->child->next->child->name != NULL);
+ CU_ASSERT_STRING_EQUAL_OR_GOTO_END(doc->rootNode->child->next->child->name, "<sentinel>");
+ CU_ASSERT_OR_GOTO_END(doc->rootNode->child->next->child->next != NULL);
+ CU_ASSERT_OR_GOTO_END(doc->rootNode->child->next->child->next->name != NULL);
+ CU_ASSERT_OR_GOTO_END(doc->rootNode->child->next->child->next->type == SCSSTYPE_PROPERTY);
+ CU_ASSERT_STRING_EQUAL_OR_GOTO_END(doc->rootNode->child->next->child->next->name, "aaa");
+ CU_ASSERT_STRING_EQUAL_OR_GOTO_END(doc->rootNode->child->next->child->next->value1, "bbb");
+
+
+end:
+ apr_terminate();
+ fprintf(stderr, "end %s\n", __func__);
+#undef TEST_STRING
+}
+void test_selector_005()
+{
+#define TEST_STRING "a1"
+ SCSSDocPtr_t doc;
+ apr_pool_t *pool;
+
+ fprintf(stderr, "start %s\n", __func__);
+ apr_initialize();
+ apr_pool_create(&pool, NULL);
+
+ doc = scss_create_doc(pool);
+ scss_parser(doc, pool, TEST_STRING);
+
+ CU_ASSERT_OR_GOTO_END(doc != NULL);
+ CU_ASSERT_OR_GOTO_END(doc->rootNode != NULL);
+ CU_ASSERT_OR_GOTO_END(doc->rootNode->type == SCSSTYPE_STYLESHEET);
+ CU_ASSERT_OR_GOTO_END(doc->rootNode->child != NULL);
+ CU_ASSERT_OR_GOTO_END(doc->rootNode->child->name != NULL);
+ CU_ASSERT_OR_GOTO_END(strcasecmp(doc->rootNode->child->name, "<sentinel>") == 0);
+ CU_ASSERT_OR_GOTO_END(doc->rootNode->child->next != NULL);
+ CU_ASSERT_OR_GOTO_END(doc->rootNode->child->next->type == SCSSTYPE_SELECTOR);
+ CU_ASSERT_OR_GOTO_END(doc->rootNode->child->next->name != NULL);
+ CU_ASSERT_OR_GOTO_END(strcasecmp(doc->rootNode->child->next->name, "a1") == 0);
+ CU_ASSERT_OR_GOTO_END(strcasecmp(doc->rootNode->child->next->value1, "") == 0);
+ CU_ASSERT_OR_GOTO_END(doc->rootNode->child->next->next == doc->rootNode->child);
+ CU_ASSERT_OR_GOTO_END(doc->rootNode->child->next->ref == &doc->rootNode->child->next);
+
+ CU_ASSERT_OR_GOTO_END(doc->rootNode->child->next->child == NULL);
+
+end:
+ apr_terminate();
+ fprintf(stderr, "end %s\n", __func__);
+#undef TEST_STRING
+}
+void test_selector_006()
+{
+#define TEST_STRING "a1;a2 { aa:bb }"
+ SCSSDocPtr_t doc;
+ apr_pool_t *pool;
+
+ fprintf(stderr, "start %s\n", __func__);
+ apr_initialize();
+ apr_pool_create(&pool, NULL);
+
+ doc = scss_create_doc(pool);
+ scss_parser(doc, pool, TEST_STRING);
+
+ CU_ASSERT_OR_GOTO_END(doc != NULL);
+ CU_ASSERT_OR_GOTO_END(doc->rootNode != NULL);
+ CU_ASSERT_OR_GOTO_END(doc->rootNode->type == SCSSTYPE_STYLESHEET);
+ CU_ASSERT_OR_GOTO_END(doc->rootNode->child != NULL);
+ CU_ASSERT_OR_GOTO_END(doc->rootNode->child->name != NULL);
+ CU_ASSERT_OR_GOTO_END(strcasecmp(doc->rootNode->child->name, "<sentinel>") == 0);
+ CU_ASSERT_OR_GOTO_END(doc->rootNode->child->next != NULL);
+ CU_ASSERT_OR_GOTO_END(doc->rootNode->child->next->type == SCSSTYPE_SELECTOR);
+ CU_ASSERT_OR_GOTO_END(doc->rootNode->child->next->name != NULL);
+ CU_ASSERT_OR_GOTO_END(strcasecmp(doc->rootNode->child->next->name, "a1") == 0);
+ CU_ASSERT_OR_GOTO_END(strcasecmp(doc->rootNode->child->next->value1, "") == 0);
+
+ CU_ASSERT_OR_GOTO_END(doc->rootNode->child->next->next != NULL);
+ CU_ASSERT_OR_GOTO_END(doc->rootNode->child->next->next->type == SCSSTYPE_SELECTOR);
+ CU_ASSERT_OR_GOTO_END(doc->rootNode->child->next->next->name != NULL);
+ CU_ASSERT_OR_GOTO_END(strcasecmp(doc->rootNode->child->next->next->name, "a2") == 0);
+ CU_ASSERT_OR_GOTO_END(strcasecmp(doc->rootNode->child->next->next->value1, "aa:bb") == 0);
+ CU_ASSERT_OR_GOTO_END(doc->rootNode->child->next->next->next == doc->rootNode->child);
+ CU_ASSERT_OR_GOTO_END(doc->rootNode->child->next->next->ref == &doc->rootNode->child->next->next);
+
+ CU_ASSERT_OR_GOTO_END(doc->rootNode->child->next->child == NULL);
+ CU_ASSERT_OR_GOTO_END(doc->rootNode->child->next->next->child != NULL);
+ CU_ASSERT_OR_GOTO_END(doc->rootNode->child->next->next->child->name != NULL);
+ CU_ASSERT_STRING_EQUAL_OR_GOTO_END(doc->rootNode->child->next->next->child->name, "<sentinel>");
+ CU_ASSERT_OR_GOTO_END(doc->rootNode->child->next->next->child->type == SCSSTYPE_SENTINEL);
+ CU_ASSERT_OR_GOTO_END(doc->rootNode->child->next->next->child->next != NULL);
+ CU_ASSERT_OR_GOTO_END(doc->rootNode->child->next->next->child->next->name != NULL);
+ CU_ASSERT_OR_GOTO_END(doc->rootNode->child->next->next->child->next->type == SCSSTYPE_PROPERTY);
+ CU_ASSERT_STRING_EQUAL_OR_GOTO_END(doc->rootNode->child->next->next->child->next->name, "aa");
+ CU_ASSERT_STRING_EQUAL_OR_GOTO_END(doc->rootNode->child->next->next->child->next->value1, "bb");
+ CU_ASSERT_OR_GOTO_END(doc->rootNode->child->next->next->child->next->child == NULL);
+ CU_ASSERT_OR_GOTO_END(doc->rootNode->child->next->next->child->next->next == doc->rootNode->child->next->next->child);
+ CU_ASSERT_OR_GOTO_END(doc->rootNode->child->next->next->child->next->ref == &doc->rootNode->child->next->next->child->next);
+
+
+end:
+ apr_terminate();
+ fprintf(stderr, "end %s\n", __func__);
+#undef TEST_STRING
+}
/*
* vim:ts=2 et
*/