/*******************************************************************************
* Copyright (c) 2015 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;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertSame;
import static org.junit.Assert.fail;
import java.util.ArrayList;
import java.util.List;
import javax.xml.namespace.QName;
import mockit.Deencapsulation;
import mockit.Expectations;
import mockit.Mock;
import mockit.MockUp;
import mockit.Mocked;
import mockit.Tested;
import mockit.Verifications;
import mockit.integration.junit4.JMockit;
import org.eclipse.persistence.exceptions.JAXBException;
import org.eclipse.persistence.jaxb.compiler.Property;
import org.eclipse.persistence.jaxb.compiler.TypeInfo;
import org.eclipse.persistence.jaxb.compiler.XMLProcessor;
import org.eclipse.persistence.jaxb.compiler.builder.TransformerPropertyBuilder;
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.xmlmodel.XmlTransformation;
import org.eclipse.persistence.jaxb.xmlmodel.XmlTransformation.XmlWriteTransformer;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
/**
* Tests TransformerPropertyBuilder methods.
*
* @author Martin Vojtek
*
*/
@RunWith(JMockit.class)
public class TransformerPropertyBuilderTestCase {
@Mocked Property property;
@Mocked TypeInfo typeInfo;
@Mocked Helper helper;
String attributeToken = "testAttributeToken";
@Tested TransformerPropertyBuilder builder;
@Before
public void init() {
builder = new TransformerPropertyBuilder(property, typeInfo, helper, attributeToken);
}
@Test
public void buildProperties(final @Mocked XmlTransformation xmlTransformation, final @Mocked XmlWriteTransformer transformer1, final @Mocked XmlWriteTransformer transformer2) {
final Property property1 = new Property();
final Property property2 = new Property();
new Expectations(TransformerPropertyBuilder.class) {{
property.getXmlTransformation(); result = xmlTransformation;
List<XmlWriteTransformer> transformers = new ArrayList<>();
transformers.add(transformer1);
transformers.add(transformer2);
xmlTransformation.getXmlWriteTransformer(); result = transformers;
String property1Name = "property1";
Deencapsulation.invoke(builder, "getPropertyName", property, transformer1); result = property1Name;
Deencapsulation.invoke(builder, "buildPropertyFromTransformer", property1Name, typeInfo, transformer1); result = property1;
String property2Name = "property2";
Deencapsulation.invoke(builder, "getPropertyName", property, transformer2); result = property2Name;
Deencapsulation.invoke(builder, "buildPropertyFromTransformer", property2Name, typeInfo, transformer2); result = property2;
}};
List<Property> properties = builder.buildProperties();
assertEquals(2, properties.size());
assertSame(property1, properties.get(0));
assertSame(property2, properties.get(1));
}
@Test
public void getPropertyName(final @Mocked XmlWriteTransformer transformer, final @Mocked XMLProcessor xmlProcessor) {
final String expectedResult = "expectedResult";
new Expectations(TransformerPropertyBuilder.class) {{
String xmlPath = "xmlPath";
transformer.getXmlPath(); result = xmlPath;
XMLProcessor.getNameFromXPath(xmlPath, property.getPropertyName(), false); result = expectedResult;
}};
String propertyName = Deencapsulation.invoke(builder, "getPropertyName", property, transformer);
assertSame(expectedResult, propertyName);
}
@Test
public void buildPropertyFromTransformer(final @Mocked String pname, final @Mocked TypeInfo typeInfo, final @Mocked XmlWriteTransformer transformer, final @Mocked JavaClass type, final @Mocked Property propety) {
final String xmlPath = "xmlPath";
new Expectations(TransformerPropertyBuilder.class) {{
transformer.getXmlPath(); result = xmlPath;
Deencapsulation.invoke(builder, "getReturnTypeFromTransformer", typeInfo, transformer); result = type;
}};
final Property resultProperty = Deencapsulation.invoke(builder, "buildPropertyFromTransformer", pname, typeInfo, transformer);
new Verifications() {{
resultProperty.setPropertyName(pname);
resultProperty.setXmlPath(xmlPath);
resultProperty.setSchemaName(new QName(pname));
resultProperty.setType(type);
}};
}
@Test
public void getReturnTypeFromTransformer_isSetTransformerClass(final @Mocked TypeInfo typeInfo, final @Mocked XmlWriteTransformer transformer, final @Mocked JavaClass javaClass, final @Mocked TransformerReflectionHelper transformerReflectionHelper, final @Mocked JavaClass resultJavaClass) {
new Expectations(TransformerPropertyBuilder.class) {{
Deencapsulation.invoke(builder, "getTransformerJavaClass", typeInfo, transformer); result = javaClass;
transformer.isSetTransformerClass(); result = true;
Deencapsulation.invoke(builder, "getTransformerReflectionHelper"); result = transformerReflectionHelper;
transformerReflectionHelper.getReturnTypeForWriteTransformationMethodTransformer(javaClass); result = resultJavaClass;
}};
final JavaClass returnType = Deencapsulation.invoke(builder, "getReturnTypeFromTransformer", typeInfo, transformer);
assertSame(resultJavaClass, returnType);
}
@Test
public void getReturnTypeFromTransformer_isNotSetTransformerClass(final @Mocked TypeInfo typeInfo, final @Mocked XmlWriteTransformer transformer, final @Mocked JavaClass javaClass, final @Mocked TransformerReflectionHelper transformerReflectionHelper, final @Mocked JavaClass resultJavaClass) {
new Expectations(TransformerPropertyBuilder.class) {{
Deencapsulation.invoke(builder, "getTransformerJavaClass", typeInfo, transformer); result = javaClass;
transformer.isSetTransformerClass(); result = false;
Deencapsulation.invoke(builder, "getTransformerReflectionHelper"); result = transformerReflectionHelper;
String transformerMethod = "transformerMethod";
transformer.getMethod(); result = transformerMethod;
transformerReflectionHelper.getReturnTypeForWriteTransformationMethod(transformerMethod, javaClass); result = resultJavaClass;
}};
final JavaClass returnType = Deencapsulation.invoke(builder, "getReturnTypeFromTransformer", typeInfo, transformer);
assertSame(resultJavaClass, returnType);
}
@Test
public void getTransformerJavaClass_isSetTransformerClass(final @Mocked TypeInfo typeInfo, final @Mocked XmlWriteTransformer transformer, final @Mocked JavaClass resultJavaClass) {
new Expectations(TransformerPropertyBuilder.class) {{
transformer.isSetTransformerClass(); result = true;
String transformerClass = "transformerClass";
transformer.getTransformerClass(); result = transformerClass;
helper.getJavaClass(transformerClass); result = resultJavaClass;
}};
final JavaClass returnType = Deencapsulation.invoke(builder, "getTransformerJavaClass", typeInfo, transformer);
assertSame(resultJavaClass, returnType);
}
@Test
public void getTransformerJavaClass_isSetTransformerClass_throwsJAXBExcpetion(final @Mocked TypeInfo typeInfo, final @Mocked XmlWriteTransformer transformer, final @Mocked JavaClass resultJavaClass) {
new Expectations(TransformerPropertyBuilder.class) {{
transformer.isSetTransformerClass(); result = true;
String transformerClass = "transformerClass";
transformer.getTransformerClass(); result = transformerClass;
helper.getJavaClass(transformerClass); result = JAXBException.transformerClassNotFound(transformerClass);
transformer.getTransformerClass(); result = transformerClass;
}};
try {
Deencapsulation.invoke(builder, "getTransformerJavaClass", typeInfo, transformer);
fail("JAXBException should be thrown");
} catch(JAXBException exception) {
}
}
@Test
public void getTransformerJavaClass_isNotSetTransformerClass(final @Mocked TypeInfo typeInfo, final @Mocked XmlWriteTransformer transformer, final @Mocked JavaClass resultJavaClass) {
new Expectations(TransformerPropertyBuilder.class) {{
transformer.isSetTransformerClass(); result = false;
helper.getJavaClass(typeInfo.getJavaClassName()); result = resultJavaClass;
}};
final JavaClass returnType = Deencapsulation.invoke(builder, "getTransformerJavaClass", typeInfo, transformer);
assertSame(resultJavaClass, returnType);
}
}