OLD | NEW |
---|---|
(Empty) | |
1 // Copyright (c) 2016, the Dart project authors. Please see the AUTHORS file | |
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. | |
4 | |
5 library analyzer.test.driver; | |
6 | |
7 import 'dart:async'; | |
8 import 'dart:convert'; | |
9 | |
10 import 'package:analyzer/dart/ast/ast.dart'; | |
11 import 'package:analyzer/error/error.dart'; | |
12 import 'package:analyzer/file_system/file_system.dart'; | |
13 import 'package:analyzer/file_system/memory_file_system.dart'; | |
14 import 'package:analyzer/source/package_map_resolver.dart'; | |
15 import 'package:analyzer/src/dart/analysis/byte_store.dart'; | |
16 import 'package:analyzer/src/dart/analysis/driver.dart'; | |
17 import 'package:analyzer/src/error/codes.dart'; | |
18 import 'package:analyzer/src/generated/engine.dart' show AnalysisOptionsImpl; | |
19 import 'package:analyzer/src/generated/source.dart'; | |
20 import 'package:async/async.dart'; | |
21 import 'package:convert/convert.dart'; | |
22 import 'package:crypto/crypto.dart'; | |
23 import 'package:test/test.dart'; | |
24 import 'package:test_reflective_loader/test_reflective_loader.dart'; | |
25 | |
26 import '../../context/mock_sdk.dart'; | |
27 | |
28 main() { | |
29 defineReflectiveSuite(() { | |
30 defineReflectiveTests(DriverTest); | |
31 }); | |
32 } | |
33 | |
34 @reflectiveTest | |
35 class DriverTest { | |
36 static final MockSdk sdk = new MockSdk(); | |
37 | |
38 final MemoryResourceProvider provider = new MemoryResourceProvider(); | |
39 final ByteStore byteStore = new _TestByteStore(); | |
40 final ContentCache contentCache = new ContentCache(); | |
41 final StringBuffer logBuffer = new StringBuffer(); | |
42 | |
43 AnalysisDriver driver; | |
44 StreamSplitter<AnalysisStatus> statusSplitter; | |
45 final List<AnalysisStatus> allStatuses = <AnalysisStatus>[]; | |
46 final List<AnalysisResult> allResults = <AnalysisResult>[]; | |
47 | |
48 String _testProject; | |
Brian Wilkerson
2016/10/27 05:06:04
Is there any value in these fields being private?
scheglov
2016/10/27 16:24:23
Done.
| |
49 String _testFile; | |
50 | |
51 void setUp() { | |
52 new MockSdk(); | |
53 _testProject = _p('/test/lib'); | |
54 _testFile = _p('/test/lib/test.dart'); | |
55 driver = new AnalysisDriver( | |
56 new PerformanceLog(logBuffer), | |
57 provider, | |
58 byteStore, | |
59 contentCache, | |
60 new SourceFactory([ | |
61 new DartUriResolver(sdk), | |
62 new PackageMapUriResolver(provider, <String, List<Folder>>{ | |
63 'test': [provider.getFolder(_testProject)] | |
64 }) | |
65 ], null, provider), | |
66 new AnalysisOptionsImpl()..strongMode = true); | |
67 statusSplitter = new StreamSplitter(driver.status); | |
68 statusSplitter.split().listen(allStatuses.add); | |
69 driver.results.listen(allResults.add); | |
70 } | |
71 | |
72 test_getResult() async { | |
73 String content = 'int f() => 42;'; | |
74 provider.newFile(_testFile, content); | |
75 driver.addFile(_testFile); | |
76 driver.priorityFiles = [_testFile]; | |
Brian Wilkerson
2016/10/27 05:06:04
These four lines (or sometimes just the first thre
scheglov
2016/10/27 16:24:23
Done.
| |
77 | |
78 AnalysisResult result = await driver.getResult(_testFile); | |
79 expect(result.path, _testFile); | |
80 expect(result.uri.toString(), 'package:test/test.dart'); | |
81 expect(result.content, content); | |
82 expect(result.contentHash, _md5(content)); | |
83 expect(result.unit, isNotNull); | |
84 expect(result.errors, hasLength(0)); | |
85 | |
86 var f = result.unit.declarations[0] as FunctionDeclaration; | |
87 expect(f.name.staticType.toString(), '() → int'); | |
88 expect(f.returnType.type.toString(), 'int'); | |
89 | |
90 // The same result is also received through the stream. | |
91 await _waitForIdle(); | |
92 expect(allResults, [result]); | |
93 } | |
94 | |
95 test_getResult_errors() async { | |
96 String content = 'main() { int vv; }'; | |
97 provider.newFile(_testFile, content); | |
98 driver.addFile(_testFile); | |
99 driver.priorityFiles = [_testFile]; | |
100 | |
101 AnalysisResult result = await driver.getResult(_testFile); | |
102 expect(result.path, _testFile); | |
103 expect(result.errors, hasLength(1)); | |
104 { | |
105 AnalysisError error = result.errors[0]; | |
106 expect(error.offset, 13); | |
107 expect(error.length, 2); | |
108 expect(error.errorCode, HintCode.UNUSED_LOCAL_VARIABLE); | |
109 expect(error.message, "The value of the local variable 'vv' isn't used."); | |
110 expect(error.correction, "Try removing the variable, or using it."); | |
111 } | |
112 } | |
113 | |
114 test_results_priority() async { | |
115 String content = 'int f() => 42;'; | |
116 provider.newFile(_testFile, content); | |
117 driver.addFile(_testFile); | |
118 driver.priorityFiles = [_testFile]; | |
119 | |
120 await _waitForIdle(); | |
121 | |
122 expect(allResults, hasLength(1)); | |
123 AnalysisResult result = allResults.single; | |
124 expect(result.path, _testFile); | |
125 expect(result.uri.toString(), 'package:test/test.dart'); | |
126 expect(result.content, content); | |
127 expect(result.contentHash, _md5(content)); | |
128 expect(result.unit, isNotNull); | |
129 expect(result.errors, hasLength(0)); | |
130 | |
131 var f = result.unit.declarations[0] as FunctionDeclaration; | |
132 expect(f.name.staticType.toString(), '() → int'); | |
133 expect(f.returnType.type.toString(), 'int'); | |
134 } | |
135 | |
136 test_results_priorityFirst() async { | |
137 var a = _p('/test/lib/a.dart'); | |
138 var b = _p('/test/lib/b.dart'); | |
139 var c = _p('/test/lib/c.dart'); | |
140 provider.newFile(a, 'class A {}'); | |
141 provider.newFile(b, 'class B {}'); | |
142 provider.newFile(c, 'class C {}'); | |
143 | |
144 driver.addFile(a); | |
145 driver.addFile(b); | |
146 driver.addFile(c); | |
147 driver.priorityFiles = [b]; | |
148 await _waitForIdle(); | |
149 | |
150 expect(allResults, hasLength(3)); | |
151 AnalysisResult result = allResults[0]; | |
152 expect(result.path, b); | |
153 expect(result.unit, isNotNull); | |
154 expect(result.errors, hasLength(0)); | |
155 } | |
156 | |
157 test_results_regular() async { | |
158 String content = 'int f() => 42;'; | |
159 provider.newFile(_testFile, content); | |
160 driver.addFile(_testFile); | |
161 | |
162 await _waitForIdle(); | |
163 | |
164 expect(allResults, hasLength(1)); | |
165 AnalysisResult result = allResults.single; | |
166 expect(result.path, _testFile); | |
167 expect(result.uri.toString(), 'package:test/test.dart'); | |
168 expect(result.content, isNull); | |
169 expect(result.contentHash, _md5(content)); | |
170 expect(result.unit, isNull); | |
171 expect(result.errors, hasLength(0)); | |
172 } | |
173 | |
174 test_results_status() async { | |
175 String content = 'int f() => 42;'; | |
176 provider.newFile(_testFile, content); | |
177 driver.addFile(_testFile); | |
178 | |
179 await _waitForIdle(); | |
180 | |
181 expect(allStatuses, hasLength(2)); | |
182 expect(allStatuses[0].isAnalyzing, isTrue); | |
183 expect(allStatuses[0].isIdle, isFalse); | |
184 expect(allStatuses[1].isAnalyzing, isFalse); | |
185 expect(allStatuses[1].isIdle, isTrue); | |
186 } | |
187 | |
188 /** | |
189 * Return the [provider] specific path for the given Posix [path]. | |
190 */ | |
191 String _p(String path) => provider.convertPath(path); | |
192 | |
193 Future<Null> _waitForIdle() async { | |
194 await statusSplitter.split().firstWhere((status) => status.isIdle); | |
195 } | |
196 | |
197 static String _md5(String content) { | |
198 return hex.encode(md5.convert(UTF8.encode(content)).bytes); | |
199 } | |
200 } | |
201 | |
202 class _TestByteStore implements ByteStore { | |
203 final map = <String, List<int>>{}; | |
204 | |
205 @override | |
206 List<int> get(String key) { | |
207 return map[key]; | |
208 } | |
209 | |
210 @override | |
211 void put(String key, List<int> bytes) { | |
212 map[key] = bytes; | |
213 } | |
214 } | |
OLD | NEW |