* Add special handling for String concatenations so the first string gets mapped correctly and work better in sound null safety. * Update variable assignments to more consistently point to helpful locations, specifically when lowered from a prefix increment like `++x`. * Run the sourcemap and stacktrace test suites with sound null safety. Previously these suites were running with unsound null safety so more operations were wrapped in function calls to check for null. Those calls allowed for mode step or break points that hid some of the issues addressed in this change. Issue: https://github.com/dart-lang/sdk/issues/55692 Change-Id: Ibd887c8da64e72ab84c0698dd49b845abfaedbb8 Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/366025 Reviewed-by: Sigmund Cherem <sigmund@google.com> Commit-Queue: Nicholas Shahan <nshahan@google.com>
2.3 KiB
Testing of source maps
This folder contains two types of tests for validating sourcemaps: the debugging behavior and the stacktrace behavior.
Running the tests requires building the sdk target: ddc_stable_test.
Except for that, running them should simply be a matter of executing the *_suite.dart files.
All tests are plain Dart files and goes in "testfiles" (debugging tests) or "stacktrace_testfiles" (stacktrace tests). They are automatically picked up by the testing framework.
Debugging tests (step tests)
See README.md in pkg/sourcemap_testing.
Debugging a test
One can filter which tests are run by running (from the sourcemap folder):
dart sourcemaps_suite.dart -- sourcemaps/printing_class_fields
One can additionally get debug output for failing tests (i.e. tests with different outcome than expected), e.g.:
dart sourcemaps_suite.dart -Ddebug=true -- sourcemaps/printing_class_fields
The latter is also useful in combination with /*fail*/ when adding new tests to see all the places
where the debugger stopped (both in JS positions and translated to dart positions).
For instance -Ddebug=true -- sourcemaps/next_through_catch_test with a /*fail*/
currently gives output like the following:
Stop #1
test.main = function() { | main() {
try { | try {
let value = /*STOP*/"world"; | var value = /*STOP*/"world";
dart.throw(dart.str`Hello, ${value}`); | // Comment
} catch (e) { | throw "Hello, $value";
Stop #2
try { | var value = "world";
let value = "world"; | // Comment
/*STOP*/dart.throw(dart.str`Hello, ${value}`); | /*STOP*/throw "Hello, $value";
} catch (e) { | }
let st = dart.stackTrace(e); | // Comment
Stop #3
dart.throw(dart.str`Hello, ${value}`); | }
} catch (e) { | // Comment
let st = /*STOP*/dart.stackTrace(e); | catch (e, /*STOP*/st) {
{ | print(e);
core.print(e); | print(st);
[...]