| Index: pkg/analysis_server/test/analysis_notification_overrides_test.dart
|
| diff --git a/pkg/analysis_server/test/analysis_notification_overrides_test.dart b/pkg/analysis_server/test/analysis_notification_overrides_test.dart
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..3a10f501f871c599807db93d454f8ff816431cfa
|
| --- /dev/null
|
| +++ b/pkg/analysis_server/test/analysis_notification_overrides_test.dart
|
| @@ -0,0 +1,354 @@
|
| +// Copyright (c) 2014, 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.
|
| +
|
| +library test.domain.analysis.notification.overrides;
|
| +
|
| +import 'dart:async';
|
| +
|
| +import 'package:analysis_server/src/analysis_server.dart';
|
| +import 'package:analysis_server/src/computer/computer_overrides.dart';
|
| +import 'package:analysis_server/src/computer/element.dart';
|
| +import 'package:analysis_server/src/constants.dart';
|
| +import 'package:analysis_server/src/protocol.dart';
|
| +import 'package:unittest/unittest.dart';
|
| +
|
| +import 'analysis_abstract.dart';
|
| +import 'reflective_tests.dart';
|
| +
|
| +
|
| +main() {
|
| + group('notification.occurrences', () {
|
| + runReflectiveTests(AnalysisNotificationOverridesTest);
|
| + });
|
| +}
|
| +
|
| +
|
| +@ReflectiveTestCase()
|
| +class AnalysisNotificationOverridesTest extends AbstractAnalysisTest {
|
| + List<Override> overridesList;
|
| + Override override;
|
| +
|
| + /**
|
| + * Asserts that there is an overridden interface [Element] at the offset of
|
| + * [search] in [override].
|
| + */
|
| + void assertHasInterfaceElement(String search) {
|
| + int offset = findOffset(search);
|
| + for (Element element in override.interfaceElements) {
|
| + if (element.location.offset == offset) {
|
| + return;
|
| + }
|
| + }
|
| + fail('Expect to find an overridden interface elements at $offset in '
|
| + '${override.interfaceElements.join('\n')}');
|
| + }
|
| +
|
| + /**
|
| + * Validates that there is an [Override] at the offset of [search].
|
| + *
|
| + * If [length] is not specified explicitly, then length of an identifier
|
| + * from [search] is used.
|
| + */
|
| + void assertHasOverride(String search, [int length = -1]) {
|
| + int offset = findOffset(search);
|
| + if (length == -1) {
|
| + length = findIdentifierLength(search);
|
| + }
|
| + findOverride(offset, length, true);
|
| + }
|
| +
|
| + /**
|
| + * Asserts that there is an overridden superclass [Element] at the offset of
|
| + * [search] in [override].
|
| + */
|
| + void assertHasSuperElement(String search) {
|
| + int offset = findOffset(search);
|
| + Element element = override.superclassElement;
|
| + expect(element.location.offset, offset);
|
| + }
|
| +
|
| + /**
|
| + * Asserts that there are no overridden elements from interfaces.
|
| + */
|
| + void assertNoInterfaceElements() {
|
| + expect(override.interfaceElements, isNull);
|
| + }
|
| +
|
| + /**
|
| + * Asserts that there are no overridden elements from the superclass.
|
| + */
|
| + void assertNoSuperElement() {
|
| + expect(override.superclassElement, isNull);
|
| + }
|
| +
|
| + /**
|
| + * Finds an [Override] with the given [offset] and [length].
|
| + *
|
| + * If [exists] is `true`, then fails if such [Override] does not exist.
|
| + * Otherwise remembers this it into [override].
|
| + *
|
| + * If [exists] is `false`, then fails if such [Override] exists.
|
| + */
|
| + void findOverride(int offset, int length, [bool exists]) {
|
| + for (Override override in overridesList) {
|
| + if (override.offset == offset && override.length == length) {
|
| + if (exists == false) {
|
| + fail('Not expected to find (offset=$offset; length=$length) in\n'
|
| + '${overridesList.join('\n')}');
|
| + }
|
| + this.override = override;
|
| + return;
|
| + }
|
| + }
|
| + if (exists == true) {
|
| + fail('Expected to find (offset=$offset; length=$length) in\n'
|
| + '${overridesList.join('\n')}');
|
| + }
|
| + }
|
| +
|
| + Future prepareOverrides(then()) {
|
| + addAnalysisSubscription(AnalysisService.OVERRIDES, testFile);
|
| + return waitForTasksFinished().then((_) {
|
| + then();
|
| + });
|
| + }
|
| +
|
| + void processNotification(Notification notification) {
|
| + if (notification.event == ANALYSIS_OVERRIDES) {
|
| + String file = notification.getParameter(FILE);
|
| + if (file == testFile) {
|
| + overridesList = <Override>[];
|
| + List<Map<String, Object>> jsonList = notification.getParameter(
|
| + OVERRIDES);
|
| + for (Map<String, Object> json in jsonList) {
|
| + overridesList.add(new Override.fromJson(json));
|
| + }
|
| + }
|
| + }
|
| + }
|
| +
|
| + void setUp() {
|
| + super.setUp();
|
| + createProject();
|
| + }
|
| +
|
| + test_afterAnalysis() {
|
| + addTestFile('''
|
| +class A {
|
| + m() {} // in A
|
| +}
|
| +class B implements A {
|
| + m() {} // in B
|
| +}
|
| +''');
|
| + return waitForTasksFinished().then((_) {
|
| + return prepareOverrides(() {
|
| + assertHasOverride('m() {} // in B');
|
| + assertNoSuperElement();
|
| + assertHasInterfaceElement('m() {} // in A');
|
| + });
|
| + });
|
| + }
|
| +
|
| + test_interface_method_direct_multiple() {
|
| + addTestFile('''
|
| +class IA {
|
| + m() {} // in IA
|
| +}
|
| +class IB {
|
| + m() {} // in IB
|
| +}
|
| +class A implements IA, IB {
|
| + m() {} // in A
|
| +}
|
| +''');
|
| + return prepareOverrides(() {
|
| + assertHasOverride('m() {} // in A');
|
| + assertNoSuperElement();
|
| + assertHasInterfaceElement('m() {} // in IA');
|
| + assertHasInterfaceElement('m() {} // in IB');
|
| + });
|
| + }
|
| +
|
| + test_interface_method_direct_single() {
|
| + addTestFile('''
|
| +class A {
|
| + m() {} // in A
|
| +}
|
| +class B implements A {
|
| + m() {} // in B
|
| +}
|
| +''');
|
| + return prepareOverrides(() {
|
| + assertHasOverride('m() {} // in B');
|
| + assertNoSuperElement();
|
| + assertHasInterfaceElement('m() {} // in A');
|
| + });
|
| + }
|
| +
|
| + test_interface_method_indirect_single() {
|
| + addTestFile('''
|
| +class A {
|
| + m() {} // in A
|
| +}
|
| +class B extends A {
|
| +}
|
| +class C implements B {
|
| + m() {} // in C
|
| +}
|
| +''');
|
| + return prepareOverrides(() {
|
| + assertHasOverride('m() {} // in C');
|
| + assertNoSuperElement();
|
| + assertHasInterfaceElement('m() {} // in A');
|
| + });
|
| + }
|
| +
|
| + test_super_fieldByField() {
|
| + addTestFile('''
|
| +class A {
|
| + int fff; // in A
|
| +}
|
| +class B extends A {
|
| + int fff; // in B
|
| +}
|
| +''');
|
| + return prepareOverrides(() {
|
| + assertHasOverride('fff; // in B');
|
| + assertHasSuperElement('fff; // in A');
|
| + assertNoInterfaceElements();
|
| + });
|
| + }
|
| +
|
| + test_super_fieldByGetter() {
|
| + addTestFile('''
|
| +class A {
|
| + int fff; // in A
|
| +}
|
| +class B extends A {
|
| + get fff => 0; // in B
|
| +}
|
| +''');
|
| + return prepareOverrides(() {
|
| + assertHasOverride('fff => 0; // in B');
|
| + assertHasSuperElement('fff; // in A');
|
| + assertNoInterfaceElements();
|
| + });
|
| + }
|
| +
|
| + test_super_fieldByMethod() {
|
| + addTestFile('''
|
| +class A {
|
| + int fff; // in A
|
| +}
|
| +class B extends A {
|
| + fff() {} // in B
|
| +}
|
| +''');
|
| + return prepareOverrides(() {
|
| + assertHasOverride('fff() {} // in B');
|
| + assertHasSuperElement('fff; // in A');
|
| + assertNoInterfaceElements();
|
| + });
|
| + }
|
| +
|
| + test_super_fieldBySetter() {
|
| + addTestFile('''
|
| +class A {
|
| + int fff; // in A
|
| +}
|
| +class B extends A {
|
| + set fff(x) {} // in B
|
| +}
|
| +''');
|
| + return prepareOverrides(() {
|
| + assertHasOverride('fff(x) {} // in B');
|
| + assertHasSuperElement('fff; // in A');
|
| + assertNoInterfaceElements();
|
| + });
|
| + }
|
| +
|
| + test_super_getterByField() {
|
| + addTestFile('''
|
| +class A {
|
| + get fff => 0; // in A
|
| + set fff(x) {} // in A
|
| +}
|
| +class B extends A {
|
| + int fff; // in B
|
| +}
|
| +''');
|
| + return prepareOverrides(() {
|
| + assertHasOverride('fff; // in B');
|
| + assertHasSuperElement('fff => 0; // in A');
|
| + assertNoInterfaceElements();
|
| + });
|
| + }
|
| +
|
| + test_super_getterByGetter() {
|
| + addTestFile('''
|
| +class A {
|
| + get fff => 0; // in A
|
| +}
|
| +class B extends A {
|
| + get fff => 0; // in B
|
| +}
|
| +''');
|
| + return prepareOverrides(() {
|
| + assertHasOverride('fff => 0; // in B');
|
| + assertHasSuperElement('fff => 0; // in A');
|
| + assertNoInterfaceElements();
|
| + });
|
| + }
|
| +
|
| + test_super_method_direct() {
|
| + addTestFile('''
|
| +class A {
|
| + m() {} // in A
|
| +}
|
| +class B extends A {
|
| + m() {} // in B
|
| +}
|
| +''');
|
| + return prepareOverrides(() {
|
| + assertHasOverride('m() {} // in B');
|
| + assertHasSuperElement('m() {} // in A');
|
| + assertNoInterfaceElements();
|
| + });
|
| + }
|
| +
|
| + test_super_method_indirect() {
|
| + addTestFile('''
|
| +class A {
|
| + m() {} // in A
|
| +}
|
| +class B extends A {
|
| +}
|
| +class C extends B {
|
| + m() {} // in C
|
| +}
|
| +''');
|
| + return prepareOverrides(() {
|
| + assertHasOverride('m() {} // in C');
|
| + assertHasSuperElement('m() {} // in A');
|
| + assertNoInterfaceElements();
|
| + });
|
| + }
|
| +
|
| + test_super_setterBySetter() {
|
| + addTestFile('''
|
| +class A {
|
| + set fff(x) {} // in A
|
| +}
|
| +class B extends A {
|
| + set fff(x) {} // in B
|
| +}
|
| +''');
|
| + return prepareOverrides(() {
|
| + assertHasOverride('fff(x) {} // in B');
|
| + assertHasSuperElement('fff(x) {} // in A');
|
| + assertNoInterfaceElements();
|
| + });
|
| + }
|
| +}
|
|
|