// Copyright (c) 2015, 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.
// VMOptions=--optimization-counter-threshold=10 --no-use-osr --no-background-compilation

import "package:expect/expect.dart";

// Test dense class-id checks. Regression test for issue 22104.

class A {
  toString() => "an A";
}

class A1 extends A { }
class A2 extends A { }
class A3 extends A { }
class A4 extends A { toString() => "ha"; }
class A5 extends A { }
class A6 extends A { }
class A7 extends A { }
class A8 extends A { }
class A9 extends A { }
class A10 extends A { }
class A11 extends A { }
class A12 extends A { }
class A13 extends A { }
class A14 extends A { }
class A15 extends A { }
class A16 extends A { }
class A17 extends A { }
class A18 extends A { }
class A19 extends A { }
class A20 extends A { }
class A21 extends A { }
class A22 extends A { }
class A23 extends A { }
class A24 extends A { }
class A25 extends A { }
class A26 extends A { }
class A27 extends A { }
class A28 extends A { }
class A29 extends A { }
class A30 extends A { }
class A31 extends A { }
class A32 extends A { }
class A33 extends A { }
class A34 extends A { }
class A35 extends A { }
class A36 extends A { }

test_class_check(e) => e.toString();

main() {
  var list = [
    new A1(),
    new A2(),
    new A11(),
    new A36()
  ];
  for (var i = 0; i < list.length; i++) {
    test_class_check(list[i]);
  }
  for (var i = 0; i < 100; i++) {
    Expect.equals("an A", test_class_check(new A1()));
  }
  Expect.equals("ha", test_class_check(new A4()));
}



