// 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 = -1;
  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));
  }
}
