| 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'; | 7 import 'dart:async'; |
| 8 | 8 |
| 9 import 'package:analysis_server/src/analysis_server.dart'; | 9 import 'package:analysis_server/src/analysis_server.dart'; |
| 10 import 'package:analysis_server/src/constants.dart'; |
| 10 import 'package:analysis_server/src/computers.dart'; | 11 import 'package:analysis_server/src/computers.dart'; |
| 11 import 'package:analysis_server/src/domain_analysis.dart'; | 12 import 'package:analysis_server/src/domain_analysis.dart'; |
| 12 import 'package:analysis_server/src/protocol.dart'; | 13 import 'package:analysis_server/src/protocol.dart'; |
| 13 import 'package:analysis_server/src/resource.dart'; | 14 import 'package:analysis_server/src/resource.dart'; |
| 14 import 'package:unittest/unittest.dart'; | 15 import 'package:unittest/unittest.dart'; |
| 15 | 16 |
| 16 import 'mocks.dart'; | 17 import 'mocks.dart'; |
| 17 | 18 |
| 18 | 19 |
| 19 main() { | 20 main() { |
| 20 groupSep = ' | '; | 21 groupSep = ' | '; |
| 21 | 22 |
| 22 MockServerChannel serverChannel; | 23 MockServerChannel serverChannel; |
| 23 AnalysisServer server; | 24 AnalysisServer server; |
| 24 AnalysisDomainHandler handler; | 25 AnalysisDomainHandler handler; |
| 25 MemoryResourceProvider resourceProvider = new MemoryResourceProvider(); | 26 MemoryResourceProvider resourceProvider = new MemoryResourceProvider(); |
| 26 | 27 |
| 27 setUp(() { | 28 setUp(() { |
| 28 serverChannel = new MockServerChannel(); | 29 serverChannel = new MockServerChannel(); |
| 29 server = new AnalysisServer(serverChannel, resourceProvider); | 30 server = new AnalysisServer(serverChannel, resourceProvider); |
| 30 handler = new AnalysisDomainHandler(server); | 31 handler = new AnalysisDomainHandler(server); |
| 31 }); | 32 }); |
| 32 | 33 |
| 33 group('notification.errors', testNotificationErrors); | 34 group('notification.errors', testNotificationErrors); |
| 34 group('notification.highlights', testNotificationHighlights); | 35 group('notification.highlights', testNotificationHighlights); |
| 35 group('updateContent', testUpdateContent); | 36 group('updateContent', testUpdateContent); |
| 36 | 37 |
| 37 group('AnalysisDomainHandler', () { | 38 group('AnalysisDomainHandler', () { |
| 38 test('getFixes', () { | 39 test('getFixes', () { |
| 39 var request = new Request('0', AnalysisDomainHandler.GET_FIXES_METHOD); | 40 var request = new Request('0', METHOD_GET_FIXES); |
| 40 request.setParameter(AnalysisDomainHandler.ERRORS_PARAM, []); | 41 request.setParameter(ERRORS, []); |
| 41 var response = handler.handleRequest(request); | 42 var response = handler.handleRequest(request); |
| 42 // TODO(scheglov) implement | 43 // TODO(scheglov) implement |
| 43 expect(response, isNull); | 44 expect(response, isNull); |
| 44 }); | 45 }); |
| 45 | 46 |
| 46 test('getMinorRefactorings', () { | 47 test('getMinorRefactorings', () { |
| 47 var request = new Request('0', AnalysisDomainHandler.GET_MINOR_REFACTORING
S_METHOD); | 48 var request = new Request('0', METHOD_GET_MINOR_REFACTORINGS); |
| 48 request.setParameter(AnalysisDomainHandler.FILE_PARAM, 'test.dart'); | 49 request.setParameter(FILE, 'test.dart'); |
| 49 request.setParameter(AnalysisDomainHandler.OFFSET_PARAM, 10); | 50 request.setParameter(OFFSET, 10); |
| 50 request.setParameter(AnalysisDomainHandler.LENGTH_PARAM, 20); | 51 request.setParameter(LENGTH, 20); |
| 51 var response = handler.handleRequest(request); | 52 var response = handler.handleRequest(request); |
| 52 // TODO(scheglov) implement | 53 // TODO(scheglov) implement |
| 53 expect(response, isNull); | 54 expect(response, isNull); |
| 54 }); | 55 }); |
| 55 | 56 |
| 56 group('setAnalysisRoots', () { | 57 group('setAnalysisRoots', () { |
| 57 Request request; | 58 Request request; |
| 58 | 59 |
| 59 setUp(() { | 60 setUp(() { |
| 60 request = new Request('0', AnalysisDomainHandler.SET_ANALYSIS_ROOTS_METH
OD); | 61 request = new Request('0', METHOD_SET_ANALYSIS_ROOTS); |
| 61 request.setParameter(AnalysisDomainHandler.INCLUDED_PARAM, []); | 62 request.setParameter(INCLUDED, []); |
| 62 request.setParameter(AnalysisDomainHandler.EXCLUDED_PARAM, []); | 63 request.setParameter(EXCLUDED, []); |
| 63 }); | 64 }); |
| 64 | 65 |
| 65 test('excluded', () { | 66 test('excluded', () { |
| 66 request.setParameter(AnalysisDomainHandler.EXCLUDED_PARAM, ['foo']); | 67 request.setParameter(EXCLUDED, ['foo']); |
| 67 // TODO(scheglov) implement | 68 // TODO(scheglov) implement |
| 68 var response = handler.handleRequest(request); | 69 var response = handler.handleRequest(request); |
| 69 expect(response, isResponseFailure('0')); | 70 expect(response, isResponseFailure('0')); |
| 70 }); | 71 }); |
| 71 | 72 |
| 72 group('included', () { | 73 group('included', () { |
| 73 test('new folder', () { | 74 test('new folder', () { |
| 74 resourceProvider.newFolder('/project'); | 75 resourceProvider.newFolder('/project'); |
| 75 resourceProvider.newFile('/project/pubspec.yaml', 'name: project'); | 76 resourceProvider.newFile('/project/pubspec.yaml', 'name: project'); |
| 76 resourceProvider.newFile('/project/bin/test.dart', 'main() {}'); | 77 resourceProvider.newFile('/project/bin/test.dart', 'main() {}'); |
| 77 request.setParameter( | 78 request.setParameter( |
| 78 AnalysisDomainHandler.INCLUDED_PARAM, | 79 INCLUDED, |
| 79 ['/project']); | 80 ['/project']); |
| 80 var response = handler.handleRequest(request); | 81 var response = handler.handleRequest(request); |
| 81 var serverRef = server; | 82 var serverRef = server; |
| 82 expect(response, isResponseSuccess('0')); | 83 expect(response, isResponseSuccess('0')); |
| 83 // verify that unit is resolved eventually | 84 // verify that unit is resolved eventually |
| 84 return waitForServerTasksFinished(server).then((_) { | 85 return waitForServerTasksFinished(server).then((_) { |
| 85 var unit = serverRef.test_getResolvedCompilationUnit('/project/bin/t
est.dart'); | 86 var unit = serverRef.test_getResolvedCompilationUnit('/project/bin/t
est.dart'); |
| 86 expect(unit, isNotNull); | 87 expect(unit, isNotNull); |
| 87 }); | 88 }); |
| 88 }); | 89 }); |
| 89 }); | 90 }); |
| 90 }); | 91 }); |
| 91 | 92 |
| 92 test('setPriorityFiles', () { | 93 test('setPriorityFiles', () { |
| 93 var request = new Request('0', AnalysisDomainHandler.SET_PRIORITY_FILES_ME
THOD); | 94 var request = new Request('0', METHOD_SET_PRIORITY_FILES); |
| 94 request.setParameter( | 95 request.setParameter( |
| 95 AnalysisDomainHandler.FILES_PARAM, | 96 FILES, |
| 96 ['projectA/aa.dart', 'projectB/ba.dart']); | 97 ['projectA/aa.dart', 'projectB/ba.dart']); |
| 97 var response = handler.handleRequest(request); | 98 var response = handler.handleRequest(request); |
| 98 // TODO(scheglov) implement | 99 // TODO(scheglov) implement |
| 99 expect(response, isNull); | 100 expect(response, isNull); |
| 100 }); | 101 }); |
| 101 | 102 |
| 102 test('setSubscriptions', () { | 103 test('setSubscriptions', () { |
| 103 var request = new Request('0', AnalysisDomainHandler.SET_SUBSCRIPTIONS_MET
HOD); | 104 var request = new Request('0', METHOD_SET_SUBSCRIPTIONS); |
| 104 request.setParameter( | 105 request.setParameter( |
| 105 AnalysisDomainHandler.SUBSCRIPTIONS_PARAM, | 106 SUBSCRIPTIONS, |
| 106 { | 107 { |
| 107 AnalysisService.HIGHLIGHTS : ['project/a.dart', 'project/b.dart'], | 108 AnalysisService.HIGHLIGHTS : ['project/a.dart', 'project/b.dart'], |
| 108 AnalysisService.NAVIGATION : ['project/c.dart'], | 109 AnalysisService.NAVIGATION : ['project/c.dart'], |
| 109 AnalysisService.OUTLINE : ['project/d.dart', 'project/e.dart'] | 110 AnalysisService.OUTLINE : ['project/d.dart', 'project/e.dart'] |
| 110 }); | 111 }); |
| 111 var response = handler.handleRequest(request); | 112 var response = handler.handleRequest(request); |
| 112 // TODO(scheglov) implement | 113 // TODO(scheglov) implement |
| 113 expect(response, isNull); | 114 expect(response, isNull); |
| 114 }); | 115 }); |
| 115 | 116 |
| 116 test('updateOptions', () { | 117 test('updateOptions', () { |
| 117 var request = new Request('0', AnalysisDomainHandler.UPDATE_OPTIONS_METHOD
); | 118 var request = new Request('0', METHOD_UPDATE_OPTIONS); |
| 118 request.setParameter( | 119 request.setParameter( |
| 119 AnalysisDomainHandler.OPTIONS_PARAM, | 120 OPTIONS, |
| 120 { | 121 { |
| 121 'analyzeAngular' : true, | 122 'analyzeAngular' : true, |
| 122 'enableDeferredLoading': true, | 123 'enableDeferredLoading': true, |
| 123 'enableEnums': false | 124 'enableEnums': false |
| 124 }); | 125 }); |
| 125 var response = handler.handleRequest(request); | 126 var response = handler.handleRequest(request); |
| 126 // TODO(scheglov) implement | 127 // TODO(scheglov) implement |
| 127 expect(response, isNull); | 128 expect(response, isNull); |
| 128 }); | 129 }); |
| 129 | 130 |
| 130 test('updateSdks', () { | 131 test('updateSdks', () { |
| 131 var request = new Request('0', AnalysisDomainHandler.UPDATE_SDKS_METHOD); | 132 var request = new Request('0', METHOD_UPDATE_SDKS); |
| 132 request.setParameter( | 133 request.setParameter( |
| 133 AnalysisDomainHandler.ADDED_PARAM, | 134 ADDED, |
| 134 ['/dart/sdk-1.3', '/dart/sdk-1.4']); | 135 ['/dart/sdk-1.3', '/dart/sdk-1.4']); |
| 135 request.setParameter( | 136 request.setParameter( |
| 136 AnalysisDomainHandler.REMOVED_PARAM, | 137 REMOVED, |
| 137 ['/dart/sdk-1.2']); | 138 ['/dart/sdk-1.2']); |
| 138 request.setParameter(AnalysisDomainHandler.DEFAULT_PARAM, '/dart/sdk-1.4')
; | 139 request.setParameter(DEFAULT, '/dart/sdk-1.4'); |
| 139 var response = handler.handleRequest(request); | 140 var response = handler.handleRequest(request); |
| 140 // TODO(scheglov) implement | 141 // TODO(scheglov) implement |
| 141 expect(response, isNull); | 142 expect(response, isNull); |
| 142 }); | 143 }); |
| 143 }); | 144 }); |
| 144 } | 145 } |
| 145 | 146 |
| 146 | 147 |
| 147 class AnalysisError { | 148 class AnalysisError { |
| 148 final String file; | 149 final String file; |
| (...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 189 String testCode; | 190 String testCode; |
| 190 | 191 |
| 191 AnalysisTestHelper() { | 192 AnalysisTestHelper() { |
| 192 serverChannel = new MockServerChannel(); | 193 serverChannel = new MockServerChannel(); |
| 193 resourceProvider = new MemoryResourceProvider(); | 194 resourceProvider = new MemoryResourceProvider(); |
| 194 server = new AnalysisServer(serverChannel, resourceProvider); | 195 server = new AnalysisServer(serverChannel, resourceProvider); |
| 195 handler = new AnalysisDomainHandler(server); | 196 handler = new AnalysisDomainHandler(server); |
| 196 // listen for notifications | 197 // listen for notifications |
| 197 Stream<Notification> notificationStream = serverChannel.notificationControll
er.stream; | 198 Stream<Notification> notificationStream = serverChannel.notificationControll
er.stream; |
| 198 notificationStream.listen((Notification notification) { | 199 notificationStream.listen((Notification notification) { |
| 199 if (notification.event == AnalysisDomainHandler.ERRORS_NOTIFICATION) { | 200 if (notification.event == NOTIFICATION_ERRORS) { |
| 200 String file = notification.getParameter(AnalysisServer.FILE_PARAM); | 201 String file = notification.getParameter(FILE); |
| 201 List<Map<String, Object>> errorMaps = notification.getParameter(Analysis
Server.ERRORS_PARAM); | 202 List<Map<String, Object>> errorMaps = notification.getParameter(ERRORS); |
| 202 filesErrors[file] = errorMaps.map(jsonToAnalysisError).toList(); | 203 filesErrors[file] = errorMaps.map(jsonToAnalysisError).toList(); |
| 203 } | 204 } |
| 204 if (notification.event == AnalysisDomainHandler.HIGHLIGHTS_NOTIFICATION) { | 205 if (notification.event == NOTIFICATION_HIGHLIGHTS) { |
| 205 String file = notification.getParameter(AnalysisServer.FILE_PARAM); | 206 String file = notification.getParameter(FILE); |
| 206 filesHighlights[file] = notification.getParameter(AnalysisDomainHandler.
REGIONS_PARAM); | 207 filesHighlights[file] = notification.getParameter(REGIONS); |
| 207 } | 208 } |
| 208 }); | 209 }); |
| 209 } | 210 } |
| 210 | 211 |
| 211 /** | 212 /** |
| 212 * Returns a [Future] that completes when this this helper finished all its | 213 * Returns a [Future] that completes when this this helper finished all its |
| 213 * scheduled tasks. | 214 * scheduled tasks. |
| 214 */ | 215 */ |
| 215 Future waitForTasksFinished() { | 216 Future waitForTasksFinished() { |
| 216 return waitForServerTasksFinished(server); | 217 return waitForServerTasksFinished(server); |
| (...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 258 | 259 |
| 259 /** | 260 /** |
| 260 * Creates a project with a single Dart file `/project/bin/test.dart` with | 261 * Creates a project with a single Dart file `/project/bin/test.dart` with |
| 261 * the given [code]. | 262 * the given [code]. |
| 262 */ | 263 */ |
| 263 void createSingleFileProject(code) { | 264 void createSingleFileProject(code) { |
| 264 this.testCode = _getCodeString(code); | 265 this.testCode = _getCodeString(code); |
| 265 resourceProvider.newFolder('/project'); | 266 resourceProvider.newFolder('/project'); |
| 266 resourceProvider.newFile('/project/pubspec.yaml', 'name: project'); | 267 resourceProvider.newFile('/project/pubspec.yaml', 'name: project'); |
| 267 resourceProvider.newFile(testFile, testCode); | 268 resourceProvider.newFile(testFile, testCode); |
| 268 Request request = new Request('0', AnalysisDomainHandler.SET_ANALYSIS_ROOTS_
METHOD); | 269 Request request = new Request('0', METHOD_SET_ANALYSIS_ROOTS); |
| 269 request.setParameter(AnalysisDomainHandler.INCLUDED_PARAM, ['/project']); | 270 request.setParameter(INCLUDED, ['/project']); |
| 270 request.setParameter(AnalysisDomainHandler.EXCLUDED_PARAM, []); | 271 request.setParameter(EXCLUDED, []); |
| 271 handleSuccessfulRequest(request); | 272 handleSuccessfulRequest(request); |
| 272 } | 273 } |
| 273 | 274 |
| 274 void setFileContent(String path, String content) { | 275 void setFileContent(String path, String content) { |
| 275 resourceProvider.newFile(path, content); | 276 resourceProvider.newFile(path, content); |
| 276 } | 277 } |
| 277 | 278 |
| 278 /** | 279 /** |
| 279 * Validates that the given [request] is handled successfully. | 280 * Validates that the given [request] is handled successfully. |
| 280 */ | 281 */ |
| (...skipping 790 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1071 testUpdateContent() { | 1072 testUpdateContent() { |
| 1072 test('full content', () { | 1073 test('full content', () { |
| 1073 AnalysisTestHelper helper = new AnalysisTestHelper(); | 1074 AnalysisTestHelper helper = new AnalysisTestHelper(); |
| 1074 helper.createSingleFileProject('// empty'); | 1075 helper.createSingleFileProject('// empty'); |
| 1075 return helper.waitForTasksFinished().then((_) { | 1076 return helper.waitForTasksFinished().then((_) { |
| 1076 // no errors initially | 1077 // no errors initially |
| 1077 List<AnalysisError> errors = helper.getTestErrors(); | 1078 List<AnalysisError> errors = helper.getTestErrors(); |
| 1078 expect(errors, isEmpty); | 1079 expect(errors, isEmpty); |
| 1079 // update code | 1080 // update code |
| 1080 { | 1081 { |
| 1081 Request request = new Request('0', AnalysisDomainHandler.UPDATE_CONTENT_
METHOD); | 1082 Request request = new Request('0', METHOD_UPDATE_CONTENT); |
| 1082 request.setParameter('files', | 1083 request.setParameter('files', |
| 1083 { | 1084 { |
| 1084 helper.testFile : { | 1085 helper.testFile : { |
| 1085 AnalysisDomainHandler.CONTENT_PARAM : 'library lib' | 1086 CONTENT : 'library lib' |
| 1086 } | 1087 } |
| 1087 }); | 1088 }); |
| 1088 helper.handleSuccessfulRequest(request); | 1089 helper.handleSuccessfulRequest(request); |
| 1089 } | 1090 } |
| 1090 // wait, there is an error | 1091 // wait, there is an error |
| 1091 helper.waitForTasksFinished().then((_) { | 1092 helper.waitForTasksFinished().then((_) { |
| 1092 List<AnalysisError> errors = helper.getTestErrors(); | 1093 List<AnalysisError> errors = helper.getTestErrors(); |
| 1093 expect(errors, hasLength(1)); | 1094 expect(errors, hasLength(1)); |
| 1094 }); | 1095 }); |
| 1095 }); | 1096 }); |
| 1096 }); | 1097 }); |
| 1097 | 1098 |
| 1098 test('incremental', () { | 1099 test('incremental', () { |
| 1099 AnalysisTestHelper helper = new AnalysisTestHelper(); | 1100 AnalysisTestHelper helper = new AnalysisTestHelper(); |
| 1100 helper.createSingleFileProject('library A;'); | 1101 helper.createSingleFileProject('library A;'); |
| 1101 return helper.waitForTasksFinished().then((_) { | 1102 return helper.waitForTasksFinished().then((_) { |
| 1102 // no errors initially | 1103 // no errors initially |
| 1103 List<AnalysisError> errors = helper.getTestErrors(); | 1104 List<AnalysisError> errors = helper.getTestErrors(); |
| 1104 expect(errors, isEmpty); | 1105 expect(errors, isEmpty); |
| 1105 // update code | 1106 // update code |
| 1106 { | 1107 { |
| 1107 Request request = new Request('0', AnalysisDomainHandler.UPDATE_CONTENT_
METHOD); | 1108 Request request = new Request('0', METHOD_UPDATE_CONTENT); |
| 1108 request.setParameter('files', | 1109 request.setParameter('files', |
| 1109 { | 1110 { |
| 1110 helper.testFile : { | 1111 helper.testFile : { |
| 1111 AnalysisDomainHandler.CONTENT_PARAM : 'library lib', | 1112 CONTENT : 'library lib', |
| 1112 AnalysisDomainHandler.OFFSET_PARAM : 'library '.length, | 1113 OFFSET : 'library '.length, |
| 1113 AnalysisDomainHandler.OLD_LENGTH_PARAM : 'A;'.length, | 1114 OLD_LENGTH : 'A;'.length, |
| 1114 AnalysisDomainHandler.NEW_LENGTH_PARAM : 'lib'.length, | 1115 NEW_LENGTH : 'lib'.length, |
| 1115 } | 1116 } |
| 1116 }); | 1117 }); |
| 1117 helper.handleSuccessfulRequest(request); | 1118 helper.handleSuccessfulRequest(request); |
| 1118 } | 1119 } |
| 1119 // wait, there is an error | 1120 // wait, there is an error |
| 1120 helper.waitForTasksFinished().then((_) { | 1121 helper.waitForTasksFinished().then((_) { |
| 1121 List<AnalysisError> errors = helper.getTestErrors(); | 1122 List<AnalysisError> errors = helper.getTestErrors(); |
| 1122 expect(errors, hasLength(1)); | 1123 expect(errors, hasLength(1)); |
| 1123 }); | 1124 }); |
| 1124 }); | 1125 }); |
| 1125 }); | 1126 }); |
| 1126 } | 1127 } |
| OLD | NEW |