Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(418)

Side by Side Diff: pkg/analysis_server/test/domain_analysis_test.dart

Issue 307533004: Send 'notification.errors' for all non-SDK files. (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: Created 6 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
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
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
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 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698