/*
* Sonar Clover Plugin
* Copyright (C) 2008 SonarSource
* 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.clover;
import org.junit.Before;
import org.junit.Test;
import org.sonar.api.batch.SensorContext;
import org.sonar.api.measures.CoreMetrics;
import org.sonar.api.resources.JavaFile;
import org.sonar.api.resources.JavaPackage;
import org.sonar.api.resources.Resource;
import org.sonar.api.test.IsMeasure;
import org.sonar.test.TestUtils;
import java.io.File;
import java.net.URISyntaxException;
import java.text.ParseException;
import static org.junit.Assert.assertEquals;
import static org.mockito.Matchers.anyDouble;
import static org.mockito.Matchers.anyObject;
import static org.mockito.Matchers.argThat;
import static org.mockito.Matchers.eq;
import static org.mockito.Mockito.*;
public class XmlReportParserTest {
private XmlReportParser reportParser;
private SensorContext context;
private File xmlFile;
@Before
public void before() throws URISyntaxException {
xmlFile = TestUtils.getResource(getClass(), "clover.xml");
context = mock(SensorContext.class);
reportParser = new XmlReportParser(context);
}
@Test
public void collectProjectMeasures() throws Exception {
reportParser.collect(xmlFile);
verify(context).saveMeasure(null, CoreMetrics.COVERAGE, 5.0); // coveredelements / elements
verify(context).saveMeasure(null, CoreMetrics.LINE_COVERAGE, 6.63); // covered methods + covered statements / methods + statements
verify(context).saveMeasure(null, CoreMetrics.LINES_TO_COVER, 196.0);
verify(context).saveMeasure(null, CoreMetrics.UNCOVERED_LINES, 183.0); // covered methods + covered statements
verify(context).saveMeasure(null, CoreMetrics.BRANCH_COVERAGE, 0.0); // covered conditionals / conditionals
verify(context).saveMeasure(null, CoreMetrics.CONDITIONS_TO_COVER, 64.0); // covered_conditionals
verify(context).saveMeasure(null, CoreMetrics.UNCOVERED_CONDITIONS, 64.0);
}
@Test
public void collectPackageMeasures() throws ParseException {
reportParser.collect(xmlFile);
final JavaPackage pac = new JavaPackage("org.sonar.samples");
verify(context).saveMeasure(pac, CoreMetrics.COVERAGE, 28.89);
// lines
verify(context).saveMeasure(pac, CoreMetrics.LINE_COVERAGE, 28.89);
verify(context).saveMeasure(pac, CoreMetrics.LINES_TO_COVER, 45.0);
verify(context).saveMeasure(pac, CoreMetrics.UNCOVERED_LINES, 32.0);
// no conditions
verify(context, never()).saveMeasure(eq(pac), eq(CoreMetrics.BRANCH_COVERAGE), anyDouble());
verify(context, never()).saveMeasure(eq(pac), eq(CoreMetrics.CONDITIONS_TO_COVER), anyDouble());
verify(context, never()).saveMeasure(eq(pac), eq(CoreMetrics.UNCOVERED_CONDITIONS), anyDouble());
}
@Test
public void parseClaver232Format() throws ParseException, URISyntaxException {
reportParser.collect(TestUtils.getResource(getClass(), "clover_2_3_2.xml"));
verify(context).saveMeasure(new JavaPackage("org.sonar.squid.sensors"), CoreMetrics.COVERAGE, 94.87);
}
@Test
public void collectFileMeasures() throws Exception {
reportParser.collect(xmlFile);
final JavaFile file = new JavaFile("org.sonar.samples.ClassUnderTest");
verify(context).saveMeasure(eq(file), argThat(new IsMeasure(CoreMetrics.LINES_TO_COVER, 5.0)));
verify(context).saveMeasure(eq(file), argThat(new IsMeasure(CoreMetrics.UNCOVERED_LINES, 0.0)));
verify(context).saveMeasure(eq(file), argThat(new IsMeasure(CoreMetrics.COVERAGE_LINE_HITS_DATA, "4=1;5=1;6=2;8=1;9=1")));
}
@Test
public void collectFileHitsData() throws Exception {
reportParser.collect(xmlFile);
verify(context).saveMeasure(eq(new JavaFile("org.sonar.samples.ClassUnderTest")), argThat(new IsMeasure(CoreMetrics.COVERAGE_LINE_HITS_DATA, "4=1;5=1;6=2;8=1;9=1")));
}
@Test
public void clover1FileNameContainsPath() {
XmlReportParser reportParser = new XmlReportParser(context);
assertEquals("SampleClass", reportParser.extractClassName("C:\\src\\main\\java\\org\\sonar\\samples\\SampleClass.java"));
assertEquals("SampleClass", reportParser.extractClassName("/src/main/java/org/sonar/samples/SampleClass.java"));
}
@Test
public void clover2FileNameDoesNotContainPath() {
XmlReportParser reportParser = new XmlReportParser(context);
assertEquals("SampleClass", reportParser.extractClassName("SampleClass.java"));
}
@Test
public void coverageShouldBeZeroWhenNoElements() throws URISyntaxException {
File xmlFile = TestUtils.getResource(getClass(), "coverageShouldBeZeroWhenNoElements/clover.xml");
context = mock(SensorContext.class);
XmlReportParser reportParser = new XmlReportParser(context);
reportParser.collect(xmlFile);
verify(context, never()).saveMeasure((Resource) anyObject(), eq(CoreMetrics.COVERAGE), anyDouble());
verify(context, never()).saveMeasure((Resource) anyObject(), eq(CoreMetrics.LINE_COVERAGE), anyDouble());
verify(context, never()).saveMeasure((Resource) anyObject(), eq(CoreMetrics.BRANCH_COVERAGE), anyDouble());
}
}