more work on Relax-NG augmented/updated the regression tests Daniel
* relaxng.c: more work on Relax-NG
* test/relaxng/* result/relaxng/*: augmented/updated the
regression tests
Daniel
diff --git a/ChangeLog b/ChangeLog
index bbe98d7..9974d09 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,9 @@
+Sun Jan 26 20:38:43 CET 2003 Daniel Veillard <daniel@veillard.com>
+
+ * relaxng.c: more work on Relax-NG
+ * test/relaxng/* result/relaxng/*: augmented/updated the
+ regression tests
+
Sun Jan 26 01:49:58 CET 2003 Daniel Veillard <daniel@veillard.com>
* relaxng.c: more work on Relax-NG
diff --git a/relaxng.c b/relaxng.c
index 2391f72..a104d8e 100644
--- a/relaxng.c
+++ b/relaxng.c
@@ -653,6 +653,8 @@
* Type library hooks *
* *
************************************************************************/
+static xmlChar *xmlRelaxNGNormalize(xmlRelaxNGValidCtxtPtr ctxt,
+ const xmlChar *str);
/**
* xmlRelaxNGSchemaTypeHave:
@@ -767,8 +769,31 @@
const xmlChar *type ATTRIBUTE_UNUSED,
const xmlChar *value1 ATTRIBUTE_UNUSED,
const xmlChar *value2 ATTRIBUTE_UNUSED) {
- TODO
- return(1);
+ int ret = -1;
+
+ if (xmlStrEqual(type, BAD_CAST "string")) {
+ ret = xmlStrEqual(value1, value2);
+ } else if (xmlStrEqual(type, BAD_CAST "token")) {
+ if (!xmlStrEqual(value1, value2)) {
+ xmlChar *nval, *nvalue;
+
+ /*
+ * TODO: trivial optimizations are possible by
+ * computing at compile-time
+ */
+ nval = xmlRelaxNGNormalize(NULL, value1);
+ nvalue = xmlRelaxNGNormalize(NULL, value2);
+
+ if ((nval == NULL) || (nvalue == NULL) ||
+ (!xmlStrEqual(nval, nvalue)))
+ ret = -1;
+ if (nval != NULL)
+ xmlFree(nval);
+ if (nvalue != NULL)
+ xmlFree(nvalue);
+ }
+ }
+ return(ret);
}
static int xmlRelaxNGTypeInitialized = 0;
@@ -2656,8 +2681,13 @@
ret = (xmlChar *) xmlMalloc((len + 1) * sizeof(xmlChar));
if (ret == NULL) {
- VALID_CTXT();
- VALID_ERROR("xmlRelaxNGNormalize: out of memory\n");
+ if (ctxt != NULL) {
+ VALID_CTXT();
+ VALID_ERROR("xmlRelaxNGNormalize: out of memory\n");
+ } else {
+ xmlGenericError(xmlGenericErrorContext,
+ "xmlRelaxNGNormalize: out of memory\n");
+ }
return(NULL);
}
p = ret;
@@ -2756,7 +2786,24 @@
case XML_RELAXNG_VALUE: {
if (!xmlStrEqual(value, define->value)) {
if (define->name != NULL) {
- TODO /* value validation w.r.t. the type */
+ xmlRelaxNGTypeLibraryPtr lib;
+
+ lib = (xmlRelaxNGTypeLibraryPtr) define->data;
+ if ((lib != NULL) && (lib->comp != NULL))
+ ret = lib->comp(lib->data, define->name, value,
+ define->value);
+ else
+ ret = -1;
+ if (ret < 0) {
+ VALID_CTXT();
+ VALID_ERROR("Internal: failed to compare type %s\n",
+ define->name);
+ return(-1);
+ } else if (ret == 1) {
+ ret = 0;
+ } else {
+ ret = -1;
+ }
} else {
xmlChar *nval, *nvalue;
@@ -2767,7 +2814,8 @@
nval = xmlRelaxNGNormalize(ctxt, define->value);
nvalue = xmlRelaxNGNormalize(ctxt, value);
- if (!xmlStrEqual(nval, nvalue))
+ if ((nval == NULL) || (nvalue == NULL) ||
+ (!xmlStrEqual(nval, nvalue)))
ret = -1;
if (nval != NULL)
xmlFree(nval);
@@ -3036,7 +3084,7 @@
for (i = 0;i < state->nbAttrs;i++) {
if (state->attrs[i] != NULL) {
VALID_CTXT();
- VALID_ERROR("Extra attribute %s for element %s\n",
+ VALID_ERROR("Invalid attribute %s for element %s\n",
state->attrs[i]->name, node->name);
ret = -1;
}
@@ -3169,7 +3217,37 @@
xmlFree(content);
break;
}
- case XML_RELAXNG_VALUE:
+ case XML_RELAXNG_VALUE: {
+ xmlChar *content;
+ xmlChar *oldvalue;
+
+ content = xmlNodeGetContent(node);
+ oldvalue = ctxt->state->value;
+ ctxt->state->value = content;
+ ret = xmlRelaxNGValidateValue(ctxt, define);
+ ctxt->state->value = oldvalue;
+ if (ret == -1) {
+ VALID_CTXT();
+ VALID_ERROR("internal error validating %s\n", define->name);
+ } else if (ret == 0) {
+ ctxt->state->seq = node->next;
+ }
+ /*
+ * TODO cover the problems with
+ * <p>12<!-- comment -->34</p>
+ * TODO detect full element coverage at compilation time.
+ */
+ if ((node != NULL) && (node->next != NULL)) {
+ VALID_CTXT();
+ VALID_ERROR("The data does not cover the full element %s\n",
+ node->parent->name);
+ ret = -1;
+ }
+ if (content != NULL)
+ xmlFree(content);
+ break;
+ }
+
TODO
break;
}
diff --git a/result/relaxng/tutor3_2_1.err b/result/relaxng/tutor3_2_1.err
index 48ac0c4..6904d3b 100644
--- a/result/relaxng/tutor3_2_1.err
+++ b/result/relaxng/tutor3_2_1.err
@@ -1,3 +1,3 @@
-error detected at relaxng.c:2982
error detected at relaxng.c:3030
+error detected at relaxng.c:3078
xmlRelaxNGValidateDefinition(): validated card : -1
diff --git a/result/relaxng/tutor3_5_2.err b/result/relaxng/tutor3_5_2.err
index 9c72d17..cb3157b 100644
--- a/result/relaxng/tutor3_5_2.err
+++ b/result/relaxng/tutor3_5_2.err
@@ -1,5 +1,5 @@
xmlRelaxNGValidateAttribute(name): -1
xmlRelaxNGValidateDefinition(): validated email : 0
xmlRelaxNGValidateDefinition(): validated card : -1
-error detected at relaxng.c:3030
+error detected at relaxng.c:3078
xmlRelaxNGValidateDefinition(): validated addressBook : -1
diff --git a/result/relaxng/tutor5_1_1.err b/result/relaxng/tutor5_1_1.err
index e9fa2d9..fa62fe3 100644
--- a/result/relaxng/tutor5_1_1.err
+++ b/result/relaxng/tutor5_1_1.err
@@ -1,3 +1,3 @@
-Unimplemented block at relaxng.c:670
-Unimplemented block at relaxng.c:689
+Unimplemented block at relaxng.c:672
+Unimplemented block at relaxng.c:691
xmlRelaxNGValidateDefinition(): validated number : 0
diff --git a/result/relaxng/tutor5_2_1.err b/result/relaxng/tutor5_2_1.err
index ac9beb0..b56a85a 100644
--- a/result/relaxng/tutor5_2_1.err
+++ b/result/relaxng/tutor5_2_1.err
@@ -1,7 +1,7 @@
-Unimplemented block at relaxng.c:670
-Unimplemented block at relaxng.c:670
-Unimplemented block at relaxng.c:689
+Unimplemented block at relaxng.c:672
+Unimplemented block at relaxng.c:672
+Unimplemented block at relaxng.c:691
xmlRelaxNGValidateDefinition(): validated x : 0
-Unimplemented block at relaxng.c:689
+Unimplemented block at relaxng.c:691
xmlRelaxNGValidateDefinition(): validated y : 0
xmlRelaxNGValidateDefinition(): validated point : 0
diff --git a/result/relaxng/tutor5_3_1.err b/result/relaxng/tutor5_3_1.err
index 5f30338..b4edac2 100644
--- a/result/relaxng/tutor5_3_1.err
+++ b/result/relaxng/tutor5_3_1.err
@@ -1,3 +1,3 @@
-error detected at relaxng.c:3163
+error detected at relaxng.c:3211
xmlRelaxNGValidateDefinition(): validated note : 0
xmlRelaxNGValidateDefinition(): validated bad : -1
diff --git a/result/relaxng/tutor6_1_3 b/result/relaxng/tutor6_1_3
index 2dea674..56aa11c 100644
--- a/result/relaxng/tutor6_1_3
+++ b/result/relaxng/tutor6_1_3
@@ -1,2 +1,2 @@
-Extra attribute preferredFormat for element card
+Invalid attribute preferredFormat for element card
./test/relaxng/tutor6_1_3.xml validation generated an internal error
diff --git a/result/relaxng/tutor6_1_3.err b/result/relaxng/tutor6_1_3.err
index 68f183f..a0bb286 100644
--- a/result/relaxng/tutor6_1_3.err
+++ b/result/relaxng/tutor6_1_3.err
@@ -1,5 +1,5 @@
xmlRelaxNGValidateAttribute(preferredFormat): -1
xmlRelaxNGValidateAttribute(email): 0
xmlRelaxNGValidateAttribute(name): 0
-error detected at relaxng.c:3038
+error detected at relaxng.c:3086
xmlRelaxNGValidateDefinition(): validated card : -1
diff --git a/result/relaxng/tutor6_1_4 b/result/relaxng/tutor6_1_4
new file mode 100644
index 0000000..d9b2291
--- /dev/null
+++ b/result/relaxng/tutor6_1_4
@@ -0,0 +1 @@
+./test/relaxng/tutor6_1_4.xml validates
diff --git a/result/relaxng/tutor6_1_4.err b/result/relaxng/tutor6_1_4.err
new file mode 100644
index 0000000..6e45621
--- /dev/null
+++ b/result/relaxng/tutor6_1_4.err
@@ -0,0 +1,4 @@
+xmlRelaxNGValidateAttribute(preferredFormat): 0
+xmlRelaxNGValidateAttribute(email): 0
+xmlRelaxNGValidateAttribute(name): 0
+xmlRelaxNGValidateDefinition(): validated card : 0
diff --git a/result/relaxng/tutor6_1_5 b/result/relaxng/tutor6_1_5
new file mode 100644
index 0000000..f601d7e
--- /dev/null
+++ b/result/relaxng/tutor6_1_5
@@ -0,0 +1 @@
+./test/relaxng/tutor6_1_5.xml validates
diff --git a/result/relaxng/tutor6_1_5.err b/result/relaxng/tutor6_1_5.err
new file mode 100644
index 0000000..6e45621
--- /dev/null
+++ b/result/relaxng/tutor6_1_5.err
@@ -0,0 +1,4 @@
+xmlRelaxNGValidateAttribute(preferredFormat): 0
+xmlRelaxNGValidateAttribute(email): 0
+xmlRelaxNGValidateAttribute(name): 0
+xmlRelaxNGValidateDefinition(): validated card : 0
diff --git a/result/relaxng/tutor6_2_1 b/result/relaxng/tutor6_2_1
new file mode 100644
index 0000000..d07807b
--- /dev/null
+++ b/result/relaxng/tutor6_2_1
@@ -0,0 +1 @@
+./test/relaxng/tutor6_2_1.xml validates
diff --git a/result/relaxng/tutor6_2_1.err b/result/relaxng/tutor6_2_1.err
new file mode 100644
index 0000000..fab4d8d
--- /dev/null
+++ b/result/relaxng/tutor6_2_1.err
@@ -0,0 +1,4 @@
+xmlRelaxNGValidateDefinition(): validated name : 0
+xmlRelaxNGValidateDefinition(): validated email : 0
+xmlRelaxNGValidateDefinition(): validated preferredFormat : 0
+xmlRelaxNGValidateDefinition(): validated card : 0
diff --git a/result/relaxng/tutor6_2_2 b/result/relaxng/tutor6_2_2
new file mode 100644
index 0000000..df10075
--- /dev/null
+++ b/result/relaxng/tutor6_2_2
@@ -0,0 +1 @@
+./test/relaxng/tutor6_2_2.xml validates
diff --git a/result/relaxng/tutor6_2_2.err b/result/relaxng/tutor6_2_2.err
new file mode 100644
index 0000000..fab4d8d
--- /dev/null
+++ b/result/relaxng/tutor6_2_2.err
@@ -0,0 +1,4 @@
+xmlRelaxNGValidateDefinition(): validated name : 0
+xmlRelaxNGValidateDefinition(): validated email : 0
+xmlRelaxNGValidateDefinition(): validated preferredFormat : 0
+xmlRelaxNGValidateDefinition(): validated card : 0
diff --git a/result/relaxng/tutor6_2_3 b/result/relaxng/tutor6_2_3
new file mode 100644
index 0000000..17602d3
--- /dev/null
+++ b/result/relaxng/tutor6_2_3
@@ -0,0 +1 @@
+./test/relaxng/tutor6_2_3.xml validates
diff --git a/result/relaxng/tutor6_2_3.err b/result/relaxng/tutor6_2_3.err
new file mode 100644
index 0000000..fab4d8d
--- /dev/null
+++ b/result/relaxng/tutor6_2_3.err
@@ -0,0 +1,4 @@
+xmlRelaxNGValidateDefinition(): validated name : 0
+xmlRelaxNGValidateDefinition(): validated email : 0
+xmlRelaxNGValidateDefinition(): validated preferredFormat : 0
+xmlRelaxNGValidateDefinition(): validated card : 0
diff --git a/result/relaxng/tutor6_2_4 b/result/relaxng/tutor6_2_4
new file mode 100644
index 0000000..4d52fa1
--- /dev/null
+++ b/result/relaxng/tutor6_2_4
@@ -0,0 +1,2 @@
+Extra content for element preferredFormat
+./test/relaxng/tutor6_2_4.xml validation generated an internal error
diff --git a/result/relaxng/tutor6_2_4.err b/result/relaxng/tutor6_2_4.err
new file mode 100644
index 0000000..2f65d34
--- /dev/null
+++ b/result/relaxng/tutor6_2_4.err
@@ -0,0 +1,5 @@
+xmlRelaxNGValidateDefinition(): validated name : 0
+xmlRelaxNGValidateDefinition(): validated email : 0
+error detected at relaxng.c:3078
+xmlRelaxNGValidateDefinition(): validated preferredFormat : -1
+xmlRelaxNGValidateDefinition(): validated card : -1
diff --git a/result/relaxng/tutor6_3_1 b/result/relaxng/tutor6_3_1
new file mode 100644
index 0000000..8a9225c
--- /dev/null
+++ b/result/relaxng/tutor6_3_1
@@ -0,0 +1,2 @@
+Invalid attribute preferredFormat for element card
+./test/relaxng/tutor6_3_1.xml validation generated an internal error
diff --git a/result/relaxng/tutor6_3_1.err b/result/relaxng/tutor6_3_1.err
new file mode 100644
index 0000000..a0bb286
--- /dev/null
+++ b/result/relaxng/tutor6_3_1.err
@@ -0,0 +1,5 @@
+xmlRelaxNGValidateAttribute(preferredFormat): -1
+xmlRelaxNGValidateAttribute(email): 0
+xmlRelaxNGValidateAttribute(name): 0
+error detected at relaxng.c:3086
+xmlRelaxNGValidateDefinition(): validated card : -1
diff --git a/test/relaxng/tutor6_1_4.xml b/test/relaxng/tutor6_1_4.xml
new file mode 100644
index 0000000..0ad64dd
--- /dev/null
+++ b/test/relaxng/tutor6_1_4.xml
@@ -0,0 +1 @@
+<card name="John Smith" email="js@example.com" preferredFormat=" html "/>
diff --git a/test/relaxng/tutor6_1_5.xml b/test/relaxng/tutor6_1_5.xml
new file mode 100644
index 0000000..c5d22bd
--- /dev/null
+++ b/test/relaxng/tutor6_1_5.xml
@@ -0,0 +1,2 @@
+<card name="John Smith" email="js@example.com" preferredFormat="html"/>
+
diff --git a/test/relaxng/tutor6_2_1.xml b/test/relaxng/tutor6_2_1.xml
new file mode 100644
index 0000000..5064bf2
--- /dev/null
+++ b/test/relaxng/tutor6_2_1.xml
@@ -0,0 +1,5 @@
+<card>
+ <name>John Smith</name>
+ <email>js@example.com</email>
+ <preferredFormat>text</preferredFormat>
+</card>
diff --git a/test/relaxng/tutor6_2_2.xml b/test/relaxng/tutor6_2_2.xml
new file mode 100644
index 0000000..57da2e8
--- /dev/null
+++ b/test/relaxng/tutor6_2_2.xml
@@ -0,0 +1,5 @@
+<card>
+ <name>John Smith</name>
+ <email>js@example.com</email>
+ <preferredFormat>html</preferredFormat>
+</card>
diff --git a/test/relaxng/tutor6_2_3.xml b/test/relaxng/tutor6_2_3.xml
new file mode 100644
index 0000000..acca979
--- /dev/null
+++ b/test/relaxng/tutor6_2_3.xml
@@ -0,0 +1,5 @@
+<card>
+ <name>John Smith</name>
+ <email>js@example.com</email>
+ <preferredFormat> html </preferredFormat>
+</card>
diff --git a/test/relaxng/tutor6_2_4.xml b/test/relaxng/tutor6_2_4.xml
new file mode 100644
index 0000000..c3f723b
--- /dev/null
+++ b/test/relaxng/tutor6_2_4.xml
@@ -0,0 +1,5 @@
+<card>
+ <name>John Smith</name>
+ <email>js@example.com</email>
+ <preferredFormat>error</preferredFormat>
+</card>
diff --git a/test/relaxng/tutor6_3_1.xml b/test/relaxng/tutor6_3_1.xml
new file mode 100644
index 0000000..0ad64dd
--- /dev/null
+++ b/test/relaxng/tutor6_3_1.xml
@@ -0,0 +1 @@
+<card name="John Smith" email="js@example.com" preferredFormat=" html "/>