diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/App.css | 65 | ||||
-rw-r--r-- | src/App.js | 121 | ||||
-rw-r--r-- | src/Blocks.js | 99 | ||||
-rw-r--r-- | src/logo.svg | 7 |
4 files changed, 248 insertions, 44 deletions
diff --git a/src/App.css b/src/App.css index 92f956e..d0870a2 100644 --- a/src/App.css +++ b/src/App.css | |||
@@ -1,32 +1,53 @@ | |||
1 | /* | ||
2 | * JaCoCo Report Viewer, a web-based coverage report viewer | ||
3 | * Copyright (C) 2018 Pacien TRAN-GIRARD | ||
4 | * Adam NAILI | ||
5 | * | ||
6 | * This program is free software: you can redistribute it and/or modify | ||
7 | * it under the terms of the GNU General Public License as published by | ||
8 | * the Free Software Foundation, either version 3 of the License, or | ||
9 | * (at your option) any later version. | ||
10 | * | ||
11 | * This program is distributed in the hope that it will be useful, | ||
12 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
13 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
14 | * GNU General Public License for more details. | ||
15 | * | ||
16 | * You should have received a copy of the GNU General Public License | ||
17 | * along with this program. If not, see <https://www.gnu.org/licenses/>. | ||
18 | */ | ||
19 | |||
1 | .App { | 20 | .App { |
2 | text-align: center; | 21 | margin: 1rem; |
22 | } | ||
23 | |||
24 | .App label { | ||
25 | display: inline-block; | ||
26 | width: 6rem; | ||
27 | } | ||
28 | |||
29 | .App ul { | ||
30 | padding-left: 1.75rem; | ||
31 | } | ||
32 | |||
33 | .App ul[inline-list="true"] { | ||
34 | display: inline; | ||
35 | padding-left: 0.75rem; | ||
3 | } | 36 | } |
4 | 37 | ||
5 | .App-logo { | 38 | .App ul[inline-list="true"] li { |
6 | animation: App-logo-spin infinite 20s linear; | 39 | display: inline; |
7 | height: 40vmin; | 40 | list-style: none; |
8 | } | 41 | } |
9 | 42 | ||
10 | .App-header { | 43 | .App ul[inline-list="true"] li:not(:first-child) { |
11 | background-color: #282c34; | 44 | padding-left: 0.75rem; |
12 | min-height: 100vh; | ||
13 | display: flex; | ||
14 | flex-direction: column; | ||
15 | align-items: center; | ||
16 | justify-content: center; | ||
17 | font-size: calc(10px + 2vmin); | ||
18 | color: white; | ||
19 | } | 45 | } |
20 | 46 | ||
21 | .App-link { | 47 | .App li[well-covered="true"] { |
22 | color: #61dafb; | 48 | color: green; |
23 | } | 49 | } |
24 | 50 | ||
25 | @keyframes App-logo-spin { | 51 | .App li[well-covered="false"] { |
26 | from { | 52 | color: red; |
27 | transform: rotate(0deg); | ||
28 | } | ||
29 | to { | ||
30 | transform: rotate(360deg); | ||
31 | } | ||
32 | } | 53 | } |
@@ -1,28 +1,119 @@ | |||
1 | /* | ||
2 | * JaCoCo Report Viewer, a web-based coverage report viewer | ||
3 | * Copyright (C) 2018 Pacien TRAN-GIRARD | ||
4 | * Adam NAILI | ||
5 | * | ||
6 | * This program is free software: you can redistribute it and/or modify | ||
7 | * it under the terms of the GNU General Public License as published by | ||
8 | * the Free Software Foundation, either version 3 of the License, or | ||
9 | * (at your option) any later version. | ||
10 | * | ||
11 | * This program is distributed in the hope that it will be useful, | ||
12 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
13 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
14 | * GNU General Public License for more details. | ||
15 | * | ||
16 | * You should have received a copy of the GNU General Public License | ||
17 | * along with this program. If not, see <https://www.gnu.org/licenses/>. | ||
18 | */ | ||
19 | |||
1 | import React, { Component } from 'react'; | 20 | import React, { Component } from 'react'; |
2 | import logo from './logo.svg'; | 21 | import {Parser} from 'xml2js'; |
22 | |||
23 | import {Counters, SessionInfo, PackagesCoverage} from './Blocks.js'; | ||
3 | import './App.css'; | 24 | import './App.css'; |
4 | 25 | ||
5 | class App extends Component { | 26 | class App extends Component { |
27 | constructor(props) { | ||
28 | super(props); | ||
29 | this.state = { | ||
30 | report: null, | ||
31 | hasError: false | ||
32 | }; | ||
33 | } | ||
34 | |||
35 | componentDidCatch(error, info) { | ||
36 | this.setState({ hasError: true }); | ||
37 | console.err(error, info); | ||
38 | } | ||
39 | |||
40 | _useReportFile(file) { | ||
41 | const fileReader = new FileReader(); | ||
42 | fileReader.onloadend = (readEvent) => this._useReport(readEvent.target.result); | ||
43 | fileReader.readAsText(file); | ||
44 | } | ||
45 | |||
46 | _useReport(xmlString) { | ||
47 | const xmlParser = new Parser(); | ||
48 | xmlParser.parseString(xmlString, (err, result) => this.setState({ report: result.report })); | ||
49 | } | ||
50 | |||
51 | _renderError() { | ||
52 | return ( | ||
53 | <span> | ||
54 | Something went wrong while rendering the report. | ||
55 | Are the provided files valid? | ||
56 | </span> | ||
57 | ); | ||
58 | } | ||
59 | |||
60 | _renderReport() { | ||
61 | return this.state.hasError ? this._renderError(): (<Report report={this.state.report} />); | ||
62 | } | ||
63 | |||
6 | render() { | 64 | render() { |
7 | return ( | 65 | return ( |
8 | <div className="App"> | 66 | <div className="App"> |
9 | <header className="App-header"> | 67 | <h1>JaCoCo Report Viewer</h1> |
10 | <img src={logo} className="App-logo" alt="logo" /> | 68 | |
11 | <p> | 69 | <div> |
12 | Edit <code>src/App.js</code> and save to reload. | 70 | <label htmlFor="reportFile">XML report: </label> |
13 | </p> | 71 | <input id="reportFile" type="file" accept=".xml" onChange={event => this._useReportFile(event.target.files[0])} /> |
14 | <a | 72 | </div> |
15 | className="App-link" | 73 | |
16 | href="https://reactjs.org" | 74 | <div> |
17 | target="_blank" | 75 | <label htmlFor="sourceJar">Source JAR: </label> |
18 | rel="noopener noreferrer" | 76 | <input id="sourceJar" type="file" accept=".jar" onChange={event => null} /> |
19 | > | 77 | </div> |
20 | Learn React | 78 | |
21 | </a> | 79 | <hr /> |
22 | </header> | 80 | {this._renderReport()} |
81 | </div> | ||
82 | ); | ||
83 | } | ||
84 | } | ||
85 | |||
86 | class Report extends Component { | ||
87 | _renderNone() { | ||
88 | return (<span>Please provide a JaCoCo XML report file to visualise.</span>); | ||
89 | } | ||
90 | |||
91 | _renderReport() { | ||
92 | return ( | ||
93 | <div> | ||
94 | <h2>Viewing report: "{this.props.report.$.name}"</h2> | ||
95 | |||
96 | <section> | ||
97 | <h3>Session info</h3> | ||
98 | <SessionInfo data={this.props.report.sessioninfo} /> | ||
99 | </section> | ||
100 | |||
101 | <section> | ||
102 | <h3>Global coverage</h3> | ||
103 | <Counters data={this.props.report.counter} /> | ||
104 | </section> | ||
105 | |||
106 | <section> | ||
107 | <h3>Details</h3> | ||
108 | <PackagesCoverage packages={this.props.report.package} /> | ||
109 | </section> | ||
23 | </div> | 110 | </div> |
24 | ); | 111 | ); |
25 | } | 112 | } |
113 | |||
114 | render() { | ||
115 | return this.props.report ? this._renderReport() : this._renderNone(); | ||
116 | } | ||
26 | } | 117 | } |
27 | 118 | ||
28 | export default App; | 119 | export default App; |
diff --git a/src/Blocks.js b/src/Blocks.js new file mode 100644 index 0000000..48e0376 --- /dev/null +++ b/src/Blocks.js | |||
@@ -0,0 +1,99 @@ | |||
1 | /* | ||
2 | * JaCoCo Report Viewer, a web-based coverage report viewer | ||
3 | * Copyright (C) 2018 Pacien TRAN-GIRARD | ||
4 | * Adam NAILI | ||
5 | * | ||
6 | * This program is free software: you can redistribute it and/or modify | ||
7 | * it under the terms of the GNU General Public License as published by | ||
8 | * the Free Software Foundation, either version 3 of the License, or | ||
9 | * (at your option) any later version. | ||
10 | * | ||
11 | * This program is distributed in the hope that it will be useful, | ||
12 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
13 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
14 | * GNU General Public License for more details. | ||
15 | * | ||
16 | * You should have received a copy of the GNU General Public License | ||
17 | * along with this program. If not, see <https://www.gnu.org/licenses/>. | ||
18 | */ | ||
19 | |||
20 | import React, { Component } from 'react'; | ||
21 | |||
22 | function renderRows(renderRowFunc, rows, inline) { | ||
23 | const renderedRows = rows ? rows.map(renderRowFunc) : (<li>None.</li>); | ||
24 | return (<ul inline-list={inline.toString()}>{renderedRows}</ul>); | ||
25 | } | ||
26 | |||
27 | export class SessionInfo extends Component { | ||
28 | _renderRow(row) { | ||
29 | const date = new Date(parseInt(row.start)); | ||
30 | return (<li key={row.id}>{row.id}: {date.toISOString()} ({row.dump - row.start} ms)</li>); | ||
31 | } | ||
32 | |||
33 | render() { | ||
34 | return renderRows(row => this._renderRow(row.$), this.props.data, false); | ||
35 | } | ||
36 | } | ||
37 | |||
38 | export class Counters extends Component { | ||
39 | _renderRow(row) { | ||
40 | const covered = parseInt(row.covered); | ||
41 | const totalCount = covered + parseInt(row.missed); | ||
42 | const wellC |