/*
* Sonar PHP Plugin
* Copyright (C) 2010 Sonar PHP Plugin
* dev@sonar.codehaus.org
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 3 of the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02
*/
package org.sonar.plugins.php.phpdepend;
import static org.mockito.Matchers.anyDouble;
import static org.mockito.Matchers.eq;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.never;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
import static org.sonar.plugins.php.api.Php.PHP;
import java.io.File;
import java.util.Arrays;
import java.util.HashSet;
import java.util.Set;
import org.apache.commons.configuration.Configuration;
import org.junit.Test;
import org.sonar.api.batch.SensorContext;
import org.sonar.api.measures.CoreMetrics;
import org.sonar.api.measures.Metric;
import org.sonar.api.resources.Project;
import org.sonar.api.resources.ProjectFileSystem;
import org.sonar.api.utils.SonarException;
import org.sonar.plugins.php.api.Php;
import org.sonar.plugins.php.api.PhpFile;
import org.sonar.plugins.php.core.PhpPlugin;
/**
* The Class PhpDependResultsParserTest.
*/
public class PhpDependResultsParserTest {
/** The context. */
private SensorContext context;
/** The metric. */
private Metric metric;
private Project project;
private static final String PDEPEND_RESULT = "/org/sonar/plugins/php/phpdepend/sensor/parser/pdepend.xml";
private static final String PDEPEND_RESULT_SAMEFILE_DIFFERBYFSUFFIX = "/org/sonar/plugins/php/phpdepend/sensor/parser/pdepend.samefiledifferbysuffix.xml";
/**
* Inits the result parser.
*/
private void init(String pdependResultFile) {
try {
File xmlReport = new File(getClass().getResource(pdependResultFile).toURI());
context = mock(SensorContext.class);
project = mock(Project.class);
ProjectFileSystem fileSystem = mock(ProjectFileSystem.class);
when(project.getFileSystem()).thenReturn(fileSystem);
when(fileSystem.getSourceDirs()).thenReturn(Arrays.asList(new File("C:/projets/PHP/Money/Sources/main")));
when(fileSystem.getTestDirs()).thenReturn(Arrays.asList(new File("C:/projets/PHP/Money/Sources/test")));
File f1 = new File("C:/projets/PHP/Money/Sources/test/MoneyTest.php");
File f2 = new File("C:/projets/PHP/Money/Sources/main/Money.php");
File f3 = new File("C:/projets/PHP/Money/Sources/main/MoneyBag.php");
File f4 = new File("C:/projets/PHP/Money/Sources/main/Common/IMoney.php");
File f5 = new File("C:/projets/PHP/Money/Sources/main/Money.inc");
when(fileSystem.getSourceFiles(PHP)).thenReturn(Arrays.asList(f1, f2, f3, f4, f5));
when(fileSystem.getTestFiles(PHP)).thenReturn(Arrays.asList(f1));
Set<Metric> metrics = new HashSet<Metric>();
metrics.add(metric);
PhpDependResultsParser parser = new PhpDependResultsParser(project, context);
Configuration configuration = mock(Configuration.class);
// new Php();
when(configuration.getStringArray(PhpPlugin.FILE_SUFFIXES_KEY)).thenReturn(null);
Php.PHP.setConfiguration(configuration);
parser.parse(xmlReport);
} catch (Exception e) {
throw new RuntimeException(e);
}
}
/**
* Should generate functions count measure.
*/
@Test
public void shouldNotGenerateMeasureForFileNotInSourceDirectory() {
metric = CoreMetrics.LINES;
init(PDEPEND_RESULT);
PhpFile file = new PhpFile("d:/projets/PHP/Money/Sources/main/Common/IMoney.php");
verify(context, never()).saveMeasure(eq(file), eq(metric), anyDouble());
}
/**
* Should not throw an exception when report not found.
*/
@Test
public void shouldNotThrowAnExceptionWhenReportNotFound() {
project = mock(Project.class);
PhpDependResultsParser parser = new PhpDependResultsParser(project, null);
parser.parse(new File("path/to/nowhere"));
}
/**
* Should throw an exception when file isn't valid
*/
@Test(expected = SonarException.class)
public void shouldThrowAnExceptionWhenReportIsInvalid() {
try {
project = mock(Project.class);
PhpDependResultsParser parser = new PhpDependResultsParser(project, null);
parser.parse(new File(getClass().getResource("/org/sonar/plugins/php/phpdepend/sensor/parser/pdepend-invalid.xml").getFile()));
} catch (SonarException e) {
throw new SonarException();
}
}
/**
* Should not throw an exception if metric not found.
*/
@Test
public void shouldNotThrowAnExceptionIfMetricNotFound() {
metric = new Metric("not a true metric");
init(PDEPEND_RESULT);
verify(context, never()).saveMeasure(eq(metric), anyDouble());
}
/**
* Should generate loc measures.
*/
@Test
public void shouldGenerateLocMeasures() {
metric = CoreMetrics.LINES;
init(PDEPEND_RESULT);
verify(context).saveMeasure(new PhpFile("MoneyTest.php", true), metric, 255.0);
verify(context).saveMeasure(new PhpFile("Money.php"), metric, 188.0);
verify(context).saveMeasure(new PhpFile("MoneyBag.php"), metric, 251.0);
verify(context).saveMeasure(new PhpFile("Common/IMoney.php"), metric, 74.0);
}
/**
* Should generate ncloc measures.
*/
@Test
public void shouldGenerateNclocMeasures() {
metric = CoreMetrics.NCLOC;
init(PDEPEND_RESULT);
verify(context).saveMeasure(new PhpFile("Money.php"), metric, 94.0);
verify(context).saveMeasure(new PhpFile("MoneyBag.php"), metric, 150.0);
verify(context).saveMeasure(new PhpFile("MoneyTest.php"), metric, 152.0);
verify(context).saveMeasure(new PhpFile("Common/IMoney.php"), metric, 15.0);
}
/**
* Should generate functions count measure.
*/
@Test
public void shouldGenerateFunctionsCountMeasure() {
metric = CoreMetrics.FUNCTIONS;
init(PDEPEND_RESULT);
verify(context).saveMeasure(new PhpFile("Money.php"), metric, 16.0);
verify(context).saveMeasure(new PhpFile("MoneyBag.php"), metric, 18.0);
verify(context).saveMeasure(new PhpFile("MoneyTest.php"), metric, 24.0);
verify(context).saveMeasure(new PhpFile("Common/IMoney.php"), metric, 8.0);
}
/**
* Should generate classes count measure.
*/
@Test
public void shouldGenerateClassesCountMeasure() {
metric = CoreMetrics.CLASSES;
init(PDEPEND_RESULT);
verify(context).saveMeasure(new PhpFile("Money.php"), metric, 2.0);
verify(context).saveMeasure(new PhpFile("MoneyBag.php"), metric, 1.0);
verify(context).saveMeasure(new PhpFile("MoneyTest.php"), metric, 1.0);
verify(context).saveMeasure(new PhpFile("Common/IMoney.php"), metric, 1.0);
}
/**
* Should generate complexty measure.
*/
@Test
public void shouldGenerateComplextyMeasure() {
metric = CoreMetrics.COMPLEXITY;
init(PDEPEND_RESULT);
verify(context).saveMeasure(new PhpFile("Money.php"), metric, 21.0);
verify(context).saveMeasure(new PhpFile("MoneyBag.php"), metric, 39.0);
verify(context).saveMeasure(new PhpFile("MoneyTest.php"), metric, 24.0);
verify(context).saveMeasure(new PhpFile("Common/IMoney.php"), metric, 0.0);
}
/**
* Should not generate dir or project measures.
*/
@Test
public void shouldNotGenerateDirOrProjectMeasures() {
metric = CoreMetrics.LINES;
init(PDEPEND_RESULT);
verify(context, never()).saveMeasure(eq(metric), anyDouble());
verify(context, never()).saveMeasure(eq(new org.sonar.api.resources.Directory("Sources/main")), eq(metric), anyDouble());
verify(context, never()).saveMeasure(eq(new org.sonar.api.resources.Directory("Sources/main/Common")), eq(metric), anyDouble());
}
@Test
public void shouldGenerateValidMeasuresOnSameFileWithDifferentSuffix() {
metric = CoreMetrics.COMPLEXITY;
init(PDEPEND_RESULT_SAMEFILE_DIFFERBYFSUFFIX);
verify(context).saveMeasure(new PhpFile("MoneyTest.php", true), metric, 24.0);
verify(context).saveMeasure(new PhpFile("Money.php"), metric, 21.0);
verify(context).saveMeasure(new PhpFile("Money.inc"), metric, 39.0);
}
}