All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.github.fslev.jsonassert_extended.comparator.ExtensibleArrayComparator Maven / Gradle / Ivy

package com.github.fslev.jsonassert_extended.comparator;

import org.json.JSONArray;
import org.json.JSONException;
import org.skyscreamer.jsonassert.Customization;
import org.skyscreamer.jsonassert.JSONCompareMode;
import org.skyscreamer.jsonassert.JSONCompareResult;
import org.skyscreamer.jsonassert.comparator.CustomComparator;
import org.skyscreamer.jsonassert.comparator.JSONCompareUtil;

public class ExtensibleArrayComparator extends CustomComparator {

    JSONCompareMode arrayCompareMode;

    public ExtensibleArrayComparator(JSONCompareMode objectCompareMode, JSONCompareMode arrayCompareMode, Customization... customizations) {
        super(objectCompareMode, customizations);
        this.arrayCompareMode = arrayCompareMode;
    }

    @Override
    public void compareJSONArray(String prefix, JSONArray expected, JSONArray actual, JSONCompareResult result) throws JSONException {

        if (expected.length() > actual.length()) {
            result.fail(prefix + "[]: Expected size is " + expected.length() + " but an actual array of size " + actual.length());
        } else if (!arrayCompareMode.isExtensible() && expected.length() != actual.length()) {
            result.fail(prefix + "[]: Expected " + expected.length() + " values but got " + actual.length());
        } else {
            if (expected.length() != 0) {
                if (arrayCompareMode.hasStrictOrder()) {
                    this.compareJSONArrayWithStrictOrder(prefix, expected, actual, result);
                } else if (!arrayCompareMode.isExtensible() && JSONCompareUtil.allSimpleValues(expected)) {
                    this.compareJSONArrayOfObjects(prefix, expected, actual, result);
                } else if (!arrayCompareMode.isExtensible() && JSONCompareUtil.allJSONObjects(expected)) {
                    this.compareJSONArrayOfObjects(prefix, expected, actual, result);
                } else if (!arrayCompareMode.isExtensible()) {
                    this.compareJSONArrayOfObjects(prefix, expected, actual, result);
                } else {
                    compareExtensibleJSONArrayOfObjects(prefix, expected, actual, result);
                }
            }
        }
    }

    protected void compareExtensibleJSONArrayOfObjects(String key, JSONArray expectedArray, JSONArray actualArray, JSONCompareResult result) throws JSONException {

        for (int i = 0; i < expectedArray.length(); i++) {
            int failures = 0;
            Object expectedValue = expectedArray.get(i);
            for (int j = 0; j < actualArray.length(); j++) {
                Object actualValue = actualArray.get(j);
                JSONCompareResult mediateResult = new JSONCompareResult();
                compareValues(key + "[" + i + "]", expectedValue, actualValue, mediateResult);
                if (!mediateResult.passed()) {
                    failures++;
                }
                if (failures == actualArray.length()) {
                    result.fail("Element " + key + "[" + i + "] has no match");
                    return;
                }
            }
        }
    }

    protected void compareJSONArrayOfObjects(String key, JSONArray expectedArray, JSONArray actualArray, JSONCompareResult result) throws JSONException {

        if (expectedArray.length() != actualArray.length()) {
            result.fail(key + "[]: Expected size " + expectedArray.length() + " is different than actual array size " + actualArray.length());
            return;
        }

        compareExtensibleJSONArrayOfObjects(key, expectedArray, actualArray, result);
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy