package com.pablissimo.sonar;
import static org.junit.Assert.*;
import static org.mockito.Mockito.*;
import java.io.File;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;
import org.junit.Before;
import org.junit.Test;
import org.sonar.api.batch.sensor.coverage.CoverageType;
import org.sonar.api.batch.sensor.coverage.NewCoverage;
import org.sonar.api.batch.sensor.internal.SensorContextTester;
import org.sonar.api.batch.fs.InputFile;
import org.sonar.api.batch.fs.internal.DefaultInputFile;
import org.sonar.api.config.Settings;
public class TsCoverageSensorImplTest {
TsCoverageSensorImpl sensor;
Settings settings;
SensorContextTester context;
LCOVParser parser;
DefaultInputFile file;
File lcovFile;
@Before
public void setUp() throws Exception {
this.file = new DefaultInputFile("", "src/test/existing.ts").setLanguage(TypeScriptLanguage.LANGUAGE_KEY);
this.file.setLines(5);
this.settings = mock(Settings.class);
when(this.settings.getString(TypeScriptPlugin.SETTING_LCOV_REPORT_PATH)).thenReturn("lcovpath");
this.parser = mock(LCOVParser.class);
this.sensor = spy(new TsCoverageSensorImpl());
this.context = SensorContextTester.create(new File(""));
this.context.fileSystem().add(this.file);
this.context.setSettings(this.settings);
this.lcovFile = mock(File.class);
when(this.lcovFile.isFile()).thenReturn(true);
doReturn(this.lcovFile).when(this.sensor).getIOFile(any(File.class), eq("lcovpath"));
doReturn(this.parser).when(this.sensor).getParser(eq(this.context), any(File[].class));
}
@Test
public void savesZeroCoverage_IfNoReportAndSettingEnabled() {
when(this.settings.getString(TypeScriptPlugin.SETTING_LCOV_REPORT_PATH)).thenReturn("");
when(this.settings.getBoolean(TypeScriptPlugin.SETTING_FORCE_ZERO_COVERAGE)).thenReturn(true);
this.sensor.execute(this.context, null);
for (int i = 1; i <= this.file.lines(); i++) {
assertEquals((Integer) 0, this.context.lineHits(this.file.key(), CoverageType.UNIT, i));
}
}
@Test
public void savesNothing_IfNoReportAndSettingDisabled() {
when(this.settings.getString(TypeScriptPlugin.SETTING_LCOV_REPORT_PATH)).thenReturn("");
when(this.settings.getBoolean(TypeScriptPlugin.SETTING_FORCE_ZERO_COVERAGE)).thenReturn(false);
this.sensor.execute(this.context, null);
for (int i = 1; i <= this.file.lines(); i++) {
assertNull(this.context.lineHits(this.file.key(), CoverageType.UNIT, i));
}
}
@Test
public void doesNotCallParser_WhenNoLCOVPathSupplied() {
when(this.settings.getString(TypeScriptPlugin.SETTING_LCOV_REPORT_PATH)).thenReturn("");
this.sensor.execute(this.context, null);
verify(this.parser, never()).parseFile(any(java.io.File.class));
}
@Test
public void savesZeroCoverage_IfParserOutputsNothingForFile() {
this.sensor.execute(this.context, null);
for (int i = 1; i <= this.file.lines(); i++) {
assertEquals((Integer) 0, this.context.lineHits(this.file.key(), CoverageType.UNIT, i));
}
}
@Test
public void usesNonCommentLinesSetForLinesToCoverMetrics_IfSettingZeroCoverage() {
Map<InputFile, Set<Integer>> nonCommentLineNumbersByFile = new HashMap<InputFile, Set<Integer>>();
HashSet<Integer> nonCommentLineNumbers = new HashSet<Integer>();
nonCommentLineNumbers.add(1);
nonCommentLineNumbers.add(3);
nonCommentLineNumbers.add(5);
nonCommentLineNumbersByFile.put(this.file, nonCommentLineNumbers);
this.sensor.execute(this.context, nonCommentLineNumbersByFile);
// Expect lines 1, 3 and 5 to have zero coverage...
assertEquals((Integer) 0, this.context.lineHits(this.file.key(), CoverageType.UNIT, 1));
assertEquals((Integer) 0, this.context.lineHits(this.file.key(), CoverageType.UNIT, 3));
assertEquals((Integer) 0, this.context.lineHits(this.file.key(), CoverageType.UNIT, 5));
// and lines 2 and 5 to not have any coverage since they're not counted as code
// according to our supplied map
assertNull(this.context.lineHits(this.file.key(), CoverageType.UNIT, 2));
assertNull(this.context.lineHits(this.file.key(), CoverageType.UNIT, 4));
}
@Test
public void savesNoCoverage_IfNotFoundFilesAreIgnored() {
when(this.settings.getBoolean(TypeScriptPlugin.SETTING_IGNORE_NOT_FOUND)).thenReturn(true);
this.sensor.execute(this.context, null);
for (int i = 1; i <= this.file.lines(); i++) {
assertNull(this.context.lineHits(this.file.key(), CoverageType.UNIT, i));
}
}
@Test
public void savesCoverage_IfParserOutputHasDetailsForFile() {
HashMap<InputFile, NewCoverage> allFilesCoverage = new HashMap<InputFile, NewCoverage>();
NewCoverage fileCoverage = spy(this.context.newCoverage());
allFilesCoverage.put(this.file, fileCoverage);
when(this.parser.parseFile(this.lcovFile)).thenReturn(allFilesCoverage);
this.sensor.execute(this.context, null);
verify(fileCoverage, times(1)).save();
}
}