/*
 * 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
<<<<<<< Updated upstream
 *
 *     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
=======
 * 
 *     https://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 
>>>>>>> Stashed changes
 * limitations under the License.
 */

package org.apache.jdo.tck.util;

/**
 * This <code>DeepEquality</code> interface defines a method indicating whether some other object is
 * "deep equal to" this object.
 *
 * <p>Two objects are deep equal, if all the fields are deep equal. The sematics of deep equal on
 * the fields depends of the field type:
 *
 * <ul>
 *   <li>fields of type <code>boolean</code> or an integral type are deep equal, if they compare
 *       true using <code>==</code>
 *   <li>fields of type <code>float</code> and <code>double</code> are deep equal, if they are close
 *       enough as defined by methods closeEnough provided by class <code>EqualityHelper</code>
 *   <li>fields of Java wrapper classes are equal if their wrapped primitive values are deep equal
 *   <li>fields of type BigDecimal are equal, if compareTo returns 0
 *   <li>collection fields are deep equal, if they have the same size and their corresponding
 *       elements compare deep equal after sorting using the natural ordering.
 *   <li>map fields compare deep equal, if they have the same size and both keys and values compare
 *       deep equal after sorting the entries using the natural ordering of the keys.
 *   <li>fields of type <code>DeepEquality</code> are deep equal, if method <code>deepEquals</code>
 *       returns <code>true</code>
 *   <li>fields of other types are deep equal, if method <code>equals</code> returns <code>true
 *       </code>
 * </ul>
 *
 * The <code>EqualityHelper</code> instance passed to the <code>deepEquals</code> method keeps track
 * of instances that have already been processed to avoid endless recursion for cyclic data
 * structures.
 *
 * @author Michael Bouschen
 * @since 1.1
 */
public interface DeepEquality {

  /**
   * Returns <code>true</code> if all the fields of this instance are deep equal to the
   * corresponding fields of the other Object. This means that all non-relationship fields are equal
   * to the corresponging fields in the other Object, and all relationship fields are deep equal.
   * Recursion is stopped in the equality helper method that compares objects.
   *
   * @param other the object with which to compare.
   * @param helper EqualityHelper to keep track of instances that have already been processed.
   * @return <code>true</code> if all the fields are deep equal; <code>false</code> otherwise.
   * @throws ClassCastException if the specified instances' type prevents it from being compared to
   *     this instance.
   */
  boolean deepCompareFields(Object other, EqualityHelper helper);
}
