// Copyright (c) 2011, 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 test using an identity hash.

abstract class BigGame {
  String get name;
}

// Giraffe overrides hashCode and provides its own identity hash.
class Giraffe implements BigGame {
  final String name;
  final int identityHash_;

  Giraffe(this.name) : identityHash_ = nextId() {}

  int get hashCode {
    return identityHash_;
  }

  // Calculate identity hash for a giraffe.
  static int nextId_;
  static int nextId() {
    if (nextId_ == null) {
      nextId_ = 17;
    }
    return nextId_++;
  }
}

// Zebra relies on the system provided identity hash.
class Zebra implements BigGame {
  final String name;
  Zebra(this.name) {}
}


class SavannahTest {

  static void testMain() {
    Map<BigGame, String> savannah = new Map<BigGame, String>();

    Giraffe giraffe1 = new Giraffe("Tony");
    Giraffe giraffe2 = new Giraffe("Rose");
    savannah[giraffe1] = giraffe1.name;
    savannah[giraffe2] = giraffe2.name;
    print("giraffe1 hash: ${giraffe1.hashCode}");
    print("giraffe2 hash: ${giraffe2.hashCode}");

    var count = savannah.length;
    print("getCount is $count");
    Expect.equals(2, count);

    print("giraffe1: ${savannah[giraffe1]}");
    print("giraffe2: ${savannah[giraffe2]}");
    Expect.equals("Tony", savannah[giraffe1]);
    Expect.equals("Rose", savannah[giraffe2]);

    Zebra zebra1 = new Zebra("Paolo");
    Zebra zebra2 = new Zebra("Zeeta");
    savannah[zebra1] = zebra1.name;
    savannah[zebra2] = zebra2.name;
    print("zebra1 hash: ${zebra1.hashCode}");
    print("zebra2 hash: ${zebra2.hashCode}");

    count = savannah.length;
    print("getCount is $count");
    Expect.equals(4, count);

    print("zebra1: ${savannah[zebra1]}");
    print("zebra2: ${savannah[zebra2]}");
    Expect.equals("Paolo", savannah[zebra1]);
    Expect.equals("Zeeta", savannah[zebra2]);
  }

}

main() {
  SavannahTest.testMain();
}
