0039aff1e3
Change-Id: I5b74a4265b25051acfbb35ae9721160b03988121 Reviewed-on: https://dart-review.googlesource.com/c/78708 Reviewed-by: Siva Annamalai <asiva@google.com> Commit-Queue: Ryan Macnak <rmacnak@google.com>
153 lines
4.5 KiB
Dart
153 lines
4.5 KiB
Dart
// Copyright (c) 2015, 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:observatory/service_io.dart';
|
|
import 'package:observatory/debugger.dart';
|
|
import 'package:unittest/unittest.dart';
|
|
import 'service_test_common.dart';
|
|
import 'test_helper.dart';
|
|
import 'dart:async';
|
|
import 'dart:developer';
|
|
|
|
const int LINE_A = 21;
|
|
const int LINE_B = 111;
|
|
const int LINE_C = 11;
|
|
|
|
void testFunction() {
|
|
int i = 0;
|
|
while (i == 0) {
|
|
debugger();
|
|
print('loop'); // Line A.
|
|
print('loop');
|
|
}
|
|
}
|
|
|
|
class TestDebugger extends Debugger {
|
|
TestDebugger(this.isolate, this.stack);
|
|
|
|
VM get vm => isolate.vm;
|
|
Isolate isolate;
|
|
ServiceMap stack;
|
|
int currentFrame = 0;
|
|
}
|
|
|
|
void debugger_location_dummy_function() {}
|
|
|
|
class DebuggerLocationTestFoo {
|
|
DebuggerLocationTestFoo(this.field);
|
|
DebuggerLocationTestFoo.named();
|
|
|
|
void method() {}
|
|
void madness() {}
|
|
|
|
int field;
|
|
}
|
|
|
|
class DebuggerLocationTestBar {}
|
|
|
|
Future<Debugger> initDebugger(Isolate isolate) {
|
|
return isolate.getStack().then((stack) {
|
|
return new TestDebugger(isolate, stack);
|
|
});
|
|
}
|
|
|
|
var tests = <IsolateTest>[
|
|
hasStoppedAtBreakpoint,
|
|
|
|
// Parse '' => current position
|
|
(Isolate isolate) async {
|
|
var debugger = await initDebugger(isolate);
|
|
var loc = await DebuggerLocation.parse(debugger, '');
|
|
expect(loc.valid, isTrue);
|
|
expect(loc.toString(), equals('debugger_location_test.dart:$LINE_A:5'));
|
|
},
|
|
|
|
// Parse line
|
|
(Isolate isolate) async {
|
|
var debugger = await initDebugger(isolate);
|
|
var loc = await DebuggerLocation.parse(debugger, '18');
|
|
expect(loc.valid, isTrue);
|
|
expect(loc.toString(), equals('debugger_location_test.dart:18'));
|
|
},
|
|
|
|
// Parse line + col
|
|
(Isolate isolate) async {
|
|
var debugger = await initDebugger(isolate);
|
|
var loc = await DebuggerLocation.parse(debugger, '16:11');
|
|
expect(loc.valid, isTrue);
|
|
expect(loc.toString(), equals('debugger_location_test.dart:16:11'));
|
|
},
|
|
|
|
// Parse script + line
|
|
(Isolate isolate) async {
|
|
var debugger = await initDebugger(isolate);
|
|
var loc = await DebuggerLocation.parse(debugger, 'unittest.dart:15');
|
|
expect(loc.valid, isTrue);
|
|
expect(loc.toString(), equals('unittest.dart:15'));
|
|
},
|
|
|
|
// Parse script + line + col
|
|
(Isolate isolate) async {
|
|
var debugger = await initDebugger(isolate);
|
|
var loc = await DebuggerLocation.parse(debugger, 'unittest.dart:15:10');
|
|
expect(loc.valid, isTrue);
|
|
expect(loc.toString(), equals('unittest.dart:15:10'));
|
|
},
|
|
|
|
// Parse bad script
|
|
(Isolate isolate) async {
|
|
var debugger = await initDebugger(isolate);
|
|
var loc = await DebuggerLocation.parse(debugger, 'bad.dart:15');
|
|
expect(loc.valid, isFalse);
|
|
expect(loc.toString(),
|
|
equals('invalid source location (Script \'bad.dart\' not found)'));
|
|
},
|
|
|
|
// Parse function
|
|
(Isolate isolate) async {
|
|
var debugger = await initDebugger(isolate);
|
|
var loc = await DebuggerLocation.parse(debugger, 'testFunction');
|
|
expect(loc.valid, isTrue);
|
|
expect(loc.toString(), equals('testFunction'));
|
|
},
|
|
|
|
// Parse bad function
|
|
(Isolate isolate) async {
|
|
var debugger = await initDebugger(isolate);
|
|
var loc = await DebuggerLocation.parse(debugger, 'doesNotReallyExist');
|
|
expect(loc.valid, isFalse);
|
|
expect(
|
|
loc.toString(),
|
|
equals(
|
|
'invalid source location (Function \'doesNotReallyExist\' not found)'));
|
|
},
|
|
|
|
// Parse constructor
|
|
(Isolate isolate) async {
|
|
var debugger = await initDebugger(isolate);
|
|
var loc = await DebuggerLocation.parse(debugger, 'DebuggerLocationTestFoo');
|
|
expect(loc.valid, isTrue);
|
|
// TODO(turnidge): Printing a constructor currently adds
|
|
// another class qualifier at the front. Do we want to change
|
|
// this to be more consistent?
|
|
expect(loc.toString(),
|
|
equals('DebuggerLocationTestFoo.DebuggerLocationTestFoo'));
|
|
},
|
|
|
|
// Parse named constructor
|
|
(Isolate isolate) async {
|
|
var debugger = await initDebugger(isolate);
|
|
var loc =
|
|
await DebuggerLocation.parse(debugger, 'DebuggerLocationTestFoo.named');
|
|
expect(loc.valid, isTrue);
|
|
// TODO(turnidge): Printing a constructor currently adds
|
|
// another class qualifier at the front. Do we want to change
|
|
// this to be more consistent?
|
|
expect(loc.toString(),
|
|
equals('DebuggerLocationTestFoo.DebuggerLocationTestFoo.named'));
|
|
},
|
|
];
|
|
|
|
main(args) => runIsolateTests(args, tests, testeeConcurrent: testFunction);
|