/* * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information * regarding copyright ownership. The ASF licenses this file * to you under the Apache License, Version 2.0 (the * "License"); you may not use this file except in compliance * with the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, * software distributed under the License is distributed on an * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * KIND, either express or implied. See the License for the * specific language governing permissions and limitations * under the License. */ package org.apache.sling.jcr.js.nodetypes.test; import java.util.Iterator; import org.apache.sling.commons.json.JSONArray; import org.apache.sling.commons.json.JSONException; import org.apache.sling.commons.json.JSONObject; import org.junit.Assert; /** * Provides assertions on equality for JSON Arrays and Objects. * * This class is copied from org.apache.sling.commons.json.test.JSONAssert. * This code in turn was based on code written by Andres Almiray <aalmiray@users.sourceforge.net> as * part of the json-lib project - http://json-lib.sourceforge.net/ * * TODO: It should be made reusable in some way or the other. */ public class JSONAssert extends Assert { /** * Asserts that two JSONArrays are equal. */ public static void assertEquals(JSONArray expected, JSONArray actual) throws JSONException { assertEquals(null, expected, actual); } /** * Asserts that two JSONObjects are equal. */ public static void assertEquals(JSONObject expected, JSONObject actual) throws JSONException { assertEquals(null, expected, actual); } /** * Asserts that two JSONArrays are equal. */ public static void assertEquals(String message, JSONArray expected, JSONArray actual) throws JSONException { String header = message == null ? "" : message + ": "; if (expected == null) { fail(header + "expected array was null"); } if (actual == null) { fail(header + "actual array was null"); } if (expected == actual || expected.equals(actual)) { return; } if (actual.length() != expected.length()) { fail(header + "arrays sizes differed, expected.length()=" + expected.length() + " actual.length()=" + actual.length()); } int max = expected.length(); for (int i = 0; i < max; i++) { Object o1 = expected.get(i); Object o2 = actual.get(i); // handle nulls if (JSONObject.NULL.equals(o1)) { if (JSONObject.NULL.equals(o2)) { continue; } fail(header + "arrays first differed at element [" + i + "];"); } else { if (JSONObject.NULL.equals(o2)) { fail(header + "arrays first differed at element [" + i + "];"); } } if (o1 instanceof JSONArray && o2 instanceof JSONArray) { JSONArray e = (JSONArray) o1; JSONArray a = (JSONArray) o2; assertEquals(header + "arrays first differed at element " + i + ";", e, a); } else if (o1 instanceof JSONObject && o2 instanceof JSONObject) { assertEquals(header + "arrays first differed at element [" + i + "];", (JSONObject) o1, (JSONObject) o2); } else if (o1 instanceof String) { assertEquals(header + "arrays first differed at element [" + i + "];", (String) o1, String.valueOf(o2)); } else if (o2 instanceof String) { assertEquals(header + "arrays first differed at element [" + i + "];", String.valueOf(o1), (String) o2); } else { assertEquals(header + "arrays first differed at element [" + i + "];", o1, o2); } } } /** * Asserts that two JSONObjects are equal. */ public static void assertEquals(String message, JSONObject expected, JSONObject actual) throws JSONException { String header = message == null ? "" : message + ": "; if (expected == null) { fail(header + "expected object was null"); } if (actual == null) { fail(header + "actual object was null"); } if (expected == actual /* || expected.equals( actual ) */) { return; } JSONArray expectedNames = expected.names(); JSONArray actualNames = actual.names(); if (expectedNames == null && actualNames == null) { return; } if (expectedNames == null) { expectedNames = new JSONArray(); } if (actualNames == null) { actualNames = new JSONArray(); } assertEquals(header + "names sizes differed, expected.names().length()=" + expectedNames.length() + " actual.names().length()=" + actualNames.length(), expectedNames.length(), actualNames .length()); for (Iterator<String> keys = expected.keys(); keys.hasNext();) { String key = keys.next(); Object o1 = expected.opt(key); Object o2 = actual.opt(key); if (JSONObject.NULL.equals(o1)) { if (JSONObject.NULL.equals(o2)) { continue; } fail(header + "objects differed at key [" + key + "];"); } else { if (JSONObject.NULL.equals(o2)) { fail(header + "objects differed at key [" + key + "];"); } } if (o1 instanceof JSONObject && o2 instanceof JSONObject) { assertEquals(header + "objects differed at key [" + key + "];", (JSONObject) o1, (JSONObject) o2); } else if (o1 instanceof JSONArray && o2 instanceof JSONArray) { assertEquals(header + "objects differed at key [" + key + "];", (JSONArray) o1, (JSONArray) o2); } else if (o1 instanceof String) { assertEquals(header + "objects differed at key [" + key + "];", (String) o1, String.valueOf(o2)); } else if (o2 instanceof String) { assertEquals(header + "objects differed at key [" + key + "];", String.valueOf(o1), (String) o2); } else { assertEquals(header + "objects differed at key [" + key + "];", o1, o2); } } } }