blob: 53f403acf68ce0cf070de1d225e41621d3c87dcf [file] [log] [blame]
/*
* Copyright 2000-2009 JetBrains s.r.o.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.theoryinpractice.testng.model;
import com.intellij.execution.JavaExecutionUtil;
import com.intellij.execution.junit.JUnitUtil;
import com.intellij.openapi.application.ApplicationManager;
import com.intellij.openapi.command.WriteCommandAction;
import com.intellij.openapi.diagnostic.Logger;
import com.intellij.openapi.module.Module;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.util.text.StringUtil;
import com.intellij.psi.PsiClass;
import com.theoryinpractice.testng.configuration.TestNGConfiguration;
import com.theoryinpractice.testng.configuration.TestNGConfigurationEditor;
import javax.swing.text.BadLocationException;
import javax.swing.text.Document;
import javax.swing.text.PlainDocument;
import java.util.LinkedHashSet;
/**
* @author Hani Suleiman Date: Jul 21, 2005 Time: 1:20:14 PM
*/
public class TestNGConfigurationModel
{
private static final Logger LOGGER = Logger.getInstance("TestNG Runner");
private TestNGConfigurationEditor editor;
private TestType type;
private final Object[] typeDocuments = new Object[6];
private final Document propertiesFileDocument = new PlainDocument();
private final Document outputDirectoryDocument = new PlainDocument();
private final Project project;
public TestNGConfigurationModel(Project project) {
type = TestType.INVALID;
for (int i = 3; i < typeDocuments.length; i++)
typeDocuments[i] = new PlainDocument();
this.project = project;
}
public void setDocument(int type, Object doc) {
typeDocuments[type] = doc;
}
public void setType(TestType type) {
if (type == this.type)
return;
this.type = type;
updateEditorType(type);
}
private void updateEditorType(TestType type) {
editor.onTypeChanged(type);
}
public void setListener(TestNGConfigurationEditor editor) {
this.editor = editor;
}
public Object getDocument(int index) {
return typeDocuments[index];
}
public Document getPropertiesFileDocument() {
return propertiesFileDocument;
}
public Document getOutputDirectoryDocument() {
return outputDirectoryDocument;
}
public Project getProject() {
return project;
}
public void apply(Module module, TestNGConfiguration config) {
boolean isGenerated = config.isGeneratedName();
apply(config.getPersistantData(), module);
if (isGenerated && !JavaExecutionUtil.isNewName(config.getName())) {
config.setGeneratedName();
}
}
private void apply(TestData data, Module module) {
data.TEST_OBJECT = type.getType();
if (TestType.GROUP == type) {
data.GROUP_NAME = getText(TestType.GROUP);
data.PACKAGE_NAME = "";
data.MAIN_CLASS_NAME = "";
data.METHOD_NAME = "";
data.SUITE_NAME = "";
} else if (TestType.PACKAGE == type) {
data.PACKAGE_NAME = getText(TestType.PACKAGE);
data.GROUP_NAME = "";
data.MAIN_CLASS_NAME = "";
data.METHOD_NAME = "";
data.SUITE_NAME = "";
} else if (TestType.METHOD == type || TestType.CLASS == type) {
String className = getText(TestType.CLASS);
data.GROUP_NAME = "";
data.SUITE_NAME = "";
if (TestType.METHOD == type)
data.METHOD_NAME = getText(TestType.METHOD);
PsiClass psiClass = !getProject().isDefault() && !StringUtil.isEmptyOrSpaces(className) ? JUnitUtil.findPsiClass(className, module, getProject()) : null;
if (psiClass != null && psiClass.isValid())
data.setMainClass(psiClass);
else
data.MAIN_CLASS_NAME = className;
} else if (TestType.SUITE == type) {
data.SUITE_NAME = getText(TestType.SUITE);
data.PACKAGE_NAME = "";
data.GROUP_NAME = "";
data.MAIN_CLASS_NAME = "";
data.METHOD_NAME = "";
}
else if (TestType.PATTERN == type) {
final LinkedHashSet<String> set = new LinkedHashSet<String>();
final String[] patterns = getText(TestType.PATTERN).split("\\|\\|");
for (String pattern : patterns) {
if (pattern.length() > 0) {
set.add(pattern);
}
}
data.setPatterns(set);
}
try {
data.PROPERTIES_FILE = propertiesFileDocument.getText(0, propertiesFileDocument.getLength());
} catch (BadLocationException e) {
throw new RuntimeException(e);
}
try {
data.OUTPUT_DIRECTORY = outputDirectoryDocument.getText(0, outputDirectoryDocument.getLength());
} catch (BadLocationException e) {
throw new RuntimeException(e);
}
}
private String getText(TestType type) {
return getText(type, typeDocuments);
}
private String getText(TestType testType, Object[] documents) {
Object document = documents[testType.getValue()];
if (document instanceof PlainDocument) {
try {
return ((PlainDocument)document).getText(0, ((PlainDocument)document).getLength());
}
catch (BadLocationException e) {
throw new RuntimeException(e);
}
}
return ((com.intellij.openapi.editor.Document)document).getText();
}
public void reset(TestNGConfiguration config) {
TestData data = config.getPersistantData();
setType(data.TEST_OBJECT);
setTypeValue(TestType.PACKAGE, data.getPackageName());
setTypeValue(TestType.CLASS, data.getMainClassName());
setTypeValue(TestType.METHOD, data.getMethodName());
setTypeValue(TestType.GROUP, data.getGroupName());
setTypeValue(TestType.SUITE, data.getSuiteName());
setTypeValue(TestType.PATTERN, StringUtil.join(data.getPatterns(), "||"));
setDocumentText(propertiesFileDocument, data.getPropertiesFile());
setDocumentText(outputDirectoryDocument, data.getOutputDirectory());
}
private void setTypeValue(TestType type, String value) {
setTypeValue(type, value, typeDocuments);
}
private void setTypeValue(TestType type, String value, Object[] documents) {
Object document = documents[type.getValue()];
setDocumentText(document, value);
}
private void setDocumentText(final Object document, final String value) {
if (document instanceof PlainDocument) {
try {
((PlainDocument)document).remove(0, ((PlainDocument)document).getLength());
((PlainDocument)document).insertString(0, value, null);
} catch (BadLocationException e) {
throw new RuntimeException(e);
}
} else {
WriteCommandAction.runWriteCommandAction(project, new Runnable() {
public void run() {
((com.intellij.openapi.editor.Document)document)
.replaceString(0, ((com.intellij.openapi.editor.Document)document).getTextLength(), value);
}
});
}
}
private void setType(String s) {
try {
setType(TestType.valueOf(s));
} catch (IllegalArgumentException e) {
LOGGER.debug("Invalid test type of " + s + " found.");
setType(TestType.CLASS);
}
}
}