/*
 * 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.api.exceptions;

import java.lang.reflect.Constructor;
import org.apache.jdo.tck.JDO_Test;
import org.apache.jdo.tck.util.BatchTestRunner;

/**
 * <B>Title:</B> Exception Constructor <br>
 * <B>Keywords:</B> exception <br>
 * <B>Assertion ID:</B> <br>
 * <B>Assertion Description: </B>
 */
@SuppressWarnings("rawtypes")
public class ExceptionConstructor extends JDO_Test {

  protected static final Class<?>[] classArrayEmpty = new Class[] {};
  protected static final Class<?>[] classArrayString = new Class[] {String.class};
  protected static final Class<?>[] classArrayStringObject =
      new Class[] {String.class, Object.class};
  protected static final Class<?>[] classArrayStringThrowable =
      new Class[] {String.class, Throwable.class};
  protected static final Class<?>[] classArrayStringThrowableArray =
      new Class[] {String.class, Throwable[].class};
  protected static final Class<?>[] classArrayStringThrowableObject =
      new Class[] {String.class, Throwable.class, Object.class};
  protected static final Class<?>[] classArrayStringThrowableArrayObject =
      new Class[] {String.class, Throwable[].class, Object.class};
  protected static final String message = "Message";
  protected static final Object object = "Failed Object";
  protected static final Throwable throwable = new Throwable("Throwable");
  protected static final Object[] objectArrayEmpty = new Object[] {};
  protected static final Object[] objectArrayString = new Object[] {message};
  protected static final Object[] objectArrayStringObject = new Object[] {message, object};
  protected static final Object[] objectArrayStringThrowableArray =
      new Object[] {message, new Throwable[] {throwable}};
  protected static final Object[] objectArrayStringThrowable = new Object[] {message, throwable};
  protected static final Object[] objectArrayStringThrowableArrayObject =
      new Object[] {message, new Throwable[] {throwable}, object};
  protected static final Object[] objectArrayStringThrowableObject =
      new Object[] {message, throwable, object};
  /**
   * The <code>main</code> is called when the class is directly executed from the command line.
   *
   * @param args The arguments passed to the program.
   */
  public static void main(String[] args) {
    BatchTestRunner.run(ExceptionConstructor.class);
  }

  /* test all constructors
   *
   */
  public void testConstructors() {
    constructJDOCanRetryException();
    constructJDODataStoreException();
    constructJDODetachedFieldAccessException();
    constructJDOException();
    constructJDOFatalDataStoreException();
    constructJDOFatalException();
    constructJDOFatalInternalException();
    constructJDOFatalUserException();
    constructJDONullIdentityException();
    constructJDOObjectNotFoundException();
    constructJDOOptimisticVerificationException();
    constructJDOUnsupportedOptionException();
    constructJDOUserCallbackException();
    failOnError();
  }

  protected void constructJDOCanRetryException() {
    constructEmpty(javax.jdo.JDOCanRetryException.class);
    constructString(javax.jdo.JDOCanRetryException.class);
    constructStringThrowableArray(javax.jdo.JDOCanRetryException.class);
    constructStringThrowable(javax.jdo.JDOCanRetryException.class);
    constructStringObject(javax.jdo.JDOCanRetryException.class);
    constructStringThrowableArrayObject(javax.jdo.JDOCanRetryException.class);
    constructStringThrowableObject(javax.jdo.JDOCanRetryException.class);
  }

  protected void constructJDODataStoreException() {
    constructEmpty(javax.jdo.JDODataStoreException.class);
    constructString(javax.jdo.JDODataStoreException.class);
    constructStringThrowableArray(javax.jdo.JDODataStoreException.class);
    constructStringThrowable(javax.jdo.JDODataStoreException.class);
    constructStringObject(javax.jdo.JDODataStoreException.class);
    constructStringThrowableArrayObject(javax.jdo.JDODataStoreException.class);
    constructStringThrowableObject(javax.jdo.JDODataStoreException.class);
  }

  protected void constructJDODetachedFieldAccessException() {
    constructEmpty(javax.jdo.JDODetachedFieldAccessException.class);
    constructString(javax.jdo.JDODetachedFieldAccessException.class);
    constructStringThrowableArray(javax.jdo.JDODetachedFieldAccessException.class);
    constructStringThrowable(javax.jdo.JDODetachedFieldAccessException.class);
    constructStringObject(javax.jdo.JDODetachedFieldAccessException.class);
  }

  protected void constructJDOException() {
    constructEmpty(javax.jdo.JDOException.class);
    constructString(javax.jdo.JDOException.class);
    constructStringThrowableArray(javax.jdo.JDOException.class);
    constructStringThrowable(javax.jdo.JDOException.class);
    constructStringObject(javax.jdo.JDOException.class);
    constructStringThrowableArrayObject(javax.jdo.JDOException.class);
    constructStringThrowableObject(javax.jdo.JDOException.class);
  }

  protected void constructJDOFatalDataStoreException() {
    constructEmpty(javax.jdo.JDOFatalDataStoreException.class);
    constructString(javax.jdo.JDOFatalDataStoreException.class);
    constructStringThrowableArray(javax.jdo.JDOFatalDataStoreException.class);
    constructStringThrowable(javax.jdo.JDOFatalDataStoreException.class);
    constructStringObject(javax.jdo.JDOFatalDataStoreException.class);
  }

  protected void constructJDOFatalException() {
    constructEmpty(javax.jdo.JDOFatalException.class);
    constructString(javax.jdo.JDOFatalException.class);
    constructStringThrowableArray(javax.jdo.JDOFatalException.class);
    constructStringThrowable(javax.jdo.JDOFatalException.class);
    constructStringObject(javax.jdo.JDOFatalException.class);
    constructStringThrowableArrayObject(javax.jdo.JDOFatalException.class);
    constructStringThrowableObject(javax.jdo.JDOFatalException.class);
  }

  protected void constructJDOFatalInternalException() {
    constructEmpty(javax.jdo.JDOFatalInternalException.class);
    constructString(javax.jdo.JDOFatalInternalException.class);
    constructStringThrowableArray(javax.jdo.JDOFatalInternalException.class);
    constructStringThrowable(javax.jdo.JDOFatalInternalException.class);
    constructStringObject(javax.jdo.JDOFatalInternalException.class);
    constructStringThrowableArrayObject(javax.jdo.JDOFatalInternalException.class);
    constructStringThrowableObject(javax.jdo.JDOFatalInternalException.class);
  }

  protected void constructJDOFatalUserException() {
    constructEmpty(javax.jdo.JDOFatalUserException.class);
    constructString(javax.jdo.JDOFatalUserException.class);
    constructStringThrowableArray(javax.jdo.JDOFatalUserException.class);
    constructStringThrowable(javax.jdo.JDOFatalUserException.class);
    constructStringObject(javax.jdo.JDOFatalUserException.class);
    constructStringThrowableArrayObject(javax.jdo.JDOFatalUserException.class);
    constructStringThrowableObject(javax.jdo.JDOFatalUserException.class);
  }

  protected void constructJDONullIdentityException() {
    constructEmpty(javax.jdo.JDONullIdentityException.class);
    constructString(javax.jdo.JDONullIdentityException.class);
    constructStringThrowableArray(javax.jdo.JDONullIdentityException.class);
    constructStringThrowable(javax.jdo.JDONullIdentityException.class);
    constructStringObject(javax.jdo.JDONullIdentityException.class);
  }

  protected void constructJDOObjectNotFoundException() {
    constructEmpty(javax.jdo.JDOObjectNotFoundException.class);
    constructString(javax.jdo.JDOObjectNotFoundException.class);
    constructStringThrowableArray(javax.jdo.JDOObjectNotFoundException.class);
    constructStringObject(javax.jdo.JDOObjectNotFoundException.class);
    constructStringThrowableArrayObject(javax.jdo.JDOObjectNotFoundException.class);
    constructStringThrowableObject(javax.jdo.JDOObjectNotFoundException.class);
  }

  protected void constructJDOOptimisticVerificationException() {
    constructEmpty(javax.jdo.JDOOptimisticVerificationException.class);
    constructString(javax.jdo.JDOOptimisticVerificationException.class);
    constructStringThrowableArray(javax.jdo.JDOOptimisticVerificationException.class);
    constructStringObject(javax.jdo.JDOOptimisticVerificationException.class);
    constructStringThrowableArrayObject(javax.jdo.JDOOptimisticVerificationException.class);
    constructStringThrowableObject(javax.jdo.JDOOptimisticVerificationException.class);
  }

