// 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.

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