| Index: mojo/public/dart/third_party/source_map_stack_trace/test/source_map_stack_trace_test.dart
|
| diff --git a/mojo/public/dart/third_party/source_map_stack_trace/test/source_map_stack_trace_test.dart b/mojo/public/dart/third_party/source_map_stack_trace/test/source_map_stack_trace_test.dart
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..ffaaaee04d2b48c1b1b593ba5429c4d6ddf14b14
|
| --- /dev/null
|
| +++ b/mojo/public/dart/third_party/source_map_stack_trace/test/source_map_stack_trace_test.dart
|
| @@ -0,0 +1,197 @@
|
| +// 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:source_maps/source_maps.dart';
|
| +import 'package:source_span/source_span.dart';
|
| +import 'package:stack_trace/stack_trace.dart';
|
| +import 'package:source_map_stack_trace/source_map_stack_trace.dart';
|
| +import 'package:test/test.dart';
|
| +
|
| +/// A simple [Mapping] for tests that don't need anything special.
|
| +final _simpleMapping = parseJson(
|
| + (new SourceMapBuilder()
|
| + ..addSpan(
|
| + new SourceMapSpan.identifier(
|
| + new SourceLocation(1,
|
| + line: 1, column: 3, sourceUrl: "foo.dart"),
|
| + "qux"),
|
| + new SourceSpan(
|
| + new SourceLocation(8, line: 5, column: 0),
|
| + new SourceLocation(18, line: 15, column: 0),
|
| + "\n" * 10)))
|
| + .build("foo.dart.js.map"));
|
| +
|
| +void main() {
|
| + test("maps a JS line and column to a Dart line and span", () {
|
| + var trace = new Trace.parse("foo.dart.js 10:11 foo");
|
| + var frame = mapStackTrace(_simpleMapping, trace).frames.first;
|
| + expect(frame.uri, equals(Uri.parse("foo.dart")));
|
| +
|
| + // These are +1 because stack_trace is 1-based whereas source_span is
|
| + // 0-basd.
|
| + expect(frame.line, equals(2));
|
| + expect(frame.column, equals(4));
|
| + });
|
| +
|
| + test("ignores JS frames without line info", () {
|
| + var trace = new Trace.parse("""
|
| +foo.dart.js 10:11 foo
|
| +foo.dart.js bar
|
| +foo.dart.js 10:11 baz
|
| +""");
|
| + var frames = mapStackTrace(_simpleMapping, trace).frames;
|
| +
|
| + expect(frames.length, equals(2));
|
| + expect(frames.first.member, equals("foo"));
|
| + expect(frames.last.member, equals("baz"));
|
| + });
|
| +
|
| + test("ignores JS frames without corresponding spans", () {
|
| + var trace = new Trace.parse("""
|
| +foo.dart.js 10:11 foo
|
| +foo.dart.js 1:1 bar
|
| +foo.dart.js 10:11 baz
|
| +""");
|
| +
|
| + var frames = mapStackTrace(_simpleMapping, trace).frames;
|
| +
|
| + expect(frames.length, equals(2));
|
| + expect(frames.first.member, equals("foo"));
|
| + expect(frames.last.member, equals("baz"));
|
| + });
|
| +
|
| + test("falls back to column 0 for unlisted column", () {
|
| + var trace = new Trace.parse("foo.dart.js 10 foo");
|
| + var builder = new SourceMapBuilder()
|
| + ..addSpan(
|
| + new SourceMapSpan.identifier(
|
| + new SourceLocation(1,
|
| + line: 1, column: 3, sourceUrl: "foo.dart"),
|
| + "qux"),
|
| + new SourceSpan(
|
| + new SourceLocation(8, line: 5, column: 0),
|
| + new SourceLocation(12, line: 9, column: 1),
|
| + "\n" * 4));
|
| +
|
| + var mapping = parseJson(builder.build("foo.dart.js.map"));
|
| + var frame = mapStackTrace(mapping, trace).frames.first;
|
| + expect(frame.uri, equals(Uri.parse("foo.dart")));
|
| + expect(frame.line, equals(2));
|
| + expect(frame.column, equals(4));
|
| + });
|
| +
|
| + test("uses package: URIs for frames within packageRoot", () {
|
| + var trace = new Trace.parse("foo.dart.js 10 foo");
|
| + var builder = new SourceMapBuilder()
|
| + ..addSpan(
|
| + new SourceMapSpan.identifier(
|
| + new SourceLocation(1,
|
| + line: 1, column: 3, sourceUrl: "packages/foo/foo.dart"),
|
| + "qux"),
|
| + new SourceSpan(
|
| + new SourceLocation(8, line: 5, column: 0),
|
| + new SourceLocation(12, line: 9, column: 1),
|
| + "\n" * 4));
|
| +
|
| + var mapping = parseJson(builder.build("foo.dart.js.map"));
|
| + var frame = mapStackTrace(mapping, trace, packageRoot: "packages/")
|
| + .frames.first;
|
| + expect(frame.uri, equals(Uri.parse("package:foo/foo.dart")));
|
| + expect(frame.line, equals(2));
|
| + expect(frame.column, equals(4));
|
| + });
|
| +
|
| + test("uses dart: URIs for frames within sdkRoot", () {
|
| + var trace = new Trace.parse("foo.dart.js 10 foo");
|
| + var builder = new SourceMapBuilder()
|
| + ..addSpan(
|
| + new SourceMapSpan.identifier(
|
| + new SourceLocation(1,
|
| + line: 1, column: 3, sourceUrl: "sdk/lib/async/foo.dart"),
|
| + "qux"),
|
| + new SourceSpan(
|
| + new SourceLocation(8, line: 5, column: 0),
|
| + new SourceLocation(12, line: 9, column: 1),
|
| + "\n" * 4));
|
| +
|
| + var mapping = parseJson(builder.build("foo.dart.js.map"));
|
| + var frame = mapStackTrace(mapping, trace, sdkRoot: "sdk/").frames.first;
|
| + expect(frame.uri, equals(Uri.parse("dart:async/foo.dart")));
|
| + expect(frame.line, equals(2));
|
| + expect(frame.column, equals(4));
|
| + });
|
| +
|
| + test("converts a stack chain", () {
|
| + var trace = new Chain([
|
| + new Trace.parse("foo.dart.js 10:11 foo"),
|
| + new Trace.parse("foo.dart.js 10:11 bar")
|
| + ]);
|
| + var traces = mapStackTrace(_simpleMapping, trace).traces;
|
| +
|
| + var frame = traces.first.frames.single;
|
| + expect(frame.uri, equals(Uri.parse("foo.dart")));
|
| + expect(frame.member, equals("foo"));
|
| + expect(frame.line, equals(2));
|
| + expect(frame.column, equals(4));
|
| +
|
| + frame = traces.last.frames.single;
|
| + expect(frame.uri, equals(Uri.parse("foo.dart")));
|
| + expect(frame.member, equals("bar"));
|
| + expect(frame.line, equals(2));
|
| + expect(frame.column, equals(4));
|
| + });
|
| +
|
| + group("cleans up", () {
|
| + test("Firefox junk", () {
|
| + expect(_prettify("foo/<"), equals("foo"));
|
| + expect(_prettify("foo<"), equals("foo"));
|
| + });
|
| +
|
| + test("arity indicators", () {
|
| + expect(_prettify(r"foo$1"), equals("foo"));
|
| + expect(_prettify(r"foo$1234"), equals("foo"));
|
| + });
|
| +
|
| + test("closures", () {
|
| + expect(_prettify("foo_closure.call"), equals("foo.<fn>"));
|
| + });
|
| +
|
| + test("nested closures", () {
|
| + expect(_prettify("foo__closure.call"), equals("foo.<fn>.<fn>"));
|
| + expect(_prettify("foo____closure.call"),
|
| + equals("foo.<fn>.<fn>.<fn>.<fn>"));
|
| + });
|
| +
|
| + test(".call", () {
|
| + expect(_prettify("foo.call"), equals("foo"));
|
| + });
|
| +
|
| + test("top-level functions", () {
|
| + expect(_prettify("dart.foo"), equals("foo"));
|
| + });
|
| +
|
| + test("library namespaces", () {
|
| + expect(_prettify(r"my_library$foo"), equals("foo"));
|
| + });
|
| +
|
| + test("static methods", () {
|
| + expect(_prettify(r"Foo.static.foo"), equals("foo"));
|
| + });
|
| +
|
| + test("instance methods", () {
|
| + expect(_prettify(r"Foo_bar__baz"), equals("Foo.bar._baz"));
|
| + });
|
| +
|
| + test("lots of stuff", () {
|
| + expect(_prettify(r"lib$Foo.static.lib$Foo_closure.call$0/<"),
|
| + equals("Foo.<fn>"));
|
| + });
|
| + });
|
| +}
|
| +
|
| +/// Runs the mapper's prettification logic on [member] and returns the result.
|
| +String _prettify(String member) {
|
| + var trace = new Trace([new Frame(Uri.parse("foo.dart.js"), 10, 11, member)]);
|
| + return mapStackTrace(_simpleMapping, trace).frames.first.member;
|
| +}
|
|
|