Index: test/source_report_test.dart |
diff --git a/test/source_report_test.dart b/test/source_report_test.dart |
new file mode 100644 |
index 0000000000000000000000000000000000000000..4a8e216c4a6718681a1effc08fa0de4da28a1562 |
--- /dev/null |
+++ b/test/source_report_test.dart |
@@ -0,0 +1,204 @@ |
+// Copyright (c) 2016, 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. |
+ |
+import 'package:test/test.dart'; |
+import 'package:vm_service_client/vm_service_client.dart'; |
+ |
+import 'utils.dart'; |
+ |
+const _mainContent = r""" |
+print("one"); |
+ print("two"); |
+ |
+ if (false) { |
+ print("three"); |
+ print("four"); |
+ }"""; |
+ |
+void main() { |
+ VMServiceClient client; |
+ VMIsolateRef isolate; |
+ |
+ tearDown(() { |
+ if (client != null) client.close(); |
+ }); |
+ |
+ group('a script with one range', () { |
+ setUp(() async { |
+ client = await runAndConnect(main: _mainContent); |
+ |
+ isolate = (await client.getVM()).isolates.single; |
+ |
+ await isolate.pause(); |
+ }); |
+ |
+ test("and no options", () async { |
+ var report = await isolate.getSourceReport(); |
+ |
+ expect(report.ranges, hasLength(greaterThan(1))); |
+ |
+ var range = report.ranges.singleWhere((range) => |
+ range.script.uri.toString().startsWith('data:application/dart')); |
+ |
+ expect(range.compiled, isTrue); |
+ |
+ var script = await range.script.load(); |
+ |
+ var startLocation = script.sourceLocation(range.location.token); |
+ expect(startLocation.line, 5); |
+ expect(startLocation.column, 1); |
+ |
+ var endLocation = script.sourceLocation(range.location.end); |
+ expect(endLocation.line, 15); |
+ expect(endLocation.column, 1); |
+ |
+ expect(range.hits, isNull); |
+ expect(range.misses, isNull); |
+ expect(range.possibleBreakpoints, isNull); |
+ }); |
+ |
+ test("including coverage", () async { |
+ var report = await isolate.getSourceReport(includeCoverageReport: true); |
+ |
+ var range = report.ranges.singleWhere((range) => |
+ range.script.uri.toString().startsWith('data:application/dart')); |
+ expect(range.possibleBreakpoints, isNull); |
+ |
+ var script = await range.script.load(); |
+ |
+ var hitLocations = |
+ range.hits.map((token) => script.sourceLocation(token).line); |
+ |
+ expect(hitLocations, [7, 8, 9, 15]); |
+ |
+ var missLocations = |
+ range.misses.map((token) => script.sourceLocation(token).line); |
+ |
+ expect(missLocations, [12, 13]); |
+ }); |
+ |
+ test("including possible breakpoints", () async { |
+ var report = |
+ await isolate.getSourceReport(includePossibleBreakpoints: true); |
+ |
+ var range = report.ranges.singleWhere((range) => |
+ range.script.uri.toString().startsWith('data:application/dart')); |
+ |
+ expect(range.hits, isNull); |
+ expect(range.misses, isNull); |
+ |
+ var script = await range.script.load(); |
+ |
+ expect(range.possibleBreakpoints, isNotEmpty); |
+ |
+ var breakPointLines = range.possibleBreakpoints |
+ .map((token) => script.sourceLocation(token).line); |
+ |
+ expect(breakPointLines, [5, 7, 8, 9, 12, 13, 15]); |
+ }); |
+ |
+ test("including coverage and possible breakpoints", () async { |
+ var report = await isolate.getSourceReport( |
+ includeCoverageReport: true, includePossibleBreakpoints: true); |
+ |
+ var range = report.ranges.singleWhere((range) => |
+ range.script.uri.toString().startsWith('data:application/dart')); |
+ |
+ expect(range.hits, isNotEmpty); |
+ expect(range.misses, isNotEmpty); |
+ expect(range.possibleBreakpoints, isNotEmpty); |
+ }); |
+ }); |
+ |
+ group('a script with multiple ranges', () { |
+ VMScript script; |
+ int mainFunctionTokenOffset; |
+ VMLibrary rootLib; |
+ |
+ setUp(() async { |
+ client = await runAndConnect( |
+ topLevel: r'''final unusedField = 5; |
+ |
+int unusedFunction(a, b) { |
+ return a + b; |
+}''', |
+ main: _mainContent); |
+ |
+ isolate = (await client.getVM()).isolates.single; |
+ |
+ await isolate.pause(); |
+ |
+ var runnableIsolate = await isolate.loadRunnable(); |
+ rootLib = await runnableIsolate.rootLibrary.load(); |
+ |
+ var mainFunc = await rootLib.functions['main'].load(); |
+ |
+ mainFunctionTokenOffset = mainFunc.location.token.offset; |
+ |
+ script = await rootLib.scripts.single.load(); |
+ }); |
+ |
+ test("not foce compiled", () async { |
+ var report = await script.getSourceReport( |
+ includeCoverageReport: true, includePossibleBreakpoints: true); |
+ |
+ expect(report.ranges, hasLength(2)); |
+ |
+ var firstRange = report.ranges.first; |
+ expect(firstRange.compiled, isFalse); |
+ expect(firstRange.location.end.offset, lessThan(mainFunctionTokenOffset)); |
+ |
+ var secondRange = report.ranges.last; |
+ expect(secondRange.compiled, isTrue); |
+ expect(secondRange.location.token.offset, mainFunctionTokenOffset); |
+ }); |
+ |
+ test("foce compiled", () async { |
+ var report = await script.getSourceReport( |
+ includeCoverageReport: true, |
+ includePossibleBreakpoints: true, |
+ forceCompile: true); |
+ |
+ expect(report.ranges, hasLength(2)); |
+ |
+ var firstRange = report.ranges.first; |
+ expect(firstRange.compiled, isTrue); |
+ |
+ var secondRange = report.ranges.last; |
+ expect(secondRange.compiled, isTrue); |
+ }); |
+ |
+ test("with tokenPos set", () async { |
+ var report = await script.getSourceReport( |
+ includeCoverageReport: true, |
+ includePossibleBreakpoints: true, |
+ tokenPos: mainFunctionTokenOffset); |
+ |
+ expect( |
+ report.ranges.single.location.token.offset, mainFunctionTokenOffset); |
+ }); |
+ |
+ test("with endTokenPos set", () async { |
+ var report = await script.getSourceReport( |
+ includeCoverageReport: true, |
+ includePossibleBreakpoints: true, |
+ endTokenPos: mainFunctionTokenOffset - 1); |
+ |
+ expect(report.ranges.single.location.end.offset, |
+ lessThan(mainFunctionTokenOffset)); |
+ }); |
+ |
+ test("with an empty token range", () async { |
+ var unusedFunction = await rootLib.functions['unusedFunction'].load(); |
+ |
+ var report = await script.getSourceReport( |
+ includeCoverageReport: true, |
+ includePossibleBreakpoints: true, |
+ tokenPos: unusedFunction.location.end.offset + 1, |
+ endTokenPos: mainFunctionTokenOffset - 1); |
+ |
+ expect(report.ranges, isEmpty); |
+ }); |
+ }); |
+} |