|
6 | 6 | import org.fugerit.java.core.xml.dom.DOMIO; |
7 | 7 | import org.fugerit.java.doc.base.config.DocConfig; |
8 | 8 | import org.fugerit.java.junit5.tag.check.model.ExecutedTest; |
| 9 | +import org.fugerit.java.junit5.tag.check.model.ReportHelper; |
9 | 10 | import org.fugerit.java.junit5.tag.check.model.ReportModel; |
10 | 11 | import org.fugerit.java.junit5.tag.check.model.TestStats; |
11 | 12 | import org.w3c.dom.Document; |
12 | 13 | import org.w3c.dom.Element; |
13 | 14 |
|
14 | | -import java.io.File; |
15 | | -import java.io.FileWriter; |
16 | | -import java.io.IOException; |
| 15 | +import java.io.*; |
17 | 16 | import java.util.*; |
18 | 17 | import java.util.stream.Collectors; |
19 | 18 |
|
@@ -42,33 +41,23 @@ private void generateReport(Map<ExecutedTest, Set<String>> testTagMap) |
42 | 41 | throws IOException { |
43 | 42 | outputFile.getParentFile().mkdirs(); |
44 | 43 |
|
45 | | - ReportModel model = this.toReportModel(testTagMap); |
| 44 | + ReportHelper helper = new ReportHelper( testTagMap ); |
| 45 | + |
46 | 46 | switch (format.toLowerCase()) { |
47 | 47 | case DocConfig.TYPE_JSON: |
48 | | - generateJsonReport(model); |
| 48 | + generateJsonReport( helper.getReportModel() ); |
49 | 49 | break; |
50 | 50 | case DocConfig.TYPE_XML: |
51 | | - generateXmlReport(testTagMap); |
| 51 | + generateXmlReport( testTagMap ); |
52 | 52 | break; |
53 | | - case "html": |
54 | | - generateHtmlReport(testTagMap); |
| 53 | + case DocConfig.TYPE_HTML: |
| 54 | + generateHtmlReport( helper ); |
55 | 55 | break; |
56 | 56 | default: |
57 | 57 | generateTextReport(testTagMap); |
58 | 58 | } |
59 | 59 | } |
60 | 60 |
|
61 | | - private ReportModel toReportModel(Map<ExecutedTest, Set<String>> testTagMap) { |
62 | | - ReportModel model = new ReportModel(); |
63 | | - for (Map.Entry<ExecutedTest, Set<String>> entry : testTagMap.entrySet()) { |
64 | | - ExecutedTest current = entry.getKey(); |
65 | | - current.getTags().addAll(entry.getValue()); |
66 | | - model.getExecutedTests().add( current ); |
67 | | - } |
68 | | - log.info( "report model, getExecutedTests().size() : {}", model.getExecutedTests().size() ); |
69 | | - return model; |
70 | | - } |
71 | | - |
72 | 61 | private void generateTextReport(Map<ExecutedTest, Set<String>> testTagMap) |
73 | 62 | throws IOException { |
74 | 63 | // Helper method for String.repeat(80) |
@@ -201,85 +190,9 @@ private String repeatString(String s, int count) { |
201 | 190 | return sb.toString(); |
202 | 191 | } |
203 | 192 |
|
204 | | - private void generateHtmlReport(Map<ExecutedTest, Set<String>> testTagMap) |
205 | | - throws IOException { |
206 | | - try (FileWriter writer = new FileWriter(outputFile)) { |
207 | | - writer.write("<!DOCTYPE html>\n<html>\n<head>\n"); |
208 | | - writer.write("<meta charset=\"UTF-8\">\n"); |
209 | | - writer.write("<title>Executed Test Tag Report</title>\n"); |
210 | | - writer.write("<style>\n"); |
211 | | - writer.write("body { font-family: Arial, sans-serif; margin: 20px; }\n"); |
212 | | - writer.write("table { border-collapse: collapse; width: 100%; margin: 20px 0; }\n"); |
213 | | - writer.write("th, td { border: 1px solid #ddd; padding: 8px; text-align: left; }\n"); |
214 | | - writer.write("th { background-color: #4CAF50; color: white; }\n"); |
215 | | - writer.write("tr:nth-child(even) { background-color: #f2f2f2; }\n"); |
216 | | - writer.write(".pass { color: green; }\n"); |
217 | | - writer.write(".fail { color: red; }\n"); |
218 | | - writer.write(".error { color: orange; }\n"); |
219 | | - writer.write(".skip { color: gray; }\n"); |
220 | | - writer.write(".tag { background-color: #e7f3ff; padding: 2px 8px; "); |
221 | | - writer.write("border-radius: 3px; margin: 2px; display: inline-block; }\n"); |
222 | | - writer.write("</style>\n"); |
223 | | - writer.write("</head>\n<body>\n"); |
224 | | - writer.write("<h1>Executed Test Tag Report</h1>\n"); |
225 | | - |
226 | | - // Summary |
227 | | - writer.write("<h2>Summary</h2>\n"); |
228 | | - writer.write("<table>\n"); |
229 | | - writer.write("<tr><th>Metric</th><th>Count</th></tr>\n"); |
230 | | - writer.write("<tr><td>Total Tests</td><td>" + testTagMap.size() + "</td></tr>\n"); |
231 | | - |
232 | | - long passed = testTagMap.keySet().stream() |
233 | | - .filter(t -> !t.isFailed() && !t.isError()).count(); |
234 | | - long failed = testTagMap.keySet().stream().filter(ExecutedTest::isFailed).count(); |
235 | | - long errors = testTagMap.keySet().stream().filter(ExecutedTest::isError).count(); |
236 | | - |
237 | | - writer.write("<tr><td>Passed</td><td class='pass'>" + passed + "</td></tr>\n"); |
238 | | - writer.write("<tr><td>Failed</td><td class='fail'>" + failed + "</td></tr>\n"); |
239 | | - writer.write("<tr><td>Errors</td><td class='error'>" + errors + "</td></tr>\n"); |
240 | | - writer.write("</table>\n"); |
241 | | - |
242 | | - // Tags summary |
243 | | - Map<String, List<ExecutedTest>> tagToTests = new HashMap<>(); |
244 | | - for (Map.Entry<ExecutedTest, Set<String>> entry : testTagMap.entrySet()) { |
245 | | - for (String tag : entry.getValue()) { |
246 | | - tagToTests.computeIfAbsent(tag, k -> new ArrayList<>()).add(entry.getKey()); |
247 | | - } |
248 | | - } |
249 | | - |
250 | | - writer.write("<h2>Tags Summary</h2>\n"); |
251 | | - writer.write("<table>\n"); |
252 | | - writer.write("<tr><th>Tag</th><th>Tests</th></tr>\n"); |
253 | | - for (Map.Entry<String, List<ExecutedTest>> entry : tagToTests.entrySet()) { |
254 | | - writer.write("<tr><td>" + entry.getKey() + "</td><td>" + |
255 | | - entry.getValue().size() + "</td></tr>\n"); |
256 | | - } |
257 | | - writer.write("</table>\n"); |
258 | | - |
259 | | - // All tests |
260 | | - writer.write("<h2>All Executed Tests</h2>\n"); |
261 | | - writer.write("<table>\n"); |
262 | | - writer.write("<tr><th>Status</th><th>Test</th><th>Tags</th><th>Time</th></tr>\n"); |
263 | | - for (Map.Entry<ExecutedTest, Set<String>> entry : testTagMap.entrySet()) { |
264 | | - ExecutedTest test = entry.getKey(); |
265 | | - String statusClass = test.isFailed() ? "fail" : |
266 | | - test.isError() ? "error" : "pass"; |
267 | | - String status = getStatusIcon(test); |
268 | | - |
269 | | - writer.write("<tr>"); |
270 | | - writer.write("<td class='" + statusClass + "'>" + status + "</td>"); |
271 | | - writer.write("<td>" + test.getClassName() + "#" + test.getMethodName() + "</td>"); |
272 | | - writer.write("<td>"); |
273 | | - for (String tag : entry.getValue()) { |
274 | | - writer.write("<span class='tag'>" + tag + "</span> "); |
275 | | - } |
276 | | - writer.write("</td>"); |
277 | | - writer.write("<td>" + test.getTime() + "s</td>"); |
278 | | - writer.write("</tr>\n"); |
279 | | - } |
280 | | - writer.write("</table>\n"); |
281 | | - |
282 | | - writer.write("</body>\n</html>"); |
| 193 | + private void generateHtmlReport(ReportHelper reportHelper) throws IOException { |
| 194 | + try (OutputStream os = new FileOutputStream(outputFile)) { |
| 195 | + DocHelper.generateReport( DocConfig.TYPE_HTML, reportHelper, os ); |
283 | 196 | } |
284 | 197 | } |
285 | 198 |
|
@@ -325,18 +238,4 @@ private String getStatusIcon(ExecutedTest test) { |
325 | 238 | return "✅"; |
326 | 239 | } |
327 | 240 |
|
328 | | - private String escapeJson(String str) { |
329 | | - return str.replace("\\", "\\\\") |
330 | | - .replace("\"", "\\\"") |
331 | | - .replace("\n", "\\n"); |
332 | | - } |
333 | | - |
334 | | - private String escapeXml(String str) { |
335 | | - return str.replace("&", "&") |
336 | | - .replace("<", "<") |
337 | | - .replace(">", ">") |
338 | | - .replace("\"", """) |
339 | | - .replace("'", "'"); |
340 | | - } |
341 | | - |
342 | 241 | } |
0 commit comments