OLD | NEW |
1 // Copyright (c) 2017, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2017, 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 /// General equivalence test functions. | 5 /// General equivalence test functions. |
6 | 6 |
7 library dart2js.equivalence.helpers; | 7 library dart2js.equivalence.helpers; |
8 | 8 |
9 import 'package:compiler/src/constants/expressions.dart'; | 9 import 'package:compiler/src/constants/expressions.dart'; |
10 import 'package:compiler/src/constants/values.dart'; | 10 import 'package:compiler/src/constants/values.dart'; |
(...skipping 321 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
332 /// Checks the pair-wise equivalence of the constants values in [list1] and | 332 /// Checks the pair-wise equivalence of the constants values in [list1] and |
333 /// [list2]. | 333 /// [list2]. |
334 /// | 334 /// |
335 /// Uses [object1], [object2] and [property] to provide context for failures. | 335 /// Uses [object1], [object2] and [property] to provide context for failures. |
336 bool checkConstantValueLists(Object object1, Object object2, String property, | 336 bool checkConstantValueLists(Object object1, Object object2, String property, |
337 List<ConstantValue> list1, List<ConstantValue> list2) { | 337 List<ConstantValue> list1, List<ConstantValue> list2) { |
338 return checkListEquivalence( | 338 return checkListEquivalence( |
339 object1, object2, property, list1, list2, checkConstantValues); | 339 object1, object2, property, list1, list2, checkConstantValues); |
340 } | 340 } |
341 | 341 |
| 342 void checkLists( |
| 343 List list1, List list2, String messagePrefix, bool sameElement(a, b), |
| 344 {bool verbose: false, |
| 345 void onSameElement(a, b), |
| 346 void onDifferentElements(a, b), |
| 347 void onUnfoundElement(a), |
| 348 void onExtraElement(b), |
| 349 String elementToString(key): defaultToString}) { |
| 350 List<List> common = <List>[]; |
| 351 List mismatch = []; |
| 352 List unfound = []; |
| 353 List extra = []; |
| 354 int index = 0; |
| 355 while (index < list1.length && index < list2.length) { |
| 356 var element1 = list1[index]; |
| 357 var element2 = list2[index]; |
| 358 if (sameElement(element1, element2)) { |
| 359 if (onSameElement != null) { |
| 360 onSameElement(element1, element2); |
| 361 } |
| 362 common.add([element1, element2]); |
| 363 } else { |
| 364 if (onDifferentElements != null) { |
| 365 onDifferentElements(element1, element2); |
| 366 } |
| 367 mismatch = [element1, element2]; |
| 368 break; |
| 369 } |
| 370 index++; |
| 371 } |
| 372 for (int tail = index; tail < list1.length; tail++) { |
| 373 var element1 = list1[tail]; |
| 374 if (onUnfoundElement != null) { |
| 375 onUnfoundElement(element1); |
| 376 } |
| 377 unfound.add(element1); |
| 378 } |
| 379 for (int tail = index; tail < list2.length; tail++) { |
| 380 var element2 = list2[tail]; |
| 381 if (onExtraElement != null) { |
| 382 onExtraElement(element2); |
| 383 } |
| 384 extra.add(element2); |
| 385 } |
| 386 StringBuffer sb = new StringBuffer(); |
| 387 sb.write("$messagePrefix:"); |
| 388 if (verbose) { |
| 389 sb.write("\n Common: \n"); |
| 390 for (List pair in common) { |
| 391 var element1 = pair[0]; |
| 392 var element2 = pair[1]; |
| 393 sb.write(" [${elementToString(element1)}," |
| 394 "${elementToString(element2)}]\n"); |
| 395 } |
| 396 } |
| 397 if (mismatch.isNotEmpty) { |
| 398 sb.write("\n Mismatch @ $index:\n " |
| 399 "${mismatch.map(elementToString).join('\n ')}"); |
| 400 } |
| 401 |
| 402 if (unfound.isNotEmpty || verbose) { |
| 403 sb.write("\n Unfound:\n ${unfound.map(elementToString).join('\n ')}"); |
| 404 } |
| 405 if (extra.isNotEmpty || verbose) { |
| 406 sb.write("\n Extra: \n ${extra.map(elementToString).join('\n ')}"); |
| 407 } |
| 408 String message = sb.toString(); |
| 409 if (mismatch.isNotEmpty) { |
| 410 Expect.fail(message); |
| 411 } else if (verbose) { |
| 412 print(message); |
| 413 } |
| 414 } |
| 415 |
342 void checkSets( | 416 void checkSets( |
343 Iterable set1, Iterable set2, String messagePrefix, bool sameElement(a, b), | 417 Iterable set1, Iterable set2, String messagePrefix, bool sameElement(a, b), |
344 {bool failOnUnfound: true, | 418 {bool failOnUnfound: true, |
345 bool failOnExtra: true, | 419 bool failOnExtra: true, |
346 bool verbose: false, | 420 bool verbose: false, |
347 void onSameElement(a, b), | 421 void onSameElement(a, b), |
348 void onUnfoundElement(a), | 422 void onUnfoundElement(a), |
349 void onExtraElement(b), | 423 void onExtraElement(b), |
350 bool elementFilter(element), | 424 bool elementFilter(element), |
351 elementConverter(element), | 425 elementConverter(element), |
(...skipping 124 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
476 (mismatch.isNotEmpty && failOnMismatch) || | 550 (mismatch.isNotEmpty && failOnMismatch) || |
477 remaining.isNotEmpty) { | 551 remaining.isNotEmpty) { |
478 Expect.fail(message); | 552 Expect.fail(message); |
479 } else { | 553 } else { |
480 print(message); | 554 print(message); |
481 } | 555 } |
482 } else if (verbose) { | 556 } else if (verbose) { |
483 print(message); | 557 print(message); |
484 } | 558 } |
485 } | 559 } |
OLD | NEW |