// Copyright (c) 2013, 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:test/test.dart'; import 'common.dart'; void main() { test('end-to-end setup', () { expect(inputVar1.text, 'longVar1'); expect(inputFunction.text, 'longName'); expect(inputVar2.text, 'longVar2'); expect(inputVar1NoSymbol.text, 'longVar1'); expect(inputFunctionNoSymbol.text, 'longName'); expect(inputVar2NoSymbol.text, 'longVar2'); expect(inputExpr.text, 'longVar1 + longVar2'); expect(outputVar1.text, 'x'); expect(outputFunction.text, 'f'); expect(outputVar2.text, 'y'); expect(outputVar1NoSymbol.text, 'x'); expect(outputFunctionNoSymbol.text, 'f'); expect(outputVar2NoSymbol.text, 'y'); expect(outputExpr.text, 'x + y'); }); test('build + parse', () { var map = (SourceMapBuilder() ..addSpan(inputVar1, outputVar1) ..addSpan(inputFunction, outputFunction) ..addSpan(inputVar2, outputVar2) ..addSpan(inputExpr, outputExpr)) .build(output.url.toString()); var mapping = parseJson(map); check(outputVar1, mapping, inputVar1, false); check(outputVar2, mapping, inputVar2, false); check(outputFunction, mapping, inputFunction, false); check(outputExpr, mapping, inputExpr, false); }); test('build + parse - no symbols', () { var map = (SourceMapBuilder() ..addSpan(inputVar1NoSymbol, outputVar1NoSymbol) ..addSpan(inputFunctionNoSymbol, outputFunctionNoSymbol) ..addSpan(inputVar2NoSymbol, outputVar2NoSymbol) ..addSpan(inputExpr, outputExpr)) .build(output.url.toString()); var mapping = parseJson(map); check(outputVar1NoSymbol, mapping, inputVar1NoSymbol, false); check(outputVar2NoSymbol, mapping, inputVar2NoSymbol, false); check(outputFunctionNoSymbol, mapping, inputFunctionNoSymbol, false); check(outputExpr, mapping, inputExpr, false); }); test('build + parse, repeated entries', () { var map = (SourceMapBuilder() ..addSpan(inputVar1, outputVar1) ..addSpan(inputVar1, outputVar1) ..addSpan(inputFunction, outputFunction) ..addSpan(inputFunction, outputFunction) ..addSpan(inputVar2, outputVar2) ..addSpan(inputVar2, outputVar2) ..addSpan(inputExpr, outputExpr) ..addSpan(inputExpr, outputExpr)) .build(output.url.toString()); var mapping = parseJson(map); check(outputVar1, mapping, inputVar1, false); check(outputVar2, mapping, inputVar2, false); check(outputFunction, mapping, inputFunction, false); check(outputExpr, mapping, inputExpr, false); }); test('build + parse - no symbols, repeated entries', () { var map = (SourceMapBuilder() ..addSpan(inputVar1NoSymbol, outputVar1NoSymbol) ..addSpan(inputVar1NoSymbol, outputVar1NoSymbol) ..addSpan(inputFunctionNoSymbol, outputFunctionNoSymbol) ..addSpan(inputFunctionNoSymbol, outputFunctionNoSymbol) ..addSpan(inputVar2NoSymbol, outputVar2NoSymbol) ..addSpan(inputVar2NoSymbol, outputVar2NoSymbol) ..addSpan(inputExpr, outputExpr)) .build(output.url.toString()); var mapping = parseJson(map); check(outputVar1NoSymbol, mapping, inputVar1NoSymbol, false); check(outputVar2NoSymbol, mapping, inputVar2NoSymbol, false); check(outputFunctionNoSymbol, mapping, inputFunctionNoSymbol, false); check(outputExpr, mapping, inputExpr, false); }); test('build + parse with file', () { var json = (SourceMapBuilder() ..addSpan(inputVar1, outputVar1) ..addSpan(inputFunction, outputFunction) ..addSpan(inputVar2, outputVar2) ..addSpan(inputExpr, outputExpr)) .toJson(output.url.toString()); var mapping = parse(json); check(outputVar1, mapping, inputVar1, true); check(outputVar2, mapping, inputVar2, true); check(outputFunction, mapping, inputFunction, true); check(outputExpr, mapping, inputExpr, true); }); test('printer projecting marks + parse', () { var out = inputContent.replaceAll('long', '_s'); var file = SourceFile.fromString(out, url: 'output2.dart'); var printer = Printer('output2.dart'); printer.mark(ispan(0, 0)); var segments = inputContent.split('long'); expect(segments.length, 6); printer.add(segments[0], projectMarks: true); printer.mark(inputVar1); printer.add('_s'); printer.add(segments[1], projectMarks: true); printer.mark(inputFunction); printer.add('_s'); printer.add(segments[2], projectMarks: true); printer.mark(inputVar2); printer.add('_s'); printer.add(segments[3], projectMarks: true); printer.mark(inputExpr); printer.add('_s'); printer.add(segments[4], projectMarks: true); printer.add('_s'); printer.add(segments[5], projectMarks: true); expect(printer.text, out); var mapping = parse(printer.map); void checkHelper(SourceMapSpan inputSpan, int adjustment) { var start = inputSpan.start.offset - adjustment; var end = (inputSpan.end.offset - adjustment) - 2; var span = SourceMapFileSpan(file.span(start, end), isIdentifier: inputSpan.isIdentifier); check(span, mapping, inputSpan, true); } checkHelper(inputVar1, 0); checkHelper(inputFunction, 2); checkHelper(inputVar2, 4); checkHelper(inputExpr, 6); // We projected correctly lines that have no mappings check(file.span(66, 66), mapping, ispan(45, 45), true); check(file.span(63, 64), mapping, ispan(45, 45), true); check(file.span(68, 68), mapping, ispan(70, 70), true); check(file.span(71, 71), mapping, ispan(70, 70), true); // Start of the last line var oOffset = out.length - 2; var iOffset = inputContent.length - 2; check(file.span(oOffset, oOffset), mapping, ispan(iOffset, iOffset), true); check(file.span(oOffset + 1, oOffset + 1), mapping, ispan(iOffset, iOffset), true); }); }