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

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

Issue 314493002: Navigation computer and two variants of tests for it. (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'; 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
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
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
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 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698