/*******************************************************************************
 * Copyright (c) 2015, 2017 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 v1.0 and Eclipse Distribution License v. 1.0
 * which accompanies this distribution.
 *
 * The Eclipse Public License is available at http://www.eclipse.org/legal/epl-v10.html
 * and the Eclipse Distribution License is available at
 * http://www.eclipse.org/org/documents/edl-v10.php.
 *
 * Contributors:
 *  - Martin Vojtek - 2.6 - Initial implementation
 ******************************************************************************/
package org.eclipse.persistence.testing.moxy.unit.jaxb.compiler.builder.helper;

import static org.junit.Assert.assertSame;
import static org.junit.Assert.fail;

import java.util.ArrayList;
import java.util.List;

import mockit.Deencapsulation;
import mockit.Expectations;
import mockit.Mock;
import mockit.MockUp;
import mockit.Mocked;
import mockit.Tested;
import mockit.integration.junit4.JMockit;

import org.eclipse.persistence.exceptions.JAXBException;
import org.eclipse.persistence.internal.helper.TransformerHelper;
import org.eclipse.persistence.jaxb.compiler.builder.helper.TransformerReflectionHelper;
import org.eclipse.persistence.jaxb.javamodel.Helper;
import org.eclipse.persistence.jaxb.javamodel.JavaClass;
import org.eclipse.persistence.jaxb.javamodel.JavaMethod;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;

/**
 * Tests TransformerReflection methods.
 *
 * @author Martin Vojtek
 *
 */
@RunWith(JMockit.class)
public class TransformerReflectionHelperTestCase {

    @Tested TransformerReflectionHelper transformerReflectionHelper;
    @Mocked Helper helper;

    @Before
    public void init() {
        this.transformerReflectionHelper = new TransformerReflectionHelper(helper);
    }

    @Test
    public void getReturnTypeForWriteTransformationMethodTransformer(final @Mocked TransformerHelper transformerHelper, final @Mocked JavaClass writerClass, final @Mocked JavaClass expectedReturnType) {
        final String transformerMethodName = "transformerMethodName";

        new MockUp<TransformerReflectionHelper>() {
            @Mock
            protected TransformerHelper getTransformerHelper() {
                return transformerHelper;
            }

            @Mock
            private JavaClass getReturnTypeForWriteTransformationMethod(String methodName, JavaClass writerClass, boolean isSetTransformerClass) throws JAXBException {
                return expectedReturnType;
            }
        };

        new Expectations() {{
            transformerHelper.getTransformerMethodName(); result = transformerMethodName;
        }};

        JavaClass returnType = Deencapsulation.invoke(transformerReflectionHelper, "getReturnTypeForWriteTransformationMethodTransformer", writerClass);

        assertSame(expectedReturnType, returnType);
    }

    @Test
    public void getReturnTypeForWriteTransformationMethod(final @Mocked JavaClass writerClass, final @Mocked JavaClass expectedReturnType) {

        final String methodName = "methodName";

        new MockUp<TransformerReflectionHelper>() {
            @Mock
            private JavaClass getReturnTypeForWriteTransformationMethod(String methodName, JavaClass writerClass, boolean isSetTransformerClass) throws JAXBException {
                return expectedReturnType;
            }
        };

        JavaClass returnType = Deencapsulation.invoke(transformerReflectionHelper, "getReturnTypeForWriteTransformationMethod", methodName, writerClass);

        assertSame(expectedReturnType, returnType);
    }

    @Test
    public void getReturnTypeForWriteTransformationMethod_isSetTransformerClass(final @Mocked TransformerHelper transformerHelper, final @Mocked JavaClass writerClass, final @Mocked JavaClass expectedReturnType, final @Mocked JavaMethod javaMethod) {

        final String methodName = "methodName";

        final boolean isSetTransformerClass = false;

        new Expectations(TransformerReflectionHelper.class) {{

            List<Class[]> classes = new ArrayList<>();
            Class[] classes1 = new Class[0];
            classes.add(classes1);
            Class[] classes2 = new Class[0];
            classes.add(classes2);

            Deencapsulation.invoke(transformerReflectionHelper, "getTransformerHelper"); result = transformerHelper;
            transformerHelper.getTransformerMethodParameters(isSetTransformerClass); result = classes;
            JavaClass[] javaClasses = new JavaClass[0];
            helper.getJavaClassArray(classes1); result = javaClasses;
            writerClass.getDeclaredMethod(methodName, javaClasses); result = null;

            helper.getJavaClassArray(classes2); result = javaClasses;
            writerClass.getDeclaredMethod(methodName, javaClasses); result = javaMethod;

            javaMethod.getReturnType(); result = expectedReturnType;
        }};

        JavaClass returnType = Deencapsulation.invoke(transformerReflectionHelper, "getReturnTypeForWriteTransformationMethod", methodName, writerClass, isSetTransformerClass);

        assertSame(expectedReturnType, returnType);
    }

    @Test
    public void getReturnTypeForWriteTransformationMethod_throwsJAXBException(final @Mocked TransformerHelper transformerHelper, final @Mocked JavaClass writerClass) {

        final String methodName = "methodName";

        final boolean isSetTransformerClass = false;

        new Expectations(TransformerReflectionHelper.class) {{

            List<Class[]> classes = new ArrayList<>();
            Class[] classes1 = new Class[0];
            classes.add(classes1);
            Class[] classes2 = new Class[0];
            classes.add(classes2);

            Deencapsulation.invoke(transformerReflectionHelper, "getTransformerHelper"); result = transformerHelper;
            transformerHelper.getTransformerMethodParameters(isSetTransformerClass); result = classes;
            JavaClass[] javaClasses = new JavaClass[0];
            helper.getJavaClassArray(classes1); result = javaClasses;
            writerClass.getDeclaredMethod(methodName, javaClasses); result = null;

            helper.getJavaClassArray(classes2); result = javaClasses;
            writerClass.getDeclaredMethod(methodName, javaClasses); result = null;

        }};

        try {
            Deencapsulation.invoke(transformerReflectionHelper, "getReturnTypeForWriteTransformationMethod", methodName, writerClass, isSetTransformerClass);
            fail("Expected JAXBException.");
        } catch (JAXBException expected) {

        }
    }
}
