Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1892)

Unified Diff: pkg/analysis_server/test/analysis_notification_overrides_test.dart

Issue 364083002: Implemention of the 'analysis.overrides' notification. (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: Created 6 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « pkg/analysis_server/lib/src/operation/operation_analysis.dart ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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();
+ });
+ }
+}
« no previous file with comments | « pkg/analysis_server/lib/src/operation/operation_analysis.dart ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698