| 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/constants.dart'; |
| (...skipping 156 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 167 class AnalysisTestHelper { | 167 class AnalysisTestHelper { |
| 168 MockServerChannel serverChannel; | 168 MockServerChannel serverChannel; |
| 169 MemoryResourceProvider resourceProvider; | 169 MemoryResourceProvider resourceProvider; |
| 170 AnalysisServer server; | 170 AnalysisServer server; |
| 171 AnalysisDomainHandler handler; | 171 AnalysisDomainHandler handler; |
| 172 | 172 |
| 173 Map<String, List<String>> analysisSubscriptions = {}; | 173 Map<String, List<String>> analysisSubscriptions = {}; |
| 174 | 174 |
| 175 Map<String, List<AnalysisError>> filesErrors = {}; | 175 Map<String, List<AnalysisError>> filesErrors = {}; |
| 176 Map<String, List<Map<String, Object>>> filesHighlights = {}; | 176 Map<String, List<Map<String, Object>>> filesHighlights = {}; |
| 177 Map<String, List<Map<String, Object>>> filesNavigation = {}; |
| 177 | 178 |
| 178 String testFile = '/project/bin/test.dart'; | 179 String testFile = '/project/bin/test.dart'; |
| 179 String testCode; | 180 String testCode; |
| 180 | 181 |
| 181 AnalysisTestHelper() { | 182 AnalysisTestHelper() { |
| 182 serverChannel = new MockServerChannel(); | 183 serverChannel = new MockServerChannel(); |
| 183 resourceProvider = new MemoryResourceProvider(); | 184 resourceProvider = new MemoryResourceProvider(); |
| 184 server = new AnalysisServer(serverChannel, resourceProvider); | 185 server = new AnalysisServer(serverChannel, resourceProvider); |
| 185 handler = new AnalysisDomainHandler(server); | 186 handler = new AnalysisDomainHandler(server); |
| 186 // listen for notifications | 187 // listen for notifications |
| 187 Stream<Notification> notificationStream = serverChannel.notificationControll
er.stream; | 188 Stream<Notification> notificationStream = serverChannel.notificationControll
er.stream; |
| 188 notificationStream.listen((Notification notification) { | 189 notificationStream.listen((Notification notification) { |
| 189 if (notification.event == NOTIFICATION_ERRORS) { | 190 if (notification.event == NOTIFICATION_ERRORS) { |
| 190 String file = notification.getParameter(FILE); | 191 String file = notification.getParameter(FILE); |
| 191 List<Map<String, Object>> errorMaps = notification.getParameter(ERRORS); | 192 List<Map<String, Object>> errorMaps = notification.getParameter(ERRORS); |
| 192 filesErrors[file] = errorMaps.map(jsonToAnalysisError).toList(); | 193 filesErrors[file] = errorMaps.map(jsonToAnalysisError).toList(); |
| 193 } | 194 } |
| 194 if (notification.event == NOTIFICATION_HIGHLIGHTS) { | 195 if (notification.event == NOTIFICATION_HIGHLIGHTS) { |
| 195 String file = notification.getParameter(FILE); | 196 String file = notification.getParameter(FILE); |
| 196 filesHighlights[file] = notification.getParameter(REGIONS); | 197 filesHighlights[file] = notification.getParameter(REGIONS); |
| 197 } | 198 } |
| 199 if (notification.event == NOTIFICATION_NAVIGATION) { |
| 200 String file = notification.getParameter(FILE); |
| 201 filesNavigation[file] = notification.getParameter(REGIONS); |
| 202 } |
| 198 }); | 203 }); |
| 199 } | 204 } |
| 200 | 205 |
| 201 void addAnalysisSubscriptionHighlight(String file) { | 206 void addAnalysisSubscriptionHighlight(String file) { |
| 202 var service = AnalysisService.HIGHLIGHTS; | 207 var service = AnalysisService.HIGHLIGHTS; |
| 203 // add file to subscription | 208 // add file to subscription |
| 204 var files = analysisSubscriptions[service.name]; | 209 var files = analysisSubscriptions[service.name]; |
| 205 if (files == null) { | 210 if (files == null) { |
| 206 files = <String>[]; | 211 files = <String>[]; |
| 207 analysisSubscriptions[service.name] = files; | 212 analysisSubscriptions[service.name] = files; |
| 208 } | 213 } |
| 209 files.add(file); | 214 files.add(file); |
| 210 // set subscriptions | 215 // set subscriptions |
| 211 Request request = new Request('0', METHOD_SET_ANALYSIS_SUBSCRIPTIONS); | 216 Request request = new Request('0', METHOD_SET_ANALYSIS_SUBSCRIPTIONS); |
| 212 request.setParameter(SUBSCRIPTIONS, analysisSubscriptions); | 217 request.setParameter(SUBSCRIPTIONS, analysisSubscriptions); |
| 213 handleSuccessfulRequest(request); | 218 handleSuccessfulRequest(request); |
| 214 } | 219 } |
| 215 | 220 |
| 216 /** | 221 /** |
| 217 * Returns a [Future] that completes when this this helper finished all its | 222 * Returns a [Future] that completes when this this helper finished all its |
| 218 * scheduled tasks. | 223 * scheduled tasks. |
| 219 */ | 224 */ |
| 220 Future waitForOperationsFinished() { | 225 Future waitForOperationsFinished() { |
| 221 return waitForServerOperationsPerformed(server); | 226 return waitForServerOperationsPerformed(server); |
| 222 } | 227 } |
| 223 | 228 |
| 224 /** | 229 /** |
| 230 * Returns the offset of [search] in [testCode]. |
| 231 * Fails if not found. |
| 232 */ |
| 233 int findOffset(String search) { |
| 234 int offset = testCode.indexOf(search); |
| 235 expect(offset, isNot(-1)); |
| 236 return offset; |
| 237 } |
| 238 |
| 239 /** |
| 225 * Returns [AnalysisError]s recorded for the given [file]. | 240 * Returns [AnalysisError]s recorded for the given [file]. |
| 226 * May be empty, but not `null`. | 241 * May be empty, but not `null`. |
| 227 */ | 242 */ |
| 228 List<AnalysisError> getErrors(String file) { | 243 List<AnalysisError> getErrors(String file) { |
| 229 List<AnalysisError> errors = filesErrors[file]; | 244 List<AnalysisError> errors = filesErrors[file]; |
| 230 if (errors != null) { | 245 if (errors != null) { |
| 231 return errors; | 246 return errors; |
| 232 } | 247 } |
| 233 return <AnalysisError>[]; | 248 return <AnalysisError>[]; |
| 234 } | 249 } |
| 235 | 250 |
| 236 /** | 251 /** |
| 237 * Returns highlights recorded for the given [file]. | 252 * Returns highlights recorded for the given [file]. |
| 238 * May be empty, but not `null`. | 253 * May be empty, but not `null`. |
| 239 */ | 254 */ |
| 240 List<Map<String, Object>> getHighlights(String file) { | 255 List<Map<String, Object>> getHighlights(String file) { |
| 241 List<Map<String, Object>> highlights = filesHighlights[file]; | 256 List<Map<String, Object>> highlights = filesHighlights[file]; |
| 242 if (highlights != null) { | 257 if (highlights != null) { |
| 243 return highlights; | 258 return highlights; |
| 244 } | 259 } |
| 245 return []; | 260 return []; |
| 246 } | 261 } |
| 247 | 262 |
| 248 /** | 263 /** |
| 264 * Returns navigation regions recorded for the given [file]. |
| 265 * May be empty, but not `null`. |
| 266 */ |
| 267 List<Map<String, Object>> getNavigation(String file) { |
| 268 List<Map<String, Object>> navigation = filesNavigation[file]; |
| 269 if (navigation != null) { |
| 270 return navigation; |
| 271 } |
| 272 return []; |
| 273 } |
| 274 |
| 275 /** |
| 249 * Returns [AnalysisError]s recorded for the [testFile]. | 276 * Returns [AnalysisError]s recorded for the [testFile]. |
| 250 * May be empty, but not `null`. | 277 * May be empty, but not `null`. |
| 251 */ | 278 */ |
| 252 List<AnalysisError> getTestErrors() { | 279 List<AnalysisError> getTestErrors() { |
| 253 return getErrors(testFile); | 280 return getErrors(testFile); |
| 254 } | 281 } |
| 255 | 282 |
| 256 /** | 283 /** |
| 257 * Returns highlights recorded for the given [testFile]. | 284 * Returns highlights recorded for the given [testFile]. |
| 258 * May be empty, but not `null`. | 285 * May be empty, but not `null`. |
| 259 */ | 286 */ |
| 260 List<Map<String, Object>> getTestHighlights() { | 287 List<Map<String, Object>> getTestHighlights() { |
| 261 return getHighlights(testFile); | 288 return getHighlights(testFile); |
| 262 } | 289 } |
| 263 | 290 |
| 264 /** | 291 /** |
| 292 * Returns navigation information recorded for the given [testFile]. |
| 293 * May be empty, but not `null`. |
| 294 */ |
| 295 List<Map<String, Object>> getTestNavigation() { |
| 296 return getNavigation(testFile); |
| 297 } |
| 298 |
| 299 /** |
| 265 * Creates an empty project `/project`. | 300 * Creates an empty project `/project`. |
| 266 */ | 301 */ |
| 267 void createEmptyProject() { | 302 void createEmptyProject() { |
| 268 resourceProvider.newFolder('/project'); | 303 resourceProvider.newFolder('/project'); |
| 269 Request request = new Request('0', METHOD_SET_ANALYSIS_ROOTS); | 304 Request request = new Request('0', METHOD_SET_ANALYSIS_ROOTS); |
| 270 request.setParameter(INCLUDED, ['/project']); | 305 request.setParameter(INCLUDED, ['/project']); |
| 271 request.setParameter(EXCLUDED, []); | 306 request.setParameter(EXCLUDED, []); |
| 272 handleSuccessfulRequest(request); | 307 handleSuccessfulRequest(request); |
| 273 } | 308 } |
| 274 | 309 |
| (...skipping 802 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1077 return testRegions(code, (NotificationHighlightHelper helper) { | 1112 return testRegions(code, (NotificationHighlightHelper helper) { |
| 1078 helper.assertHasRegion(HighlightType.TYPE_PARAMETER, 'T> {'); | 1113 helper.assertHasRegion(HighlightType.TYPE_PARAMETER, 'T> {'); |
| 1079 helper.assertHasRegion(HighlightType.TYPE_PARAMETER, 'T fff;'); | 1114 helper.assertHasRegion(HighlightType.TYPE_PARAMETER, 'T fff;'); |
| 1080 helper.assertHasRegion(HighlightType.TYPE_PARAMETER, 'T mmm('); | 1115 helper.assertHasRegion(HighlightType.TYPE_PARAMETER, 'T mmm('); |
| 1081 helper.assertHasRegion(HighlightType.TYPE_PARAMETER, 'T p)'); | 1116 helper.assertHasRegion(HighlightType.TYPE_PARAMETER, 'T p)'); |
| 1082 }); | 1117 }); |
| 1083 }); | 1118 }); |
| 1084 } | 1119 } |
| 1085 | 1120 |
| 1086 | 1121 |
| 1122 |
| 1123 |
| 1124 class NotificationNavigationHelper extends AnalysisTestHelper { |
| 1125 List<Map<String, Object>> regions; |
| 1126 |
| 1127 Future prepareRegions(then()) { |
| 1128 // TODO(scheglov) add subscription |
| 1129 // addAnalysisSubscriptionHighlight(testFile); |
| 1130 return waitForOperationsFinished().then((_) { |
| 1131 regions = getTestNavigation(); |
| 1132 then(); |
| 1133 }); |
| 1134 } |
| 1135 |
| 1136 void assertHasRegion(String regionSearch, String targetSearch) { |
| 1137 var regionOffset = findOffset(regionSearch); |
| 1138 int regionLength = findIdentifierLength(regionSearch); |
| 1139 var targetOffset = findOffset(targetSearch); |
| 1140 var targetLength = findIdentifierLength(targetSearch); |
| 1141 asserHasRegionInts(regionOffset, regionLength, targetOffset, targetLength); |
| 1142 } |
| 1143 |
| 1144 void asserHasOperatorRegion(String search, int regionLength, int targetLength)
{ |
| 1145 var regionOffset = findOffset(search); |
| 1146 var region = asserHasRegionInts(regionOffset, regionLength, -1, 0); |
| 1147 if (targetLength != -1) { |
| 1148 expect(region['targets'][0]['length'], targetLength); |
| 1149 } |
| 1150 } |
| 1151 |
| 1152 asserHasRegionInts(int regionOffset, int regionLength, |
| 1153 int targetOffset, int targetLength) { |
| 1154 Map<String, Object> region = findRegion(regionOffset, regionLength); |
| 1155 if (region != null) { |
| 1156 List<Map<String, Object>> targets = region['targets']; |
| 1157 if (targetOffset == -1) { |
| 1158 return region; |
| 1159 } |
| 1160 var target = findTarget(targets, testFile, targetOffset, targetLength); |
| 1161 if (target != null) { |
| 1162 return target; |
| 1163 } |
| 1164 } |
| 1165 fail('Expected to find (offset=$regionOffset; length=$regionLength) => ' |
| 1166 '(offset=$targetOffset; length=$targetLength) in\n' |
| 1167 '${regions.join('\n')}'); |
| 1168 } |
| 1169 |
| 1170 Map<String, Object> findRegionString(String search, [bool notNull]) { |
| 1171 int offset = findOffset(search); |
| 1172 int length = search.length; |
| 1173 return findRegion(offset, length, notNull); |
| 1174 } |
| 1175 |
| 1176 Map<String, Object> findRegionAt(String search, [bool notNull]) { |
| 1177 int offset = findOffset(search); |
| 1178 for (Map<String, Object> region in regions) { |
| 1179 if (region['offset'] == offset) { |
| 1180 if (notNull == false) { |
| 1181 fail('Not expected to find at offset=$offset in\n' |
| 1182 '${regions.join('\n')}'); |
| 1183 } |
| 1184 return region; |
| 1185 } |
| 1186 } |
| 1187 if (notNull == true) { |
| 1188 fail('Expected to find at offset=$offset in\n' |
| 1189 '${regions.join('\n')}'); |
| 1190 } |
| 1191 return null; |
| 1192 } |
| 1193 |
| 1194 Map<String, Object> findRegionIdentifier(String search, [bool notNull]) { |
| 1195 int offset = findOffset(search); |
| 1196 int length = findIdentifierLength(search); |
| 1197 return findRegion(offset, length, notNull); |
| 1198 } |
| 1199 |
| 1200 Map<String, Object> findRegion(int offset, int length, [bool notNull]) { |
| 1201 for (Map<String, Object> region in regions) { |
| 1202 if (region['offset'] == offset && region['length'] == length) { |
| 1203 if (notNull == false) { |
| 1204 fail('Not expected to find (offset=$offset; length=$length) in\n' |
| 1205 '${regions.join('\n')}'); |
| 1206 } |
| 1207 return region; |
| 1208 } |
| 1209 } |
| 1210 if (notNull == true) { |
| 1211 fail('Expected to find (offset=$offset; length=$length) in\n' |
| 1212 '${regions.join('\n')}'); |
| 1213 } |
| 1214 return null; |
| 1215 } |
| 1216 |
| 1217 Map<String, Object> findTarget(List<Map<String, Object>> targets, |
| 1218 String file, int offset, int length) { |
| 1219 for (Map<String, Object> target in targets) { |
| 1220 if (target['file'] == file && |
| 1221 target['offset'] == offset && |
| 1222 target['length'] == length) { |
| 1223 return target; |
| 1224 } |
| 1225 } |
| 1226 return null; |
| 1227 } |
| 1228 |
| 1229 void assertNoRegion(String regionSearch) { |
| 1230 var regionOffset = findOffset(regionSearch); |
| 1231 var regionLength = findIdentifierLength(regionSearch); |
| 1232 for (Map<String, Object> region in regions) { |
| 1233 if (region['offset'] == regionOffset && region['length'] == regionLength)
{ |
| 1234 fail('Unexpected (offset=$regionOffset; length=$regionLength) in\n' |
| 1235 '${regions.join('\n')}'); |
| 1236 } |
| 1237 } |
| 1238 } |
| 1239 } |
| 1240 |
| 1241 |
| 1242 int findIdentifierLength(String search) { |
| 1243 int length = 0; |
| 1244 while (length < search.length) { |
| 1245 int c = search.codeUnitAt(length); |
| 1246 if (!(c >= 'a'.codeUnitAt(0) && c <= 'z'.codeUnitAt(0) || |
| 1247 c >= 'A'.codeUnitAt(0) && c <= 'Z'.codeUnitAt(0) || |
| 1248 c >= '0'.codeUnitAt(0) && c <= '9'.codeUnitAt(0))) { |
| 1249 break; |
| 1250 } |
| 1251 length++; |
| 1252 } |
| 1253 return length; |
| 1254 } |
| 1255 |
| 1256 |
| 1257 testNotificationNavigation() { |
| 1258 Future testNavigation(String code, then(NotificationNavigationHelper helper))
{ |
| 1259 var helper = new NotificationNavigationHelper(); |
| 1260 helper.createSingleFileProject(code); |
| 1261 return helper.prepareRegions(() { |
| 1262 then(helper); |
| 1263 }); |
| 1264 } |
| 1265 |
| 1266 group('constructor', () { |
| 1267 test('named', () { |
| 1268 var code = ''' |
| 1269 class A { |
| 1270 A.named(int p) {} |
| 1271 } |
| 1272 '''; |
| 1273 return testNavigation(code, (NotificationNavigationHelper helper) { |
| 1274 // has region for complete "A.named" |
| 1275 helper.asserHasRegionInts( |
| 1276 helper.findOffset('A.named'), 'A.named'.length, |
| 1277 helper.findOffset('named(int'), 'named'.length); |
| 1278 // no separate regions for "A" and "named" |
| 1279 helper.assertNoRegion('A.named('); |
| 1280 helper.assertNoRegion('named('); |
| 1281 // validate that we don't forget to resolve parameters |
| 1282 helper.asserHasRegionInts( |
| 1283 helper.findOffset('int p'), 'int'.length, |
| 1284 -1, 0); |
| 1285 }); |
| 1286 }); |
| 1287 |
| 1288 test('unnamed', () { |
| 1289 var code = ''' |
| 1290 class A { |
| 1291 A(int p) {} |
| 1292 } |
| 1293 '''; |
| 1294 return testNavigation(code, (NotificationNavigationHelper helper) { |
| 1295 // has constructor region for "A()" |
| 1296 helper.asserHasRegionInts( |
| 1297 helper.findOffset('A(int p)'), 'A'.length, |
| 1298 helper.findOffset('A(int p)'), 0); |
| 1299 // validate that we don't forget to resolve parameters |
| 1300 helper.asserHasRegionInts( |
| 1301 helper.findOffset('int p'), 'int'.length, |
| 1302 -1, 0); |
| 1303 }); |
| 1304 }); |
| 1305 }); |
| 1306 |
| 1307 group('identifier', () { |
| 1308 test('resolved', () { |
| 1309 var code = ''' |
| 1310 class AAA {} |
| 1311 main() { |
| 1312 AAA aaa = null; |
| 1313 print(aaa); |
| 1314 } |
| 1315 '''; |
| 1316 return testNavigation(code, (NotificationNavigationHelper helper) { |
| 1317 helper.assertHasRegion('AAA aaa', 'AAA {}'); |
| 1318 helper.assertHasRegion('aaa);', 'aaa = null'); |
| 1319 helper.assertHasRegion('main() {', 'main() {'); |
| 1320 }); |
| 1321 }); |
| 1322 |
| 1323 test('unresolved', () { |
| 1324 var code = ''' |
| 1325 main() { |
| 1326 print(noo); |
| 1327 } |
| 1328 '''; |
| 1329 return testNavigation(code, (NotificationNavigationHelper helper) { |
| 1330 helper.assertNoRegion('noo);'); |
| 1331 }); |
| 1332 }); |
| 1333 }); |
| 1334 |
| 1335 test('fieldFormalParameter', () { |
| 1336 var code = ''' |
| 1337 class A { |
| 1338 int fff = 123; |
| 1339 A(this.fff); |
| 1340 } |
| 1341 '''; |
| 1342 return testNavigation(code, (NotificationNavigationHelper helper) { |
| 1343 helper.assertHasRegion('fff);', 'fff = 123'); |
| 1344 }); |
| 1345 }); |
| 1346 |
| 1347 group('instanceCreation', () { |
| 1348 test('named', () { |
| 1349 var code = ''' |
| 1350 class A { |
| 1351 A.named() {} |
| 1352 } |
| 1353 main() { |
| 1354 new A.named(); |
| 1355 } |
| 1356 '''; |
| 1357 return testNavigation(code, (NotificationNavigationHelper helper) { |
| 1358 helper.asserHasRegionInts( |
| 1359 helper.findOffset('new A.named'), 'new A.named'.length, |
| 1360 helper.findOffset('named()'), 'named'.length); |
| 1361 }); |
| 1362 }); |
| 1363 |
| 1364 test('unnamed', () { |
| 1365 var code = ''' |
| 1366 class A { |
| 1367 A() {} |
| 1368 } |
| 1369 main() { |
| 1370 new A(); |
| 1371 } |
| 1372 '''; |
| 1373 return testNavigation(code, (NotificationNavigationHelper helper) { |
| 1374 helper.asserHasRegionInts( |
| 1375 helper.findOffset('new A'), 'new A'.length, |
| 1376 helper.findOffset('A()'), ''.length); |
| 1377 }); |
| 1378 }); |
| 1379 }); |
| 1380 |
| 1381 group('operator', () { |
| 1382 test('int', () { |
| 1383 var code = ''' |
| 1384 main() { |
| 1385 var v = 0; |
| 1386 v - 1; |
| 1387 v + 2; |
| 1388 -v; // unary |
| 1389 --v; |
| 1390 ++v; |
| 1391 v--; // mm |
| 1392 v++; // pp |
| 1393 v -= 3; |
| 1394 v += 4; |
| 1395 v *= 5; |
| 1396 v /= 6; |
| 1397 } |
| 1398 '''; |
| 1399 return testNavigation(code, (NotificationNavigationHelper helper) { |
| 1400 helper.asserHasOperatorRegion('- 1;', 1, 1); |
| 1401 helper.asserHasOperatorRegion('+ 2;', 1, 1); |
| 1402 helper.asserHasOperatorRegion('-v; // unary', 1, -1); |
| 1403 helper.asserHasOperatorRegion('--v;', 2, 1); |
| 1404 helper.asserHasOperatorRegion('++v;', 2, 1); |
| 1405 helper.asserHasOperatorRegion('--; // mm', 2, 1); |
| 1406 helper.asserHasOperatorRegion('++; // pp', 2, 1); |
| 1407 helper.asserHasOperatorRegion('-= 3;', 2, 1); |
| 1408 helper.asserHasOperatorRegion('+= 4;', 2, 1); |
| 1409 helper.asserHasOperatorRegion('*= 5;', 2, 1); |
| 1410 helper.asserHasOperatorRegion('/= 6;', 2, 1); |
| 1411 }); |
| 1412 }); |
| 1413 |
| 1414 test('list', () { |
| 1415 var code = ''' |
| 1416 main() { |
| 1417 List<int> v = [1, 2, 3]; |
| 1418 v[0]; // [] |
| 1419 v[1] = 1; // []= |
| 1420 v[2] += 2; |
| 1421 } |
| 1422 '''; |
| 1423 return testNavigation(code, (NotificationNavigationHelper helper) { |
| 1424 helper.asserHasOperatorRegion(']; // []', 1, 2); |
| 1425 helper.asserHasOperatorRegion('] = 1', 1, 3); |
| 1426 helper.asserHasOperatorRegion('] += 2', 1, 3); |
| 1427 helper.asserHasOperatorRegion('+= 2', 2, 1); |
| 1428 }); |
| 1429 }); |
| 1430 }); |
| 1431 |
| 1432 test('partOf', () { |
| 1433 var helper = new NotificationNavigationHelper(); |
| 1434 var code = ''' |
| 1435 part of lib; |
| 1436 '''; |
| 1437 helper.createSingleFileProject(code); |
| 1438 var libPath = helper.setFileContent('/project/bin/lib.dart', ''' |
| 1439 library lib; |
| 1440 part 'test.dart'; |
| 1441 '''); |
| 1442 return helper.prepareRegions(() { |
| 1443 var region = helper.findRegionString('part of lib', true); |
| 1444 var target = region['targets'][0]; |
| 1445 expect(target['file'], libPath); |
| 1446 }); |
| 1447 }); |
| 1448 |
| 1449 group('string', () { |
| 1450 test('export', () { |
| 1451 var code = ''' |
| 1452 export "dart:math"; |
| 1453 '''; |
| 1454 return testNavigation(code, (NotificationNavigationHelper helper) { |
| 1455 helper.findRegionString('export "dart:math"', true); |
| 1456 }); |
| 1457 }); |
| 1458 |
| 1459 test('export unresolved URI', () { |
| 1460 var code = ''' |
| 1461 export 'no.dart'; |
| 1462 '''; |
| 1463 return testNavigation(code, (NotificationNavigationHelper helper) { |
| 1464 helper.findRegionAt('export ', false); |
| 1465 }); |
| 1466 }); |
| 1467 |
| 1468 test('import', () { |
| 1469 var code = ''' |
| 1470 import "dart:math" as m; |
| 1471 '''; |
| 1472 return testNavigation(code, (NotificationNavigationHelper helper) { |
| 1473 helper.findRegionString('import "dart:math"', true); |
| 1474 }); |
| 1475 }); |
| 1476 |
| 1477 test('import no URI', () { |
| 1478 var code = ''' |
| 1479 import ; |
| 1480 '''; |
| 1481 return testNavigation(code, (NotificationNavigationHelper helper) { |
| 1482 helper.findRegionAt('import ', false); |
| 1483 }); |
| 1484 }); |
| 1485 |
| 1486 test('import unresolved URI', () { |
| 1487 var code = ''' |
| 1488 import 'no.dart'; |
| 1489 '''; |
| 1490 return testNavigation(code, (NotificationNavigationHelper helper) { |
| 1491 helper.findRegionAt('import ', false); |
| 1492 }); |
| 1493 }); |
| 1494 |
| 1495 test('part', () { |
| 1496 var helper = new NotificationNavigationHelper(); |
| 1497 var code = ''' |
| 1498 library lib; |
| 1499 part "my_part.dart"; |
| 1500 '''; |
| 1501 helper.createSingleFileProject(code); |
| 1502 var unitPath = helper.setFileContent('/project/bin/my_part.dart', ''' |
| 1503 part of lib; |
| 1504 '''); |
| 1505 return helper.prepareRegions(() { |
| 1506 var region = helper.findRegionString('part "my_part.dart"', true); |
| 1507 var target = region['targets'][0]; |
| 1508 expect(target['file'], unitPath); |
| 1509 }); |
| 1510 }); |
| 1511 |
| 1512 test('part unresolved URI', () { |
| 1513 var helper = new NotificationNavigationHelper(); |
| 1514 var code = ''' |
| 1515 library lib; |
| 1516 part "my_part.dart"; |
| 1517 '''; |
| 1518 helper.createSingleFileProject(code); |
| 1519 return helper.prepareRegions(() { |
| 1520 helper.findRegionAt('part ', false); |
| 1521 }); |
| 1522 }); |
| 1523 }); |
| 1524 } |
| 1525 |
| 1526 |
| 1087 testUpdateContent() { | 1527 testUpdateContent() { |
| 1088 test('full content', () { | 1528 test('full content', () { |
| 1089 AnalysisTestHelper helper = new AnalysisTestHelper(); | 1529 AnalysisTestHelper helper = new AnalysisTestHelper(); |
| 1090 helper.createSingleFileProject('// empty'); | 1530 helper.createSingleFileProject('// empty'); |
| 1091 return helper.waitForOperationsFinished().then((_) { | 1531 return helper.waitForOperationsFinished().then((_) { |
| 1092 // no errors initially | 1532 // no errors initially |
| 1093 List<AnalysisError> errors = helper.getTestErrors(); | 1533 List<AnalysisError> errors = helper.getTestErrors(); |
| 1094 expect(errors, isEmpty); | 1534 expect(errors, isEmpty); |
| 1095 // update code | 1535 // update code |
| 1096 { | 1536 { |
| (...skipping 70 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1167 // subscribe | 1607 // subscribe |
| 1168 helper.addAnalysisSubscriptionHighlight(helper.testFile); | 1608 helper.addAnalysisSubscriptionHighlight(helper.testFile); |
| 1169 // wait, has regions | 1609 // wait, has regions |
| 1170 return helper.waitForOperationsFinished().then((_) { | 1610 return helper.waitForOperationsFinished().then((_) { |
| 1171 var highlights = helper.getHighlights(helper.testFile); | 1611 var highlights = helper.getHighlights(helper.testFile); |
| 1172 expect(highlights, isNot(isEmpty)); | 1612 expect(highlights, isNot(isEmpty)); |
| 1173 }); | 1613 }); |
| 1174 }); | 1614 }); |
| 1175 }); | 1615 }); |
| 1176 } | 1616 } |
| OLD | NEW |