// 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.

library test.printer_test;

import 'dart:json' as json;
import 'package:unittest/unittest.dart';
import 'package:source_maps/printer.dart';
import 'package:source_maps/span.dart';
import 'common.dart';

main() {
  test('printer', () {
    var printer = new Printer('output.dart');
    printer..add('var ')
           ..mark(inputVar1)
           ..add('x = 3;\n')
           ..mark(inputFunction)
           ..add('f(')
           ..mark(inputVar2)
           ..add('y) => ')
           ..mark(inputExpr)
           ..add('x + y;\n');
    expect(printer.text, OUTPUT);
    expect(printer.map, json.stringify(EXPECTED_MAP));
  });

  test('printer projecting marks', () {
    var out = INPUT.replaceAll('long', '_s');
    var printer = new Printer('output2.dart');

    var segments = INPUT.split('long');
    expect(segments.length, 6);
    printer..mark(ispan(0, 0))
        ..add(segments[0], projectMarks: true)
        ..mark(inputVar1)
        ..add('_s')
        ..add(segments[1], projectMarks: true)
        ..mark(inputFunction)
        ..add('_s')
        ..add(segments[2], projectMarks: true)
        ..mark(inputVar2)
        ..add('_s')
        ..add(segments[3], projectMarks: true)
        ..mark(inputExpr)
        ..add('_s')
        ..add(segments[4], projectMarks: true)
        ..add('_s')
        ..add(segments[5], projectMarks: true);

    expect(printer.text, out);
    // 8 new lines in the source map:
    expect(printer.map.split(';').length, 8);

    asFixed(Span s) => new FixedSpan(s.sourceUrl,
        s.start.offset, s.start.line, s.start.column,
        text: s.text, isIdentifier: s.isIdentifier);

    // The result is the same if we use fixed positions
    var printer2 = new Printer('output2.dart');
    printer2..mark(new FixedSpan('input.dart', 0, 0, 0))
        ..add(segments[0], projectMarks: true)
        ..mark(asFixed(inputVar1))
        ..add('_s')
        ..add(segments[1], projectMarks: true)
        ..mark(asFixed(inputFunction))
        ..add('_s')
        ..add(segments[2], projectMarks: true)
        ..mark(asFixed(inputVar2))
        ..add('_s')
        ..add(segments[3], projectMarks: true)
        ..mark(asFixed(inputExpr))
        ..add('_s')
        ..add(segments[4], projectMarks: true)
        ..add('_s')
        ..add(segments[5], projectMarks: true);

    expect(printer2.text, out);
    expect(printer2.map, printer.map);
  });
}