  protected void constructJDOUnsupportedOptionException() {
    constructEmpty(javax.jdo.JDOUnsupportedOptionException.class);
    constructString(javax.jdo.JDOUnsupportedOptionException.class);
    constructStringThrowableArray(javax.jdo.JDOUnsupportedOptionException.class);
    constructStringThrowable(javax.jdo.JDOUnsupportedOptionException.class);
  }

  protected void constructJDOUserCallbackException() {
    constructEmpty(javax.jdo.JDOUserCallbackException.class);
    constructString(javax.jdo.JDOUserCallbackException.class);
    constructStringThrowableArray(javax.jdo.JDOUserCallbackException.class);
    constructStringThrowable(javax.jdo.JDOUserCallbackException.class);
    constructStringObject(javax.jdo.JDOUserCallbackException.class);
    constructStringThrowableArrayObject(javax.jdo.JDOUserCallbackException.class);
    constructStringThrowableObject(javax.jdo.JDOUserCallbackException.class);
  }

  protected void constructEmpty(Class<?> clazz) {
    construct(clazz, classArrayEmpty, objectArrayEmpty, null, null, null);
  }

  protected void constructString(Class<?> clazz) {
    construct(clazz, classArrayString, objectArrayString, message, null, null);
  }

  protected void constructStringObject(Class<?> clazz) {
    construct(clazz, classArrayStringObject, objectArrayStringObject, message, object, null);
  }

  protected void constructStringThrowableArray(Class<?> clazz) {
    construct(
        clazz,
        classArrayStringThrowableArray,
        objectArrayStringThrowableArray,
        message,
        null,
        throwable);
  }

  protected void constructStringThrowable(Class<?> clazz) {
    construct(
        clazz, classArrayStringThrowable, objectArrayStringThrowable, message, null, throwable);
  }

  protected void constructStringThrowableArrayObject(Class<?> clazz) {
    construct(
        clazz,
        classArrayStringThrowableArrayObject,
        objectArrayStringThrowableArrayObject,
        message,
        object,
        throwable);
  }

  protected void constructStringThrowableObject(Class<?> clazz) {
    construct(
        clazz,
        classArrayStringThrowableObject,
        objectArrayStringThrowableObject,
        message,
        object,
        throwable);
  }

  protected void construct(
      Class<?> clazz,
      Class<?>[] formal,
      Object[] params,
      String expectedMessage,
      Object expectedObject,
      Throwable expectedCause) {
    Constructor<?> ctor = null;
    try {
      ctor = clazz.getConstructor(formal);
    } catch (Throwable ex) {
      appendMessage("Throwable caught during getConstructor. " + ex);
      return;
    }
    try {
      throw (Throwable) ctor.newInstance(params);
    } catch (javax.jdo.JDOException ex) {
      // good catch
      if (clazz.isInstance(ex)) {
        Object actualObject = ex.getFailedObject();
        if (expectedObject != null && !expectedObject.equals(actualObject)) {
          appendMessage(
              "Wrong failed object for exception of "
                  + clazz
                  + "; Expected: "
                  + expectedObject
                  + " Actual: "
                  + actualObject);
        }
        String actualMessage = ex.getMessage();
        if (expectedMessage != null && !expectedMessage.equals(actualMessage)) {
          appendMessage(
              "Wrong message for exception of "
                  + clazz
                  + "; Expected: "
                  + expectedMessage
                  + " Actual: "
                  + actualMessage);
        }
        Throwable actualCause = ex.getCause();
        if (expectedCause != null && !expectedCause.equals(actualCause)) {
          appendMessage(
              "Wrong cause for exception of "
                  + clazz
                  + "; Expected: "
                  + expectedCause
                  + " Actual: "
                  + actualCause);
        }
        return;
      } else {
        appendMessage(
            "Wrong Throwable type caught for "
                + clazz
                + "; Expected:"
                + clazz
                + " Actual: "
                + ex.getClass());
      }
    } catch (Throwable t) {
      appendMessage(
          "Wrong Throwable type caught for "
              + clazz
              + "; Expected:"
              + clazz
              + " Actual: "
              + t.getClass());
    }
  }
}
