// Copyright (c) 2019, 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 = 2.7
//
// dart2jsOptions=--experiment-new-rti --no-minify

import 'dart:_rti' as rti;
import "package:expect/expect.dart";

class Thingy {}

class Generic<AA> {
  checkMethod(o) => o is AA;
}

@pragma('dart2js:noInline')
void check<T>(o) {
  Expect.isTrue(o is T);
  Expect.isFalse(o is! T);
}

main() {
  check<Thingy>(Thingy());

  check<Generic<int>>(Generic<int>());

  check<Generic<dynamic>>(Generic<dynamic>());
  check<Generic<Object>>(Generic<Object>());
  check<Generic<Object>>(Generic<dynamic>());
  check<Generic<dynamic>>(Generic<Object>());

  Expect.isTrue(Generic<Thingy>().checkMethod(Thingy()));
  Expect.isTrue(Generic<Object>().checkMethod(Object()));
  Expect.isTrue(Generic<Object>().checkMethod(Thingy()));
  Expect.isFalse(Generic<Thingy>().checkMethod(Object()));
  Expect.isTrue(Generic<dynamic>().checkMethod(Object()));

  Expect.isFalse(Generic<Thingy>().checkMethod(123));
  Expect.isFalse(Generic<Thingy>().checkMethod(Object()));
}
