| // Copyright (c) 2012, 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. | |
| import "package:expect/expect.dart"; | |
| // dart2js specific test to make sure hashCode on intercepted types behaves as | |
| // intended. | |
| @pragma('dart2js:noInline') | |
| @pragma('dart2js:assumeDynamic') | |
| confuse(x) => x; | |
| class Hasher { | |
| 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, {identityHashCode}) { | |
| var h1 = hash(value1); | |
| var h2 = hash(value2); | |
| Expect.isTrue(h1 is int); | |
| Expect.isTrue(h2 is int); | |
| // Quality check - the values should be SMIs for efficient arithmetic. | |
| Expect.equals((h1 & 0x3fffffff), h1); | |
| Expect.equals((h2 & 0x3fffffff), h2); | |
| // If we're checking the (randomized) identity hash code function, | |
| // we cannot guarantee anything about the actual hash code values. | |
| if (identityHashCode) return; | |
| // We expect that the hash function is reasonable quality - there | |
| // are some difference in the low bits. | |
| Expect.isFalse(h1 == h2); | |
| Expect.isFalse((h1 & 0xf) == (h2 & 0xf)); | |
| } | |
| bools() { | |
| check(true, false, identityHashCode: 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, identityHashCode: false); | |
| Expect.equals(i1.hashCode, hash(i1)); | |
| Expect.equals(i2.hashCode, hash(i2)); | |
| } | |
| lists() { | |
| var list1 = []; | |
| var list2 = []; | |
| check(list1, list2, identityHashCode: true); | |
| 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, identityHashCode: false); | |
| check(str1, str3, identityHashCode: false); | |
| check(str2, str3, identityHashCode: false); | |
| 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() { | |
| bools(); | |
| ints(); | |
| lists(); | |
| strings(); | |
| } |