diff --git a/src/main/java/org/apache/xmlbeans/impl/values/XmlValueComparison.java b/src/main/java/org/apache/xmlbeans/impl/values/XmlValueComparison.java index 4e7e5904e..db60a2dfc 100644 --- a/src/main/java/org/apache/xmlbeans/impl/values/XmlValueComparison.java +++ b/src/main/java/org/apache/xmlbeans/impl/values/XmlValueComparison.java @@ -143,6 +143,13 @@ private static boolean content_equal(XmlCursor a, XmlCursor b, boolean mixed) { TokenType tokenA = skip_ignorable(a, mixed); TokenType tokenB = skip_ignorable(b, mixed); + // a value rooted at a document - such as one made by copy() - ends + // in ENDDOC where an element ends in END: either way, it has run + // out of content + if (tokenA.isFinish() || tokenB.isFinish()) { + return tokenA.isFinish() && tokenB.isFinish(); + } + if (tokenA != tokenB) { return false; } diff --git a/src/test/java/xmlobject/detailed/ValueEqualsTest.java b/src/test/java/xmlobject/detailed/ValueEqualsTest.java index f8ef962a8..82d68a3bd 100755 --- a/src/test/java/xmlobject/detailed/ValueEqualsTest.java +++ b/src/test/java/xmlobject/detailed/ValueEqualsTest.java @@ -95,6 +95,27 @@ void testNestedElementDifference() throws Exception { .valueEquals(clm3.getCarLocationMessage().getEventStatusArray(0))); } + @Test + void testCopyEqualsOriginal() throws Exception { + CarLocationMessageDocument clm = CarLocationMessageDocument.Factory.parse(CLM); + + // copy() roots the copy at a document, the original is an element in one + CarLocationMessageDocument.CarLocationMessage msg = clm.getCarLocationMessage(); + XmlObject copy = msg.copy(); + assertTrue(copy.valueEquals(msg)); + assertTrue(msg.valueEquals(copy)); + + XmlObject eventStatus = msg.getEventStatusArray(0); + XmlObject eventStatusCopy = eventStatus.copy(); + assertTrue(eventStatusCopy.valueEquals(eventStatus)); + assertTrue(eventStatus.valueEquals(eventStatusCopy)); + + CarLocationMessageDocument other = + CarLocationMessageDocument.Factory.parse(CLM.replace("DALLAS", "AUSTIN")); + assertFalse(copy.valueEquals(other.getCarLocationMessage())); + assertFalse(other.getCarLocationMessage().valueEquals(copy)); + } + @Test void testAttributesCompared() throws Exception { CarLocationMessageDocument clm1 = CarLocationMessageDocument.Factory.parse(CLM);