Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(107)

Unified Diff: runtime/bin/vmservice/client/lib/src/observatory/model.dart

Issue 143973005: Code coverage in Observatory (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: Created 6 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: runtime/bin/vmservice/client/lib/src/observatory/model.dart
diff --git a/runtime/bin/vmservice/client/lib/src/observatory/model.dart b/runtime/bin/vmservice/client/lib/src/observatory/model.dart
index 418957c1adfce0886a164997271565c8f2c911c8..7aa6658ef4ee37e7854d47443084cf6cb7445a8c 100644
--- a/runtime/bin/vmservice/client/lib/src/observatory/model.dart
+++ b/runtime/bin/vmservice/client/lib/src/observatory/model.dart
@@ -244,3 +244,94 @@ class Profile {
return inclusive.sublist(0, count);
}
}
+
+class ScriptLine extends Observable {
+ @observable final int line;
+ @observable int hits = -1;
+ @observable String text = '';
+ /// Do we have coverage data for this line?
+ bool get coverage => hits >= 0;
+ /// Has this line executed before?
+ bool get covered => hits > 0;
turnidge 2014/01/21 23:34:40 the names "coverage" and "covered" are a bit simil
Cutch 2014/01/22 00:50:37 Agreed. I've gone with "executable" and "covered".
+ ScriptLine(this.line);
+}
+
+class Script extends Observable {
+ @observable String kind = null;
+ @observable Map scriptRef = toObservable({});
+ @observable Map libraryRef = toObservable({});
+ @observable final List<ScriptLine> lines =
+ toObservable(new List<ScriptLine>());
+ bool _needsSource = true;
+ bool get needsSource => _needsSource;
+ Script.fromMap(Map map) {
+ scriptRef = toObservable({
+ 'id': map['id'],
+ 'name': map['name'],
+ 'user_name': map['user_name']
+ });
+ libraryRef = toObservable(map['library']);
+ kind = map['kind'];
+ _processSource(map['source']);
+ }
+
+ // Fetch (possibly create) the ScriptLine for [lineNumber].
+ ScriptLine _getLine(int lineNumber) {
+ assert(lineNumber != 0);
+ if (lineNumber >= lines.length) {
+ // Grow lines list.
+ lines.length = lineNumber + 1;
+ }
+ var line = lines[lineNumber];
+ if (line == null) {
+ // Create this line.
+ line = new ScriptLine(lineNumber);
+ lines[lineNumber] = line;
+ }
+ return line;
+ }
+
+ void _processSource(String source) {
+ if (source == null) {
+ return;
+ }
+ Logger.root.info('Loading source for ${scriptRef['name']}');
+ var sourceLines = source.split('\n');
+ _needsSource = sourceLines.length == 0;
+ for (var i = 0; i < sourceLines.length; i++) {
+ var line = _getLine(i + 1);
+ line.text = sourceLines[i];
+ }
+ }
+
+ void _processCoverageHits(List hits) {
+ for (var i = 0; i < hits.length; i += 2) {
+ var line = _getLine(hits[i]);
+ line.hits = hits[i + 1];
+ }
+ notifyPropertyChange(#coveredPercentage, 0.0, coveredPercentage());
+ }
+
+ /// What percentage of lines in this script have been covered?
+ double coveredPercentage() {
+ int coveredLines = 0;
+ int coverageLines = 0;
+ for (var line in lines) {
+ if (line == null) {
+ continue;
+ }
+ if (!line.coverage) {
+ continue;
+ }
+ coverageLines++;
+ if (!line.covered) {
+ continue;
+ }
+ coveredLines++;
+ }
+ if (coverageLines == 0) {
+ return 0.0;
+ }
+ return (coveredLines / coverageLines) * 100.0;
+ }
+}

Powered by Google App Engine
This is Rietveld 408576698