| 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.computer.element; | 5 library test.computer.element; |
| 6 | 6 |
| 7 import 'dart:mirrors'; | 7 import 'dart:mirrors'; |
| 8 | 8 |
| 9 import 'package:analysis_server/src/constants.dart'; | 9 import 'package:analysis_server/src/constants.dart'; |
| 10 import 'package:analysis_server/src/protocol_server.dart'; | 10 import 'package:analysis_server/src/protocol_server.dart'; |
| (...skipping 256 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 267 expect(location.offset, 20); | 267 expect(location.offset, 20); |
| 268 expect(location.length, 'myConstructor'.length); | 268 expect(location.length, 'myConstructor'.length); |
| 269 expect(location.startLine, 2); | 269 expect(location.startLine, 2); |
| 270 expect(location.startColumn, 11); | 270 expect(location.startColumn, 11); |
| 271 } | 271 } |
| 272 expect(element.parameters, '(int a, [String b])'); | 272 expect(element.parameters, '(int a, [String b])'); |
| 273 expect(element.returnType, 'A'); | 273 expect(element.returnType, 'A'); |
| 274 expect(element.flags, Element.FLAG_CONST); | 274 expect(element.flags, Element.FLAG_CONST); |
| 275 } | 275 } |
| 276 | 276 |
| 277 void test_fromElement_dynamic() { |
| 278 var engineElement = engine.DynamicElementImpl.instance; |
| 279 // create notification Element |
| 280 Element element = newElement_fromEngine(engineElement); |
| 281 expect(element.kind, ElementKind.UNKNOWN); |
| 282 expect(element.name, 'dynamic'); |
| 283 expect(element.location, isNull); |
| 284 expect(element.parameters, isNull); |
| 285 expect(element.returnType, isNull); |
| 286 expect(element.flags, 0); |
| 287 } |
| 288 |
| 277 void test_fromElement_FIELD() { | 289 void test_fromElement_FIELD() { |
| 278 engine.Source source = addSource('/test.dart', ''' | 290 engine.Source source = addSource('/test.dart', ''' |
| 279 class A { | 291 class A { |
| 280 static const myField = 42; | 292 static const myField = 42; |
| 281 }'''); | 293 }'''); |
| 282 engine.CompilationUnit unit = resolveLibraryUnit(source); | 294 engine.CompilationUnit unit = resolveLibraryUnit(source); |
| 283 engine.FieldElement engineElement = findElementInUnit(unit, 'myField'); | 295 engine.FieldElement engineElement = findElementInUnit(unit, 'myField'); |
| 284 // create notification Element | 296 // create notification Element |
| 285 Element element = newElement_fromEngine(engineElement); | 297 Element element = newElement_fromEngine(engineElement); |
| 286 expect(element.kind, ElementKind.FIELD); | 298 expect(element.kind, ElementKind.FIELD); |
| (...skipping 107 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 394 expect(location.file, '/test.dart'); | 406 expect(location.file, '/test.dart'); |
| 395 expect(location.offset, 16); | 407 expect(location.offset, 16); |
| 396 expect(location.length, 'mySetter'.length); | 408 expect(location.length, 'mySetter'.length); |
| 397 expect(location.startLine, 2); | 409 expect(location.startLine, 2); |
| 398 expect(location.startColumn, 7); | 410 expect(location.startColumn, 7); |
| 399 } | 411 } |
| 400 expect(element.parameters, '(String x)'); | 412 expect(element.parameters, '(String x)'); |
| 401 expect(element.returnType, isNull); | 413 expect(element.returnType, isNull); |
| 402 expect(element.flags, 0); | 414 expect(element.flags, 0); |
| 403 } | 415 } |
| 404 | |
| 405 void test_fromElement_dynamic() { | |
| 406 var engineElement = engine.DynamicElementImpl.instance; | |
| 407 // create notification Element | |
| 408 Element element = newElement_fromEngine(engineElement); | |
| 409 expect(element.kind, ElementKind.UNKNOWN); | |
| 410 expect(element.name, 'dynamic'); | |
| 411 expect(element.location, isNull); | |
| 412 expect(element.parameters, isNull); | |
| 413 expect(element.returnType, isNull); | |
| 414 expect(element.flags, 0); | |
| 415 } | |
| 416 } | 416 } |
| 417 | 417 |
| 418 /** | |
| 419 * Helper class for testing the correspondence between an analysis engine enum | |
| 420 * and an analysis server API enum. | |
| 421 */ | |
| 422 class EnumTester<EngineEnum, ApiEnum extends Enum> { | |
| 423 /** | |
| 424 * Test that the function [convert] properly converts all possible values of | |
| 425 * [EngineEnum] to an [ApiEnum] with the same name, with the exceptions noted | |
| 426 * in [exceptions]. For each key in [exceptions], if the corresponding value | |
| 427 * is null, then we check that converting the given key results in an error. | |
| 428 * If the corresponding value is an [ApiEnum], then we check that converting | |
| 429 * the given key results in the given value. | |
| 430 */ | |
| 431 void run(ApiEnum convert(EngineEnum value), {Map<EngineEnum, | |
| 432 ApiEnum> exceptions: const {}}) { | |
| 433 ClassMirror engineClass = reflectClass(EngineEnum); | |
| 434 engineClass.staticMembers.forEach((Symbol symbol, MethodMirror method) { | |
| 435 if (symbol == #values) { | |
| 436 return; | |
| 437 } | |
| 438 if (!method.isGetter) { | |
| 439 return; | |
| 440 } | |
| 441 String enumName = MirrorSystem.getName(symbol); | |
| 442 EngineEnum engineValue = engineClass.getField(symbol).reflectee; | |
| 443 expect(engineValue, new isInstanceOf<EngineEnum>()); | |
| 444 if (exceptions.containsKey(engineValue)) { | |
| 445 ApiEnum expectedResult = exceptions[engineValue]; | |
| 446 if (expectedResult == null) { | |
| 447 expect(() { | |
| 448 convert(engineValue); | |
| 449 }, throws); | |
| 450 } else { | |
| 451 ApiEnum apiValue = convert(engineValue); | |
| 452 expect(apiValue, equals(expectedResult)); | |
| 453 } | |
| 454 } else { | |
| 455 ApiEnum apiValue = convert(engineValue); | |
| 456 expect(apiValue.name, equals(enumName)); | |
| 457 } | |
| 458 }); | |
| 459 } | |
| 460 } | |
| 461 | |
| 462 | |
| 463 @ReflectiveTestCase() | 418 @ReflectiveTestCase() |
| 464 class EnumTest { | 419 class EnumTest { |
| 465 void test_AnalysisErrorSeverity() { | 420 void test_AnalysisErrorSeverity() { |
| 466 new EnumTester<engine.ErrorSeverity, AnalysisErrorSeverity>().run( | 421 new EnumTester<engine.ErrorSeverity, AnalysisErrorSeverity>().run( |
| 467 (engine.ErrorSeverity engineErrorSeverity) => | 422 (engine.ErrorSeverity engineErrorSeverity) => |
| 468 new AnalysisErrorSeverity(engineErrorSeverity.name), | 423 new AnalysisErrorSeverity(engineErrorSeverity.name), |
| 469 exceptions: { | 424 exceptions: { |
| 470 engine.ErrorSeverity.NONE: null | 425 engine.ErrorSeverity.NONE: null |
| 471 }); | 426 }); |
| 472 } | 427 } |
| (...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 504 engine.ElementKind.UNIVERSE: ElementKind.UNKNOWN | 459 engine.ElementKind.UNIVERSE: ElementKind.UNKNOWN |
| 505 }); | 460 }); |
| 506 } | 461 } |
| 507 | 462 |
| 508 void test_SearchResultKind() { | 463 void test_SearchResultKind() { |
| 509 // TODO(paulberry): why does the MatchKind class exist at all? Can't we | 464 // TODO(paulberry): why does the MatchKind class exist at all? Can't we |
| 510 // use SearchResultKind inside the analysis server? | 465 // use SearchResultKind inside the analysis server? |
| 511 new EnumTester<MatchKind, SearchResultKind>().run( | 466 new EnumTester<MatchKind, SearchResultKind>().run( |
| 512 newSearchResultKind_fromEngine, | 467 newSearchResultKind_fromEngine, |
| 513 exceptions: { | 468 exceptions: { |
| 514 // TODO(paulberry): do any of the exceptions below constitute bugs? | 469 // TODO(paulberry): do any of the exceptions below constitute bugs? |
| 515 MatchKind.ANGULAR_REFERENCE: SearchResultKind.UNKNOWN, | 470 MatchKind.ANGULAR_REFERENCE: SearchResultKind.UNKNOWN, |
| 516 MatchKind.ANGULAR_CLOSING_TAG_REFERENCE: SearchResultKind.UNKNOWN | 471 MatchKind.ANGULAR_CLOSING_TAG_REFERENCE: SearchResultKind.UNKNOWN |
| 517 }); | 472 }); |
| 518 } | 473 } |
| 519 } | 474 } |
| 475 |
| 476 |
| 477 /** |
| 478 * Helper class for testing the correspondence between an analysis engine enum |
| 479 * and an analysis server API enum. |
| 480 */ |
| 481 class EnumTester<EngineEnum, ApiEnum extends Enum> { |
| 482 /** |
| 483 * Test that the function [convert] properly converts all possible values of |
| 484 * [EngineEnum] to an [ApiEnum] with the same name, with the exceptions noted |
| 485 * in [exceptions]. For each key in [exceptions], if the corresponding value |
| 486 * is null, then we check that converting the given key results in an error. |
| 487 * If the corresponding value is an [ApiEnum], then we check that converting |
| 488 * the given key results in the given value. |
| 489 */ |
| 490 void run(ApiEnum convert(EngineEnum value), {Map<EngineEnum, |
| 491 ApiEnum> exceptions: const {}}) { |
| 492 ClassMirror engineClass = reflectClass(EngineEnum); |
| 493 engineClass.staticMembers.forEach((Symbol symbol, MethodMirror method) { |
| 494 if (symbol == #values) { |
| 495 return; |
| 496 } |
| 497 if (!method.isGetter) { |
| 498 return; |
| 499 } |
| 500 String enumName = MirrorSystem.getName(symbol); |
| 501 EngineEnum engineValue = engineClass.getField(symbol).reflectee; |
| 502 expect(engineValue, new isInstanceOf<EngineEnum>()); |
| 503 if (exceptions.containsKey(engineValue)) { |
| 504 ApiEnum expectedResult = exceptions[engineValue]; |
| 505 if (expectedResult == null) { |
| 506 expect(() { |
| 507 convert(engineValue); |
| 508 }, throws); |
| 509 } else { |
| 510 ApiEnum apiValue = convert(engineValue); |
| 511 expect(apiValue, equals(expectedResult)); |
| 512 } |
| 513 } else { |
| 514 ApiEnum apiValue = convert(engineValue); |
| 515 expect(apiValue.name, equals(enumName)); |
| 516 } |
| 517 }); |
| 518 } |
| 519 } |
| OLD | NEW |