Index: tests/compiler/dart2js_extra/hash_code_test.dart |
diff --git a/tests/compiler/dart2js_extra/hash_code_test.dart b/tests/compiler/dart2js_extra/hash_code_test.dart |
index 5db341bf2fa89b854bb5cc7d55cf2c2710fe2a1e..869c60bde3f3e99cb38d9f5628945b3ad3c105f2 100644 |
--- a/tests/compiler/dart2js_extra/hash_code_test.dart |
+++ b/tests/compiler/dart2js_extra/hash_code_test.dart |
@@ -2,10 +2,80 @@ |
// 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. |
-// dart2js specific test to make sure String.hashCode behaves as |
+// dart2js specific test to make sure hashCode on intercepted types behaves as |
// intended. |
+ |
+class Hasher { |
+ confuse(x) => [1, 'x', true, null, x].last; |
+ hash(x) => confuse(x).hashCode; |
+} |
+ |
+// Hashing via [hash] should be forced to use the general interceptor, but the |
+// local x.hashCode calls might be optimized. |
+var hash = new Hasher().hash; |
+ |
+check(value1, value2) { |
+ var h1 = hash(value1); |
+ var h2 = hash(value2); |
+ |
+ Expect.isTrue(h1 is int); |
+ Expect.isTrue(h2 is int); |
+ Expect.isFalse(h1 == h2); |
+ |
+ // We expect that the hash function is reasonable quality - there are some |
+ // difference in the low bits. |
+ Expect.isFalse((h1 & 0xf) == (h2 & 0xf)); |
+ |
+ // Quality check - the values should be SMIs for efficient arithmetic. |
+ Expect.equals((h1 & 0x1fffffff), h1); |
+ Expect.equals((h2 & 0x1fffffff), h2); |
+} |
+ |
+bools() { |
+ check(true, false); |
+ |
+ Expect.equals(true.hashCode, hash(true)); // First can be optimized. |
+ Expect.equals(false.hashCode, hash(false)); |
+} |
+ |
+ints() { |
+ var i1 = 100; |
+ var i2 = 101; |
+ check(i1, i2); |
+ Expect.equals(i1.hashCode, hash(i1)); |
+ Expect.equals(i2.hashCode, hash(i2)); |
+} |
+ |
+lists() { |
+ var list1 = []; |
+ var list2 = []; |
+ check(list1, list2); |
+ |
+ Expect.equals(list1.hashCode, hash(list1)); |
+ Expect.equals(list2.hashCode, hash(list2)); |
+} |
+ |
+strings() { |
+ var str1 = 'a'; |
+ var str2 = 'b'; |
+ var str3 = 'c'; |
+ check(str1, str2); |
+ check(str1, str3); |
+ check(str2, str3); |
+ |
+ Expect.equals(str1.hashCode, hash(str1)); |
+ Expect.equals(str2.hashCode, hash(str2)); |
+ Expect.equals(str3.hashCode, hash(str3)); |
+ |
+ Expect.equals(0xA2E9442, 'a'.hashCode); |
+ Expect.equals(0x0DB819B, 'b'.hashCode); |
+ Expect.equals(0xEBA5D59, 'c'.hashCode); |
+} |
+ |
main() { |
- Expect.equals(67633152, 'a'.hashCode); |
- Expect.equals(37224448, 'b'.hashCode); |
+ bools(); |
+ ints(); |
+ lists(); |
+ strings(); |
} |