mirror of
https://github.com/dart-lang/sdk
synced 2024-11-02 14:32:24 +00:00
912005267d
Change-Id: I46be49b2effec3e38a3dc44cd45cfe736f77fa78 Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/182680 Commit-Queue: Sigmund Cherem <sigmund@google.com> Reviewed-by: Joshua Litt <joshualitt@google.com> Reviewed-by: Nicholas Shahan <nshahan@google.com> Reviewed-by: Stephen Adams <sra@google.com>
90 lines
2.3 KiB
Dart
90 lines
2.3 KiB
Dart
// 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();
|
|
}
|