blob: 219fe348af8f48ce2881b334d7ab95ad2af588bb [file] [log] [blame]
// 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.
// @dart = 2.7
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();
}