private static boolean compare()

in ion-java-cli/src/com/amazon/tools/cli/IonJavaCli.java [375:448]


    private static boolean compare(CompareContext compareContext,
                                   int startI, int endI, int startJ, int endJ) throws IOException {
        List<Event> eventsFirst = compareContext.getEventStreamFirst();
        List<Event> eventsSecond = compareContext.getEventStreamSecond();
        int i = startI;
        int j = startJ;
        while (i <= endI && j <= endJ && i < eventsFirst.size() && j < eventsSecond.size()) {
            Event eventFirst = eventsFirst.get(i);
            Event eventSecond = eventsSecond.get(j);
            SymbolToken fieldNameFirst = eventFirst.getFieldName();
            SymbolToken fieldNameSecond = eventSecond.getFieldName();
            SymbolToken[] annotationFirst = eventFirst.getAnnotations();
            SymbolToken[] annotationSecond = eventSecond.getAnnotations();
            EventType eventTypeFirst = eventFirst.getEventType();
            EventType eventTypeSecond = eventSecond.getEventType();
            if (eventTypeFirst != eventTypeSecond) {
                setReportInfo(i, j,"Didn't match event_type", compareContext);
                return false;
            } else if (eventFirst.getDepth() != eventSecond.getDepth()) {
                setReportInfo(i, j,"Didn't match depth", compareContext);
                return false;
            } else if (eventFirst.getIonType() != eventSecond.getIonType()) {
                setReportInfo(i, j,"Didn't match ion_type", compareContext);
                return false;
            } else if (!isSameSymbolToken(fieldNameFirst, fieldNameSecond)) {
                setReportInfo(i, j,"Didn't match field_name", compareContext);
                return false;
            } else if (!isSameSymbolTokenArray(annotationFirst, annotationSecond)) {
                setReportInfo(i, j,"Didn't match annotation", compareContext);
                return false;
            }

            if (eventTypeFirst == EventType.CONTAINER_START
                    && eventFirst.getIonType() == IonType.STRUCT) {
                int iStart = i;
                int jStart = j;
                ContainerContext containerContextFirst = new ContainerContext(i);
                IonStruct structFirst = parseStruct(containerContextFirst, compareContext, endI, true);
                i = containerContextFirst.getIndex();
                ContainerContext containerContextSecond = new ContainerContext(j);
                IonStruct structSecond = parseStruct(containerContextSecond, compareContext, endJ, false);
                j = containerContextSecond.getIndex();
                if (!Equivalence.ionEquals(structFirst, structSecond)) {
                    setReportInfo(iStart, jStart,
                            "Did not find matching field for " + structFirst.toString(),
                            compareContext);
                    return false;
                }
            } else if (eventTypeFirst == EventType.SCALAR) {
                boolean compareResult;
                if (compareContext.getType() == ComparisonType.EQUIVS_TIMELINE
                        && eventFirst.getIonType() == IonType.TIMESTAMP) {
                    IonTimestamp ionTimestampFirst = (IonTimestamp) eventFirst.getValue();
                    IonTimestamp ionTimestampSecond = (IonTimestamp) eventSecond.getValue();
                    compareResult = ionTimestampFirst.timestampValue()
                            .compareTo(ionTimestampSecond.timestampValue()) == 0;
                } else {
                    compareResult = Equivalence.ionEquals(eventFirst.getValue(), eventSecond.getValue());
                }
                if (!compareResult) {
                    setReportInfo(i, j, eventFirst.getValue() + " vs. "
                            + eventSecond.getValue(), compareContext);
                    return false;
                }
            }
            i++;
            j++;
        }
        if (i <= endI || j <= endJ) {
            setReportInfo(i , j, "two event streams have different size", compareContext);
            return false;
        }
        return true;
    }