/*
 * Copyright (c) 1998, 2021 Oracle and/or its affiliates. All rights reserved.
 *
 * This program and the accompanying materials are made available under the
 * terms of the Eclipse Public License v. 2.0 which is available at
 * http://www.eclipse.org/legal/epl-2.0,
 * or the Eclipse Distribution License v. 1.0 which is available at
 * http://www.eclipse.org/org/documents/edl-v10.php.
 *
 * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
 */

// Contributors:
//     Oracle - initial API and implementation from Oracle TopLink
package org.eclipse.persistence.testing.tests.validation;

import java.lang.reflect.Method;

import java.util.Iterator;
import java.util.Vector;

import org.eclipse.persistence.descriptors.RelationalDescriptor;
import org.eclipse.persistence.exceptions.DescriptorException;
import org.eclipse.persistence.exceptions.EclipseLinkException;
import org.eclipse.persistence.internal.queries.IndirectListContainerPolicy;
import org.eclipse.persistence.mappings.DirectToFieldMapping;
import org.eclipse.persistence.mappings.ForeignReferenceMapping;
import org.eclipse.persistence.mappings.OneToOneMapping;
import org.eclipse.persistence.sessions.DatabaseRecord;
import org.eclipse.persistence.testing.framework.AutoVerifyTestCase;
import org.eclipse.persistence.testing.framework.TestErrorException;


//used for Method.class

//Created by Ian Reid
//Date: Mar 5, 2k3
//non-standard Test
//This class simply calls the static method to get the code coverage for problem
//for untestable code (i.e. method is never called in source code)

public class ConstructingDescriptorExceptionTests extends AutoVerifyTestCase {
    public ConstructingDescriptorExceptionTests() {
        setDescription("This creates all untestable Descriptor Exceptions by calling each static method contructor for Code Coverage (methods and error codes could be Deprecated)");
    }

    Vector testResults = new Vector();
    EclipseLinkException caughtException = null;

