// Copyright (c) 2013, 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.9

import "package:expect/expect.dart";

class Override {
  int hash;
  int get superHash => super.hashCode;
  int get hashCode => hash;

  int foo() => hash; //   Just some function that can be closurized.

  bool operator ==(Object other) => other is Override && other.hash == hash;
}

int bar() => 42; // Some global function.

main() {
  var o = new Object();
  var hash = o.hashCode;
  // Doesn't change.
  Expect.equals(hash, o.hashCode);
  Expect.equals(hash, identityHashCode(o));

  var c = new Override();
  int identityHash = c.superHash;
  hash = (identityHash == 42) ? 37 : 42;
  c.hash = hash;
  Expect.equals(hash, c.hashCode);
  Expect.equals(identityHash, identityHashCode(c));

  // These classes don't override hashCode.
  var samples = [0, 0x10000000, 1.5, -0, null, true, false, const Object()];
  for (var v in samples) {
    print(v);
    Expect.equals(v.hashCode, identityHashCode(v));
  }
  // These do, or might do, but we can still use hashCodeOf and get the same
  // result each time.
  samples = ["string", "", (x) => 42, c.foo, bar];
  for (var v in samples) {
    print(v);
    Expect.equals(v.hashCode, v.hashCode);
    Expect.equals(identityHashCode(v), identityHashCode(v));
  }
}
