1+ import groovy.xml.DOMBuilder
2+ import groovy.xml.dom.DOMCategory
3+ import org.gradle.api.DefaultTask
4+ import org.gradle.api.file.DirectoryProperty
5+ import org.gradle.api.file.RegularFileProperty
6+ import org.gradle.api.tasks.InputDirectory
7+ import org.gradle.api.tasks.OutputFile
8+ import org.gradle.api.tasks.TaskAction
9+
10+ abstract class AggregateTest extends DefaultTask {
11+ @InputDirectory
12+ abstract DirectoryProperty getInput ()
13+
14+ @OutputFile
15+ abstract RegularFileProperty getOutput ()
16+
17+ @TaskAction
18+ void exec () throws IOException {
19+ final javas = [:] as TreeMap
20+ final results = [:] as TreeMap
21+
22+ for (def java : input. asFile. get(). listFiles()) {
23+ for (def test : java. listFiles()) {
24+ if (! test. name. startsWith(' TEST-' ) || ! test. name. endsWith(' .xml' ))
25+ continue
26+
27+ def dirName = test. parentFile. name
28+ def (javaName, javaVersion) = dirName. split(' -' )
29+ javas. computeIfAbsent(javaName, { [] as SortedSet }). add(javaVersion)
30+
31+ def data = DOMBuilder . parse(new StringReader (test. text)). documentElement
32+ use(DOMCategory ) {
33+ def suite = data[' @name' ]
34+ suite = suite. substring(suite. lastIndexOf(' .' ) + 1 )
35+ def byTest = results. computeIfAbsent(suite, { [:] })
36+ for (def testcase : data. testcase) {
37+ def name = testcase[' @name' ]
38+ if (name. startsWith(' repetition ' ))
39+ continue
40+ def byJava = byTest. computeIfAbsent(name, { [:] })
41+ def byVersion = byJava. computeIfAbsent(javaName, { [:] })
42+ byVersion. put(javaVersion, testcase. failure. isEmpty())
43+ }
44+ }
45+ test. delete()
46+ }
47+ if (java. listFiles(). length == 0 )
48+ java. deleteDir()
49+ }
50+
51+ def buffer = new StringBuilder ()
52+ buffer. append("""
53+ <html>
54+ <style>
55+ .tooltip-text {
56+ visibility: hidden;
57+ position: absolute;
58+ z-index: 1;
59+ width: 100px;
60+ color: white;
61+ font-size: 12px;
62+ background-color: #192733;
63+ border-radius: 10px;
64+ padding: 10px 15px 10px 15px;
65+ top: -40px;
66+ left: -50%;
67+ }
68+
69+ .hover-text:hover .tooltip-text {
70+ visibility: visible;
71+ }
72+
73+ .success {
74+ background-color: #008000;
75+ }
76+
77+ .failure {
78+ background-color: #b60808;
79+ }
80+
81+ .hover-text {
82+ font-size: 16px;
83+ position: relative;
84+ display: inline;
85+ font-family: monospace;
86+ text-align: center;
87+ }
88+
89+ table, th, td {
90+ border: 1px solid black;
91+ border-collapse: collapse;
92+ }
93+
94+ th, td {
95+ padding-left: 3px;
96+ padding-right: 3px;
97+ }
98+
99+ .result {
100+ font-size: 0px;
101+ }
102+ </style>
103+ <body>
104+ """ )
105+ results. forEach{ suite , byTest ->
106+ buffer << " <h1>${ suite} </h1>\n "
107+ buffer << " <table>\n "
108+ buffer << " <thead>\n "
109+ buffer << " <th>Test</th>\n "
110+ javas. keySet(). forEach{ javaName ->
111+ buffer << " <th>${ javaName} </th>\n "
112+ }
113+ buffer << " </thead>\n "
114+ buffer << " <tbody>\n "
115+ byTest. forEach{ testName , byJava ->
116+ buffer << " <tr>\n "
117+ buffer << " <td>${ testName} </td>\n "
118+ javas. forEach{ javaName , versions ->
119+ buffer << " <td class=\" result\" >\n "
120+ def byVersion = byJava. get(javaName)
121+ versions. forEach { ver ->
122+ if (byVersion. containsKey(ver) && byVersion. get(ver)) {
123+ buffer << " <span class=\" hover-text success\" >O<span class=\" tooltip-text success\" id=\" failure\" >${ javaName} v${ ver} </span></span>\n "
124+ } else {
125+ buffer << " <span class=\" hover-text failure\" >X<span class=\" tooltip-text failure\" >${ javaName} v${ ver} </span></span>\n "
126+ }
127+ }
128+ buffer << " </td>\n "
129+ }
130+ buffer << " </tr>\n "
131+ }
132+ buffer << " </tbody>\n "
133+ buffer << " </table>\n "
134+
135+ }
136+ buffer << " </body></html>"
137+
138+ output. asFile. get(). text = buffer
139+ }
140+ }
0 commit comments