package org.jboss.tools.maven.ui.bot.test.apt;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Scanner;
import org.jboss.ide.eclipse.as.reddeer.server.requirement.ServerReqType;
import org.jboss.ide.eclipse.as.reddeer.server.requirement.ServerRequirement;
import org.jboss.ide.eclipse.as.reddeer.server.requirement.ServerRequirement.JBossServer;
import org.jboss.reddeer.common.platform.RunningPlatform;
import org.jboss.reddeer.common.wait.TimePeriod;
import org.jboss.reddeer.common.wait.WaitWhile;
import org.jboss.reddeer.core.condition.JobIsRunning;
import org.jboss.reddeer.core.condition.ShellWithTextIsAvailable;
import org.jboss.reddeer.eclipse.jdt.ui.NewJavaClassWizardDialog;
import org.jboss.reddeer.eclipse.jdt.ui.NewJavaClassWizardPage;
import org.jboss.reddeer.eclipse.jdt.ui.ProjectExplorer;
import org.jboss.reddeer.eclipse.ui.perspectives.JavaEEPerspective;
import org.jboss.reddeer.junit.requirement.inject.InjectRequirement;
import org.jboss.reddeer.requirements.cleanworkspace.CleanWorkspaceRequirement.CleanWorkspace;
import org.jboss.reddeer.requirements.openperspective.OpenPerspectiveRequirement.OpenPerspective;
import org.jboss.reddeer.requirements.server.ServerReqState;
import org.jboss.reddeer.swt.api.StyledText;
import org.jboss.reddeer.swt.api.Table;
import org.jboss.reddeer.swt.api.TableItem;
import org.jboss.reddeer.swt.api.TreeItem;
import org.jboss.reddeer.swt.exception.SWTLayerException;
import org.jboss.reddeer.swt.impl.button.CheckBox;
import org.jboss.reddeer.swt.impl.button.OkButton;
import org.jboss.reddeer.swt.impl.button.YesButton;
import org.jboss.reddeer.swt.impl.menu.ContextMenu;
import org.jboss.reddeer.swt.impl.shell.DefaultShell;
import org.jboss.reddeer.swt.impl.styledtext.DefaultStyledText;
import org.jboss.reddeer.swt.impl.tab.DefaultTabItem;
import org.jboss.reddeer.swt.impl.table.DefaultTable;
import org.jboss.reddeer.swt.impl.table.DefaultTableItem;
import org.jboss.reddeer.swt.impl.text.DefaultText;
import org.jboss.reddeer.swt.impl.tree.DefaultTree;
import org.jboss.reddeer.swt.impl.tree.DefaultTreeItem;
import org.jboss.reddeer.workbench.api.Editor;
import org.jboss.reddeer.workbench.impl.editor.TextEditor;
import org.jboss.reddeer.workbench.ui.dialogs.WorkbenchPreferenceDialog;
import org.jboss.tools.maven.reddeer.apt.ui.preferences.AnnotationProcessingSettingsPage;
import org.jboss.tools.maven.reddeer.apt.ui.preferences.AnnotationProcessingSettingsPage.ProcessingMode;
import org.jboss.tools.maven.ui.bot.test.AbstractMavenSWTBotTest;
import org.junit.After;
import org.junit.Test;
@OpenPerspective(JavaEEPerspective.class)
@JBossServer(state=ServerReqState.PRESENT, type=ServerReqType.WILDFLY8x)
public class APTPropertiesPageTest extends AbstractMavenSWTBotTest{
@InjectRequirement
private ServerRequirement sr;
private static final String PROJECT_NAME = "test";
private List<String> defaultPaths = Arrays.asList(PROJECT_NAME+"/src/main/java",
PROJECT_NAME+"/src/main/resources",PROJECT_NAME+"/src/test/java",
PROJECT_NAME+"/src/test/resources");
private String generatedSources = "generated-sources/";
private String target = "target/";
private String defaultCompilerPath = target+generatedSources+"annotations";
private String defaultProcessorPath = target+generatedSources+"apt";
@After
public void cleanup(){
deleteProjects(true);
}
@Test
public void testProcessingModesCompiler(){
prepareProject();
setProcessingMode(ProcessingMode.NONE);
addDependency(PROJECT_NAME, "org.hibernate","hibernate-jpamodelgen" , "1.2.0.Final");
updateConf(PROJECT_NAME);
checkBuildPath(PROJECT_NAME, defaultPaths, null);
checkAnnotationProcessingSettings(PROJECT_NAME, false, null, null);
setProcessingMode(ProcessingMode.JDT);
checkBuildPath(PROJECT_NAME, defaultPaths, PROJECT_NAME+"/"+defaultCompilerPath);
checkAnnotationProcessingSettings(PROJECT_NAME, true, defaultCompilerPath, null);
setProcessingMode(ProcessingMode.MAVEN);
checkBuildPath(PROJECT_NAME, defaultPaths, PROJECT_NAME+"/"+defaultCompilerPath);
checkAnnotationProcessingSettings(PROJECT_NAME, true, defaultCompilerPath, null);
}
@Test
public void testCompilerArgs(){
prepareProject();
addDependency(PROJECT_NAME, "org.hibernate","hibernate-jpamodelgen" , "1.2.0.Final");
setProcessingMode(ProcessingMode.JDT);
List<String> args = Arrays.asList("test1=value1","test2=value2");
setCompilerArgs(PROJECT_NAME, args);
updateConf(PROJECT_NAME);
checkAnnotationProcessingSettings(PROJECT_NAME, true, defaultCompilerPath, args);
}
@Test
public void testCompilerArgument(){
prepareProject();
addDependency(PROJECT_NAME, "org.hibernate","hibernate-jpamodelgen" , "1.2.0.Final");
setProcessingMode(ProcessingMode.JDT);
List<String> arguments = Arrays.asList("test1=value1","test2=value2");
String argumentWithOther = "otherParam=param";
setCompilerArgument(PROJECT_NAME, arguments,argumentWithOther);
updateConf(PROJECT_NAME);
checkAnnotationProcessingSettings(PROJECT_NAME, true, defaultCompilerPath, arguments);
}
@Test
public void testCompilerArguments(){
prepareProject();
addDependency(PROJECT_NAME, "org.hibernate","hibernate-jpamodelgen" , "1.2.0.Final");
setProcessingMode(ProcessingMode.JDT);
List<String> arguments = Arrays.asList("test1=value1","test2=value2");
String otherArg = "other=v3";
setCompilerArguments(PROJECT_NAME, arguments,otherArg);
updateConf(PROJECT_NAME);
checkAnnotationProcessingSettings(PROJECT_NAME, true, defaultCompilerPath, arguments);
}
@Test
public void testProcessorOptionMap(){
prepareProject();
addProcessorPlugin(PROJECT_NAME);
addDependency(PROJECT_NAME, "org.hibernate","hibernate-jpamodelgen" , "1.2.0.Final");
setProcessingMode(ProcessingMode.JDT);
List<String> arguments = Arrays.asList("test1=value1","test2=value2");
setProcessorOptionMap(PROJECT_NAME, arguments);
updateConf(PROJECT_NAME);
checkAnnotationProcessingSettings(PROJECT_NAME, true, defaultProcessorPath, arguments);
}
@Test
public void testProcessingModesProcessor(){
prepareProject();
addProcessorPlugin(PROJECT_NAME);
setProcessingMode(ProcessingMode.NONE);
addDependency(PROJECT_NAME, "org.hibernate","hibernate-jpamodelgen" , "1.2.0.Final");
updateConf(PROJECT_NAME);
checkBuildPath(PROJECT_NAME, defaultPaths, null);
checkAnnotationProcessingSettings(PROJECT_NAME, false, null, null);
setProcessingMode(ProcessingMode.JDT);
checkBuildPath(PROJECT_NAME, defaultPaths, PROJECT_NAME+"/"+defaultProcessorPath);
checkAnnotationProcessingSettings(PROJECT_NAME, true, defaultProcessorPath, null);
setProcessingMode(ProcessingMode.MAVEN);
checkBuildPath(PROJECT_NAME, defaultPaths, PROJECT_NAME+"/"+defaultProcessorPath);
checkAnnotationProcessingSettings(PROJECT_NAME, false, null, null);
}
@Test
public void testCompilerCustomOutput(){
prepareProject();
String customFolder = "customCompilerFolder";
setCompilerCustomOutputFolder(PROJECT_NAME, generatedSources+customFolder);
setProcessingMode(ProcessingMode.NONE);
addDependency(PROJECT_NAME, "org.hibernate","hibernate-jpamodelgen" , "1.2.0.Final");
updateConf(PROJECT_NAME);
checkBuildPath(PROJECT_NAME, defaultPaths, null);
checkAnnotationProcessingSettings(PROJECT_NAME, false, null, null);
setProcessingMode(ProcessingMode.JDT);
checkBuildPath(PROJECT_NAME, defaultPaths, PROJECT_NAME+"/"+target+generatedSources+customFolder);
checkAnnotationProcessingSettings(PROJECT_NAME, true, target+generatedSources+customFolder, null);
setProcessingMode(ProcessingMode.MAVEN);
checkBuildPath(PROJECT_NAME, defaultPaths, PROJECT_NAME+"/"+target+generatedSources+customFolder);
checkAnnotationProcessingSettings(PROJECT_NAME, true, target+generatedSources+customFolder, null);
}
@Test
public void testProcessorCustomOutput(){
prepareProject();
String customFolder = "customProcessorFolder";
addProcessorPlugin(PROJECT_NAME);
setProcessorCustomOutputFolder(PROJECT_NAME, generatedSources+customFolder);
setProcessingMode(ProcessingMode.NONE);
addDependency(PROJECT_NAME, "org.hibernate","hibernate-jpamodelgen" , "1.2.0.Final");
updateConf(PROJECT_NAME);
checkBuildPath(PROJECT_NAME, defaultPaths, null);
checkAnnotationProcessingSettings(PROJECT_NAME, false, null, null);
setProcessingMode(ProcessingMode.JDT);
checkBuildPath(PROJECT_NAME, defaultPaths, PROJECT_NAME+"/"+target+generatedSources+customFolder);
checkAnnotationProcessingSettings(PROJECT_NAME, true, target+generatedSources+customFolder, null);
setProcessingMode(ProcessingMode.MAVEN);
checkBuildPath(PROJECT_NAME, defaultPaths, PROJECT_NAME+"/"+target+generatedSources+customFolder);
checkAnnotationProcessingSettings(PROJECT_NAME, false, null, null);
}
private void addProcessorPlugin(String project){
Editor e= openPom(project);
StyledText stext = new DefaultStyledText();
int pos = stext.getPositionOfText("</plugin>");
String processorPlugin = null;
try {
processorPlugin = new Scanner(new FileInputStream("resources/pom/processorPlugin")).useDelimiter("\\A").next();
} catch (FileNotFoundException ex) {
// TODO Auto-generated catch block
ex.printStackTrace();
}
stext.selectPosition(pos+9);
stext.insertText(processorPlugin);
e.save();
}
private void setProcessingMode(ProcessingMode mode){
WorkbenchPreferenceDialog pd = new WorkbenchPreferenceDialog();
pd.open();
AnnotationProcessingSettingsPage ap = new AnnotationProcessingSettingsPage();
pd.select(ap);
ap.setAnnotationProcessingMode(mode);
new OkButton().click();
boolean runUpdate = false;
try{
new DefaultShell("Maven Annotation Processing Settings");
new YesButton().click();
} catch (SWTLayerException ex){
runUpdate = true;
}
new WaitWhile(new ShellWithTextIsAvailable("Preferences"));
new WaitWhile(new JobIsRunning(),TimePeriod.VERY_LONG);
if(runUpdate){
updateConf(PROJECT_NAME);
}
}
private void setCompilerCustomOutputFolder(String project, String customFolder){
Editor e= openPom(project);
StyledText stext = new DefaultStyledText();
int pos = stext.getPositionOfText("</target>");
stext.selectPosition(pos+9);
stext.insertText("<generatedSourcesDirectory>${project.build.directory}/"+customFolder+
"</generatedSourcesDirectory>");
e.save();
}
private void setCompilerArgs(String project, List<String> args){
Editor e = openPom(project);
StyledText stext = new DefaultStyledText();
int pos = stext.getPositionOfText("</target>");
stext.selectPosition(pos+9);
stext.insertText("</compilerArgs>");
for(String arg: args){
stext.insertText("<arg>-A"+arg+"</arg>");
}
stext.insertText("<compilerArgs>");
e.save();
}
private void setProcessorOptionMap(String project, List<String> args){
Editor e = openPom(project);
StyledText stext = new DefaultStyledText();
int pos = stext.getPositionOfText("</executions>");
stext.selectPosition(pos+13);
stext.insertText("</optionMap></configuration>");
for(String arg: args){
String[] a= arg.split("=");
stext.insertText("<"+a[0]+">"+a[1]+"</"+a[0]+">");
}
stext.insertText("<configuration><optionMap>");
e.save();
}
private void setCompilerArguments(String project, List<String> args, String otherArg){
Editor e = openPom(project);
StyledText stext = new DefaultStyledText();
int pos = stext.getPositionOfText("</target>");
stext.selectPosition(pos+9);
stext.insertText("</compilerArguments>");
for(String arg: args){
String[] a= arg.split("=");
stext.insertText("<A"+a[0]+">"+a[1]+"</A"+a[0]+">");
}
if(otherArg != null){
String[] a= otherArg.split("=");
stext.insertText("<"+a[0]+">"+a[1]+"</"+a[0]+">");
}
stext.insertText("<compilerArguments>");
e.save();
}
private void setCompilerArgument(String project, List<String> arguments, String otherArg){
Editor e = openPom(project);
StyledText stext = new DefaultStyledText();
int pos = stext.getPositionOfText("</target>");
stext.selectPosition(pos+9);
stext.insertText("</compilerArgument>");
for(String s: arguments){
stext.insertText(" -A"+s);
}
if(otherArg != null){
stext.insertText(otherArg);
}
stext.insertText("<compilerArgument>");
e.save();
}
private void setProcessorCustomOutputFolder(String project, String customFolder){
Editor e = openPom(project);
StyledText stext = new DefaultStyledText();
int pos = stext.getPositionOfText("</executions>");
stext.selectPosition(pos+13);
stext.insertText("<configuration><defaultOutputDirectory>"
+ "${project.build.directory}/"+ customFolder
+ "</defaultOutputDirectory></configuration>");
e.save();
}
private void checkBuildPath(String project, List<String> paths, String additionalPath){
openProperties(project);
new DefaultTreeItem("Java Build Path").select();
new DefaultTabItem("Source").activate();
List<TreeItem> items = new DefaultTree(1).getItems();
if(additionalPath != null){
assertEquals(paths.size()+1,items.size());
} else {
assertEquals(paths.size(),items.size());
}
List<String> itemsPaths = new ArrayList<String>();
for(TreeItem i: items){
itemsPaths.add(i.getText());
}
assertTrue(itemsPaths.containsAll(paths));
if(additionalPath != null){
assertTrue("Build path items "+itemsPaths+" expected "+additionalPath,itemsPaths.contains(additionalPath));
}
new OkButton().click();
new WaitWhile(new ShellWithTextIsAvailable("Properties for "+PROJECT_NAME));
}
private void checkAnnotationProcessingSettings(String project, boolean enabled, String sourceDir, List<String>args){
openProperties(project);
new DefaultTreeItem("Java Compiler","Annotation Processing").select();
CheckBox c = new CheckBox("Enable annotation processing");
if(!enabled){
assertTrue(!c.isEnabled() || !c.isChecked());
} else {
assertTrue(c.isEnabled() && c.isChecked());
if(RunningPlatform.isWindows()){
sourceDir = sourceDir.replace("/", "\\");
}
assertEquals(sourceDir, new DefaultText(1).getText());
}
if(args != null){
Table t = new DefaultTable();
List<TableItem> items = t.getItems();
assertEquals(args.size(),items.size());
List<String> compilerArgs = new ArrayList<String>();
for(TableItem i: items){
compilerArgs.add(i.getText(0) + "="+i.getText(1));
}
assertTrue(args.containsAll(compilerArgs));
}
new OkButton().click();
new WaitWhile(new ShellWithTextIsAvailable("Properties for "+PROJECT_NAME));
}
private void prepareProject(){
createBasicMavenProject(PROJECT_NAME, PROJECT_NAME, "war","1.7");
openProperties(PROJECT_NAME);
new DefaultTreeItem("Targeted Runtimes").select();
new DefaultTableItem(sr.getRuntimeNameLabelText(sr.getConfig())).setChecked(true);
new OkButton().click();
new WaitWhile(new ShellWithTextIsAvailable("Properties for "+PROJECT_NAME));
new WaitWhile(new JobIsRunning());
NewJavaClassWizardDialog jd = new NewJavaClassWizardDialog();
jd.open();
NewJavaClassWizardPage jp = new NewJavaClassWizardPage();
jp.setPackage(PROJECT_NAME);
jp.setName("Member");
jd.finish();
TextEditor ed = new TextEditor("Member.java");
try {
ed.setText(new Scanner(new FileInputStream("resources/classes/Member.jav_")).useDelimiter("\\A").next());
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
ed.save();
addDependency(PROJECT_NAME, "org.hibernate.javax.persistence", "hibernate-jpa-2.0-api", "1.0.1.Final");
addDependency(PROJECT_NAME, "org.hibernate", "hibernate-validator", "5.1.3.Final");
}
private void openProperties(String project){
ProjectExplorer pe = new ProjectExplorer();
pe.open();
pe.getProject(project).select();
new ContextMenu("Properties").select();
new DefaultShell("Properties for "+project);
}
}