/*******************************************************************************
* Copyright (c) 2016 Red Hat, Inc.
* Distributed under license by Red Hat, Inc. All rights reserved.
* This program is made available under the terms of the
* Eclipse Public License v1.0 which accompanies this distribution,
* and is available at http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Red Hat, Inc. - initial API and implementation
******************************************************************************/
package org.jboss.tools.hibernate.reddeer.test;
import static org.junit.Assert.*;
import java.util.Arrays;
import java.util.Collection;
import org.jboss.reddeer.common.exception.RedDeerException;
import org.jboss.reddeer.common.wait.WaitUntil;
import org.jboss.reddeer.eclipse.jdt.ui.ProjectExplorer;
import org.jboss.reddeer.eclipse.jdt.ui.packageexplorer.PackageExplorer;
import org.jboss.reddeer.junit.internal.runner.ParameterizedRequirementsRunnerFactory;
import org.jboss.reddeer.junit.requirement.inject.InjectRequirement;
import org.jboss.reddeer.junit.runner.RedDeerSuite;
import org.jboss.reddeer.requirements.cleanworkspace.CleanWorkspaceRequirement;
import org.jboss.reddeer.requirements.db.DatabaseConfiguration;
import org.jboss.reddeer.requirements.db.DatabaseRequirement;
import org.jboss.reddeer.requirements.db.DatabaseRequirement.Database;
import org.jboss.reddeer.swt.impl.shell.DefaultShell;
import org.jboss.reddeer.swt.impl.styledtext.DefaultStyledText;
import org.jboss.reddeer.workbench.impl.editor.Marker;
import org.jboss.reddeer.workbench.impl.editor.TextEditor;
import org.jboss.tools.hibernate.reddeer.condition.EntityIsGenerated;
import org.jboss.tools.hibernate.reddeer.console.wizards.NewReverseEngineeringFileWizard;
import org.jboss.tools.hibernate.reddeer.console.wizards.TableFilterWizardPage;
import org.jboss.tools.hibernate.reddeer.dialog.LaunchConfigurationsDialog;
import org.jboss.tools.hibernate.reddeer.mapper.editors.ReverseEngineeringEditor;
import org.jboss.tools.hibernate.ui.bot.test.factory.HibernateToolsFactory;
import org.junit.After;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.Parameterized.Parameter;
import org.junit.runners.Parameterized.Parameters;
import org.junit.runners.Parameterized.UseParametersRunnerFactory;
@RunWith(RedDeerSuite.class)
@UseParametersRunnerFactory(ParameterizedRequirementsRunnerFactory.class)
@Database(name = "testdb")
//https://issues.jboss.org/browse/JBIDE-22283 works for hibernate >= 4.3
public class CodeGenerationKeyWordsTest extends HibernateRedDeerTest {
@InjectRequirement
private DatabaseRequirement dbRequirement;
@Parameter
public String prj;
@Parameter(1)
public String hbVersion;
@Parameters(name="hibernate {1}")
public static Collection<Object[]> data() {
return Arrays.asList(new Object[][] {
{"mvn-hibernate43","4.3"},
{"mvn-hibernate50","5.0"},
{"mvn-hibernate51","5.1"},
{"mvn-hibernate52","5.2"}
});
}
@After
public void deleteAll(){
new CleanWorkspaceRequirement().fulfill();
}
@Test
public void testHibernateGenerateConfiguration() {
prepareMvn();
createAndRunHibernateGenerationConfiguration(true, "src/main/java");
checkGeneratedEntities("src/main/java");
}
private void prepareMvn() {
importMavenProject(prj);
DatabaseConfiguration cfg = dbRequirement.getConfiguration();
HibernateToolsFactory.createConfigurationFile(cfg, prj, "hibernate.cfg.xml", true);
HibernateToolsFactory.setHibernateVersion(prj, hbVersion);
}
private void createAndRunHibernateGenerationConfiguration(boolean reveng, String src) {
if (reveng) {
createRevengFile();
}
LaunchConfigurationsDialog dlg = new LaunchConfigurationsDialog();
dlg.open();
dlg.createNewConfiguration();
dlg.selectConfiguration(prj);
dlg.setOutputDir("/" + prj + "/" + src);
dlg.setPackage("org.gen");
dlg.setReverseFromJDBC(true);
if (reveng)
dlg.setRevengFile(prj, "hibernate.reveng.xml");
new DefaultShell(LaunchConfigurationsDialog.DIALOG_TITLE).setFocus();
dlg.selectExporter(0);
dlg.selectExporter(1);
dlg.apply();
dlg.run();
}
private void checkGeneratedEntities(String src) {
PackageExplorer pe = new PackageExplorer();
pe.open();
try {
new WaitUntil(new EntityIsGenerated(prj, src, "org.gen", "Actor.java"));
pe.getProject(prj).getProjectItem(src, "org.gen", "Actor.java").open();
} catch (RedDeerException e) {
fail("Entities not generated, possible cause https://issues.jboss.org/browse/JBIDE-19217");
}
TextEditor actorEditor = new TextEditor("Actor.java");
assertTrue(actorEditor.getText().contains("implements_"));
for (Marker m : actorEditor.getMarkers()) {
if (m.getType().equals("org.eclipse.jdt.ui.error")) {
fail("Actor has error markers");
}
}
}
private void createRevengFile() {
ProjectExplorer pe = new ProjectExplorer();
pe.open();
pe.selectProjects(prj);
NewReverseEngineeringFileWizard wizard = new NewReverseEngineeringFileWizard();
wizard.open();
wizard.next();
TableFilterWizardPage page = new TableFilterWizardPage();
page.setConsoleConfiguration(prj);
page.refreshDatabaseSchema();
page.pressInclude();
wizard.finish();
ReverseEngineeringEditor re = new ReverseEngineeringEditor();
re.activateSourceTab();
DefaultStyledText ds = new DefaultStyledText();
ds.selectPosition(ds.getPositionOfText("</hibernate-reverse-engineering>"));
ds.insertText("<table catalog=\"SAKILA\" schema=\"PUBLIC\" name=\"ACTOR\">"
+ "<column name=\"FIRST_NAME\" property=\"implements\" type=\"string\" /></table>");
re.save();
}
}