Modernize yang-data-codec-xml tests 21/115121/2
authorRobert Varga <robert.varga@pantheon.tech>
Thu, 6 Feb 2025 12:19:04 +0000 (13:19 +0100)
committerRobert Varga <nite@hq.sk>
Thu, 6 Feb 2025 13:15:06 +0000 (13:15 +0000)
Use AssertJ instead of Hamcrest for most tests.

Change-Id: Idf87b126dce062f31c743d705119c5df5c52a9c1
Signed-off-by: Robert Varga <robert.varga@pantheon.tech>
codec/yang-data-codec-xml/src/test/java/org/opendaylight/yangtools/yang/data/codec/xml/AnyXmlWithParamsParsingTest.java
codec/yang-data-codec-xml/src/test/java/org/opendaylight/yangtools/yang/data/codec/xml/AnydataParseTest.java
codec/yang-data-codec-xml/src/test/java/org/opendaylight/yangtools/yang/data/codec/xml/Bug5396Test.java
codec/yang-data-codec-xml/src/test/java/org/opendaylight/yangtools/yang/data/codec/xml/StrictParsingModeTest.java
codec/yang-data-codec-xml/src/test/java/org/opendaylight/yangtools/yang/data/codec/xml/XmlStreamUtilsTest.java
codec/yang-data-codec-xml/src/test/java/org/opendaylight/yangtools/yang/data/codec/xml/XmlToNormalizedNodesTest.java
codec/yang-data-codec-xml/src/test/java/org/opendaylight/yangtools/yang/data/codec/xml/YT1533Test.java

index 102c5565220ea11a4e4c5cba4d27c36df25de493..f9393b4fe266f56cfce68ecc8d1c15f87187e711 100644 (file)
@@ -7,8 +7,7 @@
  */
 package org.opendaylight.yangtools.yang.data.codec.xml;
 
-import static org.hamcrest.CoreMatchers.containsString;
-import static org.hamcrest.MatcherAssert.assertThat;
+import static org.assertj.core.api.Assertions.assertThat;
 import static org.junit.jupiter.api.Assertions.assertInstanceOf;
 
 import java.io.InputStream;
