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

class M<T> {
  bool matches(o) {
    bool isChecked = checkUsingIs(o);
    if (checkedMode) {
      Expect.equals(isChecked, checkUsingCheckedMode(o));
    }
    return isChecked;
  }

  bool checkUsingIs(o) {
    return o is T;
  }

  bool checkUsingCheckedMode(o) {
    try {
      T x = o;
    } on Error {
      return false;
    }
    return true;
  }

  static final bool checkedMode = computeCheckedMode();
  static bool computeCheckedMode() {
    try {
      int x = "foo";
    } on Error {
      return true;
    }
    return false;
  }
}

class S {
}

class C0<T> extends S with M { }
class C1<T> extends S with M<T> { }
class C2<T> extends S with M<int> { }
class C3 extends S with M<String> { }

main() {
  var c0 = new C0();
  Expect.isTrue(c0 is M);
  Expect.isTrue(c0 is M<int>);
  Expect.isTrue(c0 is M<String>);
  Expect.isTrue(c0.matches(c0));
  Expect.isTrue(c0.matches(42));
  Expect.isTrue(c0.matches("hello"));

  var c0_int = new C0<int>();
  Expect.isTrue(c0_int is M);
  Expect.isTrue(c0_int is M<int>);
  Expect.isTrue(c0_int is M<String>);
  Expect.isTrue(c0_int.matches(c0));
  Expect.isTrue(c0_int.matches(42));
  Expect.isTrue(c0_int.matches("hello"));

  var c0_String = new C0<String>();
  Expect.isTrue(c0_String is M);
  Expect.isTrue(c0_String is M<int>);
  Expect.isTrue(c0_String is M<String>);
  Expect.isTrue(c0_String.matches(c0));
  Expect.isTrue(c0_String.matches(42));
  Expect.isTrue(c0_String.matches("hello"));

  var c1 = new C1();
  Expect.isTrue(c1 is M);
  Expect.isTrue(c1 is M<int>);
  Expect.isTrue(c1 is M<String>);
  Expect.isTrue(c1.matches(c1));
  Expect.isTrue(c1.matches(42));
  Expect.isTrue(c1.matches("hello"));

  var c1_int = new C1<int>();
  Expect.isTrue(c1_int is M);
  Expect.isTrue(c1_int is M<int>);
  Expect.isFalse(c1_int is M<String>);
  Expect.isFalse(c1_int.matches(c1));
  Expect.isTrue(c1_int.matches(42));
  Expect.isFalse(c1_int.matches("hello"));

  var c1_String = new C1<String>();
  Expect.isTrue(c1_String is M);
  Expect.isFalse(c1_String is M<int>);
  Expect.isTrue(c1_String is M<String>);
  Expect.isFalse(c1_String.matches(c1));
  Expect.isFalse(c1_String.matches(42));
  Expect.isTrue(c1_String.matches("hello"));

  var c2 = new C2();
  Expect.isTrue(c2 is M);
  Expect.isTrue(c2 is M<int>);
  Expect.isFalse(c2 is M<String>);
  Expect.isFalse(c2.matches(c2));
  Expect.isTrue(c2.matches(42));
  Expect.isFalse(c2.matches("hello"));

  var c2_int = new C2<int>();
  Expect.isTrue(c2_int is M);
  Expect.isTrue(c2_int is M<int>);
  Expect.isFalse(c2_int is M<String>);
  Expect.isFalse(c2_int.matches(c2));
  Expect.isTrue(c2_int.matches(42));
  Expect.isFalse(c2_int.matches("hello"));

  var c2_String = new C2<String>();
  Expect.isTrue(c2_String is M);
  Expect.isTrue(c2_String is M<int>);
  Expect.isFalse(c2_String is M<String>);
  Expect.isFalse(c2_String.matches(c2));
  Expect.isTrue(c2_String.matches(42));
  Expect.isFalse(c2_String.matches("hello"));

  var c3 = new C3();
  Expect.isTrue(c3 is M);
  Expect.isFalse(c3 is M<int>);
  Expect.isTrue(c3 is M<String>);
  Expect.isFalse(c3.matches(c2));
  Expect.isFalse(c3.matches(42));
  Expect.isTrue(c3.matches("hello"));
}
