| OLD | NEW |
| 1 // Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file | 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 | 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. | 3 // BSD-style license that can be found in the LICENSE file. |
| 4 | 4 |
| 5 library test.services.completion.dart.util; | 5 library test.services.completion.dart.util; |
| 6 | 6 |
| 7 import 'dart:async'; | 7 import 'dart:async'; |
| 8 | 8 |
| 9 import 'package:analysis_server/plugin/protocol/protocol.dart' as protocol | 9 import 'package:analysis_server/plugin/protocol/protocol.dart' as protocol |
| 10 show Element, ElementKind; | 10 show Element, ElementKind; |
| 11 import 'package:analysis_server/plugin/protocol/protocol.dart' | 11 import 'package:analysis_server/plugin/protocol/protocol.dart' |
| 12 hide Element, ElementKind; | 12 hide Element, ElementKind; |
| 13 import 'package:analysis_server/plugin/protocol/protocol.dart'; | 13 import 'package:analysis_server/plugin/protocol/protocol.dart'; |
| 14 import 'package:analysis_server/src/provisional/completion/dart/completion_dart.
dart'; | 14 import 'package:analysis_server/src/provisional/completion/dart/completion_dart.
dart'; |
| 15 import 'package:analysis_server/src/services/completion/completion_core.dart'; | 15 import 'package:analysis_server/src/services/completion/completion_core.dart'; |
| 16 import 'package:analysis_server/src/services/completion/dart/completion_manager.
dart' | 16 import 'package:analysis_server/src/services/completion/dart/completion_manager.
dart' |
| 17 show DartCompletionRequestImpl; | 17 show DartCompletionRequestImpl; |
| 18 import 'package:analysis_server/src/services/completion/dart_completion_manager.
dart' | 18 import 'package:analysis_server/src/services/completion/dart_completion_manager.
dart' |
| 19 show DART_RELEVANCE_DEFAULT, DART_RELEVANCE_LOW, ReplacementRange; | 19 show DART_RELEVANCE_DEFAULT, DART_RELEVANCE_LOW, ReplacementRange; |
| 20 import 'package:analysis_server/src/services/index/index.dart'; | 20 import 'package:analysis_server/src/services/index/index.dart'; |
| 21 import 'package:analysis_server/src/services/index/local_memory_index.dart'; | 21 import 'package:analysis_server/src/services/index/local_memory_index.dart'; |
| 22 import 'package:analysis_server/src/services/search/search_engine_internal.dart'
; | 22 import 'package:analysis_server/src/services/search/search_engine_internal.dart'
; |
| 23 import 'package:analyzer/src/generated/source.dart'; | 23 import 'package:analyzer/src/generated/source.dart'; |
| 24 import 'package:analyzer/task/dart.dart'; |
| 24 import 'package:unittest/unittest.dart'; | 25 import 'package:unittest/unittest.dart'; |
| 25 | 26 |
| 26 import '../../../abstract_context.dart'; | 27 import '../../../abstract_context.dart'; |
| 27 | 28 |
| 28 int suggestionComparator(CompletionSuggestion s1, CompletionSuggestion s2) { | 29 int suggestionComparator(CompletionSuggestion s1, CompletionSuggestion s2) { |
| 29 String c1 = s1.completion.toLowerCase(); | 30 String c1 = s1.completion.toLowerCase(); |
| 30 String c2 = s2.completion.toLowerCase(); | 31 String c2 = s2.completion.toLowerCase(); |
| 31 return c1.compareTo(c2); | 32 return c1.compareTo(c2); |
| 32 } | 33 } |
| 33 | 34 |
| 34 abstract class DartCompletionContributorTest extends AbstractContextTest { | 35 abstract class DartCompletionContributorTest extends AbstractContextTest { |
| 35 Index index; | 36 Index index; |
| 36 SearchEngineImpl searchEngine; | 37 SearchEngineImpl searchEngine; |
| 37 String testFile = '/completionTest.dart'; | 38 String testFile = '/completionTest.dart'; |
| 38 Source testSource; | 39 Source testSource; |
| 39 int completionOffset; | 40 int completionOffset; |
| 40 int replacementOffset; | 41 int replacementOffset; |
| 41 int replacementLength; | 42 int replacementLength; |
| 42 DartCompletionContributor contributor; | 43 DartCompletionContributor contributor; |
| 43 DartCompletionRequest request; | 44 DartCompletionRequest request; |
| 44 List<CompletionSuggestion> suggestions; | 45 List<CompletionSuggestion> suggestions; |
| 45 | 46 |
| 47 /** |
| 48 * If `true` and `null` is specified as the suggestion's expected returnType |
| 49 * then the actual suggestion is expected to have a `dynamic` returnType. |
| 50 * Newer tests return `false` so that they can distinguish between |
| 51 * `dynamic` and `null`. |
| 52 * Eventually all tests should be converted and this getter removed. |
| 53 */ |
| 54 bool get isNullExpectedReturnTypeConsideredDynamic => true; |
| 55 |
| 46 void addTestSource(String content) { | 56 void addTestSource(String content) { |
| 47 expect(completionOffset, isNull, reason: 'Call addTestUnit exactly once'); | 57 expect(completionOffset, isNull, reason: 'Call addTestUnit exactly once'); |
| 48 completionOffset = content.indexOf('^'); | 58 completionOffset = content.indexOf('^'); |
| 49 expect(completionOffset, isNot(equals(-1)), reason: 'missing ^'); | 59 expect(completionOffset, isNot(equals(-1)), reason: 'missing ^'); |
| 50 int nextOffset = content.indexOf('^', completionOffset + 1); | 60 int nextOffset = content.indexOf('^', completionOffset + 1); |
| 51 expect(nextOffset, equals(-1), reason: 'too many ^'); | 61 expect(nextOffset, equals(-1), reason: 'too many ^'); |
| 52 content = content.substring(0, completionOffset) + | 62 content = content.substring(0, completionOffset) + |
| 53 content.substring(completionOffset + 1); | 63 content.substring(completionOffset + 1); |
| 54 testSource = addSource(testFile, content); | 64 testSource = addSource(testFile, content); |
| 55 } | 65 } |
| (...skipping 79 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 135 } | 145 } |
| 136 return cs; | 146 return cs; |
| 137 } | 147 } |
| 138 | 148 |
| 139 CompletionSuggestion assertSuggestClass(String name, | 149 CompletionSuggestion assertSuggestClass(String name, |
| 140 {int relevance: DART_RELEVANCE_DEFAULT, | 150 {int relevance: DART_RELEVANCE_DEFAULT, |
| 141 String importUri, | 151 String importUri, |
| 142 CompletionSuggestionKind kind: CompletionSuggestionKind.INVOCATION, | 152 CompletionSuggestionKind kind: CompletionSuggestionKind.INVOCATION, |
| 143 bool isDeprecated: false, | 153 bool isDeprecated: false, |
| 144 String elemFile, | 154 String elemFile, |
| 155 String elemName, |
| 145 int elemOffset}) { | 156 int elemOffset}) { |
| 146 CompletionSuggestion cs = assertSuggest(name, | 157 CompletionSuggestion cs = assertSuggest(name, |
| 147 csKind: kind, | 158 csKind: kind, |
| 148 relevance: relevance, | 159 relevance: relevance, |
| 149 importUri: importUri, | 160 importUri: importUri, |
| 150 isDeprecated: isDeprecated, | 161 isDeprecated: isDeprecated, |
| 151 elemFile: elemFile, | 162 elemFile: elemFile, |
| 152 elemOffset: elemOffset); | 163 elemOffset: elemOffset); |
| 153 protocol.Element element = cs.element; | 164 protocol.Element element = cs.element; |
| 154 expect(element, isNotNull); | 165 expect(element, isNotNull); |
| 155 expect(element.kind, equals(protocol.ElementKind.CLASS)); | 166 expect(element.kind, equals(protocol.ElementKind.CLASS)); |
| 156 expect(element.name, equals(name)); | 167 expect(element.name, equals(elemName ?? name)); |
| 157 expect(element.parameters, isNull); | 168 expect(element.parameters, isNull); |
| 158 expect(element.returnType, isNull); | 169 expect(element.returnType, isNull); |
| 159 assertHasNoParameterInfo(cs); | 170 assertHasNoParameterInfo(cs); |
| 160 return cs; | 171 return cs; |
| 161 } | 172 } |
| 162 | 173 |
| 163 CompletionSuggestion assertSuggestClassTypeAlias(String name, | 174 CompletionSuggestion assertSuggestClassTypeAlias(String name, |
| 164 {int relevance: DART_RELEVANCE_DEFAULT, | 175 {int relevance: DART_RELEVANCE_DEFAULT, |
| 165 CompletionSuggestionKind kind: CompletionSuggestionKind.INVOCATION}) { | 176 CompletionSuggestionKind kind: CompletionSuggestionKind.INVOCATION}) { |
| 166 CompletionSuggestion cs = | 177 CompletionSuggestion cs = |
| (...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 234 CompletionSuggestion assertSuggestFunction(String name, String returnType, | 245 CompletionSuggestion assertSuggestFunction(String name, String returnType, |
| 235 {CompletionSuggestionKind kind: CompletionSuggestionKind.INVOCATION, | 246 {CompletionSuggestionKind kind: CompletionSuggestionKind.INVOCATION, |
| 236 bool isDeprecated: false, | 247 bool isDeprecated: false, |
| 237 int relevance: DART_RELEVANCE_DEFAULT, | 248 int relevance: DART_RELEVANCE_DEFAULT, |
| 238 String importUri}) { | 249 String importUri}) { |
| 239 CompletionSuggestion cs = assertSuggest(name, | 250 CompletionSuggestion cs = assertSuggest(name, |
| 240 csKind: kind, | 251 csKind: kind, |
| 241 relevance: relevance, | 252 relevance: relevance, |
| 242 importUri: importUri, | 253 importUri: importUri, |
| 243 isDeprecated: isDeprecated); | 254 isDeprecated: isDeprecated); |
| 244 expect(cs.returnType, returnType != null ? returnType : 'dynamic'); | 255 if (returnType != null) { |
| 256 expect(cs.returnType, returnType); |
| 257 } else if (isNullExpectedReturnTypeConsideredDynamic) { |
| 258 expect(cs.returnType, 'dynamic'); |
| 259 } else { |
| 260 expect(cs.returnType, isNull); |
| 261 } |
| 245 protocol.Element element = cs.element; | 262 protocol.Element element = cs.element; |
| 246 expect(element, isNotNull); | 263 expect(element, isNotNull); |
| 247 expect(element.kind, equals(protocol.ElementKind.FUNCTION)); | 264 expect(element.kind, equals(protocol.ElementKind.FUNCTION)); |
| 248 expect(element.name, equals(name)); | 265 expect(element.name, equals(name)); |
| 249 expect(element.isDeprecated, equals(isDeprecated)); | 266 expect(element.isDeprecated, equals(isDeprecated)); |
| 250 String param = element.parameters; | 267 String param = element.parameters; |
| 251 expect(param, isNotNull); | 268 expect(param, isNotNull); |
| 252 expect(param[0], equals('(')); | 269 expect(param[0], equals('(')); |
| 253 expect(param[param.length - 1], equals(')')); | 270 expect(param[param.length - 1], equals(')')); |
| 254 expect(element.returnType, | 271 if (returnType != null) { |
| 255 equals(returnType != null ? returnType : 'dynamic')); | 272 expect(element.returnType, returnType); |
| 273 } else if (isNullExpectedReturnTypeConsideredDynamic) { |
| 274 expect(element.returnType, 'dynamic'); |
| 275 } else { |
| 276 expect(element.returnType, isNull); |
| 277 } |
| 256 assertHasParameterInfo(cs); | 278 assertHasParameterInfo(cs); |
| 257 return cs; | 279 return cs; |
| 258 } | 280 } |
| 259 | 281 |
| 260 CompletionSuggestion assertSuggestFunctionTypeAlias( | 282 CompletionSuggestion assertSuggestFunctionTypeAlias( |
| 261 String name, String returnType, {bool isDeprecated: false, | 283 String name, String returnType, |
| 284 {bool isDeprecated: false, |
| 262 int relevance: DART_RELEVANCE_DEFAULT, | 285 int relevance: DART_RELEVANCE_DEFAULT, |
| 263 CompletionSuggestionKind kind: CompletionSuggestionKind.INVOCATION, | 286 CompletionSuggestionKind kind: CompletionSuggestionKind.INVOCATION, |
| 264 String importUri}) { | 287 String importUri}) { |
| 265 CompletionSuggestion cs = assertSuggest(name, | 288 CompletionSuggestion cs = assertSuggest(name, |
| 266 csKind: kind, | 289 csKind: kind, |
| 267 relevance: relevance, | 290 relevance: relevance, |
| 268 importUri: importUri, | 291 importUri: importUri, |
| 269 isDeprecated: isDeprecated); | 292 isDeprecated: isDeprecated); |
| 270 expect(cs.returnType, returnType != null ? returnType : 'dynamic'); | 293 if (returnType != null) { |
| 294 expect(cs.returnType, returnType); |
| 295 } else if (isNullExpectedReturnTypeConsideredDynamic) { |
| 296 expect(cs.returnType, 'dynamic'); |
| 297 } else { |
| 298 expect(cs.returnType, isNull); |
| 299 } |
| 271 protocol.Element element = cs.element; | 300 protocol.Element element = cs.element; |
| 272 expect(element, isNotNull); | 301 expect(element, isNotNull); |
| 273 expect(element.kind, equals(protocol.ElementKind.FUNCTION_TYPE_ALIAS)); | 302 expect(element.kind, equals(protocol.ElementKind.FUNCTION_TYPE_ALIAS)); |
| 274 expect(element.name, equals(name)); | 303 expect(element.name, equals(name)); |
| 275 expect(element.isDeprecated, equals(isDeprecated)); | 304 expect(element.isDeprecated, equals(isDeprecated)); |
| 276 // TODO (danrubel) Determine why params are null | 305 // TODO (danrubel) Determine why params are null |
| 277 // String param = element.parameters; | 306 // String param = element.parameters; |
| 278 // expect(param, isNotNull); | 307 // expect(param, isNotNull); |
| 279 // expect(param[0], equals('(')); | 308 // expect(param[0], equals('(')); |
| 280 // expect(param[param.length - 1], equals(')')); | 309 // expect(param[param.length - 1], equals(')')); |
| (...skipping 75 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 356 assertHasNoParameterInfo(cs); | 385 assertHasNoParameterInfo(cs); |
| 357 return cs; | 386 return cs; |
| 358 } | 387 } |
| 359 | 388 |
| 360 CompletionSuggestion assertSuggestTopLevelVar(String name, String returnType, | 389 CompletionSuggestion assertSuggestTopLevelVar(String name, String returnType, |
| 361 {int relevance: DART_RELEVANCE_DEFAULT, | 390 {int relevance: DART_RELEVANCE_DEFAULT, |
| 362 CompletionSuggestionKind kind: CompletionSuggestionKind.INVOCATION, | 391 CompletionSuggestionKind kind: CompletionSuggestionKind.INVOCATION, |
| 363 String importUri}) { | 392 String importUri}) { |
| 364 CompletionSuggestion cs = assertSuggest(name, | 393 CompletionSuggestion cs = assertSuggest(name, |
| 365 csKind: kind, relevance: relevance, importUri: importUri); | 394 csKind: kind, relevance: relevance, importUri: importUri); |
| 366 expect(cs.returnType, returnType != null ? returnType : 'dynamic'); | 395 if (returnType != null) { |
| 396 expect(cs.returnType, returnType); |
| 397 } else if (isNullExpectedReturnTypeConsideredDynamic) { |
| 398 expect(cs.returnType, 'dynamic'); |
| 399 } else { |
| 400 expect(cs.returnType, isNull); |
| 401 } |
| 367 protocol.Element element = cs.element; | 402 protocol.Element element = cs.element; |
| 368 expect(element, isNotNull); | 403 expect(element, isNotNull); |
| 369 expect(element.kind, equals(protocol.ElementKind.TOP_LEVEL_VARIABLE)); | 404 expect(element.kind, equals(protocol.ElementKind.TOP_LEVEL_VARIABLE)); |
| 370 expect(element.name, equals(name)); | 405 expect(element.name, equals(name)); |
| 371 expect(element.parameters, isNull); | 406 expect(element.parameters, isNull); |
| 372 expect(element.returnType, returnType != null ? returnType : 'dynamic'); | 407 if (returnType != null) { |
| 408 expect(element.returnType, returnType); |
| 409 } else if (isNullExpectedReturnTypeConsideredDynamic) { |
| 410 expect(element.returnType, 'dynamic'); |
| 411 } else { |
| 412 expect(element.returnType, isNull); |
| 413 } |
| 373 assertHasNoParameterInfo(cs); | 414 assertHasNoParameterInfo(cs); |
| 374 return cs; | 415 return cs; |
| 375 } | 416 } |
| 376 | 417 |
| 377 /** | 418 /** |
| 378 * Return a [Future] that completes with the containing library information | 419 * Return a [Future] that completes with the containing library information |
| 379 * after it is accessible via [context.getLibrariesContaining]. | 420 * after it is accessible via [context.getLibrariesContaining]. |
| 380 */ | 421 */ |
| 381 Future computeLibrariesContaining([int times = 200]) { | 422 Future computeLibrariesContaining([int times = 200]) { |
| 382 List<Source> libraries = context.getLibrariesContaining(testSource); | 423 List<Source> libraries = context.getLibrariesContaining(testSource); |
| (...skipping 96 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 479 if (times == 0 || context == null) return new Future.value(); | 520 if (times == 0 || context == null) return new Future.value(); |
| 480 context.performAnalysisTask(); | 521 context.performAnalysisTask(); |
| 481 // We use a delayed future to allow microtask events to finish. The | 522 // We use a delayed future to allow microtask events to finish. The |
| 482 // Future.value or Future() constructors use scheduleMicrotask themselves an
d | 523 // Future.value or Future() constructors use scheduleMicrotask themselves an
d |
| 483 // would therefore not wait for microtask callbacks that are scheduled after | 524 // would therefore not wait for microtask callbacks that are scheduled after |
| 484 // invoking this method. | 525 // invoking this method. |
| 485 return new Future.delayed( | 526 return new Future.delayed( |
| 486 Duration.ZERO, () => performAnalysis(times - 1, completer)); | 527 Duration.ZERO, () => performAnalysis(times - 1, completer)); |
| 487 } | 528 } |
| 488 | 529 |
| 530 void resolveSource(String path, String content) { |
| 531 Source libSource = addSource(path, content); |
| 532 var target = new LibrarySpecificUnit(libSource, libSource); |
| 533 context.computeResult(target, RESOLVED_UNIT); |
| 534 } |
| 535 |
| 489 @override | 536 @override |
| 490 void setUp() { | 537 void setUp() { |
| 491 super.setUp(); | 538 super.setUp(); |
| 492 index = createLocalMemoryIndex(); | 539 index = createLocalMemoryIndex(); |
| 493 searchEngine = new SearchEngineImpl(index); | 540 searchEngine = new SearchEngineImpl(index); |
| 494 contributor = createContributor(); | 541 contributor = createContributor(); |
| 495 } | 542 } |
| 496 } | 543 } |
| OLD | NEW |