package com.querydsl.apt;
import static org.junit.Assert.fail;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import javax.persistence.*;
import org.junit.Test;
import com.google.common.base.Charsets;
import com.google.common.collect.ForwardingSet;
import com.google.common.io.Files;
import com.querydsl.apt.domain.AbstractEntityTest;
import com.querydsl.apt.domain.CustomCollection;
import com.querydsl.apt.domain.Generic2Test;
import com.querydsl.apt.hibernate.HibernateAnnotationProcessor;
import com.querydsl.codegen.GenericExporter;
import com.querydsl.codegen.Keywords;
import com.querydsl.codegen.PropertyHandling;
import com.querydsl.core.domain.A;
public class GenericExporterTest extends AbstractProcessorTest {
private static final String PACKAGE_PATH = "src/test/java/com/querydsl/apt/domain/";
private static final List<String> CLASSES = getFiles(PACKAGE_PATH);
@Test
public void execute() throws IOException {
// via APT
process(QuerydslAnnotationProcessor.class, CLASSES, "QuerydslAnnotationProcessor");
// via GenericExporter
GenericExporter exporter = new GenericExporter();
exporter.setTargetFolder(new File("target/GenericExporterTest"));
exporter.export(AbstractEntityTest.class.getPackage(), A.class.getPackage());
List<String> expected = new ArrayList<String>();
// delegates are not supported
expected.add("QDelegateTest_SimpleUser.java");
expected.add("QDelegateTest_SimpleUser2.java");
expected.add("QDelegateTest_User.java");
expected.add("QDelegate2Test_Entity.java");
expected.add("QExampleEntity.java");
expected.add("QQueryProjectionTest_DTOWithProjection.java");
expected.add("QQueryProjectionTest_EntityWithProjection.java");
expected.add("QEmbeddable3Test_EmbeddableClass.java");
expected.add("QQueryEmbedded4Test_User.java");
execute(expected, "GenericExporterTest", "QuerydslAnnotationProcessor");
}
@Test
public void execute2() throws IOException {
// via APT
process(HibernateAnnotationProcessor.class, CLASSES, "HibernateAnnotationProcessor");
// via GenericExporter
GenericExporter exporter = new GenericExporter();
exporter.setKeywords(Keywords.JPA);
exporter.setEntityAnnotation(Entity.class);
exporter.setEmbeddableAnnotation(Embeddable.class);
exporter.setEmbeddedAnnotation(Embedded.class);
exporter.setSupertypeAnnotation(MappedSuperclass.class);
exporter.setSkipAnnotation(Transient.class);
exporter.setTargetFolder(new File("target/GenericExporterTest2"));
exporter.addStopClass(ForwardingSet.class);
exporter.setStrictMode(true);
exporter.setPropertyHandling(PropertyHandling.JPA);
exporter.export(AbstractEntityTest.class.getPackage(), A.class.getPackage());
List<String> expected = new ArrayList<String>();
// GenericExporter doesn't include field/method selection
expected.add("QCustomCollection_MyCustomCollection2.java");
expected.add("QTemporalTest_MyEntity.java");
expected.add("QTemporal2Test_Cheque.java");
expected.add("QQueryProjectionTest_DTOWithProjection.java");
expected.add("QQueryProjectionTest_EntityWithProjection.java");
expected.add("QEmbeddable3Test_EmbeddableClass.java");
expected.add("QGeneric4Test_HidaBez.java");
expected.add("QGeneric4Test_HidaBezGruppe.java");
expected.add("QInterfaceType2Test_UserImpl.java");
expected.add("QOrderTest_Order.java");
expected.add("QManagedEmailTest_ManagedEmails.java");
expected.add("QGeneric12Test_ChannelRole.java");
expected.add("QManyToManyTest_Person.java");
expected.add("QOneToOneTest_Person.java");
expected.add("QGeneric16Test_HidaBez.java");
expected.add("QGeneric16Test_HidaBezGruppe.java");
execute(expected, "GenericExporterTest2", "HibernateAnnotationProcessor");
}
@Test
public void execute3() {
GenericExporter exporter = new GenericExporter();
exporter.setKeywords(Keywords.JPA);
exporter.setEntityAnnotation(Entity.class);
exporter.setEmbeddableAnnotation(Embeddable.class);
exporter.setEmbeddedAnnotation(Embedded.class);
exporter.setSupertypeAnnotation(MappedSuperclass.class);
exporter.setSkipAnnotation(Transient.class);
exporter.setTargetFolder(new File("target/GenericExporterTest3"));
exporter.setPropertyHandling(PropertyHandling.JPA);
//exporter.addStopClass(ForwardingSet.class);
exporter.export(CustomCollection.MyCustomCollection.class,
CustomCollection.MyCustomCollection2.class,
CustomCollection.MyEntity.class);
}
@Test
public void execute4() throws IOException {
GenericExporter exporter = new GenericExporter();
exporter.setKeywords(Keywords.JPA);
exporter.setEntityAnnotation(Entity.class);
exporter.setEmbeddableAnnotation(Embeddable.class);
exporter.setEmbeddedAnnotation(Embedded.class);
exporter.setSupertypeAnnotation(MappedSuperclass.class);
exporter.setSkipAnnotation(Transient.class);
exporter.setTargetFolder(new File("target/GenericExporterTest4"));
exporter.setPropertyHandling(PropertyHandling.JPA);
exporter.addStopClass(ForwardingSet.class);
exporter.export(Generic2Test.class.getClasses());
}
private void execute(List<String> expected, String genericExporterFolder, String aptFolder) throws IOException {
List<String> failures = new ArrayList<String>();
int successes = 0;
for (File file : new File("target/" + genericExporterFolder + "/com/querydsl/apt/domain").listFiles()) {
File other = new File("target/" + aptFolder + "/com/querydsl/apt/domain", file.getName());
if (!other.exists() || !other.isFile()) {
continue;
}
String result1 = Files.toString(file, Charsets.UTF_8);
String result2 = Files.toString(other, Charsets.UTF_8);
if (!result1.equals(result2)) {
if (!expected.contains(file.getName())) {
System.err.println(file.getName());
failures.add(file.getName());
} else {
expected.remove(file.getName());
}
} else {
successes++;
}
}
expected.remove("QGeneric16Test_HidaBez.java"); // unstable
expected.remove("QGeneric4Test_HidaBez.java"); // unstable
expected.remove("QGeneric16Test_HidaBezGruppe.java"); // unstable
expected.remove("QGeneric4Test_HidaBezGruppe.java"); // unstable
if (!expected.isEmpty()) {
fail("Following expected failures succeeded: " + expected);
}
if (!failures.isEmpty()) {
for (String failure : failures) {
System.err.println(failure);
}
fail("Failed with " + failures.size() + " failures, " + successes + " succeeded, " + failures);
}
}
}