// 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(); }