OLD | NEW |
(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 } |
OLD | NEW |