forked from eclipse/lemminx
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
RelaxNG validation with XInclude / File association report DOCTYPE error
Fixes eclipse#1421 Signed-off-by: azerr <[email protected]>
- Loading branch information
1 parent
486955a
commit ac6fd25
Showing
8 changed files
with
282 additions
and
14 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
120 changes: 120 additions & 0 deletions
120
...ipse/lemminx/extensions/relaxng/xml/diagnostics/XMLFileAssociationRNCDiagnosticsTest.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,120 @@ | ||
/******************************************************************************* | ||
* Copyright (c) 2022 Red Hat Inc. and others. | ||
* All rights reserved. This program and the accompanying materials | ||
* which accompanies this distribution, and is available at | ||
* http://www.eclipse.org/legal/epl-v20.html | ||
* | ||
* SPDX-License-Identifier: EPL-2.0 | ||
* | ||
* Contributors: | ||
* Red Hat Inc. - initial API and implementation | ||
*******************************************************************************/ | ||
package org.eclipse.lemminx.extensions.relaxng.xml.diagnostics; | ||
|
||
import static org.eclipse.lemminx.XMLAssert.d; | ||
|
||
import java.io.File; | ||
import java.util.function.Consumer; | ||
|
||
import org.eclipse.lemminx.AbstractCacheBasedTest; | ||
import org.eclipse.lemminx.XMLAssert; | ||
import org.eclipse.lemminx.extensions.contentmodel.model.ContentModelManager; | ||
import org.eclipse.lemminx.extensions.contentmodel.settings.ContentModelSettings; | ||
import org.eclipse.lemminx.extensions.contentmodel.settings.XMLFileAssociation; | ||
import org.eclipse.lemminx.extensions.contentmodel.settings.XMLValidationRootSettings; | ||
import org.eclipse.lemminx.extensions.relaxng.xml.validator.RelaxNGErrorCode; | ||
import org.eclipse.lemminx.services.XMLLanguageService; | ||
import org.eclipse.lsp4j.Diagnostic; | ||
import org.junit.jupiter.api.Test; | ||
|
||
/** | ||
* XML Validation tests with RelaxNG compact syntax by using XML file | ||
* association. | ||
* | ||
*/ | ||
public class XMLFileAssociationRNCDiagnosticsTest extends AbstractCacheBasedTest { | ||
|
||
@Test | ||
public void valid() throws Exception { | ||
String xml = "<addressBook>\r\n" + // | ||
" <card>\r\n" + // | ||
" <name>John Smith</name>\r\n" + // | ||
" <email>[email protected]</email>\r\n" + // | ||
" </card>\r\n" + // | ||
" <card>\r\n" + // | ||
" <name>Fred Bloggs</name>\r\n" + // | ||
" <email>[email protected]</email>\r\n" + // | ||
" </card>\r\n" + // | ||
"</addressBook>"; | ||
testDiagnosticsFor(xml, "file:///test/addressBook.xml"); | ||
} | ||
|
||
@Test | ||
public void unkwown_element() throws Exception { | ||
String xml = "<addressBook>\r\n" + // | ||
" <card>\r\n" + // | ||
" <nameXXX>John Smith</nameXXX>\r\n" + // unknown_element -> element "nameXXX" not allowed anywhere; | ||
// expected element "name" | ||
" <email>[email protected]</email>\r\n" + // unexpected_element_required_element_missing -> "element | ||
// "email" not allowed yet; missing required element "name"" | ||
" </card>\r\n" + // | ||
" <card>\r\n" + // | ||
" <name>Fred Bloggs</name>\r\n" + // | ||
" <email>[email protected]</email>\r\n" + // | ||
" </card>\r\n" + // | ||
"</addressBook>"; | ||
testDiagnosticsFor(xml, "file:///test/addressBook.xml", // | ||
d(2, 5, 12, RelaxNGErrorCode.unknown_element), // | ||
d(3, 5, 10, RelaxNGErrorCode.unexpected_element_required_element_missing)); | ||
} | ||
|
||
@Test | ||
public void xinclude() throws Exception { | ||
ContentModelSettings settings = new ContentModelSettings(); | ||
XMLValidationRootSettings validation = new XMLValidationRootSettings(); | ||
validation.getXInclude().setEnabled(true); | ||
settings.setValidation(validation); | ||
String fileURI = new File("src/test/resources/relaxng/xinclude/foo.xml").toURI().toString(); | ||
|
||
String xml = "<foo xmlns:xi=\"http://www.w3.org/2001/XInclude\">\r\n" + // | ||
" <xi:include href=\"bar.xml\" />\r\n" + // | ||
"</foo>"; | ||
testDiagnosticsFor(xml, fileURI, settings); | ||
|
||
xml = "<foo xmlns:xi=\"http://www.w3.org/2001/XInclude\">\r\n" + // | ||
" <xi:include href=\"bar2.xml\" />\r\n" + // | ||
"</foo>"; | ||
testDiagnosticsFor(xml, fileURI, settings, // | ||
d(0, 1, 4, null), // | ||
d(0, 1, 4, RelaxNGErrorCode.incomplete_element_required_element_missing)); | ||
} | ||
|
||
private static void testDiagnosticsFor(String xml, String fileURI, Diagnostic... expected) { | ||
ContentModelSettings settings = new ContentModelSettings(); | ||
settings.setValidation(new XMLValidationRootSettings()); | ||
testDiagnosticsFor(xml, fileURI, settings, expected); | ||
} | ||
|
||
private static void testDiagnosticsFor(String xml, String fileURI, ContentModelSettings settings, | ||
Diagnostic... expected) { | ||
Consumer<XMLLanguageService> configuration = ls -> { | ||
ContentModelManager contentModelManager = ls.getComponent(ContentModelManager.class); | ||
contentModelManager | ||
.setFileAssociations(createXMLFileAssociation("src/test/resources/relaxng/")); | ||
}; | ||
|
||
XMLAssert.testDiagnosticsFor(xml, null, configuration, fileURI, true, settings, | ||
expected); | ||
} | ||
|
||
private static XMLFileAssociation[] createXMLFileAssociation(String baseSystemId) { | ||
XMLFileAssociation addressBook = new XMLFileAssociation(); | ||
addressBook.setPattern("**/addressBook.xml"); | ||
addressBook.setSystemId(baseSystemId + "addressBook.rnc"); | ||
XMLFileAssociation foo = new XMLFileAssociation(); | ||
foo.setPattern("**/foo.xml"); | ||
foo.setSystemId(baseSystemId + "/xinclude/foo.rnc"); | ||
return new XMLFileAssociation[] { addressBook, foo }; | ||
} | ||
|
||
} |
120 changes: 120 additions & 0 deletions
120
...ipse/lemminx/extensions/relaxng/xml/diagnostics/XMLFileAssociationRNGDiagnosticsTest.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,120 @@ | ||
/******************************************************************************* | ||
* Copyright (c) 2022 Red Hat Inc. and others. | ||
* All rights reserved. This program and the accompanying materials | ||
* which accompanies this distribution, and is available at | ||
* http://www.eclipse.org/legal/epl-v20.html | ||
* | ||
* SPDX-License-Identifier: EPL-2.0 | ||
* | ||
* Contributors: | ||
* Red Hat Inc. - initial API and implementation | ||
*******************************************************************************/ | ||
package org.eclipse.lemminx.extensions.relaxng.xml.diagnostics; | ||
|
||
import static org.eclipse.lemminx.XMLAssert.d; | ||
|
||
import java.io.File; | ||
import java.util.function.Consumer; | ||
|
||
import org.eclipse.lemminx.AbstractCacheBasedTest; | ||
import org.eclipse.lemminx.XMLAssert; | ||
import org.eclipse.lemminx.extensions.contentmodel.model.ContentModelManager; | ||
import org.eclipse.lemminx.extensions.contentmodel.settings.ContentModelSettings; | ||
import org.eclipse.lemminx.extensions.contentmodel.settings.XMLFileAssociation; | ||
import org.eclipse.lemminx.extensions.contentmodel.settings.XMLValidationRootSettings; | ||
import org.eclipse.lemminx.extensions.relaxng.xml.validator.RelaxNGErrorCode; | ||
import org.eclipse.lemminx.services.XMLLanguageService; | ||
import org.eclipse.lsp4j.Diagnostic; | ||
import org.junit.jupiter.api.Test; | ||
|
||
/** | ||
* XML Validation tests with RelaxNG XML syntax by using XML file | ||
* association. | ||
* | ||
*/ | ||
public class XMLFileAssociationRNGDiagnosticsTest extends AbstractCacheBasedTest { | ||
|
||
@Test | ||
public void valid() throws Exception { | ||
String xml = "<addressBook>\r\n" + // | ||
" <card>\r\n" + // | ||
" <name>John Smith</name>\r\n" + // | ||
" <email>[email protected]</email>\r\n" + // | ||
" </card>\r\n" + // | ||
" <card>\r\n" + // | ||
" <name>Fred Bloggs</name>\r\n" + // | ||
" <email>[email protected]</email>\r\n" + // | ||
" </card>\r\n" + // | ||
"</addressBook>"; | ||
testDiagnosticsFor(xml, "file:///test/addressBook.xml"); | ||
} | ||
|
||
@Test | ||
public void unkwown_element() throws Exception { | ||
String xml = "<addressBook>\r\n" + // | ||
" <card>\r\n" + // | ||
" <nameXXX>John Smith</nameXXX>\r\n" + // unknown_element -> element "nameXXX" not allowed anywhere; | ||
// expected element "name" | ||
" <email>[email protected]</email>\r\n" + // unexpected_element_required_element_missing -> "element | ||
// "email" not allowed yet; missing required element "name"" | ||
" </card>\r\n" + // | ||
" <card>\r\n" + // | ||
" <name>Fred Bloggs</name>\r\n" + // | ||
" <email>[email protected]</email>\r\n" + // | ||
" </card>\r\n" + // | ||
"</addressBook>"; | ||
testDiagnosticsFor(xml, "file:///test/addressBook.xml", // | ||
d(2, 5, 12, RelaxNGErrorCode.unknown_element), // | ||
d(3, 5, 10, RelaxNGErrorCode.unexpected_element_required_element_missing)); | ||
} | ||
|
||
@Test | ||
public void xinclude() throws Exception { | ||
ContentModelSettings settings = new ContentModelSettings(); | ||
XMLValidationRootSettings validation = new XMLValidationRootSettings(); | ||
validation.getXInclude().setEnabled(true); | ||
settings.setValidation(validation); | ||
String fileURI = new File("src/test/resources/relaxng/xinclude/foo.xml").toURI().toString(); | ||
|
||
String xml = "<foo xmlns:xi=\"http://www.w3.org/2001/XInclude\">\r\n" + // | ||
" <xi:include href=\"bar.xml\" />\r\n" + // | ||
"</foo>"; | ||
testDiagnosticsFor(xml, fileURI, settings); | ||
|
||
xml = "<foo xmlns:xi=\"http://www.w3.org/2001/XInclude\">\r\n" + // | ||
" <xi:include href=\"bar2.xml\" />\r\n" + // | ||
"</foo>"; | ||
testDiagnosticsFor(xml, fileURI, settings, // | ||
d(0, 1, 4, null), // | ||
d(0, 1, 4, RelaxNGErrorCode.incomplete_element_required_element_missing)); | ||
} | ||
|
||
private static void testDiagnosticsFor(String xml, String fileURI, Diagnostic... expected) { | ||
ContentModelSettings settings = new ContentModelSettings(); | ||
settings.setValidation(new XMLValidationRootSettings()); | ||
testDiagnosticsFor(xml, fileURI, settings, expected); | ||
} | ||
|
||
private static void testDiagnosticsFor(String xml, String fileURI, ContentModelSettings settings, | ||
Diagnostic... expected) { | ||
Consumer<XMLLanguageService> configuration = ls -> { | ||
ContentModelManager contentModelManager = ls.getComponent(ContentModelManager.class); | ||
contentModelManager | ||
.setFileAssociations(createXMLFileAssociation("src/test/resources/relaxng/")); | ||
}; | ||
|
||
XMLAssert.testDiagnosticsFor(xml, null, configuration, fileURI, true, settings, | ||
expected); | ||
} | ||
|
||
private static XMLFileAssociation[] createXMLFileAssociation(String baseSystemId) { | ||
XMLFileAssociation addressBook = new XMLFileAssociation(); | ||
addressBook.setPattern("**/addressBook.xml"); | ||
addressBook.setSystemId(baseSystemId + "addressBook_v3.rng"); | ||
XMLFileAssociation foo = new XMLFileAssociation(); | ||
foo.setPattern("**/foo.xml"); | ||
foo.setSystemId(baseSystemId + "/xinclude/foo.rng"); | ||
return new XMLFileAssociation[] { addressBook, foo }; | ||
} | ||
|
||
} |
2 changes: 2 additions & 0 deletions
2
org.eclipse.lemminx/src/test/resources/relaxng/xinclude/bar.xml
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,2 @@ | ||
|
||
<bar></bar> |
2 changes: 2 additions & 0 deletions
2
org.eclipse.lemminx/src/test/resources/relaxng/xinclude/bar2.xml
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,2 @@ | ||
|
||
<bar2></bar2> |
5 changes: 5 additions & 0 deletions
5
org.eclipse.lemminx/src/test/resources/relaxng/xinclude/foo.rnc
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,5 @@ | ||
element foo { | ||
element bar { | ||
attribute xml:base{text} | ||
} | ||
} |
14 changes: 14 additions & 0 deletions
14
org.eclipse.lemminx/src/test/resources/relaxng/xinclude/foo.rng
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,14 @@ | ||
<grammar xmlns="http://relaxng.org/ns/structure/1.0" | ||
datatypeLibrary="http://www.w3.org/2001/XMLSchema-datatypes" | ||
xmlns:xi="http://www.w3.org/2001/XInclude"> | ||
<start> | ||
<ref name="foo" /> | ||
</start> | ||
<define name="foo"> | ||
<element name="foo"> | ||
<element name="bar"> | ||
<attribute name="xml:base" /> | ||
</element> | ||
</element> | ||
</define> | ||
</grammar> |
3 changes: 3 additions & 0 deletions
3
org.eclipse.lemminx/src/test/resources/relaxng/xinclude/foo.xml
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,3 @@ | ||
<foo xmlns:xi="http://www.w3.org/2001/XInclude"> | ||
<xi:include href="bar.xml" /> | ||
</foo> |