Index: client/tools/show_coverage.js |
=================================================================== |
--- client/tools/show_coverage.js (revision 5923) |
+++ client/tools/show_coverage.js (working copy) |
@@ -1,259 +0,0 @@ |
-// Copyright (c) 2011, the Dart project authors. Please see the AUTHORS file |
-// for details. All rights reserved. Use of this source code is governed by a |
-// BSD-style license that can be found in the LICENSE file. |
- |
-/** |
- * A simple application that renders coverage results in a page. It sorts data |
- * by file name, shows a summary table including coverage statistics per |
- * package, and implements the necessary behaviour to select a file and view |
- * line-by-line coverage information. |
- */ |
- |
-var files_; |
-var code_; |
-var summary_; |
-var selectedDiv_; |
-var file_percent_ = {}; |
-var package_lines_ = {}; |
-var package_covered_ = {}; |
-var package_rec_lines_ = {}; |
-var package_rec_covered_ = {}; |
- |
-// handle a click event anywhere on the screen |
-function clickListener(e) { |
- var elem = e.target; |
- // determine if a file or a close link was clicked on: |
- while (elem != null) { |
- if (elem.classList) { |
- if (elem.classList.contains("file")) { |
- fileSelected(elem); |
- return; |
- } else if (elem.classList.contains("close")) { |
- closeDetails(); |
- } |
- } |
- elem = elem.parentNode; |
- } |
-} |
- |
-// handle when a row in the list of files is selected |
-function fileSelected(elem) { |
- if (selectedDiv_ != null) { |
- selectedDiv_.classList.remove("file-selected"); |
- } |
- if (selectedDiv_ == elem) { |
- closeDetails(); |
- return; |
- } |
- selectedDiv_ = elem; |
- elem.classList.add("file-selected"); |
- var file = elem.getAttribute("data-field"); |
- var code_with_coverage = ""; |
- var lines = code_[file]; |
- var coverage = summary_[file]; |
- for (var lineNum = 0; lineNum < lines.length; lineNum++) { |
- var covered = coverage[lineNum] == 1; |
- var currentLine = lines[lineNum]. |
- replace(/</g, "<"). |
- replace(/>/g, ">"). |
- replace(/\n/g, "\\n"); |
- var iscode = coverage[lineNum] == 0 || coverage[lineNum] == 1; |
- code_with_coverage += |
- "<span class='linenum'><span class='" + |
- (covered && iscode ? "yes" : (iscode ? "no" : "")) + "'>" + |
- (lineNum + 1)+ "</span>" + |
- "<span>" + currentLine + "</span>" + |
- "</div>"; |
- } |
- |
- var detailsDiv = document.getElementById("details-body"); |
- detailsDiv.innerHTML = code_with_coverage; |
- var outerDiv = detailsDiv.parentNode; |
- outerDiv.classList.remove("hidden"); |
-} |
- |
-// closes the detail view that displays line-by-line coverage info |
-function closeDetails() { |
- if (selectedDiv_ != null) { |
- selectedDiv_.classList.remove("file-selected"); |
- selectedDiv_ = null; |
- } |
- var detailsDiv = document.getElementById("details-body"); |
- detailsDiv.parentNode.classList.add("hidden"); |
-} |
- |
-// generates an HTML string segment for a coverage-bar |
-function generatePercentBar(percent) { |
- return "<span class='coverage-bar'>" + |
- "<span class='coverage-bar-inner' style='width:" + percent + "px'>" + |
- "</span></span>"; |
-} |
- |
-// extracts the top-level directory from a path |
-function getRootDir(path) { |
- if (path == null) { |
- return null; |
- } |
- var index = path.indexOf("/"); |
- return index == -1 ? null : path.substring(0, index); |
-} |
- |
-// extracts the directory portion of a path |
-function getDirName(path) { |
- if (path == null) { |
- return null; |
- } |
- var index = path.lastIndexOf("/"); |
- return index == -1 ? null : path.substring(0, index); |
-} |
- |
-// extracts the file name portion of a path |
-function getFileName(path) { |
- if (path == null) { |
- return null; |
- } |
- var index = path.lastIndexOf("/"); |
- return index == -1 ? path : path.substring(index + 1); |
-} |
- |
-// generates an HTML string segment with the summary stats for a package which |
-// doesn't include sub-packages statistics. |
-function generatePackageLine(pkg) { |
- var percent = ((package_covered_[pkg] * 100) / package_lines_[pkg]). |
- toFixed(1); |
- return "<tr class='package'><td colspan='2' class='package'>" + |
- pkg + |
- "<td class='file-percent'>" + percent + "%</td>" + |
- "<td class='file-percent'>" + generatePercentBar(percent) + |
- "</td> </tr>"; |
-} |
- |
-// generates an HTML string segment with the summary stats for a package which |
-// includes sub-packages statistics |
-function generatePackageLineRec(pkg) { |
- var percent = ((package_rec_covered_[pkg] * 100) / |
- package_rec_lines_[pkg]).toFixed(1); |
- return "<tr class='package'><td colspan='2' class='package'>" + |
- pkg + " (with subpackages)" + |
- "<td class='file-percent'>" + percent + "%</td>" + |
- "<td class='file-percent'>" + generatePercentBar(percent) + |
- "</td> </tr>"; |
-} |
- |
-// generates an hTML string segment with the summary stats for a single file |
-function generateFileLine(file) { |
- var filename = getFileName(file); |
- var percent = file_percent_[file].toFixed(1) |
- return "<tr class='file' data-field='" + file + "'>" + |
- "<td></td>" + |
- "<td class='file-name'>" + |
- filename + |
- "</td>" + |
- "<td class='file-percent'>" + percent + "%</td>" + |
- "<td class='file-percent'>" + generatePercentBar(percent) + |
- "</td>" + |
- "</tr>"; |
-} |
- |
-// Updates coverage information in a package given the coverage data from a file |
-// that is directly on that package or on some sub-package |
-function recordPackageLinesRec(pkg, totalcode, covered) { |
- if (package_rec_lines_[pkg] == null) { |
- package_rec_lines_[pkg] = totalcode; |
- package_rec_covered_[pkg] = covered; |
- } else { |
- package_rec_lines_[pkg] += totalcode; |
- package_rec_covered_[pkg] += covered; |
- } |
-} |
- |
-// Updates coverage information in a package given the coverage data from a file |
-// directly on that package |
-function recordPackageLines(pkg, totalcode, covered) { |
- if (package_lines_[pkg] == null) { |
- package_lines_[pkg] = totalcode; |
- package_covered_[pkg] = covered; |
- } else { |
- package_lines_[pkg] += totalcode; |
- package_covered_[pkg] += covered; |
- } |
-} |
- |
-var EMPTY_ROW = "<tr><td> </td></tr>"; |
- |
-// renders the page with a list of files and an area to display more details. |
-function render(files, code, summary) { |
- files.sort() |
- files_ = files; |
- code_ = code; |
- summary_ = summary; |
- var buffer = ""; |
- var last_pkg = null; |
- |
- // compute percent for files and packages. Tally information per package, by |
- // tracking total lines covered on any file in the package |
- |
- for (var i = 0; i < files.length; i++) { |
- var file = files[i]; |
- var coverage = summary[file]; |
- var covered = 0; |
- var totalcode = 0; |
- for (var j = 0; j < coverage.length; j++) { |
- if (coverage[j] == 1 || coverage[j] == 0) { |
- totalcode += 1; |
- } |
- if (coverage[j] == 1) { |
- covered += 1; |
- } |
- } |
- file_percent_[file] = (covered * 100) / totalcode; |
- var pkg = getDirName(file); |
- |
- // summary for this package alone |
- recordPackageLines(pkg, totalcode, covered); |
- |
- // summary for each package including subpackages |
- while (pkg != null) { |
- recordPackageLinesRec(pkg, totalcode, covered); |
- pkg = getDirName(pkg) |
- } |
- recordPackageLinesRec("** everything **", totalcode, covered); |
- } |
- |
- // create UI for the results... |
- buffer += generatePackageLineRec("** everything **"); |
- for (var i = 0; i < files.length; i++) { |
- var file = files[i]; |
- |
- var pkg = getDirName(file) |
- if (pkg != last_pkg) { |
- var prefix = getRootDir(last_pkg); |
- var rec_summary = ""; |
- if (pkg.indexOf(prefix) != 0) { |
- var current = getDirName(pkg); |
- while (current != null) { |
- rec_summary = EMPTY_ROW + generatePackageLineRec(current) + |
- rec_summary; |
- current = getDirName(current); |
- } |
- } |
- buffer += rec_summary + EMPTY_ROW + generatePackageLineRec(pkg); |
- last_pkg = pkg; |
- } |
- buffer += generateFileLine(file); |
- } |
- |
- var menu = "<div class='menu'><table class='menu-table'><tbody>" + |
- buffer + "</tbody></table></div>" |
- |
- // single file details |
- var details = "<div class='details hidden'><div class='close'>X Close</div>" + |
- "<div id='details-body' class='details-body'></div></div>"; |
- |
- var div = document.createElement("div"); |
- div.innerHTML = "<div class='all'>" + |
- "<div>Select a file to display its details:</div> " |
- + menu + details + "</div>"; |
- document.body.appendChild(div); |
- document.body.addEventListener("click", clickListener, true); |
-} |