/** * 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; import org.eclipse.core.resources.IResourceChangeEvent; import org.eclipse.core.resources.IResourceChangeListener; import org.eclipse.core.resources.IResourceDelta; import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.core.runtime.IStatus; import org.eclipse.core.runtime.Status; import org.eclipse.core.runtime.jobs.Job; import org.eclipse.jface.viewers.ISelection; import org.eclipse.jface.viewers.StructuredSelection; import org.eclipse.ui.progress.UIJob; import com.piece_framework.makegood.core.continuoustesting.Scope; public class ContinuousTestRunner implements IResourceChangeListener { @Override public void resourceChanged(IResourceChangeEvent event) { if (MakeGoodContext.getInstance().isShuttingDown()) return; if (!MakeGoodContext.getInstance().getContinuousTesting().isEnabled()) return; IResourceDelta delta = event.getDelta(); if (delta == null) return; IResourceDelta[] deltas = delta.getAffectedChildren(); if (deltas.length == 0) return; try { if (!MakeGoodContext.getInstance().getProjectValidation().validate(deltas[0].getResource().getProject())) return; } catch (CoreException e) { Activator.getDefault().getLog().log(new Status(IStatus.ERROR, Activator.PLUGIN_ID, e.getMessage(), e)); return; } if (!shouldRunTests(deltas)) return; if (MakeGoodContext.getInstance().getContinuousTesting().getScope() == Scope.ALL_TESTS) { final ISelection selection = new StructuredSelection(deltas[0].getResource()); if (ActivePart.isAllTestsRunnable(selection)) { Job job = new UIJob("MakeGood Run All Tests By Continuous Test Runner") { //$NON-NLS-1$ @Override public IStatus runInUIThread(IProgressMonitor monitor) { MakeGoodContext.getInstance().getTestRunner().runAllTestsByContinuousTestRunner(selection); return Status.OK_STATUS; } }; job.schedule(); } } else if (MakeGoodContext.getInstance().getContinuousTesting().getScope() == Scope.LAST_TEST) { if (MakeGoodContext.getInstance().getTestRunner().hasLastTest()) { Job job = new UIJob("MakeGood Run Last Test By Continuous Test Runner") { //$NON-NLS-1$ @Override public IStatus runInUIThread(IProgressMonitor monitor) { MakeGoodContext.getInstance().getTestRunner().rerunLastTestByContinuousTestRunner(); return Status.OK_STATUS; } }; job.schedule(); } } else if (MakeGoodContext.getInstance().getContinuousTesting().getScope() == Scope.FAILED_TESTS) { if (MakeGoodContext.getInstance().getTestRunner().hasLastTest()) { Job job = new UIJob("MakeGood Run Failed Tests By Continuous Test Runner") { //$NON-NLS-1$ @Override public IStatus runInUIThread(IProgressMonitor monitor) { MakeGoodContext.getInstance().getTestRunner().rerunFailedTestsByContinuousTestRunner(); return Status.OK_STATUS; } }; job.schedule(); } } } private boolean shouldRunTests(IResourceDelta[] deltas) { for (IResourceDelta delta: deltas) { if (delta.getKind() != IResourceDelta.CHANGED) return true; int flags = delta.getFlags(); if ((flags & IResourceDelta.CONTENT) != 0) return true; if ((flags & IResourceDelta.REPLACED) != 0) return true; if ((flags & IResourceDelta.TYPE) != 0) return true; if ((flags & IResourceDelta.LOCAL_CHANGED) != 0) return true; return shouldRunTests(delta.getAffectedChildren()); } return false; } }