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 496d0e398ae2e4cde4fe6ad745d406f93b6f4c80..dca85531e2ee554889705c4b722f2db8216771cf 100644 |
--- a/tests/compiler/dart2js/serialization/test_helper.dart |
+++ b/tests/compiler/dart2js/serialization/test_helper.dart |
@@ -4,6 +4,7 @@ |
library dart2js.serialization_test_helper; |
+import 'dart:collection'; |
import 'package:compiler/src/common/resolution.dart'; |
import 'package:compiler/src/constants/expressions.dart'; |
import 'package:compiler/src/dart_types.dart'; |
@@ -12,6 +13,40 @@ import 'package:compiler/src/elements/elements.dart'; |
import 'package:compiler/src/serialization/equivalence.dart'; |
import 'package:compiler/src/tree/nodes.dart'; |
+Check currentCheck; |
+ |
+class Check { |
+ final Check parent; |
+ final Object object1; |
+ final Object object2; |
+ final String property; |
+ final Object value1; |
+ final Object value2; |
+ |
+ Check(this.parent, this.object1, this.object2, this.property, this.value1, this.value2); |
+ |
+ String printOn(StringBuffer sb, String indent) { |
+ if (parent != null) { |
+ indent = parent.printOn(sb, indent); |
+ sb.write('\n$indent|\n'); |
+ } |
+ sb.write("${indent}property='$property'\n "); |
+ sb.write("${indent}object1=$object1 (${object1.runtimeType})\n "); |
+ sb.write("${indent}value=${value1 == null ? "null" : "'$value1'"} "); |
+ sb.write("(${value1.runtimeType}) vs\n "); |
+ sb.write("${indent}object2=$object2 (${object2.runtimeType})\n "); |
+ sb.write("${indent}value=${value2 == null ? "null" : "'$value2'"} "); |
+ sb.write("(${value2.runtimeType})"); |
+ return ' $indent'; |
+ } |
+ |
+ String toString() { |
+ StringBuffer sb = new StringBuffer(); |
+ printOn(sb, ''); |
+ return sb.toString(); |
+ } |
+} |
+ |
/// Strategy for checking equivalence. |
/// |
/// Use this strategy to fail early with contextual information in the event of |
@@ -99,15 +134,12 @@ class CheckStrategy implements TestStrategy { |
/// [value2] respectively, are equal and throw otherwise. |
bool check(var object1, var object2, String property, var value1, var value2, |
[bool equivalence(a, b) = equality]) { |
+ currentCheck = new Check( |
+ currentCheck, object1, object2, property, value1, value2); |
if (!equivalence(value1, value2)) { |
- throw "property='$property'\n " |
- "object1=$object1 (${object1.runtimeType})\n " |
- "value=${value1 == null ? "null" : "'$value1'"} " |
- "(${value1.runtimeType}) <>\n " |
- "object2=$object2 (${object2.runtimeType})\n " |
- "value=${value2 == null ? "null" : "'$value2'"} " |
- "(${value2.runtimeType})"; |
+ throw currentCheck; |
} |
+ currentCheck = currentCheck.parent; |
return true; |
} |
@@ -119,6 +151,8 @@ bool checkListEquivalence( |
Object object1, Object object2, String property, |
Iterable list1, Iterable list2, |
void checkEquivalence(o1, o2, property, a, b)) { |
+ currentCheck = |
+ new Check(currentCheck, object1, object2, property, list1, list2); |
for (int i = 0; i < list1.length && i < list2.length; i++) { |
checkEquivalence( |
object1, object2, property, |
@@ -138,6 +172,7 @@ bool checkListEquivalence( |
'`${property}` on $object1:\n ${list1.join('\n ')}\n' |
'`${property}` on $object2:\n ${list2.join('\n ')}'; |
} |
+ currentCheck = currentCheck.parent; |
return true; |
} |
@@ -244,7 +279,8 @@ bool checkTypes( |
if (type1 == null || type2 == null) { |
return check(object1, object2, property, type1, type2); |
} else { |
- return const TypeEquivalence(const CheckStrategy()).visit(type1, type2); |
+ return check(object1, object2, property, type1, type2, |
+ (a, b) => const TypeEquivalence(const CheckStrategy()).visit(a, b)); |
} |
} |
@@ -268,7 +304,8 @@ bool checkConstants( |
if (exp1 == null || exp2 == null) { |
return check(object1, object2, property, exp1, exp2); |
} else { |
- return const ConstantEquivalence(const CheckStrategy()).visit(exp1, exp2); |
+ return check(object1, object2, property, exp1, exp2, |
+ (a, b) => const ConstantEquivalence(const CheckStrategy()).visit(a, b)); |
} |
} |