package org.phpsrc.eclipse.pti.tools.phpunit.core;
import java.io.File;
import java.io.InvalidClassException;
import java.io.InvalidObjectException;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.core.runtime.Assert;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.Path;
import org.eclipse.dltk.core.search.SearchMatch;
import org.eclipse.dltk.internal.core.SourceType;
import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.php.internal.ui.PHPUiConstants;
import org.eclipse.ui.IEditorInput;
import org.eclipse.ui.IWorkbenchPage;
import org.eclipse.ui.IWorkbenchWindow;
import org.eclipse.ui.part.FileEditorInput;
import org.phpsrc.eclipse.pti.core.PHPToolCorePlugin;
import org.phpsrc.eclipse.pti.core.PHPToolkitUtil;
import org.phpsrc.eclipse.pti.core.search.PHPSearchEngine;
import org.phpsrc.eclipse.pti.tools.phpunit.IPHPUnitConstants;
import org.phpsrc.eclipse.pti.tools.phpunit.PHPUnitPlugin;
import org.phpsrc.eclipse.pti.tools.phpunit.core.preferences.PHPUnitPreferences;
import org.phpsrc.eclipse.pti.tools.phpunit.core.preferences.PHPUnitPreferencesFactory;
import org.phpsrc.eclipse.pti.tools.phpunit.ui.preferences.PHPUnitConfigurationBlock;
import org.phpsrc.eclipse.pti.ui.Logger;
@SuppressWarnings("restriction")
public class PHPUnitUtil {
public static String generateTestCaseClassName(String sourceClass) {
return sourceClass + "Test";
}
public static String generatePHPClassName(String testClass) {
if (testClass.endsWith("Test"))
testClass = testClass.substring(0, testClass.length() - 4);
return testClass;
}
public static File generateProjectRelativeTestCaseFile(IFile classFile) {
SearchMatch[] matches = PHPSearchEngine.findClass(
PHPToolkitUtil.getClassName(classFile),
PHPSearchEngine.createProjectScope(classFile.getProject()));
if (matches.length > 0) {
for (SearchMatch match : matches) {
if (classFile == null || match.getResource().equals(classFile)) {
return generateProjectRelativeTestCaseFile(
(SourceType) match.getElement(), classFile);
}
}
}
return null;
}
public static File generateProjectRelativeTestCaseFile(SourceType type,
IResource resource) {
Assert.isNotNull(type);
Assert.isNotNull(resource);
String patternFolder = null;
String patternFile = null;
PHPUnitPreferences preferences = PHPUnitPreferencesFactory
.factory(resource);
if (preferences != null) {
patternFolder = preferences.getTestFilePatternFolder();
patternFile = preferences.getTestFilePatternFile();
}
if (patternFolder == null)
patternFolder = PHPUnitConfigurationBlock.TEST_FILE_PATTERN_FOLDER_DEFAULT;
String patternProject = "";
String patternPath = "";
String path = type.getPath().toOSString();
int firstSeparator = path.indexOf(File.separatorChar, 1);
if (firstSeparator > 0) {
patternProject = path.substring(1, firstSeparator);
int lastSeparator = path.lastIndexOf(File.separatorChar);
if (firstSeparator + 1 < lastSeparator)
patternPath = path.substring(firstSeparator + 1, lastSeparator);
} else {
patternProject = path;
}
Pattern pDirPlaceholder = Pattern.compile(Pattern
.quote(IPHPUnitConstants.TEST_FILE_PATTERN_PLACEHOLDER_DIR)
+ "(\\{([0-9]*)(,)?([0-9]*)\\})?");
String[] folderParts = patternPath.split(Pattern.quote(""
+ File.separatorChar));
Matcher mDirPlaceholder = pDirPlaceholder.matcher(patternFolder);
while (mDirPlaceholder.find()) {
if (mDirPlaceholder.group(1) != null
&& !"".equals(mDirPlaceholder.group(1))) {
int start = 1;
int end = 0;
try {
start = Integer.parseInt(mDirPlaceholder.group(2));
} catch (Exception e) {
}
try {
end = Integer.parseInt(mDirPlaceholder.group(4));
} catch (Exception e) {
}
if (end == 0) {
if (",".equals(mDirPlaceholder.group(3))) {
end = folderParts.length;
} else {
end = start;
}
} else if (end > folderParts.length) {
end = folderParts.length;
}
String folderSubstring = "";
for (int i = start; i <= end; ++i) {
if (i > folderParts.length)
break;
if (folderSubstring.length() > 0) {
folderSubstring += File.separatorChar;
}
folderSubstring += folderParts[i - 1];
}
patternFolder = patternFolder.replace(mDirPlaceholder.group(),
folderSubstring);
} else {
patternFolder = patternFolder
.replaceFirst(
Pattern.quote(IPHPUnitConstants.TEST_FILE_PATTERN_PLACEHOLDER_DIR),
patternPath.replace("\\", "\\\\"));
}
}
patternFolder = patternFolder.replace(
IPHPUnitConstants.TEST_FILE_PATTERN_PLACEHOLDER_PROJECT,
patternProject);
if (patternFile == null)
patternFile = PHPUnitConfigurationBlock.TEST_FILE_PATTERN_FILE_DEFAULT;
String fileName = resource.getName();
int firstDotPos = fileName.indexOf(".");
int lastDotPos = fileName.lastIndexOf(".");
patternFile = patternFile.replace(
IPHPUnitConstants.TEST_FILE_PATTERN_PLACEHOLDER_FILENAME_LONG,
fileName.substring(0, lastDotPos));
patternFile = patternFile.replace(
IPHPUnitConstants.TEST_FILE_PATTERN_PLACEHOLDER_FILENAME,
fileName.substring(0, firstDotPos));
patternFile = patternFile.replace(
IPHPUnitConstants.TEST_FILE_PATTERN_PLACEHOLDER_FILE_EXTENSION,
fileName.substring(lastDotPos + 1));
return new File(patternFolder + File.separatorChar + patternFile);
}
public static boolean syncPHPClassToTestCase(String sourceClassName,
IFile sourceClassFile, String testClassName, String testClassFile,
String testSuperClass) {
try {
PHPUnit phpunit = PHPUnit.getInstance();
phpunit.createTestSkeleton(sourceClassName, sourceClassFile,
testClassName, testClassFile, testSuperClass);
Path path = new Path(testClassFile);
IFile testFile = ResourcesPlugin.getWorkspace().getRoot()
.getFile(path);
IEditorInput editorInput = new FileEditorInput(testFile);
IWorkbenchWindow window = PHPUnitPlugin.getActiveWorkbenchWindow();
IWorkbenchPage page = window.getActivePage();
page.openEditor(editorInput, PHPUiConstants.PHP_EDITOR_ID);
return true;
} catch (PHPUnitException e) {
MessageDialog.openError(
PHPToolCorePlugin.getActiveWorkbenchShell(),
"Failed creating PHPUnit Test Case", e.getMessage());
Logger.logException(e);
} catch (InvalidObjectException e) {
MessageDialog.openError(
PHPToolCorePlugin.getActiveWorkbenchShell(),
"Failed creating PHPUnit Test Case", e.getMessage());
Logger.logException(e);
} catch (InvalidClassException e) {
MessageDialog.openError(
PHPToolCorePlugin.getActiveWorkbenchShell(),
"Failed creating PHPUnit Test Case", e.getMessage());
Logger.logException(e);
} catch (CoreException e) {
MessageDialog.openError(
PHPToolCorePlugin.getActiveWorkbenchShell(),
"Failed creating PHPUnit Test Case", e.getMessage());
Logger.logException(e);
}
return false;
}
public static File generateProjectRelativePHPClassFile(IFile classFile) {
SearchMatch[] matches = PHPSearchEngine.findClass(
PHPToolkitUtil.getClassName(classFile),
PHPSearchEngine.createProjectScope(classFile.getProject()));
if (matches.length > 0) {
for (SearchMatch match : matches) {
if (classFile == null || match.getResource().equals(classFile)) {
return generateProjectRelativePHPClassFile(
(SourceType) match.getElement(), classFile);
}
}
}
return null;
}
public static File generateProjectRelativePHPClassFile(SourceType type,
IResource resource) {
Assert.isNotNull(type);
Assert.isNotNull(resource);
String patternTestFolder = null;
String patternSourceFolder = null;
String patternFile = null;
PHPUnitPreferences preferences = PHPUnitPreferencesFactory
.factory(resource);
if (preferences != null) {
patternSourceFolder = preferences.getSourceFilePatternFolder();
if ("".equals(patternSourceFolder))
patternSourceFolder = null;
patternFile = preferences.getTestFilePatternFile();
patternTestFolder = preferences.getTestFilePatternFolder();
}
if (patternTestFolder == null)
patternTestFolder = PHPUnitConfigurationBlock.TEST_FILE_PATTERN_FOLDER_DEFAULT;
String patternProject = "";
String patternPath = "";
String path = type.getPath().toOSString();
int firstSeparator = path.indexOf(File.separatorChar, 1);
if (firstSeparator > 0) {
patternProject = path.substring(1, firstSeparator);
int lastSeparator = path.lastIndexOf(File.separatorChar);
if (firstSeparator + 1 < lastSeparator)
patternPath = path.substring(firstSeparator + 1, lastSeparator);
} else {
patternProject = path;
}
String filePath;
if (patternSourceFolder != null) {
Pattern pDirPlaceholder = Pattern.compile(Pattern
.quote(IPHPUnitConstants.TEST_FILE_PATTERN_PLACEHOLDER_DIR)
+ "(\\{([0-9]*)(,)?([0-9]*)\\})?");
String[] folderParts = patternPath.split(Pattern.quote(""
+ File.separatorChar));
Matcher mDirPlaceholder = pDirPlaceholder
.matcher(patternSourceFolder);
while (mDirPlaceholder.find()) {
if (mDirPlaceholder.group(1) != null
&& !"".equals(mDirPlaceholder.group(1))) {
int start = 1;
int end = 0;
try {
start = Integer.parseInt(mDirPlaceholder.group(2));
} catch (Exception e) {
}
try {
end = Integer.parseInt(mDirPlaceholder.group(4));
} catch (Exception e) {
}
if (end == 0) {
if (",".equals(mDirPlaceholder.group(3))) {
end = folderParts.length;
} else {
end = start;
}
} else if (end > folderParts.length) {
end = folderParts.length;
}
String folderSubstring = "";
for (int i = start; i <= end; ++i) {
if (i > folderParts.length)
break;
if (folderSubstring.length() > 0) {
folderSubstring += File.separatorChar;
}
folderSubstring += folderParts[i - 1];
}
patternSourceFolder = patternSourceFolder.replace(
mDirPlaceholder.group(), folderSubstring);
} else {
patternSourceFolder = patternSourceFolder
.replaceFirst(
Pattern.quote(IPHPUnitConstants.TEST_FILE_PATTERN_PLACEHOLDER_DIR),
patternPath.replace("\\", "\\\\"));
}
}
patternSourceFolder = patternSourceFolder.replace(
IPHPUnitConstants.TEST_FILE_PATTERN_PLACEHOLDER_PROJECT,
patternProject);
filePath = patternSourceFolder;
} else {
String targetFolder = File.separatorChar + patternProject
+ File.separatorChar + patternPath;
if (patternTestFolder.charAt(patternTestFolder.length() - 1) == File.separatorChar)
patternTestFolder = patternTestFolder.substring(0,
patternTestFolder.length() - 1);
patternTestFolder = patternTestFolder.replace(
IPHPUnitConstants.TEST_FILE_PATTERN_PLACEHOLDER_PROJECT,
"([^" + File.separatorChar + "]+)"); //$NON-NLS-1$ //$NON-NLS-2$
patternTestFolder = patternTestFolder
.replace(
IPHPUnitConstants.TEST_FILE_PATTERN_PLACEHOLDER_DIR,
"(.+)"); //$NON-NLS-1$
patternTestFolder = patternTestFolder.replace("\\", "\\\\"); //$NON-NLS-1$ //$NON-NLS-2$
Pattern p = Pattern.compile(patternTestFolder);
Matcher m = p.matcher(targetFolder);
if (m.matches()) {
targetFolder = File.separatorChar + m.group(1)
+ File.separatorChar + m.group(2);
}
filePath = targetFolder;
}
if (patternFile == null)
patternFile = PHPUnitConfigurationBlock.TEST_FILE_PATTERN_FILE_DEFAULT;
String fileName = resource.getName();
patternFile = patternFile.replace(".", "\\."); //$NON-NLS-1$ //$NON-NLS-2$
patternFile = patternFile.replace(
IPHPUnitConstants.TEST_FILE_PATTERN_PLACEHOLDER_FILENAME_LONG,
"(.+)"); //$NON-NLS-1$
patternFile = patternFile.replace(
IPHPUnitConstants.TEST_FILE_PATTERN_PLACEHOLDER_FILENAME,
"(.+)"); //$NON-NLS-1$
patternFile = patternFile.replace(
IPHPUnitConstants.TEST_FILE_PATTERN_PLACEHOLDER_FILE_EXTENSION,
"([^.]+)"); //$NON-NLS-1$
Matcher m = Pattern.compile(patternFile).matcher(fileName);
if (m.matches()) {
fileName = m.group(1) + "." + m.group(2); //$NON-NLS-1$
}
return new File(filePath + File.separatorChar + fileName);
}
public static boolean syncTestCaseToPHPClass(String testClassName,
IFile testClassFile, String phpClassName, String phpClassFile,
String phpSuperClass) {
try {
PHPUnit phpunit = PHPUnit.getInstance();
phpunit.createPHPClassSkeleton(testClassName, testClassFile,
phpClassName, phpClassFile, phpSuperClass);
Path path = new Path(phpClassFile);
IFile testFile = ResourcesPlugin.getWorkspace().getRoot()
.getFile(path);
IEditorInput editorInput = new FileEditorInput(testFile);
IWorkbenchWindow window = PHPUnitPlugin.getActiveWorkbenchWindow();
IWorkbenchPage page = window.getActivePage();
page.openEditor(editorInput, PHPUiConstants.PHP_EDITOR_ID);
return true;
} catch (PHPUnitException e) {
MessageDialog.openError(
PHPToolCorePlugin.getActiveWorkbenchShell(),
"Failed creating PHP Class", e.getMessage());
Logger.logException(e);
} catch (InvalidObjectException e) {
MessageDialog.openError(
PHPToolCorePlugin.getActiveWorkbenchShell(),
"Failed creating PHP Class", e.getMessage());
Logger.logException(e);
} catch (InvalidClassException e) {
MessageDialog.openError(
PHPToolCorePlugin.getActiveWorkbenchShell(),
"Failed creating PHP Class", e.getMessage());
Logger.logException(e);
} catch (CoreException e) {
MessageDialog.openError(
PHPToolCorePlugin.getActiveWorkbenchShell(),
"Failed creating PHP Class", e.getMessage());
Logger.logException(e);
}
return false;
}
}