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

// @dart = 2.7

// Unittest for the [LocationCollector].

import 'package:compiler/src/io/code_output.dart';
import 'package:compiler/src/io/location_provider.dart';
import 'package:expect/expect.dart';
import 'package:kernel/ast.dart' show Location;

import '../helpers/output_collector.dart';

test(List events, Map<int, List<int>> expectedPositions) {
  BufferedOutputSink sink = new BufferedOutputSink();
  LocationCollector locationProvider = new LocationCollector();
  CodeOutput output =
      new StreamCodeOutput(sink, <CodeOutputListener>[locationProvider]);
  for (var event in events) {
    if (event is String) {
      output.add(event);
    } else if (event is CodeBuffer) {
      output.addBuffer(event);
    }
  }
  output.close();

  expectedPositions.forEach((int offset, List<int> expectedPosition) {
    if (expectedPosition == null) {
      Expect.throws(
          () => locationProvider.getLocation(offset),
          (e) => true,
          'Expected out-of-bounds offset: $offset\n'
          'text:"""${sink.text}"""\n'
          'locationProvider:$locationProvider');
    } else {
      Location location = locationProvider.getLocation(offset);
      int line = location.line - 1;
      int column = location.column - 1;
      Expect.equals(
          expectedPosition[0],
          line,
          'Unexpected result: $offset -> $expectedPosition = [$line,$column]\n'
          'text:"""${sink.text}"""\n'
          'locationProvider:$locationProvider');
      Expect.equals(
          expectedPosition[1],
          column,
          'Unexpected result: $offset -> $expectedPosition = [$line,$column]\n'
          'text:"""${sink.text}"""\n'
          'locationProvider:$locationProvider');
    }
  });
}

main() {
  test([
    ""
  ], {
    0: [0, 0],
    1: null
  });

  test([
    " "
  ], {
    0: [0, 0],
    1: [0, 1],
    2: null
  });

  test([
    "\n "
  ], {
    0: [0, 0],
    1: [1, 0],
    2: [1, 1],
    3: null
  });

  Map<int, List<int>> positions = {
    0: [0, 0],
    1: [0, 1],
    2: [1, 0],
    3: [1, 1],
    4: [2, 0],
    5: [2, 1],
    6: null
  };

  test(["a\nb\nc"], positions);

  test(["a", "\nb\nc"], positions);

  test(["a", "\n", "b\nc"], positions);

  CodeBuffer buffer1 = new CodeBuffer();
  buffer1.add("a\nb\nc");
  test([buffer1], positions);

  CodeBuffer buffer2 = new CodeBuffer();
  buffer2.add("\nb\nc");
  test(["a", buffer2], positions);

  CodeBuffer buffer3 = new CodeBuffer();
  buffer3.add("a");
  test([buffer3, buffer2], positions);

  CodeBuffer buffer4 = new CodeBuffer();
  buffer4.addBuffer(buffer3);
  test([buffer4, buffer2], positions);
}
