From ecf1e1cef48a15975755da0029426f3f121f4efc Mon Sep 17 00:00:00 2001 From: "Andreas Penski (init)" Date: Tue, 28 Jul 2020 17:05:59 +0200 Subject: [PATCH] #58 Fix schematron evaluation add tests with schematron --- CHANGELOG.md | 3 + .../validationtool/impl/DefaultResult.java | 3 +- .../validationtool/api/InputFactoryTest.java | 2 +- .../cmd/CommandlineApplicationTest.java | 2 +- .../config/SchemaBuilderTest.java | 2 +- .../validationtool/daemon/CheckHandlerIT.java | 2 +- .../validationtool/impl/DefaultCheckTest.java | 39 ++- .../de/kosit/validationtool/impl/Helper.java | 7 +- .../impl/SimpleScenarioCheckTest.java | 2 +- .../impl/tasks/SchemaValidatorActionTest.java | 2 +- .../simple/input/foo-schematron-invalid.xml | 7 + ...-invalid.xml => simple-schema-invalid.xml} | 0 .../input/simple-schematron-invalid.xml | 16 ++ .../examples/simple/repository/simple.sch | 18 ++ .../examples/simple/repository/simple.xsd | 2 +- .../examples/simple/repository/simple.xsl | 232 ++++++++++++++++++ .../resources/examples/simple/scenarios.xml | 13 +- 17 files changed, 340 insertions(+), 12 deletions(-) create mode 100644 src/test/resources/examples/simple/input/foo-schematron-invalid.xml rename src/test/resources/examples/simple/input/{simple-invalid.xml => simple-schema-invalid.xml} (100%) create mode 100644 src/test/resources/examples/simple/input/simple-schematron-invalid.xml create mode 100644 src/test/resources/examples/simple/repository/simple.sch create mode 100644 src/test/resources/examples/simple/repository/simple.xsl diff --git a/CHANGELOG.md b/CHANGELOG.md index 7bf22fe..b3282b5 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,9 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/) and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). ## 1.3.1 +### Fixed +- failed-asserts are not evaluated correctly while computing overall acceptance + ### Changed - engine info contains version number of the validator (configurations can output this in the report for maintainance puposes) diff --git a/src/main/java/de/kosit/validationtool/impl/DefaultResult.java b/src/main/java/de/kosit/validationtool/impl/DefaultResult.java index e8be8ac..79e79e5 100644 --- a/src/main/java/de/kosit/validationtool/impl/DefaultResult.java +++ b/src/main/java/de/kosit/validationtool/impl/DefaultResult.java @@ -134,7 +134,8 @@ public class DefaultResult implements Result { private List filterSchematronResult(final Class type) { return getSchematronResult() != null - ? getSchematronResult().stream().filter(type::isInstance).map(type::cast).collect(Collectors.toList()) + ? getSchematronResult().stream().flatMap(e -> e.getActivePatternAndFiredRuleAndFailedAssert().stream()) + .filter(type::isInstance).map(type::cast).collect(Collectors.toList()) : Collections.emptyList(); } diff --git a/src/test/java/de/kosit/validationtool/api/InputFactoryTest.java b/src/test/java/de/kosit/validationtool/api/InputFactoryTest.java index aa8e6e3..fd1a209 100644 --- a/src/test/java/de/kosit/validationtool/api/InputFactoryTest.java +++ b/src/test/java/de/kosit/validationtool/api/InputFactoryTest.java @@ -77,7 +77,7 @@ public class InputFactoryTest { public void testHashCodeGeneration() throws IOException { final byte[] s1 = drain(InputFactory.read(Simple.SIMPLE_VALID.toURL())).getHashCode(); final byte[] s2 = drain(InputFactory.read(Simple.SIMPLE_VALID.toURL())).getHashCode(); - final byte[] s3 = drain(InputFactory.read(Simple.INVALID.toURL())).getHashCode(); + final byte[] s3 = drain(InputFactory.read(Simple.SCHEMA_INVALID.toURL())).getHashCode(); assertThat(s1).isNotEmpty(); assertThat(s1).isEqualTo(s2); assertThat(s3).isNotEmpty(); diff --git a/src/test/java/de/kosit/validationtool/cmd/CommandlineApplicationTest.java b/src/test/java/de/kosit/validationtool/cmd/CommandlineApplicationTest.java index 55fa847..75548c7 100644 --- a/src/test/java/de/kosit/validationtool/cmd/CommandlineApplicationTest.java +++ b/src/test/java/de/kosit/validationtool/cmd/CommandlineApplicationTest.java @@ -141,7 +141,7 @@ public class CommandlineApplicationTest { final String[] args = new String[] { "-s", Paths.get(Simple.SCENARIOS).toString(), "-o", this.output.toString(), "-r", Paths.get(Simple.REPOSITORY_URI).toString(), Paths.get(Simple.EXAMPLES).toString() }; CommandLineApplication.mainProgram(args); - assertThat(this.commandLine.getErrorOutput()).contains("Processing 6 object(s) completed"); + assertThat(this.commandLine.getErrorOutput()).contains("Processing 8 object(s) completed"); } @Test diff --git a/src/test/java/de/kosit/validationtool/config/SchemaBuilderTest.java b/src/test/java/de/kosit/validationtool/config/SchemaBuilderTest.java index e7e43b0..bff1c7d 100644 --- a/src/test/java/de/kosit/validationtool/config/SchemaBuilderTest.java +++ b/src/test/java/de/kosit/validationtool/config/SchemaBuilderTest.java @@ -50,7 +50,7 @@ public class SchemaBuilderTest { @Test public void testInvalidSchema() { - final SchemaBuilder builder = schema("myname").schemaLocation(Simple.INVALID); + final SchemaBuilder builder = schema("myname").schemaLocation(Simple.SCHEMA_INVALID); final Result, String> result = builder.build(Simple.createContentRepository()); assertThat(result).isNotNull(); assertThat(result.isValid()).isFalse(); diff --git a/src/test/java/de/kosit/validationtool/daemon/CheckHandlerIT.java b/src/test/java/de/kosit/validationtool/daemon/CheckHandlerIT.java index 9aef88b..0642137 100644 --- a/src/test/java/de/kosit/validationtool/daemon/CheckHandlerIT.java +++ b/src/test/java/de/kosit/validationtool/daemon/CheckHandlerIT.java @@ -38,7 +38,7 @@ public class CheckHandlerIT extends BaseIT { @Test @Ignore // no default error report yet public void internalServerErrorTest() throws IOException { - try ( final InputStream io = Simple.INVALID.toURL().openStream() ) { + try ( final InputStream io = Simple.SCHEMA_INVALID.toURL().openStream() ) { given().contentType(APPLICATION_XML).body(toContent(io)).when().post("/").then().statusCode(200); } } diff --git a/src/test/java/de/kosit/validationtool/impl/DefaultCheckTest.java b/src/test/java/de/kosit/validationtool/impl/DefaultCheckTest.java index 1b86c24..62d94dd 100644 --- a/src/test/java/de/kosit/validationtool/impl/DefaultCheckTest.java +++ b/src/test/java/de/kosit/validationtool/impl/DefaultCheckTest.java @@ -20,9 +20,11 @@ package de.kosit.validationtool.impl; import static de.kosit.validationtool.api.InputFactory.read; +import static de.kosit.validationtool.impl.Helper.Simple.FOO_SCHEMATRON_INVALID; import static de.kosit.validationtool.impl.Helper.Simple.GARBAGE; import static de.kosit.validationtool.impl.Helper.Simple.NOT_WELLFORMED; import static de.kosit.validationtool.impl.Helper.Simple.REJECTED; +import static de.kosit.validationtool.impl.Helper.Simple.SCHEMATRON_INVALID; import static de.kosit.validationtool.impl.Helper.Simple.UNKNOWN; import static org.assertj.core.api.Assertions.assertThat; @@ -48,8 +50,6 @@ import de.kosit.validationtool.impl.Helper.Simple; */ public class DefaultCheckTest { - - public static final int MULTI_COUNT = 5; private DefaultCheck implementation; @@ -67,6 +67,8 @@ public class DefaultCheckTest { assertThat(doc).isNotNull(); assertThat(doc.getReport()).isNotNull(); assertThat(doc.isAcceptable()).isTrue(); + assertThat(doc.isSchematronValid()).isTrue(); + assertThat(doc.isSchemaValid()).isTrue(); assertThat(doc.getAcceptRecommendation()).isEqualTo(AcceptRecommendation.ACCEPTABLE); } @@ -157,4 +159,37 @@ public class DefaultCheckTest { assertThat(result.getReportDocument()).isNotNull(); } + @Test + public void testSchematronFailed() { + final Result result = this.implementation.checkInput(read(SCHEMATRON_INVALID)); + assertThat(result).isNotNull(); + assertThat(result.isWellformed()).isTrue(); + assertThat(result.isSchemaValid()).isTrue(); + assertThat(result.getFailedAsserts()).isNotEmpty(); + assertThat(result.isSchematronValid()).isFalse(); + assertThat(result.isProcessingSuccessful()).isTrue(); + // acceptMatch overules schematron!!! + assertThat(result.getAcceptRecommendation()).isEqualTo(AcceptRecommendation.ACCEPTABLE); + assertThat(result.isAcceptable()).isTrue(); + assertThat(result.getReport()).isNotNull(); + assertThat(result.getReportDocument()).isNotNull(); + + } + + @Test + public void testSchematronFailedWithoutAcceptMatch() { + final Result result = this.implementation.checkInput(read(FOO_SCHEMATRON_INVALID)); + assertThat(result).isNotNull(); + assertThat(result.isWellformed()).isTrue(); + assertThat(result.isSchemaValid()).isTrue(); + result.getFailedAsserts(); + assertThat(result.isSchematronValid()).isFalse(); + assertThat(result.getFailedAsserts()).isNotEmpty(); + assertThat(result.isProcessingSuccessful()).isTrue(); + assertThat(result.getAcceptRecommendation()).isEqualTo(AcceptRecommendation.REJECT); + assertThat(result.isAcceptable()).isFalse(); + assertThat(result.getReport()).isNotNull(); + assertThat(result.getReportDocument()).isNotNull(); + } + } diff --git a/src/test/java/de/kosit/validationtool/impl/Helper.java b/src/test/java/de/kosit/validationtool/impl/Helper.java index 1fa0837..ed5e13c 100644 --- a/src/test/java/de/kosit/validationtool/impl/Helper.java +++ b/src/test/java/de/kosit/validationtool/impl/Helper.java @@ -58,13 +58,17 @@ public class Helper { public static final URI FOO = Simple.ROOT.resolve("input/foo.xml"); + public static final URI FOO_SCHEMATRON_INVALID = EXAMPLES.resolve("foo-schematron-invalid.xml"); + public static final URI REJECTED = Simple.ROOT.resolve("input/withManualReject.xml"); public static final URI SCENARIOS = ROOT.resolve("scenarios.xml"); public static final URI REPOSITORY_URI = ROOT.resolve("repository/"); - public static final URI INVALID = ROOT.resolve("input/simple-invalid.xml"); + public static final URI SCHEMA_INVALID = ROOT.resolve("input/simple-schema-invalid.xml"); + + public static final URI SCHEMATRON_INVALID = ROOT.resolve("input/simple-schematron-invalid.xml"); public static final URI NOT_WELLFORMED = ROOT.resolve("input/simple-not-wellformed.xml"); @@ -95,6 +99,7 @@ public class Helper { public static final URI SCENARIOS = ROOT.resolve("scenarios.xml"); public static final URI SCENARIOS_ILLFORMED = ROOT.resolve("scenarios-illformed.xml"); + } public static class Resolving { diff --git a/src/test/java/de/kosit/validationtool/impl/SimpleScenarioCheckTest.java b/src/test/java/de/kosit/validationtool/impl/SimpleScenarioCheckTest.java index 0040d31..b9b5de7 100644 --- a/src/test/java/de/kosit/validationtool/impl/SimpleScenarioCheckTest.java +++ b/src/test/java/de/kosit/validationtool/impl/SimpleScenarioCheckTest.java @@ -38,7 +38,7 @@ public class SimpleScenarioCheckTest { @Test public void testInvalid() throws MalformedURLException { - final Result result = this.implementation.checkInput(InputFactory.read(Simple.INVALID.toURL())); + final Result result = this.implementation.checkInput(InputFactory.read(Simple.SCHEMA_INVALID.toURL())); assertThat(result).isNotNull(); assertThat(result.getAcceptRecommendation()).isEqualTo(AcceptRecommendation.REJECT); assertThat(result.getSchemaViolations()).isNotEmpty(); diff --git a/src/test/java/de/kosit/validationtool/impl/tasks/SchemaValidatorActionTest.java b/src/test/java/de/kosit/validationtool/impl/tasks/SchemaValidatorActionTest.java index bdc6248..a25ffe9 100644 --- a/src/test/java/de/kosit/validationtool/impl/tasks/SchemaValidatorActionTest.java +++ b/src/test/java/de/kosit/validationtool/impl/tasks/SchemaValidatorActionTest.java @@ -78,7 +78,7 @@ public class SchemaValidatorActionTest { @Test public void testValidationFailure() throws MalformedURLException { - final Input input = InputFactory.read(Simple.INVALID.toURL()); + final Input input = InputFactory.read(Simple.SCHEMA_INVALID.toURL()); final CheckAction.Bag bag = createBag(input); this.service.check(bag); assertThat(bag.getSchemaValidationResult().isValid()).isFalse(); diff --git a/src/test/resources/examples/simple/input/foo-schematron-invalid.xml b/src/test/resources/examples/simple/input/foo-schematron-invalid.xml new file mode 100644 index 0000000..7135295 --- /dev/null +++ b/src/test/resources/examples/simple/input/foo-schematron-invalid.xml @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff --git a/src/test/resources/examples/simple/input/simple-invalid.xml b/src/test/resources/examples/simple/input/simple-schema-invalid.xml similarity index 100% rename from src/test/resources/examples/simple/input/simple-invalid.xml rename to src/test/resources/examples/simple/input/simple-schema-invalid.xml diff --git a/src/test/resources/examples/simple/input/simple-schematron-invalid.xml b/src/test/resources/examples/simple/input/simple-schematron-invalid.xml new file mode 100644 index 0000000..9c95879 --- /dev/null +++ b/src/test/resources/examples/simple/input/simple-schematron-invalid.xml @@ -0,0 +1,16 @@ + + + + ads + ds + + + + + + +
some data
+ + +
+
\ No newline at end of file diff --git a/src/test/resources/examples/simple/repository/simple.sch b/src/test/resources/examples/simple/repository/simple.sch new file mode 100644 index 0000000..2839542 --- /dev/null +++ b/src/test/resources/examples/simple/repository/simple.sch @@ -0,0 +1,18 @@ + + + Schematron Simple + + + + + + + + The element inner appears exactly once. + + + The element inner appears exactly once. + + + + \ No newline at end of file diff --git a/src/test/resources/examples/simple/repository/simple.xsd b/src/test/resources/examples/simple/repository/simple.xsd index 30ba1f4..8330f3e 100644 --- a/src/test/resources/examples/simple/repository/simple.xsd +++ b/src/test/resources/examples/simple/repository/simple.xsd @@ -7,7 +7,7 @@ - + diff --git a/src/test/resources/examples/simple/repository/simple.xsl b/src/test/resources/examples/simple/repository/simple.xsl new file mode 100644 index 0000000..95f6304 --- /dev/null +++ b/src/test/resources/examples/simple/repository/simple.xsl @@ -0,0 +1,232 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + / + + + + + + *: + + [namespace-uri()=' + + '] + + + + [ + + ] + + + + / + + @ + + + @*[local-name()=' + + ' and namespace-uri()=' + + '] + + + + + + + + + / + + + [ + + ] + + + + /@ + + + + + + + / + + + [ + + ] + + + + /@ + + + + + + + + + + + + + + + + + + + + + + + + . + + + + + U + + U + + + + U. + + n + + + + U. + + _ + + _ + + + + + + + + + +   +   +   + + + + + + + + + + + + + + + + Schematron Simple + + + + + + + + + + + + + + content-1 + + + + The element inner appears exactly once. + + + + + + + + + + + + + + + + content-2 + + + + The element inner appears exactly once. + + + + + + + + + + diff --git a/src/test/resources/examples/simple/scenarios.xml b/src/test/resources/examples/simple/scenarios.xml index 3a99296..a896a23 100644 --- a/src/test/resources/examples/simple/scenarios.xml +++ b/src/test/resources/examples/simple/scenarios.xml @@ -41,6 +41,12 @@ simple.xsd + + + Sample Schematron + simple.xsl + + Report für eRechnung @@ -58,13 +64,18 @@ http://validator.kosit.de/test-sample /test:foo - Sample Schema simple.xsd + + + Sample Schematron + simple.xsl + + Report für eRechnung