Chromium Code Reviews| 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.domain.analysis; | 5 library test.domain.analysis; |
| 6 | 6 |
| 7 import 'dart:async'; | |
| 8 | |
| 7 import 'package:analysis_server/src/analysis_server.dart'; | 9 import 'package:analysis_server/src/analysis_server.dart'; |
| 8 import 'package:analysis_server/src/domain_analysis.dart'; | 10 import 'package:analysis_server/src/domain_analysis.dart'; |
| 9 import 'package:analysis_server/src/protocol.dart'; | 11 import 'package:analysis_server/src/protocol.dart'; |
| 10 import 'package:analysis_server/src/resource.dart'; | 12 import 'package:analysis_server/src/resource.dart'; |
| 11 import 'package:unittest/unittest.dart'; | 13 import 'package:unittest/unittest.dart'; |
| 12 | 14 |
| 13 import 'mocks.dart'; | 15 import 'mocks.dart'; |
| 14 | 16 |
| 17 | |
| 18 /** | |
| 19 * A helper to test 'analysis.*' requests. | |
| 20 */ | |
| 21 class AnalysisTestHelper { | |
| 22 MockServerChannel serverChannel; | |
| 23 MemoryResourceProvider resourceProvider; | |
| 24 AnalysisServer server; | |
| 25 AnalysisDomainHandler handler; | |
| 26 | |
| 27 Map<String, List<AnalysisError>> filesErrors = {}; | |
| 28 | |
| 29 String testFile = '/project/bin/test.dart'; | |
| 30 String testCode; | |
| 31 | |
| 32 AnalysisTestHelper() { | |
| 33 serverChannel = new MockServerChannel(); | |
| 34 resourceProvider = new MemoryResourceProvider(); | |
| 35 server = new AnalysisServer(serverChannel, resourceProvider); | |
| 36 handler = new AnalysisDomainHandler(server); | |
| 37 // listen for notifications | |
| 38 Stream<Notification> notificationStream = serverChannel.notificationControll er.stream; | |
| 39 notificationStream.listen((Notification notification) { | |
| 40 if (notification.event == AnalysisDomainHandler.ERRORS_NOTIFICATION) { | |
| 41 String file = notification.getParameter(AnalysisServer.FILE_PARAM); | |
| 42 List<Map<String, Object>> errorMaps = notification.getParameter(Analysis Server.ERRORS_PARAM); | |
| 43 filesErrors[file] = errorMaps.map(jsonToAnalysisError).toList(); | |
| 44 } | |
| 45 }); | |
| 46 } | |
| 47 | |
| 48 /** | |
| 49 * Returns a [Future] that completes when this this helper finished all its | |
| 50 * scheduled tasks. | |
| 51 */ | |
| 52 Future waitForTasksFinished() { | |
| 53 return waitForServerTasksFinished(server); | |
| 54 } | |
| 55 | |
| 56 /** | |
| 57 * Returns [AnalysisError]s recorded for the given [file]. | |
| 58 * May be empty, but not `null`. | |
| 59 */ | |
| 60 List<AnalysisError> getErrors(String file) { | |
| 61 List<AnalysisError> errors = filesErrors[file]; | |
| 62 if (errors != null) { | |
| 63 return errors; | |
| 64 } | |
| 65 return <AnalysisError>[]; | |
| 66 } | |
| 67 | |
| 68 /** | |
| 69 * Returns [AnalysisError]s recorded for the [testFile]. | |
| 70 * May be empty, but not `null`. | |
| 71 */ | |
| 72 List<AnalysisError> getTestErrors() { | |
| 73 return getErrors(testFile); | |
| 74 } | |
| 75 | |
| 76 /** | |
| 77 * Creates a project with a single Dart file `/project/bin/test.dart` with | |
| 78 * the given [code]. | |
| 79 */ | |
| 80 createSingleFileProject(code) { | |
| 81 if (code is List<String>) { | |
| 82 code = code.join('\n'); | |
| 83 } | |
| 84 this.testCode = code; | |
| 85 resourceProvider.newFolder('/project'); | |
| 86 resourceProvider.newFile('/project/pubspec.yaml', 'name: project'); | |
| 87 resourceProvider.newFile(testFile, testCode); | |
| 88 Request request = new Request('0', AnalysisDomainHandler.SET_ANALYSIS_ROOTS_ METHOD); | |
| 89 request.setParameter(AnalysisDomainHandler.INCLUDED_PARAM, ['/project']); | |
| 90 request.setParameter(AnalysisDomainHandler.EXCLUDED_PARAM, []); | |
| 91 Response response = handler.handleRequest(request); | |
| 92 expect(response, isResponseSuccess('0')); | |
| 93 } | |
| 94 } | |
| 95 | |
| 96 | |
| 97 | |
| 15 main() { | 98 main() { |
| 16 groupSep = ' | '; | 99 groupSep = ' | '; |
| 17 | 100 |
| 101 AnalysisTestHelper helper; | |
| 102 MockServerChannel serverChannel; | |
| 18 AnalysisServer server; | 103 AnalysisServer server; |
| 19 AnalysisDomainHandler handler; | 104 AnalysisDomainHandler handler; |
| 20 MemoryResourceProvider resourceProvider = new MemoryResourceProvider(); | 105 MemoryResourceProvider resourceProvider = new MemoryResourceProvider(); |
| 21 | 106 |
| 22 setUp(() { | 107 setUp(() { |
| 23 var serverChannel = new MockServerChannel(); | 108 helper = new AnalysisTestHelper(); |
| 109 serverChannel = new MockServerChannel(); | |
| 24 server = new AnalysisServer(serverChannel, resourceProvider); | 110 server = new AnalysisServer(serverChannel, resourceProvider); |
| 25 handler = new AnalysisDomainHandler(server); | 111 handler = new AnalysisDomainHandler(server); |
| 26 }); | 112 }); |
| 27 | 113 |
| 114 group('notification.errors', () { | |
| 115 testNotificationErrors(); | |
|
Brian Wilkerson
2014/05/28 14:25:21
Why are these tests in a separate method? And if t
scheglov
2014/05/28 15:46:37
I want to start structuring tests.
It seems that d
| |
| 116 }); | |
| 117 | |
| 28 group('AnalysisDomainHandler', () { | 118 group('AnalysisDomainHandler', () { |
| 29 test('getFixes', () { | 119 test('getFixes', () { |
| 30 var request = new Request('0', AnalysisDomainHandler.GET_FIXES_METHOD); | 120 var request = new Request('0', AnalysisDomainHandler.GET_FIXES_METHOD); |
| 31 request.setParameter(AnalysisDomainHandler.ERRORS_PARAM, []); | 121 request.setParameter(AnalysisDomainHandler.ERRORS_PARAM, []); |
| 32 var response = handler.handleRequest(request); | 122 var response = handler.handleRequest(request); |
| 33 // TODO(scheglov) implement | 123 // TODO(scheglov) implement |
| 34 expect(response, isNull); | 124 expect(response, isNull); |
| 35 }); | 125 }); |
| 36 | 126 |
| 37 test('getMinorRefactorings', () { | 127 test('getMinorRefactorings', () { |
| (...skipping 27 matching lines...) Expand all Loading... | |
| 65 resourceProvider.newFolder('/project'); | 155 resourceProvider.newFolder('/project'); |
| 66 resourceProvider.newFile('/project/pubspec.yaml', 'name: project'); | 156 resourceProvider.newFile('/project/pubspec.yaml', 'name: project'); |
| 67 resourceProvider.newFile('/project/bin/test.dart', 'main() {}'); | 157 resourceProvider.newFile('/project/bin/test.dart', 'main() {}'); |
| 68 request.setParameter( | 158 request.setParameter( |
| 69 AnalysisDomainHandler.INCLUDED_PARAM, | 159 AnalysisDomainHandler.INCLUDED_PARAM, |
| 70 ['/project']); | 160 ['/project']); |
| 71 var response = handler.handleRequest(request); | 161 var response = handler.handleRequest(request); |
| 72 var serverRef = server; | 162 var serverRef = server; |
| 73 expect(response, isResponseSuccess('0')); | 163 expect(response, isResponseSuccess('0')); |
| 74 // verify that unit is resolved eventually | 164 // verify that unit is resolved eventually |
| 75 return pumpEventQueue(1000).then((_) { | 165 return waitForServerTasksFinished(server).then((_) { |
| 76 var unit = serverRef.test_getResolvedCompilationUnit('/project/bin/t est.dart'); | 166 var unit = serverRef.test_getResolvedCompilationUnit('/project/bin/t est.dart'); |
| 77 expect(unit, isNotNull); | 167 expect(unit, isNotNull); |
| 78 }); | 168 }); |
| 79 }); | 169 }); |
| 80 }); | 170 }); |
| 81 }); | 171 }); |
| 82 | 172 |
| 83 test('setPriorityFiles', () { | 173 test('setPriorityFiles', () { |
| 84 var request = new Request('0', AnalysisDomainHandler.SET_PRIORITY_FILES_ME THOD); | 174 var request = new Request('0', AnalysisDomainHandler.SET_PRIORITY_FILES_ME THOD); |
| 85 request.setParameter( | 175 request.setParameter( |
| (...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 136 request.setParameter( | 226 request.setParameter( |
| 137 AnalysisDomainHandler.REMOVED_PARAM, | 227 AnalysisDomainHandler.REMOVED_PARAM, |
| 138 ['/dart/sdk-1.2']); | 228 ['/dart/sdk-1.2']); |
| 139 request.setParameter(AnalysisDomainHandler.DEFAULT_PARAM, '/dart/sdk-1.4') ; | 229 request.setParameter(AnalysisDomainHandler.DEFAULT_PARAM, '/dart/sdk-1.4') ; |
| 140 var response = handler.handleRequest(request); | 230 var response = handler.handleRequest(request); |
| 141 // TODO(scheglov) implement | 231 // TODO(scheglov) implement |
| 142 expect(response, isNull); | 232 expect(response, isNull); |
| 143 }); | 233 }); |
| 144 }); | 234 }); |
| 145 } | 235 } |
| 236 | |
| 237 | |
| 238 testNotificationErrors() { | |
| 239 AnalysisTestHelper helper; | |
| 240 | |
| 241 setUp(() { | |
| 242 helper = new AnalysisTestHelper(); | |
| 243 }); | |
| 244 | |
| 245 test('ParserErrorCode', () { | |
| 246 helper.createSingleFileProject('library lib'); | |
| 247 return helper.waitForTasksFinished().then((_) { | |
| 248 List<AnalysisError> errors = helper.getTestErrors(); | |
| 249 expect(errors, hasLength(1)); | |
| 250 AnalysisError error = errors[0]; | |
| 251 expect(error.file, '/project/bin/test.dart'); | |
| 252 expect(error.errorCode, 'ParserErrorCode.EXPECTED_TOKEN'); | |
| 253 expect(error.offset, isPositive); | |
| 254 expect(error.length, isNonNegative); | |
| 255 expect(error.message, isNotNull); | |
| 256 }); | |
| 257 }); | |
| 258 | |
| 259 test('StaticWarningCode', () { | |
| 260 helper.createSingleFileProject([ | |
| 261 'main() {', | |
| 262 ' print(unknown);', | |
| 263 '}']); | |
| 264 return helper.waitForTasksFinished().then((_) { | |
| 265 List<AnalysisError> errors = helper.getTestErrors(); | |
| 266 expect(errors, hasLength(1)); | |
| 267 AnalysisError error = errors[0]; | |
| 268 expect(error.errorCode, 'StaticWarningCode.UNDEFINED_IDENTIFIER'); | |
| 269 }); | |
| 270 }); | |
| 271 } | |
| 272 | |
| 273 | |
| 274 class AnalysisError { | |
| 275 final String file; | |
| 276 final String errorCode; | |
| 277 final int offset; | |
| 278 final int length; | |
| 279 final String message; | |
| 280 final String correction; | |
| 281 AnalysisError(this.file, this.errorCode, this.offset, this.length, | |
| 282 this.message, this.correction); | |
| 283 | |
| 284 @override | |
| 285 String toString() { | |
| 286 return 'NotificationError(file=$file; errorCode=$errorCode; ' | |
| 287 'offset=$offset; length=$length; message=$message)'; | |
| 288 } | |
| 289 } | |
| 290 | |
| 291 | |
| 292 AnalysisError jsonToAnalysisError(Map<String, Object> json) { | |
| 293 return new AnalysisError( | |
| 294 json['file'], | |
| 295 json['errorCode'], | |
| 296 json['offset'], | |
| 297 json['length'], | |
| 298 json['message'], | |
| 299 json['correction']); | |
| 300 } | |
| OLD | NEW |