| // 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. |
| |
| // 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 '../../lib/src/util/output_collector.dart'; |
| |
| test(List events, Map<int, List<int>?> expectedPositions) { |
| BufferedOutputSink sink = BufferedOutputSink(); |
| LocationCollector locationProvider = LocationCollector(); |
| CodeOutput output = 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 = CodeBuffer(); |
| buffer1.add("a\nb\nc"); |
| test([buffer1], positions); |
| |
| CodeBuffer buffer2 = CodeBuffer(); |
| buffer2.add("\nb\nc"); |
| test(["a", buffer2], positions); |
| |
| CodeBuffer buffer3 = CodeBuffer(); |
| buffer3.add("a"); |
| test([buffer3, buffer2], positions); |
| |
| CodeBuffer buffer4 = CodeBuffer(); |
| buffer4.addBuffer(buffer3); |
| test([buffer4, buffer2], positions); |
| } |