@@ -62,14 +61,12 @@ class AnyXmlWithParamsParsingTest {
 
         final String anyXmlParsedDomString = toStringDom(anyXmlParsedDom);
 
-        assertThat(anyXmlParsedDomString, containsString(
-                "active xmpref:prefixed2=\"attribute2\""));
-        assertThat(anyXmlParsedDomString, containsString(
-                "interface-name xmpref:prefixed3=\"attribute3\""));
-        assertThat(anyXmlParsedDomString, containsString(
-                "interface-configuration xmlns:xmpref=\"xml:namespace:prefix\" simple=\"attribute\""));
-        assertThat(anyXmlParsedDomString, containsString(
-                "interface-configurations xmlns=\"http://cisco.com/ns/yang/Cisco-IOS-XR-ifmgr-cfg\""));
+        assertThat(anyXmlParsedDomString).contains("active xmpref:prefixed2=\"attribute2\"");
+        assertThat(anyXmlParsedDomString).contains("interface-name xmpref:prefixed3=\"attribute3\"");
+        assertThat(anyXmlParsedDomString).contains(
+                "interface-configuration xmlns:xmpref=\"xml:namespace:prefix\" simple=\"attribute\"");
+        assertThat(anyXmlParsedDomString).contains(
+                "interface-configurations xmlns=\"http://cisco.com/ns/yang/Cisco-IOS-XR-ifmgr-cfg\"");
     }
 
     private static NodeIdentifier getNodeId(final NormalizedNode parsed, final String localName) {
index cd28c6bbe018bfa7b9a42de2c8574c84985ddbfb..f5d9bcb3c8955173c5489a88050f352621f7e5e5 100644 (file)
@@ -7,10 +7,8 @@
  */
 package org.opendaylight.yangtools.yang.data.codec.xml;
 
-import static org.hamcrest.CoreMatchers.instanceOf;
-import static org.hamcrest.MatcherAssert.assertThat;
+import static org.junit.jupiter.api.Assertions.assertInstanceOf;
 
-import javax.xml.stream.XMLStreamReader;
 import org.junit.jupiter.api.Test;
 import org.opendaylight.yangtools.util.xml.UntrustedXML;
 import org.opendaylight.yangtools.yang.data.api.schema.AnydataNode;
@@ -21,7 +19,7 @@ import org.opendaylight.yangtools.yang.model.util.SchemaInferenceStack.Inference
 class AnydataParseTest extends AbstractAnydataTest {
     @Test
     void testAnydata() throws Exception {
-        final XMLStreamReader reader = UntrustedXML.createXMLStreamReader(
+        final var reader = UntrustedXML.createXMLStreamReader(
             toInputStream("<foo xmlns=\"test-anydata\"><bar/></foo>"));
 
         final var result = new NormalizationResultHolder();
@@ -30,6 +28,6 @@ class AnydataParseTest extends AbstractAnydataTest {
             true);
         xmlParser.parse(reader);
 
-        assertThat(result.getResult().data(), instanceOf(AnydataNode.class));
+        assertInstanceOf(AnydataNode.class, result.getResult().data());
     }
 }
index 9fd794f3c99c27bd08f8b3c95324c49b21fbd29a..1337467955af129d16e745745a6769a3d0e31a57 100644 (file)
@@ -7,8 +7,7 @@
  */
 package org.opendaylight.yangtools.yang.data.codec.xml;
 
-import static org.hamcrest.CoreMatchers.startsWith;
-import static org.hamcrest.MatcherAssert.assertThat;
+import static org.assertj.core.api.Assertions.assertThat;
 import static org.junit.jupiter.api.Assertions.assertEquals;
 import static org.junit.jupiter.api.Assertions.assertInstanceOf;
 import static org.junit.jupiter.api.Assertions.assertThrows;
@@ -73,7 +72,7 @@ class Bug5396Test {
 
         final var ex = assertThrows(IllegalArgumentException.class,
             () -> testInputXML("/bug5396/xml/invalid-foo.xml", null));
-        assertThat(ex.getMessage(), startsWith("Invalid value \"dp09P1p2s1234\" for union type."));
+        assertThat(ex.getMessage()).startsWith("Invalid value \"dp09P1p2s1234\" for union type.");
     }
 
     private void testInputXML(final String xmlPath, final String expectedValue) throws Exception {
index 4713eb9352b622129dc230f550a39993970d874d..6069d460de2021a72117e50345472688db40e8e4 100644 (file)
@@ -7,8 +7,7 @@
  */
 package org.opendaylight.yangtools.yang.data.codec.xml;
 
-import static org.hamcrest.CoreMatchers.containsString;
-import static org.hamcrest.MatcherAssert.assertThat;
+import static org.assertj.core.api.Assertions.assertThat;
 import static org.junit.jupiter.api.Assertions.assertNotNull;
 import static org.junit.jupiter.api.Assertions.assertThrows;
 
@@ -79,7 +78,7 @@ class StrictParsingModeTest {
             Inference.ofDataTreePath(schemaContext, QName.create("foo", "top-level-container")), true);
 
         final var ex = assertThrows(XMLStreamException.class, () -> xmlParser.parse(reader));
-        assertThat(ex.getMessage(), containsString("Schema for node with name unknown-container-a and namespace foo "
-            + "does not exist in parent EmptyContainerEffectiveStatement{argument=(foo)top-level-container}"));
+        assertThat(ex.getMessage()).contains("Schema for node with name unknown-container-a and namespace foo "
+            + "does not exist in parent EmptyContainerEffectiveStatement{argument=(foo)top-level-container}");
     }
 }
index c699661b41f36560a490574e047b461e0f0f0575..1a0adf309812204027a0c514442cfabfdd5e3a43 100644 (file)
@@ -7,17 +7,15 @@
  */
 package org.opendaylight.yangtools.yang.data.codec.xml;
 
-import static org.hamcrest.CoreMatchers.containsString;
-import static org.hamcrest.CoreMatchers.instanceOf;
-import static org.hamcrest.MatcherAssert.assertThat;
+import static org.assertj.core.api.Assertions.assertThat;
 import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertInstanceOf;
 import static org.junit.jupiter.api.Assertions.assertNotNull;
 import static org.junit.jupiter.api.Assertions.assertSame;
 import static org.junit.jupiter.api.Assertions.assertTrue;
 
 import java.io.ByteArrayOutputStream;
 import java.io.IOException;
-import java.util.regex.Matcher;
 import java.util.regex.Pattern;
 import javax.xml.stream.XMLStreamException;
 import javax.xml.stream.XMLStreamWriter;
@@ -31,8 +29,6 @@ import org.opendaylight.yangtools.yang.model.api.EffectiveModelContext;
 import org.opendaylight.yangtools.yang.model.api.LeafSchemaNode;
 import org.opendaylight.yangtools.yang.model.api.Module;
 import org.opendaylight.yangtools.yang.model.api.TypeDefinition;
-import org.opendaylight.yangtools.yang.model.api.TypedDataSchemaNode;
-import org.opendaylight.yangtools.yang.model.api.meta.EffectiveStatement;
 import org.opendaylight.yangtools.yang.model.api.type.InstanceIdentifierTypeDefinition;
 import org.opendaylight.yangtools.yang.model.api.type.LeafrefTypeDefinition;
 import org.opendaylight.yangtools.yang.model.api.type.StringTypeDefinition;
@@ -42,6 +38,7 @@ import org.opendaylight.yangtools.yang.test.util.YangParserTestUtils;
 class XmlStreamUtilsTest {
     @FunctionalInterface
     interface XMLStreamWriterConsumer {
+
         void accept(XMLStreamWriter writer) throws XMLStreamException;
     }
 
@@ -77,7 +74,7 @@ class XmlStreamUtilsTest {
             writer.writeEndElement();
         });
 
-        assertThat(xmlAsString, containsString("element>identity"));
+        assertThat(xmlAsString).contains("element>identity");
 
         xmlAsString = createXml(writer -> {
             writer.writeStartElement("elementDifferent");
@@ -88,14 +85,14 @@ class XmlStreamUtilsTest {
             writer.writeEndElement();
         });
 
-        final Pattern prefixedIdentityPattern = Pattern.compile(".*\"different:namespace\">(.*):identity.*");
-        final Matcher matcher = prefixedIdentityPattern.matcher(xmlAsString);
+        final var prefixedIdentityPattern = Pattern.compile(".*\"different:namespace\">(.*):identity.*");
+        final var matcher = prefixedIdentityPattern.matcher(xmlAsString);
         assertTrue(matcher.matches(), "Xml: " + xmlAsString + " should match: " + prefixedIdentityPattern);
     }
 
     private static String createXml(final XMLStreamWriterConsumer consumer) throws XMLStreamException, IOException {
-        final ByteArrayOutputStream out = new ByteArrayOutputStream();
-        final XMLStreamWriter writer = TestFactories.DEFAULT_OUTPUT_FACTORY.createXMLStreamWriter(out);
+        final var out = new ByteArrayOutputStream();
+        final var writer = TestFactories.DEFAULT_OUTPUT_FACTORY.createXMLStreamWriter(out);
 
         consumer.accept(writer);
 
@@ -139,20 +136,17 @@ class XmlStreamUtilsTest {
             getTargetNodeForLeafRef(InstanceIdentifierTypeDefinition.class, "relname"));
     }
 
-    private static TypeDefinition<?> getTargetNodeForLeafRef(final Class<?> clas, final String... names) {
-        final SchemaInferenceStack stack = SchemaInferenceStack.of(modelContext);
+    private static TypeDefinition<?> getTargetNodeForLeafRef(final Class<? extends TypeDefinition<?>> expected,
+            final String... names) {
+        final var stack = SchemaInferenceStack.of(modelContext);
         stack.enterDataTree(QName.create(leafRefModule.getQNameModule(), "cont2"));
-        for (String name : names) {
+        for (var name : names) {
             stack.enterDataTree(QName.create(leafRefModule.getQNameModule(), name));
         }
 
-        final EffectiveStatement<?, ?> leaf = stack.currentStatement();
-        assertThat(leaf, instanceOf(LeafSchemaNode.class));
-        final TypeDefinition<? extends TypeDefinition<?>> type = ((TypedDataSchemaNode) leaf).getType();
-        assertThat(type, instanceOf(LeafrefTypeDefinition.class));
+        final var leaf = assertInstanceOf(LeafSchemaNode.class, stack.currentStatement());
+        final var type = assertInstanceOf(LeafrefTypeDefinition.class, leaf.getType());
 
-        final TypeDefinition<?> resolved = stack.resolveLeafref((LeafrefTypeDefinition) type);
-        assertThat(resolved, instanceOf(clas));
-        return resolved;
+        return assertInstanceOf(expected, stack.resolveLeafref(type));
     }
 }
index 5883c3b47d0b7726369cf2f9c155f25735b56992..c169bd05d7e72c273a6f4da9d40c7bea0880f020 100644 (file)
@@ -7,13 +7,11 @@
  */
 package org.opendaylight.yangtools.yang.data.codec.xml;
 
-import static org.hamcrest.CoreMatchers.containsString;
-import static org.hamcrest.MatcherAssert.assertThat;
+import static org.assertj.core.api.Assertions.assertThat;
 import static org.junit.jupiter.api.Assertions.assertEquals;
 import static org.junit.jupiter.api.Assertions.assertNotNull;
 import static org.junit.jupiter.api.Assertions.assertThrows;
 
-import java.util.HashMap;
 import java.util.Map;
 import javax.xml.stream.XMLStreamException;
 import org.junit.jupiter.api.AfterAll;
@@ -24,12 +22,7 @@ import org.opendaylight.yangtools.yang.common.QName;
 import org.opendaylight.yangtools.yang.common.QNameModule;
 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.NodeIdentifier;
 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.NodeIdentifierWithPredicates;
-import org.opendaylight.yangtools.yang.data.api.schema.ChoiceNode;
-import org.opendaylight.yangtools.yang.data.api.schema.ContainerNode;
-import org.opendaylight.yangtools.yang.data.api.schema.LeafNode;
-import org.opendaylight.yangtools.yang.data.api.schema.MapNode;
 import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode;
-import org.opendaylight.yangtools.yang.data.api.schema.SystemLeafSetNode;
 import org.opendaylight.yangtools.yang.data.impl.schema.ImmutableNormalizedNodeStreamWriter;
 import org.opendaylight.yangtools.yang.data.impl.schema.NormalizationResultHolder;
 import org.opendaylight.yangtools.yang.data.spi.node.ImmutableNodes;
@@ -124,9 +117,9 @@ class XmlToNormalizedNodesTest {
         final var streamWriter = ImmutableNormalizedNodeStreamWriter.from(result);
         final var xmlParser = XmlParserStream.create(streamWriter, parentContainerSchema);
         final var ex = assertThrows(XMLStreamException.class, () -> xmlParser.parse(reader));
-        assertThat(ex.getMessage(), containsString("""
+        assertThat(ex.getMessage()).contains("""
             Duplicate element "decimal64-leaf" in namespace "foo-namespace" with parent \
-            "EmptyContainerEffectiveStatement{argument=(foo-namespace)leaf-container}" in XML input"""));
+            "EmptyContainerEffectiveStatement{argument=(foo-namespace)leaf-container}" in XML input""");
     }
 
     @Test
@@ -137,9 +130,9 @@ class XmlToNormalizedNodesTest {
         final var streamWriter = ImmutableNormalizedNodeStreamWriter.from(result);
         final var xmlParser = XmlParserStream.create(streamWriter, parentContainerSchema);
         final var ex = assertThrows(XMLStreamException.class, () -> xmlParser.parse(reader));
-        assertThat(ex.getMessage(), containsString("""
+        assertThat(ex.getMessage()).contains("""
             Duplicate element "my-anyxml" in namespace "foo-namespace" with parent \
-            "EmptyContainerEffectiveStatement{argument=(foo-namespace)anyxml-container}" in XML input"""));
+            "EmptyContainerEffectiveStatement{argument=(foo-namespace)anyxml-container}" in XML input""");
     }
 
     @Test
@@ -150,9 +143,9 @@ class XmlToNormalizedNodesTest {
         final var streamWriter = ImmutableNormalizedNodeStreamWriter.from(result);
         final var xmlParser = XmlParserStream.create(streamWriter, parentContainerSchema);
         final var ex = assertThrows(XMLStreamException.class, () -> xmlParser.parse(reader));
-        assertThat(ex.getMessage(), containsString("""
+        assertThat(ex.getMessage()).contains("""
             Duplicate element "leaf-container" in namespace "foo-namespace" with parent \
-            "EmptyContainerEffectiveStatement{argument=(foo-namespace)parent-container}" in XML input"""));
+            "EmptyContainerEffectiveStatement{argument=(foo-namespace)parent-container}" in XML input""");
     }
 
     @Test
@@ -163,7 +156,7 @@ class XmlToNormalizedNodesTest {
         final var streamWriter = ImmutableNormalizedNodeStreamWriter.from(result);
         final var xmlParser = XmlParserStream.create(streamWriter, outerContainerSchema);
         final var ex = assertThrows(XMLStreamException.class, () -> xmlParser.parse(reader));
-        assertThat(ex.getMessage(), containsString(" START_ELEMENT "));
+        assertThat(ex.getMessage()).contains(" START_ELEMENT ");
     }
 
     @Test
@@ -174,7 +167,7 @@ class XmlToNormalizedNodesTest {
         final var streamWriter = ImmutableNormalizedNodeStreamWriter.from(result);
         final var xmlParser = XmlParserStream.create(streamWriter, outerContainerSchema);
         final var ex = assertThrows(XMLStreamException.class, () -> xmlParser.parse(reader));
-        assertThat(ex.getMessage(), containsString("</my-leaf-1>"));
+        assertThat(ex.getMessage()).contains("</my-leaf-1>");
     }
 
     @Test
@@ -185,7 +178,7 @@ class XmlToNormalizedNodesTest {
         final var streamWriter = ImmutableNormalizedNodeStreamWriter.from(result);
         final var xmlParser = XmlParserStream.create(streamWriter, outerContainerSchema);
         final var ex = assertThrows(XMLStreamException.class, () -> xmlParser.parse(reader));
-        assertThat(ex.getMessage(), containsString("</my-container-1>"));
+        assertThat(ex.getMessage()).contains("</my-container-1>");
     }
 
     @Test
@@ -196,14 +189,14 @@ class XmlToNormalizedNodesTest {
         final var streamWriter = ImmutableNormalizedNodeStreamWriter.from(result);
         final var xmlParser = XmlParserStream.create(streamWriter, outerContainerSchema);
         final var ex = assertThrows(XMLStreamException.class, () -> xmlParser.parse(reader));
-        assertThat(ex.getMessage(), containsString("""
+        assertThat(ex.getMessage()).contains("""
             Schema for node with name my-container-1 and namespace baz-namespace does not exist in parent \
-            EmptyContainerEffectiveStatement{argument=(baz-namespace)my-container-1}"""));
+            EmptyContainerEffectiveStatement{argument=(baz-namespace)my-container-1}""");
     }
 
     private static NormalizedNode buildOuterContainerNode() {
         // my-container-1
-        MapNode myKeyedListNode = ImmutableNodes.newSystemMapBuilder()
+        final var myKeyedListNode = ImmutableNodes.newSystemMapBuilder()
             .withNodeIdentifier(new NodeIdentifier(MY_KEYED_LIST))
             .withChild(ImmutableNodes.newMapEntryBuilder()
                 .withNodeIdentifier(NodeIdentifierWithPredicates.of(MY_KEYED_LIST, MY_KEY_LEAF, "listkeyvalue1"))
@@ -217,15 +210,15 @@ class XmlToNormalizedNodesTest {
                 .build())
             .build();
 
-        LeafNode<?> myLeaf1Node = ImmutableNodes.leafNode(MY_LEAF_1, "value1");
+        final var myLeaf1Node = ImmutableNodes.leafNode(MY_LEAF_1, "value1");
 
-        SystemLeafSetNode<?> myLeafListNode = ImmutableNodes.newSystemLeafSetBuilder()
+        final var myLeafListNode = ImmutableNodes.newSystemLeafSetBuilder()
             .withNodeIdentifier(new NodeIdentifier(MY_LEAFLIST))
             .withChild(ImmutableNodes.leafSetEntry(MY_LEAFLIST, "lflvalue1"))
             .withChild(ImmutableNodes.leafSetEntry(MY_LEAFLIST, "lflvalue2"))
             .build();
 
-        ContainerNode myContainer1Node = ImmutableNodes.newContainerBuilder()
+        final var myContainer1Node = ImmutableNodes.newContainerBuilder()
             .withNodeIdentifier(new NodeIdentifier(MY_CONTAINER_1))
             .withChild(myKeyedListNode)
             .withChild(myLeaf1Node)
@@ -233,19 +226,19 @@ class XmlToNormalizedNodesTest {
             .build();
 
         // my-container-2
-        ContainerNode innerContainerNode = ImmutableNodes.newContainerBuilder()
+        final var innerContainerNode = ImmutableNodes.newContainerBuilder()
             .withNodeIdentifier(new NodeIdentifier(INNER_CONTAINER))
             .withChild(ImmutableNodes.leafNode(MY_LEAF_2, "value2"))
             .build();
 
-        LeafNode<?> myLeaf3Node = ImmutableNodes.leafNode(MY_LEAF_3, "value3");
+        final var myLeaf3Node = ImmutableNodes.leafNode(MY_LEAF_3, "value3");
 
-        ChoiceNode myChoiceNode = ImmutableNodes.newChoiceBuilder()
+        final var myChoiceNode = ImmutableNodes.newChoiceBuilder()
             .withNodeIdentifier(new NodeIdentifier(MY_CHOICE))
             .withChild(ImmutableNodes.leafNode(MY_LEAF_IN_CASE_2, "case2value"))
             .build();
 
-        ContainerNode myContainer2Node = ImmutableNodes.newContainerBuilder()
+        final var myContainer2Node = ImmutableNodes.newContainerBuilder()
             .withNodeIdentifier(new NodeIdentifier(MY_CONTAINER_2))
             .withChild(innerContainerNode)
             .withChild(myLeaf3Node)
@@ -253,24 +246,22 @@ class XmlToNormalizedNodesTest {
             .build();
 
         // my-container-3
-        Map<QName, Object> keys = new HashMap<>();
-        keys.put(MY_FIRST_KEY_LEAF, "listkeyvalue1");
-        keys.put(MY_SECOND_KEY_LEAF, "listkeyvalue2");
 
-        MapNode myDoublyKeyedListNode = ImmutableNodes.newSystemMapBuilder()
+        final var myDoublyKeyedListNode = ImmutableNodes.newSystemMapBuilder()
                 .withNodeIdentifier(new NodeIdentifier(MY_DOUBLY_KEYED_LIST))
                 .withChild(ImmutableNodes.newMapEntryBuilder()
-                    .withNodeIdentifier(NodeIdentifierWithPredicates.of(MY_DOUBLY_KEYED_LIST, keys))
+                    .withNodeIdentifier(NodeIdentifierWithPredicates.of(MY_DOUBLY_KEYED_LIST,
+                        Map.of(MY_FIRST_KEY_LEAF, "listkeyvalue1", MY_SECOND_KEY_LEAF, "listkeyvalue2")))
                     .withChild(ImmutableNodes.leafNode(MY_LEAF_IN_LIST_3, "listleafvalue1"))
                     .build())
                 .build();
 
-        ContainerNode myContainer3Node = ImmutableNodes.newContainerBuilder()
+        final var myContainer3Node = ImmutableNodes.newContainerBuilder()
             .withNodeIdentifier(new NodeIdentifier(MY_CONTAINER_3))
             .withChild(myDoublyKeyedListNode)
             .build();
 
-        ContainerNode outerContainerNode = ImmutableNodes.newContainerBuilder()
+        final var outerContainerNode = ImmutableNodes.newContainerBuilder()
             .withNodeIdentifier(new NodeIdentifier(OUTER_CONTAINER))
             .withChild(myContainer1Node)
             .withChild(myContainer2Node)
index f24aedbef01122d355c0fee102f4d4877c8be576..2354fa9231d150493b600b4c08f6c71b2227e68b 100644 (file)
@@ -7,8 +7,7 @@
  */
 package org.opendaylight.yangtools.yang.data.codec.xml;
 
-import static org.hamcrest.CoreMatchers.startsWith;
-import static org.hamcrest.MatcherAssert.assertThat;
+import static org.assertj.core.api.Assertions.assertThat;
 import static org.junit.jupiter.api.Assertions.assertThrows;
 
 import java.io.StringReader;
@@ -42,8 +41,8 @@ class YT1533Test {
                   <bar/>
                 </foo>""")))
         );
-        assertThat(ex.getMessage()startsWith("""
+        assertThat(ex.getMessage()).startsWith("""
             ParseError at [row,col]:[2,9]
-            Message: Schema for node with name bar and namespace foo does not exist in parent EffectiveSchema"""));
+            Message: Schema for node with name bar and namespace foo does not exist in parent EffectiveSchema""");
     }
 }