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