@@ -18,6 +18,7 @@ import scala.language.unsafeNulls
1818import scala .collection .mutable .Buffer
1919import dotty .tools .dotc .util .DiffUtil
2020
21+ import java .nio .charset .StandardCharsets
2122import java .util .stream .Collectors
2223
2324@ Category (Array (classOf [BootstrappedOnlyTests ]))
@@ -127,6 +128,71 @@ class CoverageTests:
127128 )
128129 }
129130
131+ @ Test
132+ def checkIncrementalCoverage (): Unit =
133+ val target = Files .createTempDirectory(" coverage" )
134+ val sourceRoot = target.resolve(" src" )
135+ Files .createDirectory(sourceRoot)
136+ val sourceFile1 = sourceRoot.resolve(" file1.scala" )
137+ Files .write(sourceFile1, " def file1() = 1" .getBytes(StandardCharsets .UTF_8 ))
138+
139+ val coverageOut = target.resolve(" coverage-out" )
140+ Files .createDirectory(coverageOut)
141+ val options = defaultOptions.and(" -Ycheck:instrumentCoverage" , " -coverage-out" , coverageOut.toString, " -sourceroot" , sourceRoot.toString)
142+ compileFile(sourceFile1.toString, options).checkCompile()
143+
144+ val scoverageFile = coverageOut.resolve(" scoverage.coverage" )
145+ assert(Files .exists(scoverageFile), s " Expected scoverage file to exist at $scoverageFile" )
146+
147+ locally {
148+ val coverage = Serializer .deserialize(scoverageFile, sourceRoot.toString())
149+ val filesWithCoverage = coverage.statements.map(_.location.sourcePath.getFileName.toString).toSet
150+ assertEquals(Set (" file1.scala" ), filesWithCoverage)
151+ }
152+
153+ val sourceFile2 = sourceRoot.resolve(" file2.scala" )
154+ Files .write(sourceFile2, " def file2() = 2" .getBytes(StandardCharsets .UTF_8 ))
155+
156+ compileFile(sourceFile2.toString, options).checkCompile()
157+ locally {
158+ val coverage = Serializer .deserialize(scoverageFile, sourceRoot.toString())
159+ val filesWithCoverage = coverage.statements.map(_.location.sourcePath.getFileName.toString).toSet
160+ assertEquals(Set (" file1.scala" , " file2.scala" ), filesWithCoverage)
161+ }
162+
163+ @ Test
164+ def `deleted source files should not be kept in incremental coverage` (): Unit =
165+ val target = Files .createTempDirectory(" coverage" )
166+ val sourceRoot = target.resolve(" src" )
167+ Files .createDirectory(sourceRoot)
168+ val sourceFile1 = sourceRoot.resolve(" file1.scala" )
169+ Files .write(sourceFile1, " def file1() = 1" .getBytes(StandardCharsets .UTF_8 ))
170+
171+ val coverageOut = target.resolve(" coverage-out" )
172+ Files .createDirectory(coverageOut)
173+ val options = defaultOptions.and(" -Ycheck:instrumentCoverage" , " -coverage-out" , coverageOut.toString, " -sourceroot" , sourceRoot.toString)
174+ compileFile(sourceFile1.toString, options).checkCompile()
175+
176+ val scoverageFile = coverageOut.resolve(" scoverage.coverage" )
177+ assert(Files .exists(scoverageFile), s " Expected scoverage file to exist at $scoverageFile" )
178+
179+ locally {
180+ val coverage = Serializer .deserialize(scoverageFile, sourceRoot.toString())
181+ val filesWithCoverage = coverage.statements.map(_.location.sourcePath.getFileName.toString).toSet
182+ assertEquals(Set (" file1.scala" ), filesWithCoverage)
183+ }
184+
185+ val sourceFile2 = sourceRoot.resolve(" file2.scala" )
186+ Files .write(sourceFile2, " def file2() = 2" .getBytes(StandardCharsets .UTF_8 ))
187+
188+ Files .delete(sourceFile1)
189+
190+ compileFile(sourceFile2.toString, options).checkCompile()
191+ locally {
192+ val coverage = Serializer .deserialize(scoverageFile, sourceRoot.toString())
193+ val filesWithCoverage = coverage.statements.map(_.location.sourcePath.getFileName.toString).toSet
194+ assertEquals(Set (" file2.scala" ), filesWithCoverage)
195+ }
130196
131197object CoverageTests extends ParallelTesting :
132198 import scala .concurrent .duration .*
0 commit comments