Index: tests/lib/mirrors/equality_test.dart |
diff --git a/tests/lib/mirrors/equality_test.dart b/tests/lib/mirrors/equality_test.dart |
new file mode 100644 |
index 0000000000000000000000000000000000000000..3036903fd338cc391f264ec27297bbfa88af12cf |
--- /dev/null |
+++ b/tests/lib/mirrors/equality_test.dart |
@@ -0,0 +1,117 @@ |
+// Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file |
+// for details. All rights reserved. Use of this source code is governed by a |
+// BSD-style license that can be found in the LICENSE file. |
+ |
+library test.class_equality_test; |
+ |
+import 'dart:mirrors'; |
+ |
+import 'package:expect/expect.dart'; |
+ |
+class A<T> {} |
+class B extends A<int> {} |
+ |
+class BadEqualityHash { |
+ int count = 0; |
+ bool operator ==(other) => true; |
+ int get hashCode => count++; |
+} |
+ |
+checkEquality(List<Map> equivalenceClasses) { |
+ for (var equivalenceClass in equivalenceClasses) { |
+ equivalenceClass.forEach((name, member) { |
+ equivalenceClass.forEach((otherName, otherMember) { |
+ // Reflexivity, symmetry and transitivity. |
+ Expect.equals(member, |
+ otherMember, |
+ "$name == $otherName"); |
+ Expect.equals(member.hashCode, |
+ otherMember.hashCode, |
+ "$name.hashCode == $otherName.hashCode"); |
+ }); |
+ for (var otherEquivalenceClass in equivalenceClasses) { |
+ if (otherEquivalenceClass == equivalenceClass) continue; |
+ otherEquivalenceClass.forEach((otherName, otherMember) { |
+ Expect.notEquals(member, |
+ otherMember, |
+ "$name != $otherName"); // Exclusion. |
+ // Hash codes may or may not be equal. |
+ }); |
+ } |
+ }); |
+ } |
+} |
+ |
+void subroutine() { |
+} |
+ |
+main() { |
+ LibraryMirror thisLibrary = |
+ currentMirrorSystem() |
+ .findLibrary(const Symbol('test.class_equality_test')) |
+ .single; |
+ |
+ var o1 = new Object(); |
+ var o2 = new Object(); |
+ |
+ var badEqualityHash1 = new BadEqualityHash(); |
+ var badEqualityHash2 = new BadEqualityHash(); |
+ |
+ checkEquality([ |
ahe
2013/08/30 20:40:14
Could you avoid passing in a list, and instead cal
rmacnak
2013/08/30 21:08:29
The number of cases is quadratic. Notice I am pass
ahe
2013/08/30 21:11:13
OK
|
+ {'reflect(o1)' : reflect(o1), |
+ 'reflect(o1), again' : reflect(o1)}, |
+ |
+ {'reflect(o2)' : reflect(o2), |
+ 'reflect(o2), again' : reflect(o2)}, |
+ |
+ {'reflect(badEqualityHash1)' : reflect(badEqualityHash1), |
+ 'reflect(badEqualityHash1), again' : reflect(badEqualityHash1)}, |
+ |
+ {'reflect(badEqualityHash2)' : reflect(badEqualityHash2), |
+ 'reflect(badEqualityHash2), again' : reflect(badEqualityHash2)}, |
+ |
+ {'reflect(true)' : reflect(true), |
+ 'reflect(true), again' : reflect(true)}, |
+ |
+ {'reflect(false)' : reflect(false), |
+ 'reflect(false), again' : reflect(false)}, |
+ |
+ {'reflect(null)' : reflect(null), |
+ 'reflect(null), again' : reflect(null)}, |
+ |
+ {'reflect(3.5+4.5)' : reflect(3.5+4.5), |
+ 'reflect(6.5+1.5)' : reflect(6.5+1.5)}, |
+ |
+ {'reflect(3+4)' : reflect(3+4), |
+ 'reflect(6+1)' : reflect(6+1)}, |
+ |
+ {'reflect("foo")' : reflect("foo"), |
+ 'reflect("foo"), again' : reflect("foo")}, |
+ |
+// {'currentMirrorSystem().voidType' : currentMirrorSystem().voidType, |
+// 'thisLibrary.functions[#subroutine].returnType' : |
+// thisLibrary.functions[const Symbol('subroutine')].returnType}, |
+ |
+ {'currentMirrorSystem().dynamicType' : currentMirrorSystem().dynamicType, |
+ 'thisLibrary.functions[#main].returnType' : |
+ thisLibrary.functions[const Symbol('main')].returnType}, |
+ |
+// {'reflectClass(A)' : reflectClass(A), |
+// 'thisLibrary.classes[#A]' : thisLibrary.classes[const Symbol('A')], |
+// 'reflect(new A<int>()).type.originalDeclaration' : |
+// reflect(new A<int>()).type.originalDeclaration}, |
+ |
+ {'reflectClass(B).superclass' : reflectClass(B).superclass, |
+ 'reflect(new A<int>()).type' : reflect(new A<int>()).type}, |
+ |
+ {'reflectClass(B)' : reflectClass(B), |
+ 'thisLibrary.classes[#B]' : thisLibrary.classes[const Symbol('B')], |
+ 'reflect(new B()).type' : reflect(new B()).type}, |
+ |
+ {'thisLibrary' : thisLibrary, |
+ 'reflectClass(A).owner' : reflectClass(A).owner, |
+ 'reflectClass(B).owner' : reflectClass(B).owner, |
+ 'reflect(new A()).type.owner' : reflect(new A()).type.owner, |
+ 'reflect(new A()).type.owner' : reflect(new A()).type.owner}, |
+ ]); |
+} |