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

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