/**
* Copyright (c) 2010 MATSUFUJI Hideharu <matsufuji2008@gmail.com>,
* 2010-2013 KUBO Atsuhiro <kubo@iteman.jp>,
* All rights reserved.
*
* This file is part of MakeGood.
*
* This program and the accompanying materials are 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
*/
package com.piece_framework.makegood.ui.launch;
import org.eclipse.core.resources.IProject;
import org.eclipse.debug.core.ILaunchManager;
import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.swt.widgets.Display;
import org.eclipse.ui.IEditorPart;
import org.eclipse.ui.IWorkbenchPart;
import com.piece_framework.makegood.launch.PHPexeItemRepository;
import com.piece_framework.makegood.launch.TestLifecycle;
import com.piece_framework.makegood.ui.ActivePart;
import com.piece_framework.makegood.ui.MakeGoodContext;
import com.piece_framework.makegood.ui.Messages;
import com.piece_framework.makegood.ui.views.ViewOpener;
public class TestRunner {
private MakeGoodLaunchShortcut lastShortcut;
private Object lastTestTarget;
private IWorkbenchPart lastActivePart;
/**
* @since 1.4.0
*/
private boolean isTestRunByContinuousTestRunner = false;
/**
* @since 1.6.0
*/
private PHPexeItemRepository phpexeItemRepository = new PHPexeItemRepository();
public void runRelatedTests(IEditorPart editorPart) {
runTests(editorPart, new RelatedTestsLaunchShortcut());
}
public void runTestsInContext(IEditorPart editorPart) {
runTests(editorPart, new ContextLaunchShortcut());
}
public void runTestsInClass(IEditorPart editorPart) {
runTests(editorPart, new ClassLaunchShortcut());
}
public void runTestsInFile(IEditorPart editorPart) {
runTests(editorPart, new FileLaunchShortcut());
}
public void runTestsFromExplorer(ISelection selection) {
runTests(selection, new ResourceLaunchShortcut());
}
public void runAllTestsByContinuousTestRunner(ISelection selection) {
isTestRunByContinuousTestRunner = true;
runTests(selection, new AllTestsLaunchShortcut());
isTestRunByContinuousTestRunner = false;
}
public void runAllTests() {
runTests(MakeGoodContext.getInstance().getActivePart().getEntity(), new AllTestsLaunchShortcut());
}
public boolean hasLastTest() {
if (lastTestTarget == null) return false;
TestLifecycle lastTestLifecycle = TestLifecycle.getInstance();
if (lastTestLifecycle == null) return false;
IProject lastTestProject = lastTestLifecycle.getTestTargets().getProject();
if (lastTestProject == null) return false;
if (!lastTestProject.equals(MakeGoodContext.getInstance().getActivePart().getProject())) return false;
return true;
}
public void rerunLastTest() {
runTests(lastTestTarget, lastShortcut);
}
/**
* @since 1.4.0
*/
public void rerunLastTestByContinuousTestRunner() {
isTestRunByContinuousTestRunner = true;
rerunLastTest();
isTestRunByContinuousTestRunner = false;
}
/**
* @since 2.1.0
*/
public void rerunFailedTests() {
runTests(
lastTestTarget,
new FailedTestsLaunchShortcut(TestLifecycle.getInstance().getFailures().findAll(), lastShortcut)
);
}
/**
* @since 2.1.0
*/
public void rerunFailedTestsByContinuousTestRunner() {
isTestRunByContinuousTestRunner = true;
rerunFailedTests();
isTestRunByContinuousTestRunner = false;
}
public void restoreFocusToLastActivePart() {
if (lastActivePart != null) {
ViewOpener.setFocus(lastActivePart);
}
}
@SuppressWarnings("restriction")
private void runTests(Object testTarget, MakeGoodLaunchShortcut shortcut) {
synchronized (TestRunner.class) {
if (TestLifecycle.isRunning()) {
if (!isTestRunByContinuousTestRunner) {
raiseTestSessionAlreadyExistsError();
}
return;
}
TestLifecycle.create();
}
if (hasPHPexeItem()) {
if (!isTestRunByContinuousTestRunner) {
if (shortcut instanceof FailedTestsLaunchShortcut) {
lastShortcut = ((FailedTestsLaunchShortcut) shortcut).getLastShortcut();
} else {
lastShortcut = shortcut;
}
lastTestTarget = testTarget;
}
lastActivePart = ActivePart.getActivePart();
}
String launchMode = MakeGoodContext.getInstance().isDebug() ? ILaunchManager.DEBUG_MODE : ILaunchManager.RUN_MODE;
try {
if (testTarget instanceof ISelection) {
shortcut.launch((ISelection) testTarget, launchMode);
} else if (testTarget instanceof IEditorPart) {
shortcut.launch((IEditorPart) testTarget, launchMode);
}
} catch (TestLaunchException e) {
TestLifecycle.destroy();
}
if (!hasPHPexeItem()) {
TestLifecycle.destroy();
}
}
private void raiseTestSessionAlreadyExistsError() {
final Display display = Display.getDefault();
display.syncExec(new Runnable() {
@Override
public void run() {
MessageDialog.openError(
display.getActiveShell(),
Messages.TestRunner_TestSessionAlreadyExists_Title,
Messages.TestRunner_TestSessionAlreadyExists_Message
);
}
});
}
/**
* @since 1.4.0
*/
private boolean hasPHPexeItem() {
return phpexeItemRepository.findByProject(TestLifecycle.getInstance().getTestTargets().getProject()) != null;
}
}