public void compare()

in testing/testutils/src/main/java/org/apache/axiom/testutils/stax/XMLStreamReaderComparator.java [287:438]


    public void compare() throws Exception {
        if (sortAttributes) {
            expected = new AttributeSortingXMLStreamReaderFilter(expected);
            actual = new AttributeSortingXMLStreamReaderFilter(actual);
        }
        if (treatSpaceAsCharacters) {
            expected = new SpaceAsCharactersXMLStreamReaderFilter(expected);
            actual = new SpaceAsCharactersXMLStreamReaderFilter(actual);
        }
        while (true) {
            int eventType = assertSameResult(Integer.class, "getEventType");
            if (eventType == XMLStreamReader.START_ELEMENT) {
                path.addLast(expected.getName());
            }
            if (compareCharacterEncodingScheme) {
                assertSameResult(String.class, "getCharacterEncodingScheme");
            }
            if (compareEncoding) {
                assertSameResult(String.class, "getEncoding", Normalizer.LOWER_CASE);
            }
            Integer attributeCount = assertSameResult(Integer.class, "getAttributeCount");
            // Test the behavior of the getAttributeXxx methods for all types of events,
            // to check that an appropriate exception is thrown for events other than
            // START_ELEMENT
            for (int i = 0; i < (attributeCount == null ? 1 : attributeCount.intValue()); i++) {
                Class<?>[] paramTypes = {Integer.TYPE};
                Object[] args = {new Integer(i)};
                assertSameResult(String.class, "getAttributeLocalName", paramTypes, args);
                assertSameResult(QName.class, "getAttributeName", paramTypes, args);
                namespaceURIs.add(
                        assertSameResult(String.class, "getAttributeNamespace", paramTypes, args));
                prefixes.add(
                        assertSameResult(
                                String.class,
                                "getAttributePrefix",
                                paramTypes,
                                args,
                                Normalizer.EMPTY_STRING_TO_NULL));
                assertSameResult(String.class, "getAttributeType", paramTypes, args);
                assertSameResult(String.class, "getAttributeValue", paramTypes, args);
                assertSameResult(Boolean.class, "isAttributeSpecified", paramTypes, args);
            }
            if (attributeCount != null) {
                for (int i = 0; i < attributeCount.intValue(); i++) {
                    QName qname = expected.getAttributeName(i);
                    assertSameResult(
                            String.class,
                            "getAttributeValue",
                            new Class[] {String.class, String.class},
                            new Object[] {qname.getNamespaceURI(), qname.getLocalPart()});
                }
            }
            assertSameResult(String.class, "getLocalName");
            assertSameResult(QName.class, "getName");
            Integer namespaceCount = assertSameResult(Integer.class, "getNamespaceCount");
            if (namespaceCount != null) {
                Map<String, String> expectedNamespaces = new HashMap<>();
                Map<String, String> actualNamespaces = new HashMap<>();
                for (int i = 0; i < namespaceCount.intValue(); i++) {
                    String expectedPrefix = expected.getNamespacePrefix(i);
                    String expectedNamespaceURI = expected.getNamespaceURI(i);
                    if (expectedNamespaceURI != null && expectedNamespaceURI.length() == 0) {
                        expectedNamespaceURI = null;
                    }
                    String actualPrefix = actual.getNamespacePrefix(i);
                    String actualNamespaceURI = actual.getNamespaceURI(i);
                    if (actualNamespaceURI != null && actualNamespaceURI.length() == 0) {
                        actualNamespaceURI = null;
                    }
                    expectedNamespaces.put(expectedPrefix, expectedNamespaceURI);
                    actualNamespaces.put(actualPrefix, actualNamespaceURI);
                    prefixes.add(expectedPrefix);
                    namespaceURIs.add(expectedNamespaceURI);
                }
                assertEquals(expectedNamespaces, actualNamespaces);
            }
            namespaceURIs.add(assertSameResult(String.class, "getNamespaceURI"));
            assertSameResult(String.class, "getPIData");
            assertSameResult(String.class, "getPITarget");
            prefixes.add(assertSameResult(String.class, "getPrefix"));
            if ((eventType != XMLStreamReader.DTD || compareInternalSubset)
                    && (eventType != XMLStreamReader.ENTITY_REFERENCE
                            || compareEntityReplacementValue)) {
                assertSameResult(
                        String.class,
                        "getText",
                        eventType == XMLStreamReader.DTD ? Normalizer.DTD : null);
            }
            Integer textLength = assertSameResult(Integer.class, "getTextLength");
            InvocationResults<Integer> textStart = invoke(Integer.class, "getTextStart");
            InvocationResults<char[]> textCharacters = invoke(char[].class, "getTextCharacters");
            if (textLength != null) {
                assertEquals(
                        new String(
                                textCharacters.getExpected(), textStart.getExpected(), textLength),
                        new String(textCharacters.getActual(), textStart.getActual(), textLength));
            }
            assertSameResult(Boolean.class, "hasName");
            assertSameResult(Boolean.class, "hasText");
            assertSameResult(Boolean.class, "isCharacters");
            assertSameResult(Boolean.class, "isEndElement");
            assertSameResult(Boolean.class, "isStartElement");
            assertSameResult(Boolean.class, "isWhiteSpace");

            // Only check getNamespaceURI(String) for START_ELEMENT and END_ELEMENT. The Javadoc
            // of XMLStreamReader suggests that this method is valid for all states, but Woodstox
            // only allows it for some states.
            if (eventType == XMLStreamReader.START_ELEMENT
                    || eventType == XMLStreamReader.END_ELEMENT) {
                for (String prefix : prefixes) {
                    // The StAX specs are not clear about the expected result of getNamespaceURI
                    // when called with prefix "xml" (which doesn't require an explicit declaration)
                    if (prefix != null && !prefix.equals("xml")) {
                        assertSameResult(
                                String.class,
                                "getNamespaceURI",
                                new Class[] {String.class},
                                new Object[] {prefix});
                    }
                }
            }

            compareNamespaceContexts(expected.getNamespaceContext(), actual.getNamespaceContext());

            if (eventType == XMLStreamReader.END_ELEMENT) {
                path.removeLast();
            }

            assertSameResult(Boolean.class, "hasNext");

            int expectedNextEvent;
            try {
                expectedNextEvent = expected.next();
            } catch (IllegalStateException ex) {
                expectedNextEvent = -1;
            } catch (NoSuchElementException ex) {
                expectedNextEvent = -1;
            }
            if (expectedNextEvent == -1) {
                try {
                    actual.next();
                } catch (IllegalStateException ex) {
                    break;
                } catch (NoSuchElementException ex) {
                    break;
                }
                fail("Expected reader to throw IllegalStateException or NoSuchElementException");
            } else {
                assertEquals("Event type at " + getLocation(), expectedNextEvent, actual.next());
            }
        }
    }