Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Featrue/100-HTMLParser #134

Merged
merged 4 commits into from
Dec 13, 2023
Merged
Show file tree
Hide file tree
Changes from 3 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -0,0 +1,98 @@
// SPDX-License-Identifier: MIT
// SPDX-FileCopyrightText: 2023

package com.amos.pitmutationmate.pitmutationmate.reporting

import org.jsoup.Jsoup
import org.jsoup.nodes.Element
import java.io.File

class HTMLParser {
fun loadResultsFromHtml(htmlReportPath: String): OverallResultData {
val overallResultData = OverallResultData()
try {
val document = Jsoup.parse(File(htmlReportPath), "UTF-8")

val projectSummaryTable = document.selectFirst("h3:contains(Project Summary) + table")
if (projectSummaryTable != null) {
val rows = projectSummaryTable.select("tbody tr")
if (rows.isNotEmpty()) {
val overallRow = rows.first()
overallResultData.overallMutationResult = extractOverallMutationResultFromRow(overallRow)
}
}

val breakdownByPackageTable = document.selectFirst("h3:contains(Breakdown by Package) + table")
if (breakdownByPackageTable != null) {
val rows = breakdownByPackageTable.select("tbody tr")
if (rows.isNotEmpty()) {
for (row in rows) {
val packageResult = PackageResult(
extractPackageNameFromRow(row),
extractPackageHrefFromRow(row),
extractMutationResultFromRow(row)
)
overallResultData.addPackageResult(packageResult)
}
}
}
} catch (e: Exception) {
e.printStackTrace()
}
return overallResultData
}

private fun extractOverallMutationResultFromRow(row: Element?): MutationResult {
val cells = row?.select("td") ?: emptyList()

val numberOfClasses = cells.getOrNull(0)?.text() ?: "N/A"
val lineCoverage = cells.getOrNull(1)?.text() ?: "N/A"
val mutationCoverage = cells.getOrNull(2)?.text() ?: "N/A"
val testStrength = cells.getOrNull(3)?.text() ?: "N/A"

return MutationResult(numberOfClasses, lineCoverage, mutationCoverage, testStrength)
}

private fun extractMutationResultFromRow(row: Element?): MutationResult {
val cells = row?.select("td") ?: emptyList()

val numberOfClasses = cells.getOrNull(1)?.text() ?: "N/A"
val lineCoverage = cells.getOrNull(2)?.text() ?: "N/A"
val mutationCoverage = cells.getOrNull(3)?.text() ?: "N/A"
val testStrength = cells.getOrNull(4)?.text() ?: "N/A"

return MutationResult(numberOfClasses, lineCoverage, mutationCoverage, testStrength)
}

private fun extractPackageNameFromRow(row: Element?): String {
val packageElement = row?.selectFirst("td a")
return packageElement?.text() ?: "N/A"
}

private fun extractPackageHrefFromRow(row: Element?): String {
val packageElement = row?.selectFirst("td a")
return packageElement?.attr("href") ?: "N/A"
}

data class OverallResultData(
var overallMutationResult: MutationResult? = null,
val packageResults: MutableList<PackageResult> = mutableListOf()
) {
fun addPackageResult(packageResult: PackageResult) {
packageResults.add(packageResult)
}
}

data class MutationResult(
val numberOfClasses: String,
val lineCoverage: String,
val mutationCoverage: String,
val testStrength: String
)

data class PackageResult(
val packageName: String,
val packageHref: String,
val mutationResult: MutationResult
)
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
package com.amos.pitmutationmate.pitmutationmate
lheimbs marked this conversation as resolved.
Show resolved Hide resolved

import com.amos.pitmutationmate.pitmutationmate.reporting.HTMLParser
import org.junit.jupiter.api.Assertions.assertEquals
import org.junit.jupiter.api.Test
import java.io.File

class HTMLParserTests {
private fun getTestInputFilepath(filename: String): File {
val path = "src/test/resources/$filename"
return File(path)
}

@Test
fun testParsing() {
val htmlParser = HTMLParser()
val file = getTestInputFilepath("test_report/index.html")
val resultData = htmlParser.loadResultsFromHtml(file.absolutePath)

assertEquals("1", resultData.overallMutationResult?.numberOfClasses)
assertEquals("100% 19/19", resultData.overallMutationResult?.lineCoverage)
assertEquals("23% 3/13", resultData.overallMutationResult?.mutationCoverage)
assertEquals("25% 3/12", resultData.overallMutationResult?.testStrength)

val packageResult = resultData.packageResults[0]

assertEquals("de.esolutions.pitest.showcase", packageResult.packageName)
assertEquals("./de.esolutions.pitest.showcase/index.html", packageResult.packageHref)
assertEquals("1", packageResult.mutationResult.numberOfClasses)
assertEquals("100% 19/19", packageResult.mutationResult.lineCoverage)
assertEquals("23% 3/13", packageResult.mutationResult.mutationCoverage)
assertEquals("25% 3/12", packageResult.mutationResult.testStrength)
}
}
Original file line number Diff line number Diff line change
@@ -1,9 +1,8 @@
// SPDX-License-Identifier: MIT
// SPDX-FileCopyrightText: 2023

package com.amos.pitmutationmate.pitmutationmate
package com.amos.pitmutationmate.pitmutationmate.reporting

import com.amos.pitmutationmate.pitmutationmate.reporting.XMLParser
import org.junit.jupiter.api.Assertions.assertEquals
import org.junit.jupiter.api.Assertions.assertFalse
import org.junit.jupiter.api.Assertions.assertTrue
Expand Down
69 changes: 69 additions & 0 deletions pitmutationmate/src/test/resources/test_report/index.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,69 @@
<!DOCTYPE html>
lheimbs marked this conversation as resolved.
Show resolved Hide resolved
<html>
<head>
<meta http-equiv="Content-Type" content="text/html;charset=windows-1252">
<link rel="stylesheet" type="text/css" href="style.css">
</head>
<body>

<h1>Pit Test Coverage Report</h1>

<h3>Project Summary</h3>
<table>
<thead>
<tr>
<th>Number of Classes</th>
<th>Line Coverage</th>
<th>Mutation Coverage</th>
<th>Test Strength</th>
</tr>
</thead>
<tbody>
<tr>
<td>1</td>
<td>100% <div class="coverage_bar"><div class="coverage_complete width-100"></div><div class="coverage_legend">19/19</div></div></td>
<td>23% <div class="coverage_bar"><div class="coverage_complete width-23"></div><div class="coverage_legend">3/13</div></div></td>
<td>25% <div class="coverage_bar"><div class="coverage_complete width-25"></div><div class="coverage_legend">3/12</div></div></td>
</tr>
</tbody>
</table>


<h3>Breakdown by Package</h3>
<table>
<thead>
<tr>
<th>Name</th>
<th>Number of Classes</th>
<th>Line Coverage</th>
<th>Mutation Coverage</th>
<th>Test Strength</th>
</tr>
</thead>
<tbody>

<tr>
<td><a href="./de.esolutions.pitest.showcase/index.html">de.esolutions.pitest.showcase</a></td>
<td>1</td>
<td><div class="coverage_percentage">100% </div><div class="coverage_bar"><div class="coverage_complete width-100"></div><div class="coverage_legend">19/19</div></div></td>
<td><div class="coverage_percentage">23% </div><div class="coverage_bar"><div class="coverage_complete width-23"></div><div class="coverage_legend">3/13</div></div></td>
<td><div class="coverage_percentage">25% </div><div class="coverage_bar"><div class="coverage_complete width-25"></div><div class="coverage_legend">3/12</div></div></td>
</tr>

</tbody>
</table>
<br/>



<hr/>

Report generated by <a href='https://pitest.org'>PIT</a> 1.14.3

<br/>
<br/>

Enhanced functionality available at <a href='https://www.arcmutate.com/'>arcmutate.com</a>

</body>
</html>