/*
* JaCoCo Report Viewer, a web-based coverage report viewer
* Copyright (C) 2018 Pacien TRAN-GIRARD
* Adam NAILI
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as
* published by the Free Software Foundation, either version 3 of the
* License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see .
*/
import React, { Component } from 'react';
export class CoverageListing extends Component {
constructor(props) {
super(props);
this.state = {
listingContent: null,
coverageMap: null
};
}
componentDidMount() {
this._updateState();
}
componentDidUpdate(prevProps) {
if (this.props.fileName === prevProps.fileName &&
this.props.sourceSet === prevProps.sourceSet &&
this.props.coverage === prevProps.coverage) return;
this._updateState();
}
_updateState() {
if (!this.props.sourceSet || !(this.props.fileName in this.props.sourceSet)) {
this.setState({ listingContent: null });
return;
}
this._updateListingContent();
this._updateCoverageMap();
}
_updateCoverageMap() {
const coverageMap = this.props.coverage.reduce(function(map, line) {
map[parseInt(line.$.nr)] = line.$;
return map;
}, {});
this.setState({ coverageMap: coverageMap });
}
_updateListingContent() {
this.props.sourceSet[this.props.fileName]
.async('text')
.then(content => this.setState({ listingContent: content }));
}
_lineCoverageString(coverage) {
const instructionCount = parseInt(coverage.ci) + parseInt(coverage.mi);
const branchCount = parseInt(coverage.cb) + parseInt(coverage.mb);
return coverage.ci + '/' + instructionCount + ' instructions covered, ' +
coverage.cb + '/' + branchCount + ' branches covered';
}
_renderNone() {
return (
No source file provided.
);
}
_nonEmptyString(str) {
return str ? str : ' '; // workaround for empty collapsing
}
_renderLine(lineContent, lineNumber) {
if (!(lineNumber in this.state.coverageMap))
return (
{lineContent}
);
const coverage = this.state.coverageMap[lineNumber];
const wellCovered = parseInt(coverage.mi) === 0 && parseInt(coverage.mb) === 0;
return (
{lineContent}
);
}
_renderListing() {
const lines = this.state.listingContent
.split('\n')
.map(this._nonEmptyString)
.map((line, index) => this._renderLine(line, index + 1));
return ();
}
render() {
return this.state.listingContent ? this._renderListing() : this._renderNone();
}
}