// 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:convert';
import 'package:test/test.dart';
import 'package:source_maps/source_maps.dart';
import 'package:source_span/source_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.encode(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(SourceMapSpan s) => new SourceMapSpan(s.start, s.end, s.text,
        isIdentifier: s.isIdentifier);

    // The result is the same if we use fixed positions
    var printer2 = new Printer('output2.dart');
    printer2..mark(new SourceLocation(0, sourceUrl: 'input.dart').pointSpan())
        ..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);
  });

  group('nested printer', () {
    test('simple use', () {
      var printer = new NestedPrinter();
      printer..add('var ')
             ..add('x = 3;\n', span: inputVar1)
             ..add('f(', span: inputFunction)
             ..add('y) => ', span: inputVar2)
             ..add('x + y;\n', span: inputExpr)
             ..build('output.dart');
      expect(printer.text, OUTPUT);
      expect(printer.map, JSON.encode(EXPECTED_MAP));
    });

    test('nested use', () {
      var printer = new NestedPrinter();
      printer..add('var ')
             ..add(new NestedPrinter()..add('x = 3;\n', span: inputVar1))
             ..add('f(', span: inputFunction)
             ..add(new NestedPrinter()..add('y) => ', span: inputVar2))
             ..add('x + y;\n', span: inputExpr)
             ..build('output.dart');
      expect(printer.text, OUTPUT);
      expect(printer.map, JSON.encode(EXPECTED_MAP));
    });

    test('add indentation', () {
      var out = INPUT.replaceAll('long', '_s');
      var lines = INPUT.trim().split('\n');
      expect(lines.length, 7);
      var printer = new NestedPrinter();
      for (int i = 0; i < lines.length; i++) {
        if (i == 5) printer.indent++;
        printer.addLine(lines[i].replaceAll('long', '_s').trim());
        if (i == 5) printer.indent--;
      }
      printer.build('output.dart');
      expect(printer.text, out);
    });
  });
}