    @Override
    public void test() throws NoSuchMethodException {
        try {
            Class<ConstructingDescriptorExceptionTests> javaClass = ConstructingDescriptorExceptionTests.class;
            RelationalDescriptor descriptor = new RelationalDescriptor();
            descriptor.setJavaClass(javaClass);
            TestErrorException dummyException = new TestErrorException("no ERROR");
            DirectToFieldMapping mapping = new DirectToFieldMapping();
            ForeignReferenceMapping mappingFR = new OneToOneMapping();
            IndirectListContainerPolicy policy = new IndirectListContainerPolicy();
            Object object = new Object();
            DatabaseRecord row = new DatabaseRecord();
            Class[] parmClasses = { };
            Method method = javaClass.getDeclaredMethod("test", parmClasses);

            DescriptorException descriptorException;

            descriptorException = DescriptorException.javaClassNotSpecified(descriptor);
            if (descriptorException.getErrorCode() != 39)
                testResults.add("DescriptorException.javaClassNotSpecified");
            //    else testResults.add("Passed");
            descriptorException = DescriptorException.writeLockFieldInChildDescriptor(descriptor);
            if (descriptorException.getErrorCode() != 109)
                testResults.add("DescriptorException.writeLockFieldInChildDescriptor");
            //    else testResults.add("Passed");
            descriptorException = DescriptorException.childDoesNotDefineAbstractQueryKeyOfParent(descriptor, descriptor, "dummy");
            if (descriptorException.getErrorCode() != 120)
                testResults.add("DescriptorException.childDoesNotDefineAbstractQueryKeyOfParent");
            //    else testResults.add("Passed");
            descriptorException = DescriptorException.missingIndirectContainerConstructor(javaClass);
            if (descriptorException.getErrorCode() != 145)
                testResults.add("DescriptorException.missingIndirectContainerConstructor");
            //    else testResults.add("Passed");
            descriptorException = DescriptorException.couldNotInstantiateIndirectContainerClass(javaClass, dummyException);
            if (descriptorException.getErrorCode() != 146)
                testResults.add("DescriptorException.couldNotInstantiateIndirectContainerClass");
            //    else testResults.add("Passed");
            descriptorException = DescriptorException.invalidContainerPolicy(policy, javaClass);
            if (descriptorException.getErrorCode() != 147)
                testResults.add("DescriptorException.invalidContainerPolicy");
            //    else testResults.add("Passed");
            descriptorException = DescriptorException.invalidUseOfNoIndirection(mapping);
            if (descriptorException.getErrorCode() != 149)
                testResults.add("DescriptorException.invalidUseOfNoIndirection");
            //    else testResults.add("Passed");
            descriptorException = DescriptorException.proxyIndirectionNotAvailable(mapping);
            if (descriptorException.getErrorCode() != 159)
                testResults.add("DescriptorException.proxyIndirectionNotAvailable");
            //    else testResults.add("Passed");

            descriptorException = DescriptorException.illegalAccesstWhileGettingValueThruInstanceVaraibleAccessor("attributeName", "objectName", dummyException);
            if (descriptorException.getErrorCode() != 13)
                testResults.add("DescriptorException.illegalAccesstWhileGettingValueThruInstanceVaraibleAccessor");
            //    else testResults.add("Passed");
            descriptorException = DescriptorException.illegalAccessWhileCloning(object, "methodName", descriptor, dummyException);
            if (descriptorException.getErrorCode() != 14)
                testResults.add("DescriptorException.illegalAccessWhileCloning");
            //    else testResults.add("Passed");
            descriptorException = DescriptorException.illegalAccessWhileEventExecution("eventMethodName", descriptor, dummyException);
            if (descriptorException.getErrorCode() != 16)
                testResults.add("DescriptorException.illegalAccessWhileEventExecution");
            //    else testResults.add("Passed");
            descriptorException = DescriptorException.illegalAccessWhileGettingValueThruMethodAccessor("methodName", "objectName", dummyException);
            if (descriptorException.getErrorCode() != 17)
                testResults.add("DescriptorException.illegalAccessWhileGettingValueThruMethodAccessor");
            //    else testResults.add("Passed");
            descriptorException = DescriptorException.illegalAccessWhileInstantiatingMethodBasedProxy(dummyException);
            if (descriptorException.getErrorCode() != 18)
                testResults.add("DescriptorException.illegalAccessWhileInstantiatingMethodBasedProxy");
            //    else testResults.add("Passed");
            descriptorException = DescriptorException.illegalAccessWhileInvokingAttributeMethod(mapping, dummyException);
            if (descriptorException.getErrorCode() != 19)
                testResults.add("DescriptorException.illegalAccessWhileInvokingAttributeMethod");
            //    else testResults.add("Passed");
            descriptorException = DescriptorException.illegalAccessWhileInvokingFieldToMethod("methodName", mapping, dummyException);
            if (descriptorException.getErrorCode() != 20)
                testResults.add("DescriptorException.illegalAccessWhileInvokingFieldToMethod");
            //    else testResults.add("Passed");
            descriptorException = DescriptorException.illegalAccessWhileInvokingRowExtractionMethod(row, method, descriptor, dummyException);
            if (descriptorException.getErrorCode() != 21)
                testResults.add("DescriptorException.illegalAccessWhileInvokingRowExtractionMethod");
            //    else testResults.add("Passed");
            descriptorException = DescriptorException.illegalAccessWhileMethodInstantiation("methodName", descriptor, dummyException);
            if (descriptorException.getErrorCode() != 22)
                testResults.add("DescriptorException.illegalAccessWhileMethodInstantiation");
            //    else testResults.add("Passed");
            descriptorException = DescriptorException.illegalAccessWhileObsoleteEventExecute("eventMethodName", descriptor, dummyException);
            if (descriptorException.getErrorCode() != 23)
                testResults.add("DescriptorException.illegalAccessWhileObsoleteEventExecute");
            //    else testResults.add("Passed");
            descriptorException = DescriptorException.illegalAccessWhileSettingValueThruInstanceVariableAccessor("attributeName", "objectName", object, dummyException);
            if (descriptorException.getErrorCode() != 24)
                testResults.add("DescriptorException.illegalAccessWhileSettingValueThruInstanceVariableAccessor");
            //    else testResults.add("Passed");
            descriptorException = DescriptorException.illegalAccessWhileSettingValueThruMethodAccessor("setMethodName", object, dummyException);
            if (descriptorException.getErrorCode() != 25)
                testResults.add("DescriptorException.illegalAccessWhileSettingValueThruMethodAccessor");
            //    else testResults.add("Passed");
            descriptorException = DescriptorException.missingClassForIndicatorFieldValue(object, descriptor);
            if (descriptorException.getErrorCode() != 43)
                testResults.add("DescriptorException.missingClassForIndicatorFieldValue");
            //    else testResults.add("Passed");
            descriptorException = DescriptorException.missingClassIndicatorField(row, descriptor);
            if (descriptorException.getErrorCode() != 44)
                testResults.add("DescriptorException.missingClassIndicatorField");
            //    else testResults.add("Passed");
            descriptorException = DescriptorException.notDeserializable(mapping, dummyException);
            if (descriptorException.getErrorCode() != 66)
                testResults.add("DescriptorException.notDeserializable");
            //    else testResults.add("Passed");
            descriptorException = DescriptorException.notSerializable(mapping, dummyException);
            if (descriptorException.getErrorCode() != 67)
                testResults.add("DescriptorException.notSerializable");
            //    else testResults.add("Passed");
            descriptorException = DescriptorException.nullPointerWhileSettingValueThruInstanceVariableAccessor("attributeName", object, dummyException);
            if (descriptorException.getErrorCode() != 71)
                testResults.add("DescriptorException.nullPointerWhileSettingValueThruInstanceVariableAccessor");
            //    else testResults.add("Passed");
            descriptorException = DescriptorException.nullPointerWhileSettingValueThruMethodAccessor("setMethodName", object, dummyException);
            if (descriptorException.getErrorCode() != 72)
                testResults.add("DescriptorException.nullPointerWhileSettingValueThruMethodAccessor");
            //    else testResults.add("Passed");
            descriptorException = DescriptorException.securityOnFindMethod("methodName", descriptor, dummyException);
            if (descriptorException.getErrorCode() != 82)
                testResults.add("DescriptorException.securityOnFindMethod");
            //    else testResults.add("Passed");
            descriptorException = DescriptorException.securityOnFindObsoleteMethod("methodName", descriptor, dummyException);
            if (descriptorException.getErrorCode() != 83)
                testResults.add("DescriptorException.securityOnFindObsoleteMethod");
            //    else testResults.add("Passed");
            descriptorException = DescriptorException.securityOnInitializingAttributeMethod("attributeMethodName", mapping, dummyException);
            if (descriptorException.getErrorCode() != 84)
                testResults.add("DescriptorException.securityOnInitializingAttributeMethod");
            //    else testResults.add("Passed");
            descriptorException = DescriptorException.securityWhileConvertingToMethod("methodName", mapping, dummyException);
            if (descriptorException.getErrorCode() != 85)
                testResults.add("DescriptorException.securityWhileConvertingToMethod");
            //    else testResults.add("Passed");
            descriptorException = DescriptorException.securityWhileInitializingAttributesInInstanceVariableAccessor("attributeName", "javaClassName", dummyException);
            if (descriptorException.getErrorCode() != 86)
                testResults.add("DescriptorException.securityWhileInitializingAttributesInInstanceVariableAccessor");
            //    else testResults.add("Passed");
            descriptorException = DescriptorException.securityWhileInitializingAttributesInMethodAccessor("setMethodName", "getMethodName", "javaClassName");
            if (descriptorException.getErrorCode() != 87)
                testResults.add("DescriptorException.securityWhileInitializingAttributesInMethodAccessor");
            //    else testResults.add("Passed");
            descriptorException = DescriptorException.securityWhileInitializingClassExtractionMethod("methodName", descriptor, dummyException);
            if (descriptorException.getErrorCode() != 88)
                testResults.add("DescriptorException.securityWhileInitializingClassExtractionMethod");
            //    else testResults.add("Passed");
            descriptorException = DescriptorException.securityWhileInitializingCopyPolicy("methodName", descriptor, dummyException);
            if (descriptorException.getErrorCode() != 89)
                testResults.add("DescriptorException.securityWhileInitializingCopyPolicy");
            //    else testResults.add("Passed");
            descriptorException = DescriptorException.securityWhileInitializingInstantiationPolicy("methodName", descriptor, dummyException);
            if (descriptorException.getErrorCode() != 90)
                testResults.add("DescriptorException.securityWhileInitializingInstantiationPolicy");
            //    else testResults.add("Passed");
            descriptorException = DescriptorException.sizeMismatchOfForeignKeys(mappingFR);
            if (descriptorException.getErrorCode() != 92)
                testResults.add("DescriptorException.sizeMismatchOfForeignKeys");
            //    else testResults.add("Passed");
            descriptorException = DescriptorException.targetForeignKeysSizeMismatch(mappingFR);
            if (descriptorException.getErrorCode() != 96)
                testResults.add("DescriptorException.targetForeignKeysSizeMismatch");
            //    else testResults.add("Passed");
            descriptorException = DescriptorException.multipleTableInsertOrderMismatch(descriptor);
            if (descriptorException.getErrorCode() != 143)
                testResults.add("DescriptorException.multipleTableInsertOrderMismatch");
            //    else testResults.add("Passed");
            descriptorException = DescriptorException.variableOneToOneMappingIsNotDefinedProperly(mapping, descriptor, "targetKeyName");
            if (descriptorException.getErrorCode() != 166)
                testResults.add("DescriptorException.variableOneToOneMappingIsNotDefinedProperly");
            //    else testResults.add("Passed");
            descriptorException = DescriptorException.illegalAccessWhileConstructorInstantiationOfFactory(descriptor, dummyException);
            if (descriptorException.getErrorCode() != 170)
                testResults.add("DescriptorException.illegalAccessWhileConstructorInstantiationOfFactory");
            //    else testResults.add("Passed");
            descriptorException = DescriptorException.noSuchMethodWhileConstructorInstantiationOfFactory(descriptor, dummyException);
            if (descriptorException.getErrorCode() != 172)
                testResults.add("DescriptorException.noSuchMethodWhileConstructorInstantiationOfFactory");
            //    else testResults.add("Passed");
            descriptorException = DescriptorException.nullPointerWhileConstructorInstantiationOfFactory(descriptor, dummyException);
            if (descriptorException.getErrorCode() != 173)
                testResults.add("DescriptorException.nullPointerWhileConstructorInstantiationOfFactory");
            //    else testResults.add("Passed");
            descriptorException = DescriptorException.illegalAccessWhileMethodInstantiationOfFactory("methodName", descriptor, dummyException);
            if (descriptorException.getErrorCode() != 174)
                testResults.add("DescriptorException.illegalAccessWhileMethodInstantiationOfFactory");
            //    else testResults.add("Passed");
            descriptorException = DescriptorException.targetInvocationWhileMethodInstantiationOfFactory("methodName", descriptor, dummyException);
            if (descriptorException.getErrorCode() != 175)
                testResults.add("DescriptorException.targetInvocationWhileMethodInstantiationOfFactory");
            //    else testResults.add("Passed");
            descriptorException = DescriptorException.nullPointerWhileMethodInstantiationOfFactory("methodName", descriptor, dummyException);
            if (descriptorException.getErrorCode() != 176)
                testResults.add("DescriptorException.nullPointerWhileMethodInstantiationOfFactory");
            //    else testResults.add("Passed");
            descriptorException = DescriptorException.mappingForAttributeIsMissing("attributeName", descriptor);
            if (descriptorException.getErrorCode() != 177)
                testResults.add("DescriptorException.mappingForAttributeIsMissing");
            //    else testResults.add("Passed");
            descriptorException = DescriptorException.attributeMappingIsMissingForEntityBean("attributeName", "beanName");
            if (descriptorException.getErrorCode() != 178)
                testResults.add("DescriptorException.attributeMappingIsMissingForEntityBean");
            //    else testResults.add("Passed");
        } catch (EclipseLinkException exception) {
            caughtException = exception;
        }
    }

    @Override
    protected void verify() {
        if (caughtException != null) {
            throw new TestErrorException("An exception was thrown:" + org.eclipse.persistence.internal.helper.Helper.cr() + "caught exception was not null! \n\n[EXPECTING] no Exceptions ");
        }
        Iterator iteratorResults = testResults.iterator();
        while (iteratorResults.hasNext()) {
            String item = (String)iteratorResults.next();
            if (!item.equalsIgnoreCase("passed")) {
                throw new TestErrorException("The proper exception was not created:" + org.eclipse.persistence.internal.helper.Helper.cr() + "[Problem with METHOD] " + item);
            }

        }


    }
}
