package com.pablissimo.sonar;
import static org.junit.Assert.*;
import java.io.File;
import java.net.URISyntaxException;
import java.net.URL;
import java.util.Map;
import org.junit.Before;
import org.junit.Test;
import org.sonar.api.batch.fs.InputFile;
import org.sonar.api.batch.fs.internal.DefaultInputFile;
import org.sonar.api.batch.sensor.coverage.NewCoverage;
import org.sonar.api.batch.sensor.coverage.internal.DefaultCoverage;
import org.sonar.api.batch.sensor.internal.SensorContextTester;
public class LCOVParserImplTest {
LOCSensor sensor;
SensorContextTester sensorContext;
DefaultInputFile inputFile;
@Before
public void setUp() throws Exception {
this.sensorContext = SensorContextTester.create(new File(""));
this.inputFile =
new DefaultInputFile("", "path/to/file.ts")
.setLanguage(TypeScriptLanguage.LANGUAGE_KEY)
.setLines(3);
this.sensorContext.fileSystem().add(this.inputFile);
}
@Test
public void parsesBasicLcovFiles() {
Map<InputFile, NewCoverage> coverage = executeForTestCase("basic");
DefaultCoverage c = (DefaultCoverage) coverage.get(this.inputFile);
assertEquals((Integer) 3, c.hitsByLine().get(1));
assertEquals((Integer) 0, c.hitsByLine().get(2));
assertEquals((Integer) 1, c.hitsByLine().get(3));
assertEquals(3, c.linesToCover());
}
@Test
public void parsesAngularTemplateLoaderOutput() {
Map<InputFile, NewCoverage> coverage = executeForTestCase("angular");
DefaultCoverage c = (DefaultCoverage) coverage.get(this.inputFile);
assertEquals((Integer) 3, c.hitsByLine().get(1));
assertEquals((Integer) 0, c.hitsByLine().get(2));
assertEquals((Integer) 1, c.hitsByLine().get(3));
assertEquals(3, c.linesToCover());
}
@Test
public void parsesAngularTemplateLoaderOutput_IfPassedThroughMultipleLoaders() {
Map<InputFile, NewCoverage> coverage = executeForTestCase("angularmanybangs");
DefaultCoverage c = (DefaultCoverage) coverage.get(this.inputFile);
assertEquals((Integer) 3, c.hitsByLine().get(1));
assertEquals((Integer) 0, c.hitsByLine().get(2));
assertEquals((Integer) 1, c.hitsByLine().get(3));
assertEquals(3, c.linesToCover());
}
@Test
public void handlesNoContent() {
Map<InputFile, NewCoverage> coverage = executeForTestCase("blank");
assertNotNull(coverage);
assertEquals(0, coverage.size());
}
@Test
public void handlesNoLineHitsForASingleFile() {
Map<InputFile, NewCoverage> coverage = executeForTestCase("nolinehits");
DefaultCoverage c = (DefaultCoverage) coverage.get(this.inputFile);
assertEquals(1, coverage.size());
assertNotNull(c);
assertNull(c.hitsByLine().get(1));
assertNull(c.hitsByLine().get(2));
assertNull(c.hitsByLine().get(3));
}
@Test
public void ignoresFilesNotPartOfAnalysisSet() {
Map<InputFile, NewCoverage> coverage = executeForTestCase("existingandnot");
DefaultCoverage c = (DefaultCoverage) coverage.get(this.inputFile);
assertNotNull(c);
assertEquals(1, coverage.size());
}
@Test
public void handlesFilesEndingWithExclamationMarkIfNotPartOfSet() {
Map<InputFile, NewCoverage> coverage = executeForTestCase("angularendswithbang");
assertNotNull(coverage);
assertEquals(0, coverage.size());
}
@Test
public void handlesOutOfRangeLineNumbers() {
Map<InputFile, NewCoverage> coverage = executeForTestCase("outofrangelines");
DefaultCoverage c = (DefaultCoverage) coverage.get(this.inputFile);
assertNotNull(c);
assertEquals(1, coverage.size());
assertEquals((Integer) 3, c.hitsByLine().get(1));
}
@Test(expected = IllegalArgumentException.class)
public void createThrowsWhenFileDoesNotExist() {
File nonExistent = new File("whatever");
LCOVParserImpl.create(this.sensorContext, nonExistent);
}
@Test(expected = IllegalArgumentException.class)
public void parseFileThrowsWhenFileDoesNotExist() {
File nonExistent = new File("whatever");
LCOVParser parser = getParser(resource("basic"));
parser.parseFile(nonExistent);
}
@Test
public void doesNotThrow_withWindowsStyleAngularCLIPaths() {
executeForTestCase("angularwindowspaths");
}
private Map<InputFile, NewCoverage> executeForTestCase(String testName) {
File lcovFile = resource(testName);
LCOVParser parser = getParser(lcovFile);
return parser.parseFile(lcovFile);
}
private LCOVParser getParser(File lcovFile) {
return LCOVParserImpl.create(this.sensorContext, lcovFile);
}
private File resource(String testName) {
URL lcovUrl = LCOVParserImplTest.class.getClassLoader().getResource("./lcov/" + testName + ".lcov");
try {
File lcovFile = new File(lcovUrl.toURI());
return lcovFile;
}
catch (URISyntaxException e) {
return null;
}
}
}