/******************************************************************************* * Copyright (c) 2009, 2010 Sven Kiera * All rights reserved. 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 org.phpsrc.eclipse.pti.tools.phpunit.validator; import org.eclipse.core.resources.IFile; import org.eclipse.core.resources.IFolder; import org.eclipse.core.resources.IMarker; import org.eclipse.core.resources.IResource; import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.dltk.compiler.problem.IProblem; import org.eclipse.wst.validation.AbstractValidator; import org.eclipse.wst.validation.ValidationResult; import org.eclipse.wst.validation.ValidationState; import org.phpsrc.eclipse.pti.core.PHPToolkitUtil; import org.phpsrc.eclipse.pti.core.compiler.problem.FileProblem; import org.phpsrc.eclipse.pti.tools.phpunit.IPHPUnitConstants; import org.phpsrc.eclipse.pti.tools.phpunit.core.PHPUnit; import org.phpsrc.eclipse.pti.ui.Logger; public class PHPUnitValidator extends AbstractValidator { public ValidationResult validate(IResource resource, int kind, ValidationState state, IProgressMonitor monitor) { // process only PHP files if (resource.getType() != IResource.FILE || !(PHPToolkitUtil.isPhpFile((IFile) resource))) { return null; } IFile testCaseFile = PHPUnit.searchTestCase((IFile) resource); if (testCaseFile == null) return null; return validateTestCase(testCaseFile); } public ValidationResult validateTestCase(IFile file) { return validateTestCase(file, false); } public ValidationResult validateTestCase(IFile file, boolean forceCodeCoverage) { // remove the markers currently existing for this resource // in case of project/folder, the markers are deleted recursively try { file.deleteMarkers(IPHPUnitConstants.VALIDATOR_PHPUNIT_MARKER, false, IResource.DEPTH_INFINITE); } catch (CoreException e) { } PHPUnit phpunit = PHPUnit.getInstance(); return createFileMarker(phpunit.runTestCase(file, forceCodeCoverage)); } public ValidationResult validateTestSuite(IFile file) { return validateTestSuite(file, false); } public ValidationResult validateTestSuite(IFile file, boolean forceCodeCoverage) { // remove the markers currently existing for this resource // in case of project/folder, the markers are deleted recursively try { file.getParent().deleteMarkers( IPHPUnitConstants.VALIDATOR_PHPUNIT_MARKER, false, IResource.DEPTH_INFINITE); } catch (CoreException e) { } PHPUnit phpunit = PHPUnit.getInstance(); return createFileMarker(phpunit.runTestSuite(file, forceCodeCoverage)); } public ValidationResult validateFolder(IFolder folder) { return validateFolder(folder, false); } public ValidationResult validateFolder(IFolder folder, boolean forceCodeCoverage) { // remove the markers currently existing for this resource // in case of project/folder, the markers are deleted recursively try { folder.deleteMarkers(IPHPUnitConstants.VALIDATOR_PHPUNIT_MARKER, false, IResource.DEPTH_INFINITE); } catch (CoreException e) { } PHPUnit phpunit = PHPUnit.getInstance(); return createFileMarker(phpunit.runAllTestsInFolder(folder, forceCodeCoverage)); } protected ValidationResult createFileMarker(IProblem[] problems) { ValidationResult result = new ValidationResult(); for (IProblem problem : problems) { IFile file = ((FileProblem) problem).getOriginatingFile(); try { IMarker marker = file .createMarker(IPHPUnitConstants.VALIDATOR_PHPUNIT_MARKER); marker.setAttribute(IMarker.PROBLEM, true); marker.setAttribute(IMarker.LINE_NUMBER, problem.getSourceLineNumber()); if (problem.isWarning()) { marker.setAttribute(IMarker.SEVERITY, IMarker.SEVERITY_WARNING); result.incrementWarning(1); } else { marker.setAttribute(IMarker.SEVERITY, IMarker.SEVERITY_ERROR); result.incrementError(1); } marker.setAttribute(IMarker.CHAR_START, problem.getSourceStart()); marker.setAttribute(IMarker.CHAR_END, problem.getSourceEnd()); marker.setAttribute(IMarker.MESSAGE, problem.getMessage()); } catch (CoreException e) { Logger.logException(e); } } return result; } }