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

// @dart = 2.9

import "package:expect/expect.dart";

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