// 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:package_resolver/package_resolver.dart';
import 'package:path/path.dart' as p;
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 = _mapTrace(_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 = _mapTrace(_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 = _mapTrace(_simpleMapping, trace).frames;

    expect(frames.length, equals(2));
    expect(frames.first.member, equals("foo"));
    expect(frames.last.member, equals("baz"));
  });

  test("include frames from JS files not covered by the source map bundle",
      () {
    var trace = new Trace.parse("""
foo.dart.js 10:11  foo
jquery.js 10:1  foo
bar.dart.js 10:11  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 sourceMapJson1 = builder.build("foo.dart.js.map");
    sourceMapJson1['file'] = "foo.dart.js";

    builder = new SourceMapBuilder()
      ..addSpan(
          new SourceMapSpan.identifier(
              new SourceLocation(1,
                  line: 1, column: 3, sourceUrl: "packages/bar/bar.dart"),
              "qux"),
          new SourceSpan(new SourceLocation(8, line: 5, column: 0),
              new SourceLocation(12, line: 9, column: 1), "\n" * 4));
    var sourceMapJson2 = builder.build("bar.dart.js.map");
    sourceMapJson2['file'] = "bar.dart.js";

    var bundle = [sourceMapJson1, sourceMapJson2];
    var mapping = parseJsonExtended(bundle);
    var frames = _mapTrace(mapping, trace,
            packageResolver: new SyncPackageResolver.root("packages/"))
        .frames;

    expect(frames.length, equals(3));

    var frame = frames[0];
    expect(frame.uri, equals(Uri.parse("package:foo/foo.dart")));
    expect(frame.line, equals(2));
    expect(frame.column, equals(4));

    frame = frames[1];
    expect(p.basename(frame.uri.toString()), equals("jquery.js"));
    expect(frame.line, equals(10));

    frame = frames[2];
    expect(frame.uri, equals(Uri.parse("package:bar/bar.dart")));
    expect(frame.line, equals(2));
    expect(frame.column, equals(4));
  });

  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 = _mapTrace(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 = _mapTrace(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 package: URIs for frames within packageResolver.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 mappedTrace = _mapTrace(mapping, trace,
        packageResolver: new SyncPackageResolver.root("packages/"));
    var frame = mappedTrace.frames.first;
    expect(frame.uri, equals(Uri.parse("package:foo/foo.dart")));
    expect(frame.line, equals(2));
    expect(frame.column, equals(4));
  });

  test("uses package: URIs for frames within a packageResolver.packageMap URL",
      () {
    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 mappedTrace = _mapTrace(mapping, trace,
        packageResolver: new SyncPackageResolver.config({
          "foo": Uri.parse("packages/foo")
        }));
    var frame = mappedTrace.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 = _mapTrace(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 = _mapChain(_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("named arguments", () {
      expect(_prettify(r"foo$1$bar"), equals("foo"));
      expect(_prettify(r"foo$123$bar$bang$qux"), 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>"));
    });
  });
}

/// Like [mapStackTrace], but is guaranteed to return a [Trace] so it can be
/// inspected.
Trace _mapTrace(Mapping sourceMap, StackTrace stackTrace,
    {bool minified: false, SyncPackageResolver packageResolver, sdkRoot,
    packageRoot}) {
  return new Trace.from(mapStackTrace(sourceMap, stackTrace,
      minified: minified, packageResolver: packageResolver, sdkRoot: sdkRoot,
      packageRoot: packageRoot));
}

/// Like [mapStackTrace], but is guaranteed to return a [Chain] so it can be
/// inspected.
Chain _mapChain(Mapping sourceMap, StackTrace stackTrace,
    {bool minified: false, SyncPackageResolver packageResolver, sdkRoot,
    packageRoot}) {
  return new Chain.forTrace(mapStackTrace(sourceMap, stackTrace,
      minified: minified, packageResolver: packageResolver, sdkRoot: sdkRoot,
      packageRoot: packageRoot));
}

/// 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 _mapTrace(_simpleMapping, trace).frames.first.member;
}
