Chromium Code Reviews| Index: tests/compiler/dart2js/message_span_test.dart |
| diff --git a/tests/compiler/dart2js/message_span_test.dart b/tests/compiler/dart2js/message_span_test.dart |
| new file mode 100644 |
| index 0000000000000000000000000000000000000000..e61e06c74de5b43879dd0a020a7fbdddd6a5cf5d |
| --- /dev/null |
| +++ b/tests/compiler/dart2js/message_span_test.dart |
| @@ -0,0 +1,146 @@ |
| +// Copyright (c) 2016, 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. |
| + |
| +import 'package:async_helper/async_helper.dart'; |
| +import 'package:compiler/src/commandline_options.dart'; |
| +import 'package:compiler/src/diagnostics/messages.dart'; |
| +import 'package:compiler/src/io/source_file.dart'; |
| +import 'package:expect/expect.dart'; |
| +import 'memory_compiler.dart'; |
| +import 'memory_source_file_helper.dart'; |
| + |
| +const List<Test> TESTS = const <Test>[ |
| + const Test(''' |
| +class A { A(b); } |
| +class B extends A { |
| + a() {} |
| + |
| + lot() {} |
| + |
| + of() {} |
| + |
| + var members; |
| +} |
| +main() => B();''', |
| + const { |
| + MessageKind.NO_MATCHING_CONSTRUCTOR_FOR_IMPLICIT: ''' |
| +class B extends A { |
| +^^^^^^^^^^^^^^^^^^^'''}), |
|
ahe
2016/02/04 11:32:33
I suggest this becomes:
class B extends A {
^^^^^
Johnni Winther
2016/02/05 09:14:20
Done.
|
| + |
| + const Test(''' |
| +class A { A(b); } |
| +class B |
| + extends A { |
| + a() {} |
| + |
| + lot() {} |
| + |
| + of() {} |
| + |
| + var members; |
| +} |
| +main() => B();''', |
| + const { |
| + MessageKind.NO_MATCHING_CONSTRUCTOR_FOR_IMPLICIT: ''' |
| +class B |
| + extends A { |
| +'''}), |
| + |
| + const Test(''' |
| +void foo(int a) { |
| + // a |
| + // non-empty |
| + // body |
| +} |
| +main() => foo('');''', |
| + const { |
| + MessageKind.THIS_IS_THE_METHOD: ''' |
| +void foo(int a) { |
| +^^^^^^^^^^^^^^^'''}), |
| + |
| + const Test(''' |
| +void foo(int a, |
| + int b) { |
| + // a |
| + // non-empty |
| + // body |
| +} |
| +main() => foo('', 0);''', |
| + const { |
| + MessageKind.THIS_IS_THE_METHOD: ''' |
| +void foo(int a, |
| + int b) { |
| +'''}), |
| + |
| + const Test(''' |
| +class A { |
| + int foo() { |
| + // a |
| + // non-empty |
| + // body |
| + } |
| +} |
| +class B extends A { |
| + int get foo { |
| + // a |
| + // non-empty |
| + // body |
| + return 0; |
| + } |
| +} |
| +main() => new B();''', |
| + const { |
| + MessageKind.CANNOT_OVERRIDE_METHOD_WITH_GETTER: ''' |
| + int get foo { |
| + ^^^^^^^^^^^''', |
| + MessageKind.CANNOT_OVERRIDE_METHOD_WITH_GETTER_CONT: ''' |
| + int foo() { |
| + ^^^^^^^^^'''}), |
| +]; |
| + |
| +class Test { |
| + final String code; |
| + final Map<MessageKind, String> kindToSpan; |
| + |
| + const Test(this.code, this.kindToSpan); |
| +} |
| + |
| +const String MARKER = '---marker---'; |
| + |
| +main() { |
| + asyncTest(() async { |
| + var cachedCompiler; |
| + for (Test test in TESTS) { |
| + DiagnosticCollector collector = new DiagnosticCollector(); |
| + CompilationResult result = await runCompiler( |
| + memorySourceFiles: {'main.dart': test.code}, |
| + options: [Flags.analyzeOnly], |
| + diagnosticHandler: collector, |
| + cachedCompiler: cachedCompiler); |
| + cachedCompiler = result.compiler; |
| + MemorySourceFileProvider provider = cachedCompiler.provider; |
| + Map<MessageKind, String> kindToSpan = |
| + new Map<MessageKind, String>.from(test.kindToSpan); |
| + for (CollectedMessage message in collector.messages) { |
| + String expectedSpanText = kindToSpan[message.messageKind]; |
| + if (expectedSpanText != null) { |
| + SourceFile sourceFile = provider.getSourceFile(message.uri); |
| + String locationMessage = |
| + sourceFile.getLocationMessage(MARKER, message.begin, message.end); |
| + // Remove `filename:line:column:` and message. |
| + String strippedLocationMessage = locationMessage.substring( |
| + locationMessage.indexOf(MARKER) + MARKER.length + 1); |
| + Expect.equals(expectedSpanText, strippedLocationMessage, |
| + "Unexpected span for ${message.messageKind} in\n${test.code}" |
| + "\nExpected:${expectedSpanText.codeUnits}" |
| + "\nActual :${strippedLocationMessage.codeUnits}"); |
| + kindToSpan.remove(message.messageKind); |
| + } |
| + } |
| + kindToSpan.forEach((MessageKind kind, _) { |
| + Expect.fail("Missing message kin $kind in\n${test.code}"); |
| + }); |
| + } |
| + }); |
| +} |