| // 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); |
| } |