diff --git a/scalac-scoverage-plugin/src/main/scala/scoverage/report/CodeGrid.scala b/scalac-scoverage-plugin/src/main/scala/scoverage/report/CodeGrid.scala
index 2b590b0f..c55eb66b 100644
--- a/scalac-scoverage-plugin/src/main/scala/scoverage/report/CodeGrid.scala
+++ b/scalac-scoverage-plugin/src/main/scala/scoverage/report/CodeGrid.scala
@@ -52,7 +52,7 @@ class CodeGrid(mFile: MeasuredFile) {
sb append spanStart(cell.status)
style = style2
}
- sb.append(cell.char)
+ xml.Utility.escape(cell.char.toString, sb)
})
sb append ""
sb.toString
diff --git a/scalac-scoverage-plugin/src/test/resources/scoverage/forHtmlWriter/src/main/scala/ClassContainingHtml.scala b/scalac-scoverage-plugin/src/test/resources/scoverage/forHtmlWriter/src/main/scala/ClassContainingHtml.scala
new file mode 100644
index 00000000..49ce9185
--- /dev/null
+++ b/scalac-scoverage-plugin/src/test/resources/scoverage/forHtmlWriter/src/main/scala/ClassContainingHtml.scala
@@ -0,0 +1,5 @@
+package coverage.sample
+
+class ClassContainingHtml {
+ def some_html =
HTML content
+}
diff --git a/scalac-scoverage-plugin/src/test/resources/scoverage/forHtmlWriter/src/main/scala/Class1.scala b/scalac-scoverage-plugin/src/test/resources/scoverage/forHtmlWriter/src/main/scala/ClassInMainDir.scala
similarity index 78%
rename from scalac-scoverage-plugin/src/test/resources/scoverage/forHtmlWriter/src/main/scala/Class1.scala
rename to scalac-scoverage-plugin/src/test/resources/scoverage/forHtmlWriter/src/main/scala/ClassInMainDir.scala
index 22a59500..08dd1394 100644
--- a/scalac-scoverage-plugin/src/test/resources/scoverage/forHtmlWriter/src/main/scala/Class1.scala
+++ b/scalac-scoverage-plugin/src/test/resources/scoverage/forHtmlWriter/src/main/scala/ClassInMainDir.scala
@@ -1,5 +1,5 @@
package coverage.sample
-class Class1 {
+class ClassInMainDir {
def msg_coverage = println("measure coverage of code")
}
diff --git a/scalac-scoverage-plugin/src/test/resources/scoverage/forHtmlWriter/src/main/scala/subdir/Class2.scala b/scalac-scoverage-plugin/src/test/resources/scoverage/forHtmlWriter/src/main/scala/subdir/ClassInSubDir.scala
similarity index 74%
rename from scalac-scoverage-plugin/src/test/resources/scoverage/forHtmlWriter/src/main/scala/subdir/Class2.scala
rename to scalac-scoverage-plugin/src/test/resources/scoverage/forHtmlWriter/src/main/scala/subdir/ClassInSubDir.scala
index 5e6a5dec..53fa1beb 100644
--- a/scalac-scoverage-plugin/src/test/resources/scoverage/forHtmlWriter/src/main/scala/subdir/Class2.scala
+++ b/scalac-scoverage-plugin/src/test/resources/scoverage/forHtmlWriter/src/main/scala/subdir/ClassInSubDir.scala
@@ -1,5 +1,5 @@
package coverage.sample
-class Class2 {
+class ClassInSubDir {
def msg_test = println("test code")
}
diff --git a/scalac-scoverage-plugin/src/test/scala/scoverage/ScoverageHtmlWriterTest.scala b/scalac-scoverage-plugin/src/test/scala/scoverage/ScoverageHtmlWriterTest.scala
index f565b906..a7076876 100644
--- a/scalac-scoverage-plugin/src/test/scala/scoverage/ScoverageHtmlWriterTest.scala
+++ b/scalac-scoverage-plugin/src/test/scala/scoverage/ScoverageHtmlWriterTest.scala
@@ -12,39 +12,49 @@ import org.scalatest.FunSuite
class ScoverageHtmlWriterTest extends FunSuite {
- test("HTML coverage report has been created correctly") {
+ val rootDirForClasses = new File(getClass.getResource("forHtmlWriter/src/main/scala/").getFile)
- def tempDir(): File = {
- val dir = new File(IOUtils.getTempDirectory, UUID.randomUUID().toString)
- dir.mkdirs()
- dir.deleteOnExit()
- dir
- }
+ def pathToClassFile(classLocation: String): String =
+ new File(rootDirForClasses, classLocation).getCanonicalPath
- val coverage = Coverage()
+ val pathToClassContainingHtml = pathToClassFile("ClassContainingHtml.scala")
+ val pathToClassInSubDir = pathToClassFile("subdir/ClassInSubDir.scala")
+ val pathToClassInMainDir = pathToClassFile("ClassInMainDir.scala")
- val class2 = new File(getClass.getResource("forHtmlWriter/src/main/scala/subdir/Class2.scala").getFile()).getCanonicalPath()
- val class1 = new File(getClass.getResource("forHtmlWriter/src/main/scala/Class1.scala").getFile()).getCanonicalPath()
+ val statementForClassContainingHtml = Statement(pathToClassContainingHtml,
+ Location("coverage.sample", "ClassContainingHtml", "ClassContainingHtml", ClassType.Class, "some_html", pathToClassInSubDir),
+ 3, 74, 97, 4, "HTML content
",
+ "scala.Predef.println", "Apply", false, 0)
+ val statementForClassInSubDir = Statement(pathToClassInSubDir,
+ Location("coverage.sample", "ClassInSubDir", "ClassInSubDir", ClassType.Class, "msg_test", pathToClassInSubDir),
+ 2, 64, 84, 4, "scala.this.Predef.println(\"test code\")",
+ "scala.Predef.println", "Apply", false, 0)
+ val statementForClassInMainDir = Statement(pathToClassInMainDir,
+ Location("coverage.sample", "ClassInMainDir", "ClassInMainDir", ClassType.Class, "msg_coverage", pathToClassInMainDir),
+ 1, 69, 104, 4, "scala.this.Predef.println(\"measure coverage of code\")",
+ "scala.Predef.println", "Apply", false, 0)
- coverage.add(
- Statement(class2,
- Location("coverage.sample", "Class2", "Class2", ClassType.Class, "msg_test", class2),
- 2, 60, 80, 4, "scala.this.Predef.println(\"test code\")",
- "scala.Predef.println", "Apply", false, 0)
- )
+ def createTemporaryDir(): File = {
+ val dir = new File(IOUtils.getTempDirectory, UUID.randomUUID().toString)
+ dir.mkdirs()
+ dir.deleteOnExit()
+ dir
+ }
- coverage.add(
- Statement(class1,
- Location("coverage.sample", "Class1", "Class1", ClassType.Class, "msg_coverage", class1),
- 1, 64, 99, 4, "scala.this.Predef.println(\"measure coverage of code\")",
- "scala.Predef.println", "Apply", false, 0)
- )
+ def writeCoverageToTemporaryDir(coverage: Coverage): File = {
+ val outputDir = createTemporaryDir()
+ val htmlWriter = new ScoverageHtmlWriter(rootDirForClasses, outputDir)
+ htmlWriter.write(coverage)
+ outputDir
+ }
- val dir = getClass.getResource("forHtmlWriter/src/main/scala/").getFile()
- val outputDir = tempDir()
+ test("HTML coverage report contains correct links") {
- val htmlWriter = new ScoverageHtmlWriter(new File(dir), outputDir)
- htmlWriter.write(coverage)
+ val coverage = Coverage()
+ coverage.add(statementForClassInSubDir)
+ coverage.add(statementForClassInMainDir)
+
+ val outputDir = writeCoverageToTemporaryDir(coverage)
val htmls = List("overview.html", "coverage.sample.html")
@@ -57,7 +67,18 @@ class ScoverageHtmlWriterTest extends FunSuite {
}
}
- assert( links.toSet == Set("Class1.scala.html", "subdir/Class2.scala.html") )
+ assert( links.toSet == Set("ClassInMainDir.scala.html", "subdir/ClassInSubDir.scala.html") )
}
}
+
+ test("HTML coverage report escapes HTML") {
+
+ val coverage = Coverage()
+ coverage.add(statementForClassContainingHtml)
+ val outputDir = writeCoverageToTemporaryDir(coverage)
+
+ val contentsOfFileWithEmbeddedHtml = Source.fromFile(new File(outputDir, "ClassContainingHtml.scala.html")).getLines.mkString
+ assert( !contentsOfFileWithEmbeddedHtml.contains("HTML content
") )
+ assert( contentsOfFileWithEmbeddedHtml.contains("<div>HTML content</div>") )
+ }
}