| Index: tests/compiler/dart2js/serialization/test_helper.dart
|
| diff --git a/tests/compiler/dart2js/serialization/test_helper.dart b/tests/compiler/dart2js/serialization/test_helper.dart
|
| index 4bbed39b8c73b51b0eea69ad24bcd08f5000006b..34f40aa76b4c634dfd107d1ff2f0d91868c6bfd5 100644
|
| --- a/tests/compiler/dart2js/serialization/test_helper.dart
|
| +++ b/tests/compiler/dart2js/serialization/test_helper.dart
|
| @@ -12,6 +12,7 @@ import 'package:compiler/src/compiler.dart';
|
| import 'package:compiler/src/elements/elements.dart';
|
| import 'package:compiler/src/serialization/equivalence.dart';
|
| import 'package:compiler/src/tree/nodes.dart';
|
| +import 'package:expect/expect.dart';
|
|
|
| Check currentCheck;
|
|
|
| @@ -185,7 +186,7 @@ bool checkListEquivalence(
|
| Set computeSetDifference(
|
| Iterable set1,
|
| Iterable set2,
|
| - List common,
|
| + List<List> common,
|
| List unfound,
|
| {bool sameElement(a, b): equality,
|
| void checkElements(a, b)}) {
|
| @@ -197,19 +198,19 @@ Set computeSetDifference(
|
| // set.difference would work)
|
| Set remaining = set2.toSet();
|
| for (var element1 in set1) {
|
| - bool found = false;
|
| + var correspondingElement;
|
| for (var element2 in remaining) {
|
| if (sameElement(element1, element2)) {
|
| if (checkElements != null) {
|
| checkElements(element1, element2);
|
| }
|
| - found = true;
|
| + correspondingElement = element2;
|
| remaining.remove(element2);
|
| break;
|
| }
|
| }
|
| - if (found) {
|
| - common.add(element1);
|
| + if (correspondingElement != null) {
|
| + common.add([element1, correspondingElement]);
|
| } else {
|
| unfound.add(element1);
|
| }
|
| @@ -229,7 +230,7 @@ bool checkSetEquivalence(
|
| Iterable set2,
|
| bool sameElement(a, b),
|
| {void onSameElement(a, b)}) {
|
| - List common = [];
|
| + List<List> common = <List>[];
|
| List unfound = [];
|
| Set remaining =
|
| computeSetDifference(set1, set2, common, unfound,
|
| @@ -428,3 +429,125 @@ void checkImpacts(Compiler compiler1, Element member1,
|
|
|
| testResolutionImpactEquivalence(impact1, impact2, const CheckStrategy());
|
| }
|
| +
|
| +void checkSets(
|
| + Iterable set1,
|
| + Iterable set2,
|
| + String messagePrefix,
|
| + bool sameElement(a, b),
|
| + {bool failOnUnfound: true,
|
| + bool verbose: false,
|
| + void onSameElement(a, b)}) {
|
| + List<List> common = <List>[];
|
| + List unfound = [];
|
| + Set remaining = computeSetDifference(
|
| + set1, set2, common, unfound,
|
| + sameElement: sameElement,
|
| + checkElements: onSameElement);
|
| + StringBuffer sb = new StringBuffer();
|
| + sb.write("$messagePrefix:");
|
| + if (verbose) {
|
| + sb.write("\n Common:\n ${common.join('\n ')}");
|
| + }
|
| + if (unfound.isNotEmpty || verbose) {
|
| + sb.write("\n Unfound:\n ${unfound.join('\n ')}");
|
| + }
|
| + if (remaining.isNotEmpty || verbose) {
|
| + sb.write("\n Extra: \n ${remaining.join('\n ')}");
|
| + }
|
| + String message = sb.toString();
|
| + if (unfound.isNotEmpty || remaining.isNotEmpty) {
|
| +
|
| + if (failOnUnfound || remaining.isNotEmpty) {
|
| + Expect.fail(message);
|
| + } else {
|
| + print(message);
|
| + }
|
| + } else if (verbose) {
|
| + print(message);
|
| + }
|
| +}
|
| +
|
| +String defaultToString(obj) => '$obj';
|
| +
|
| +void checkMaps(
|
| + Map map1,
|
| + Map map2,
|
| + String messagePrefix,
|
| + bool sameKey(a, b),
|
| + bool sameValue(a, b),
|
| + {bool failOnUnfound: true,
|
| + bool failOnMismatch: true,
|
| + bool verbose: false,
|
| + String keyToString(key): defaultToString,
|
| + String valueToString(key): defaultToString}) {
|
| + List<List> common = <List>[];
|
| + List unfound = [];
|
| + List<List> mismatch = <List>[];
|
| + Set remaining = computeSetDifference(
|
| + map1.keys, map2.keys, common, unfound,
|
| + sameElement: sameKey,
|
| + checkElements: (k1, k2) {
|
| + var v1 = map1[k1];
|
| + var v2 = map2[k2];
|
| + if (!sameValue(v1, v2)) {
|
| + mismatch.add([k1, k2]);
|
| + }
|
| + });
|
| + StringBuffer sb = new StringBuffer();
|
| + sb.write("$messagePrefix:");
|
| + if (verbose) {
|
| + sb.write("\n Common: \n");
|
| + for (List pair in common) {
|
| + var k1 = pair[0];
|
| + var k2 = pair[1];
|
| + var v1 = map1[k1];
|
| + var v2 = map2[k2];
|
| + sb.write(" key1 =${keyToString(k1)}\n");
|
| + sb.write(" key2 =${keyToString(k2)}\n");
|
| + sb.write(" value1=${valueToString(v1)}\n");
|
| + sb.write(" value2=${valueToString(v2)}\n");
|
| + }
|
| + }
|
| + if (unfound.isNotEmpty || verbose) {
|
| + sb.write("\n Unfound: \n");
|
| + for (var k1 in unfound) {
|
| + var v1 = map1[k1];
|
| + sb.write(" key1 =${keyToString(k1)}\n");
|
| + sb.write(" value1=${valueToString(v1)}\n");
|
| + }
|
| + }
|
| + if (remaining.isNotEmpty || verbose) {
|
| + sb.write("\n Extra: \n");
|
| + for (var k2 in remaining) {
|
| + var v2 = map2[k2];
|
| + sb.write(" key2 =${keyToString(k2)}\n");
|
| + sb.write(" value2=${valueToString(v2)}\n");
|
| + }
|
| + }
|
| + if (mismatch.isNotEmpty || verbose) {
|
| + sb.write("\n Mismatch: \n");
|
| + for (List pair in mismatch) {
|
| + var k1 = pair[0];
|
| + var k2 = pair[1];
|
| + var v1 = map1[k1];
|
| + var v2 = map2[k2];
|
| + sb.write(" key1 =${keyToString(k1)}\n");
|
| + sb.write(" key2 =${keyToString(k2)}\n");
|
| + sb.write(" value1=${valueToString(v1)}\n");
|
| + sb.write(" value2=${valueToString(v2)}\n");
|
| + }
|
| + }
|
| + String message = sb.toString();
|
| + if (unfound.isNotEmpty || mismatch.isNotEmpty || remaining.isNotEmpty) {
|
| + if ((unfound.isNotEmpty && failOnUnfound) ||
|
| + (mismatch.isNotEmpty && failOnMismatch) ||
|
| + remaining.isNotEmpty) {
|
| + Expect.fail(message);
|
| + } else {
|
| + print(message);
|
| + }
|
| + } else if (verbose) {
|
| + print(message);
|
| + }
|
| +}
|
|
|