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

Side by Side Diff: pkg/analysis_server/test/analysis/notification_implemented_test.dart

Issue 1368793003: The 'analysis.implemented' notification implementation. (Closed) Base URL: git@github.com:dart-lang/sdk.git@master
Patch Set: Created 5 years, 2 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 unified diff | Download patch
OLDNEW
(Empty)
1 // Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file
2 // for details. All rights reserved. Use of this source code is governed by a
3 // BSD-style license that can be found in the LICENSE file.
4
5 library test.analysis.notification.implemented;
6
7 import 'dart:async';
8
9 import 'package:analysis_server/src/constants.dart';
10 import 'package:analysis_server/src/protocol.dart';
11 import 'package:analysis_server/src/services/index/index.dart';
12 import 'package:analysis_server/src/services/index/local_memory_index.dart';
13 import 'package:test_reflective_loader/test_reflective_loader.dart';
14 import 'package:unittest/unittest.dart';
15
16 import '../analysis_abstract.dart';
17 import '../utils.dart';
18
19 main() {
20 initializeTestEnvironment();
21 defineReflectiveTests(AnalysisNotificationImplementedTest);
22 }
23
24 @reflectiveTest
25 class AnalysisNotificationImplementedTest extends AbstractAnalysisTest {
26 List<ImplementedClass> implementedClasses;
27 List<ImplementedMember> implementedMembers;
28
29 /**
30 * Validates that there is an [ImplementedClass] at the offset of [search].
31 *
32 * If [length] is not specified explicitly, then length of an identifier
33 * from [search] is used.
34 */
35 void assertHasImplementedClass(String search, [int length = -1]) {
36 int offset = findOffset(search);
37 if (length == -1) {
38 length = findIdentifierLength(search);
39 }
40 for (ImplementedClass clazz in implementedClasses) {
41 if (clazz.offset == offset && clazz.length == length) {
42 return;
43 }
44 }
45 fail('Expect to find an implemented class at $offset'
46 ' in $implementedClasses');
47 }
48
49 /**
50 * Validates that there is an [ImplementedClass] at the offset of [search].
51 *
52 * If [length] is not specified explicitly, then length of an identifier
53 * from [search] is used.
54 */
55 void assertHasImplementedMember(String search, [int length = -1]) {
56 int offset = findOffset(search);
57 if (length == -1) {
58 length = findIdentifierLength(search);
59 }
60 for (ImplementedMember member in implementedMembers) {
61 if (member.offset == offset && member.length == length) {
62 return;
63 }
64 }
65 fail('Expect to find an implemented member at $offset'
66 ' in $implementedMembers');
67 }
68
69 /**
70 * Validates that there is no an [ImplementedClass] at the offset of [search].
71 *
72 * If [length] is not specified explicitly, then length of an identifier
73 * from [search] is used.
74 */
75 void assertNoImplementedMember(String search, [int length = -1]) {
76 int offset = findOffset(search);
77 if (length == -1) {
78 length = findIdentifierLength(search);
79 }
80 for (ImplementedMember member in implementedMembers) {
81 if (member.offset == offset) {
82 fail('Unexpected implemented member at $offset'
83 ' in $implementedMembers');
84 }
85 }
86 }
87
88 @override
89 Index createIndex() {
90 return createLocalMemoryIndex();
91 }
92
93 Future prepareImplementedElements() {
94 addAnalysisSubscription(AnalysisService.IMPLEMENTED, testFile);
95 Future waitForNotification(int times) {
96 if (times == 0 || implementedClasses != null) {
97 return new Future.value();
98 }
99 return new Future.delayed(
100 Duration.ZERO, () => waitForNotification(times - 1));
101 }
102 return waitForNotification(100);
103 }
104
105 void processNotification(Notification notification) {
106 if (notification.event == ANALYSIS_IMPLEMENTED) {
107 var params = new AnalysisImplementedParams.fromNotification(notification);
108 if (params.file == testFile) {
109 implementedClasses = params.classes;
110 implementedMembers = params.members;
111 }
112 }
113 }
114
115 void setUp() {
116 super.setUp();
117 createProject();
118 }
119
120 test_afterAnalysis() async {
121 addTestFile('''
122 class A {}
123 class B extends A {}
124 ''');
125 await waitForTasksFinished();
126 await prepareImplementedElements();
127 assertHasImplementedClass('A {');
128 }
129
130 test_class_extended() async {
131 addTestFile('''
132 class A {}
133 class B extends A {}
134 ''');
135 await prepareImplementedElements();
136 assertHasImplementedClass('A {');
137 }
138
139 test_class_implemented() async {
140 addTestFile('''
141 class A {}
142 class B implements A {}
143 ''');
144 await prepareImplementedElements();
145 assertHasImplementedClass('A {');
146 }
147
148 test_class_mixed() async {
149 addTestFile('''
150 class A {}
151 class B = Object with A;
152 ''');
153 await prepareImplementedElements();
154 assertHasImplementedClass('A {');
155 }
156
157 test_field_withField() async {
158 addTestFile('''
159 class A {
160 int f; // A
161 }
162 class B extends A {
163 int f;
164 }
165 ''');
166 await prepareImplementedElements();
167 assertHasImplementedMember('f; // A');
168 }
169
170 test_field_withGetter() async {
171 addTestFile('''
172 class A {
173 int f; // A
174 }
175 class B extends A {
176 get f => null;
177 }
178 ''');
179 await prepareImplementedElements();
180 assertHasImplementedMember('f; // A');
181 }
182
183 test_field_withSetter() async {
184 addTestFile('''
185 class A {
186 int f; // A
187 }
188 class B extends A {
189 void set f(_) {}
190 }
191 ''');
192 await prepareImplementedElements();
193 assertHasImplementedMember('f; // A');
194 }
195
196 test_getter_withField() async {
197 addTestFile('''
198 class A {
199 get f => null; // A
200 }
201 class B extends A {
202 int f;
203 }
204 ''');
205 await prepareImplementedElements();
206 assertHasImplementedMember('f => null; // A');
207 }
208
209 test_getter_withGetter() async {
210 addTestFile('''
211 class A {
212 get f => null; // A
213 }
214 class B extends A {
215 get f => null;
216 }
217 ''');
218 await prepareImplementedElements();
219 assertHasImplementedMember('f => null; // A');
220 }
221
222 test_method_withMethod() async {
223 addTestFile('''
224 class A {
225 m() {} // A
226 }
227 class B extends A {
228 m() {} // B
229 }
230 ''');
231 await prepareImplementedElements();
232 assertHasImplementedMember('m() {} // A');
233 assertNoImplementedMember('m() {} // B');
234 }
235
236 test_method_withMethod_indirectSubclass() async {
237 addTestFile('''
238 class A {
239 m() {} // A
240 }
241 class B extends A {
242 }
243 class C extends A {
244 m() {}
245 }
246 ''');
247 await prepareImplementedElements();
248 assertHasImplementedMember('m() {} // A');
249 }
250
251 test_method_withMethod_wasAbstract() async {
252 addTestFile('''
253 abstract class A {
254 m(); // A
255 }
256 class B extends A {
257 m() {}
258 }
259 ''');
260 await prepareImplementedElements();
261 assertHasImplementedMember('m(); // A');
262 }
263
264 test_setter_withField() async {
265 addTestFile('''
266 class A {
267 set f(_) {} // A
268 }
269 class B extends A {
270 int f;
271 }
272 ''');
273 await prepareImplementedElements();
274 assertHasImplementedMember('f(_) {} // A');
275 }
276
277 test_setter_withSetter() async {
278 addTestFile('''
279 class A {
280 set f(_) {} // A
281 }
282 class B extends A {
283 set f(_) {} // B
284 }
285 ''');
286 await prepareImplementedElements();
287 assertHasImplementedMember('f(_) {} // A');
288 }
289 }
OLDNEW
« no previous file with comments | « pkg/analysis_server/lib/src/operation/operation_analysis.dart ('k') | pkg/analysis_server/test/analysis/test_all.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698