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

Side by Side Diff: pkg/analyzer/test/src/task/dart_test.dart

Issue 994293002: Task: Build Library Element Model (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: Updates for review comments. Created 5 years, 9 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
« no previous file with comments | « pkg/analyzer/lib/task/dart.dart ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2015, the Dart project authors. Please see the AUTHORS file 1 // Copyright (c) 2015, 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.src.task.dart_test; 5 library test.src.task.dart_test;
6 6
7 import 'package:analyzer/file_system/file_system.dart';
8 import 'package:analyzer/file_system/memory_file_system.dart';
9 import 'package:analyzer/src/context/cache.dart';
10 import 'package:analyzer/src/generated/ast.dart';
11 import 'package:analyzer/src/generated/element.dart';
7 import 'package:analyzer/src/generated/engine.dart' 12 import 'package:analyzer/src/generated/engine.dart'
8 hide AnalysisTask, ParseDartTask, ScanDartTask; 13 hide AnalysisTask, ParseDartTask, ScanDartTask;
14 import 'package:analyzer/src/generated/error.dart';
15 import 'package:analyzer/src/generated/resolver.dart';
16 import 'package:analyzer/src/generated/sdk.dart';
9 import 'package:analyzer/src/generated/source.dart'; 17 import 'package:analyzer/src/generated/source.dart';
18 import 'package:analyzer/src/generated/testing/ast_factory.dart';
10 import 'package:analyzer/src/task/dart.dart'; 19 import 'package:analyzer/src/task/dart.dart';
20 import 'package:analyzer/src/task/driver.dart';
11 import 'package:analyzer/task/dart.dart'; 21 import 'package:analyzer/task/dart.dart';
12 import 'package:analyzer/task/general.dart'; 22 import 'package:analyzer/task/general.dart';
13 import 'package:analyzer/task/model.dart'; 23 import 'package:analyzer/task/model.dart';
24 import 'package:typed_mock/typed_mock.dart';
14 import 'package:unittest/unittest.dart'; 25 import 'package:unittest/unittest.dart';
15 26
16 import '../../generated/resolver_test.dart'; 27 import '../../generated/resolver_test.dart';
17 import '../../generated/test_support.dart'; 28 import '../../generated/test_support.dart';
18 import '../../reflective_tests.dart'; 29 import '../../reflective_tests.dart';
19 30
20 main() { 31 main() {
21 groupSep = ' | '; 32 groupSep = ' | ';
22 runReflectiveTests(BuildCompilationUnitElementTaskTest); 33 runReflectiveTests(BuildCompilationUnitElementTaskTest);
34 runReflectiveTests(BuildLibraryElementTaskTest);
23 runReflectiveTests(ParseDartTaskTest); 35 runReflectiveTests(ParseDartTaskTest);
24 runReflectiveTests(ScanDartTaskTest); 36 runReflectiveTests(ScanDartTaskTest);
25 } 37 }
26 38
27 @reflectiveTest 39 @reflectiveTest
28 class BuildCompilationUnitElementTaskTest extends EngineTestCase { 40 class BuildCompilationUnitElementTaskTest extends EngineTestCase {
29 test_buildInputs() { 41 test_buildInputs() {
30 AnalysisTarget target = new TestSource(); 42 AnalysisTarget target = new TestSource();
31 Map<String, TaskInput> inputs = 43 Map<String, TaskInput> inputs =
32 BuildCompilationUnitElementTask.buildInputs(target); 44 BuildCompilationUnitElementTask.buildInputs(target);
(...skipping 73 matching lines...) Expand 10 before | Expand all | Expand 10 after
106 BuildCompilationUnitElementTask.PARSED_UNIT_INPUT_NAME: 118 BuildCompilationUnitElementTask.PARSED_UNIT_INPUT_NAME:
107 parseOutputs[PARSED_UNIT] 119 parseOutputs[PARSED_UNIT]
108 }; 120 };
109 buildTask.perform(); 121 buildTask.perform();
110 122
111 return buildTask; 123 return buildTask;
112 } 124 }
113 } 125 }
114 126
115 @reflectiveTest 127 @reflectiveTest
128 class BuildLibraryElementTaskTest extends EngineTestCase {
129 MemoryResourceProvider resourceProvider = new MemoryResourceProvider();
130 InternalAnalysisContext context = AnalysisContextFactory.contextWithCore();
131
132 Source librarySource;
133 CompilationUnit libraryUnit;
134 CompilationUnitElement libraryUnitElement;
135 List<CompilationUnit> partUnits;
136
137 BuildLibraryElementTask task;
138 Map<ResultDescriptor<dynamic>, dynamic> outputs;
139 LibraryElement libraryElement;
140
141 void setUp() {
142 DartSdk sdk = context.sourceFactory.dartSdk;
143 context.sourceFactory = new SourceFactory(<UriResolver>[
144 new DartUriResolver(sdk),
145 new ResourceUriResolver(resourceProvider)
146 ]);
147 }
148
149 test_buildInputs() {
150 ExtendedAnalysisContext context = new _MockContext();
151 // prepare sources
152 File libraryFile = resourceProvider.newFile('/lib.dart', '');
153 File partFile1 = resourceProvider.newFile('/part1.dart', '');
154 File partFile2 = resourceProvider.newFile('/part2.dart', '');
155 Source librarySource = libraryFile.createSource();
156 Source partSource1 = partFile1.createSource();
157 Source partSource2 = partFile2.createSource();
158 // set INCLUDED_PARTS
159 context.getCacheEntry(librarySource).setValue(
160 INCLUDED_PARTS, <Source>[partSource1, partSource2]);
161 // set BUILT_UNIT
162 CompilationUnit libraryUnit = AstFactory.compilationUnit();
163 CompilationUnit partUnit1 = AstFactory.compilationUnit();
164 CompilationUnit partUnit2 = AstFactory.compilationUnit();
165 context.getCacheEntry(librarySource).setValue(BUILT_UNIT, libraryUnit);
166 context.getCacheEntry(partSource1).setValue(BUILT_UNIT, partUnit1);
167 context.getCacheEntry(partSource2).setValue(BUILT_UNIT, partUnit2);
168 // request inputs
169 WorkItem workItem = new WorkItem(
170 context, librarySource, BuildLibraryElementTask.DESCRIPTOR);
171 workItem.gatherInputs(null);
172 Map<String, dynamic> inputs = workItem.inputs;
173 expect(inputs, hasLength(2));
174 expect(inputs[BuildLibraryElementTask.DEFINING_BUILT_UNIT_INPUT_NAME],
175 libraryUnit);
176 expect(inputs[BuildLibraryElementTask.PART_BUILT_UNITS_INPUT_NAME],
177 unorderedEquals([partUnit1, partUnit2]));
178 }
179
180 test_constructor() {
181 AnalysisTarget target = new TestSource();
182 BuildLibraryElementTask task = new BuildLibraryElementTask(context, target);
183 expect(task, isNotNull);
184 expect(task.context, context);
185 expect(task.target, target);
186 }
187
188 test_createTask() {
189 AnalysisTarget target = new TestSource();
190 BuildLibraryElementTask task =
191 BuildLibraryElementTask.createTask(context, target);
192 expect(task, isNotNull);
193 expect(task.context, context);
194 expect(task.target, target);
195 }
196
197 test_description() {
198 AnalysisTarget target = new TestSource();
199 BuildLibraryElementTask task = new BuildLibraryElementTask(null, target);
200 expect(task.description, isNotNull);
201 }
202
203 test_descriptor() {
204 TaskDescriptor descriptor = BuildLibraryElementTask.DESCRIPTOR;
205 expect(descriptor, isNotNull);
206 }
207
208 test_perform() {
209 _performBuildTask({
210 '/lib.dart': '''
211 library lib;
212 part 'part1.dart';
213 part 'part2.dart';
214 ''',
215 '/part1.dart': '''
216 part of lib;
217 ''',
218 '/part2.dart': '''
219 part of lib;
220 '''
221 });
222 expect(task.caughtException, isNull);
223 expect(outputs, hasLength(4));
224 // simple outputs
225 expect(outputs[BUILD_LIBRARY_ERRORS], isEmpty);
226 expect(outputs[IS_LAUNCHABLE], isFalse);
227 expect(outputs[HAS_HTML_IMPORT], isFalse);
228 // LibraryElement output
229 expect(libraryElement, isNotNull);
230 expect(libraryElement.entryPoint, isNull);
231 expect(libraryElement.source, same(librarySource));
232 expect(libraryElement.definingCompilationUnit, libraryUnitElement);
233 expect(libraryElement.parts,
234 unorderedEquals([partUnits[0].element, partUnits[1].element]));
235 // LibraryElement references
236 expect((libraryUnit.directives[0] as LibraryDirective).element,
237 same(libraryElement));
238 expect((partUnits[0].directives[0] as PartOfDirective).element,
239 same(libraryElement));
240 expect((partUnits[1].directives[0] as PartOfDirective).element,
241 same(libraryElement));
242 // CompilationUnitElement(s)
243 {
244 CompilationUnitElement unitElement = partUnits[0].element;
245 expect(unitElement.uri, 'part1.dart');
246 expect(unitElement.uriOffset, 18);
247 expect(unitElement.uriEnd, 30);
248 expect((libraryUnit.directives[1] as PartDirective).element,
249 same(unitElement));
250 }
251 {
252 CompilationUnitElement unitElement = partUnits[1].element;
253 expect(unitElement.uri, 'part2.dart');
254 expect(unitElement.uriOffset, 37);
255 expect(unitElement.uriEnd, 49);
256 expect((libraryUnit.directives[2] as PartDirective).element,
257 same(unitElement));
258 }
259 }
260
261 test_perform_error_missingLibraryDirectiveWithPart() {
262 _performBuildTask({
263 '/lib.dart': '''
264 part 'part.dart';
265 ''',
266 '/part.dart': '''
267 part of lib;
268 '''
269 });
270 expect(task.caughtException, isNull);
271 _assertErrorsWithCodes(
272 [ResolverErrorCode.MISSING_LIBRARY_DIRECTIVE_WITH_PART]);
273 }
274
275 test_perform_error_partOfDifferentLibrary() {
276 _performBuildTask({
277 '/lib.dart': '''
278 library lib;
279 part 'part.dart';
280 ''',
281 '/part.dart': '''
282 part of someOtherLib;
283 '''
284 });
285 expect(task.caughtException, isNull);
286 _assertErrorsWithCodes([StaticWarningCode.PART_OF_DIFFERENT_LIBRARY]);
287 }
288
289 test_perform_error_partOfNonPart() {
290 _performBuildTask({
291 '/lib.dart': '''
292 library lib;
293 part 'part.dart';
294 ''',
295 '/part.dart': '''
296 // no part of
297 '''
298 });
299 expect(task.caughtException, isNull);
300 _assertErrorsWithCodes([CompileTimeErrorCode.PART_OF_NON_PART]);
301 }
302
303 test_perform_hasHtmlImport() {
304 _performBuildTask({
305 '/lib.dart': '''
306 import 'dart:html';
307 '''
308 });
309 expect(outputs[HAS_HTML_IMPORT], isTrue);
310 }
311
312 test_perform_isLaunchable_inDefiningUnit() {
313 _performBuildTask({
314 '/lib.dart': '''
315 library lib;
316 main() {
317 }
318 '''
319 });
320 expect(outputs[IS_LAUNCHABLE], isTrue);
321 expect(libraryElement.entryPoint, isNotNull);
322 }
323
324 test_perform_isLaunchable_inPartUnit() {
325 _performBuildTask({
326 '/lib.dart': '''
327 library lib;
328 part 'part.dart';
329 ''',
330 '/part.dart': '''
331 part of lib;
332 main() {
333 }
334 '''
335 });
336 expect(outputs[IS_LAUNCHABLE], isTrue);
337 expect(libraryElement.entryPoint, isNotNull);
338 }
339
340 test_perform_patchTopLevelAccessors() {
341 _performBuildTask({
342 '/lib.dart': '''
343 library lib;
344 part 'part1.dart';
345 part 'part2.dart';
346 ''',
347 '/part1.dart': '''
348 part of lib;
349 int get test => 0;
350 ''',
351 '/part2.dart': '''
352 part of lib;
353 void set test(_) {}
354 '''
355 });
356 CompilationUnitElement unitElement1 = partUnits[0].element;
357 CompilationUnitElement unitElement2 = partUnits[1].element;
358 PropertyAccessorElement getter = unitElement1.accessors[0];
359 PropertyAccessorElement setter = unitElement2.accessors[0];
360 PropertyInducingElement variable = getter.variable;
361 expect(getter.isGetter, isTrue);
362 expect(setter.isSetter, isTrue);
363 expect(variable, isNotNull);
364 expect(setter.variable, same(variable));
365 expect(unitElement1.topLevelVariables, [variable]);
366 expect(unitElement2.topLevelVariables, [variable]);
367 }
368
369 void _assertErrorsWithCodes(List<ErrorCode> expectedErrorCodes) {
370 List<AnalysisError> errors = outputs[BUILD_LIBRARY_ERRORS];
371 GatheringErrorListener errorListener = new GatheringErrorListener();
372 errorListener.addAll(errors);
373 errorListener.assertErrorsWithCodes(expectedErrorCodes);
374 }
375
376 CompilationUnit _buildCompilationUnit(
377 InternalAnalysisContext context, String path, String content) {
378 File file = resourceProvider.newFile(path, content);
379 Source source = file.createSource();
380
381 ScanDartTask scanTask = new ScanDartTask(context, source);
382 scanTask.inputs = {ScanDartTask.CONTENT_INPUT_NAME: content};
383 scanTask.perform();
384 Map<ResultDescriptor, dynamic> scanOutputs = scanTask.outputs;
385
386 ParseDartTask parseTask = new ParseDartTask(context, source);
387 parseTask.inputs = {
388 ParseDartTask.LINE_INFO_INPUT_NAME: scanOutputs[LINE_INFO],
389 ParseDartTask.TOKEN_STREAM_INPUT_NAME: scanOutputs[TOKEN_STREAM]
390 };
391 parseTask.perform();
392 Map<ResultDescriptor, dynamic> parseOutputs = parseTask.outputs;
393
394 BuildCompilationUnitElementTask buildTask =
395 new BuildCompilationUnitElementTask(context, source);
396 buildTask.inputs = {
397 BuildCompilationUnitElementTask.PARSED_UNIT_INPUT_NAME:
398 parseOutputs[PARSED_UNIT]
399 };
400 buildTask.perform();
401 return buildTask.outputs[BUILT_UNIT];
402 }
403
404 void _performBuildTask(Map<String, String> sourceMap) {
405 Map<String, CompilationUnit> unitMap = <String, CompilationUnit>{};
406 sourceMap.forEach((String path, String content) {
407 CompilationUnit unit = _buildCompilationUnit(context, path, content);
408 unitMap[path] = unit;
409 });
410
411 libraryUnit = unitMap.values.first;
412 libraryUnitElement = libraryUnit.element;
413 librarySource = libraryUnitElement.source;
414 partUnits = unitMap.values.skip(1).toList();
415
416 task = new BuildLibraryElementTask(context, librarySource);
417 task.inputs = {
418 BuildLibraryElementTask.DEFINING_BUILT_UNIT_INPUT_NAME: libraryUnit,
419 BuildLibraryElementTask.PART_BUILT_UNITS_INPUT_NAME: partUnits
420 };
421 task.perform();
422 outputs = task.outputs;
423 libraryElement = outputs[BUILT_LIBRARY_ELEMENT];
424 }
425 }
426
427 @reflectiveTest
116 class ParseDartTaskTest extends EngineTestCase { 428 class ParseDartTaskTest extends EngineTestCase {
117 test_buildInputs() { 429 test_buildInputs() {
118 AnalysisTarget target = new TestSource(); 430 AnalysisTarget target = new TestSource();
119 Map<String, TaskInput> inputs = ParseDartTask.buildInputs(target); 431 Map<String, TaskInput> inputs = ParseDartTask.buildInputs(target);
120 expect(inputs, isNotNull); 432 expect(inputs, isNotNull);
121 expect(inputs, hasLength(2)); 433 expect(inputs, hasLength(2));
122 expect(inputs[ParseDartTask.LINE_INFO_INPUT_NAME], isNotNull); 434 expect(inputs[ParseDartTask.LINE_INFO_INPUT_NAME], isNotNull);
123 expect(inputs[ParseDartTask.TOKEN_STREAM_INPUT_NAME], isNotNull); 435 expect(inputs[ParseDartTask.TOKEN_STREAM_INPUT_NAME], isNotNull);
124 } 436 }
125 437
(...skipping 164 matching lines...) Expand 10 before | Expand all | Expand 10 after
290 ScanDartTask _performScanTask(String content) { 602 ScanDartTask _performScanTask(String content) {
291 AnalysisContext context = AnalysisContextFactory.contextWithCore(); 603 AnalysisContext context = AnalysisContextFactory.contextWithCore();
292 AnalysisTarget target = new TestSource(); 604 AnalysisTarget target = new TestSource();
293 605
294 ScanDartTask scanTask = new ScanDartTask(context, target); 606 ScanDartTask scanTask = new ScanDartTask(context, target);
295 scanTask.inputs = {ScanDartTask.CONTENT_INPUT_NAME: content}; 607 scanTask.inputs = {ScanDartTask.CONTENT_INPUT_NAME: content};
296 scanTask.perform(); 608 scanTask.perform();
297 return scanTask; 609 return scanTask;
298 } 610 }
299 } 611 }
612
613 class _MockContext extends TypedMock implements ExtendedAnalysisContext {
614 Map<AnalysisTarget, CacheEntry> entryMap = <AnalysisTarget, CacheEntry>{};
615
616 @override
617 CacheEntry getCacheEntry(AnalysisTarget target) {
618 return entryMap.putIfAbsent(target, () => new CacheEntry());
619 }
620
621 noSuchMethod(Invocation invocation) => super.noSuchMethod(invocation);
622 }
OLDNEW
« no previous file with comments | « pkg/analyzer/lib/task/dart.dart ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698