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

import 'dart:convert';
import 'package:test/test.dart';
import 'package:source_maps/source_maps.dart';
import 'common.dart';

main() {
  test('builder - with span', () {
    var map = (new SourceMapBuilder()
        ..addSpan(inputVar1, outputVar1)
        ..addSpan(inputFunction, outputFunction)
        ..addSpan(inputVar2, outputVar2)
        ..addSpan(inputExpr, outputExpr))
        .build(output.url.toString());
    expect(map, equals(EXPECTED_MAP));
  });

  test('builder - with location', () {
    var str = (new SourceMapBuilder()
        ..addLocation(inputVar1.start, outputVar1.start, 'longVar1')
        ..addLocation(inputFunction.start, outputFunction.start, 'longName')
        ..addLocation(inputVar2.start, outputVar2.start, 'longVar2')
        ..addLocation(inputExpr.start, outputExpr.start, null))
        .toJson(output.url.toString());
    expect(str, JSON.encode(EXPECTED_MAP));
  });
}
