/*
 * 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.
 */
/**
 * @assertion If a generic type is used but type arguments are not provided,
 * then the type arguments default to the unknown type.
 * @description Indirectly verifies the assertion: checks that various unrelated
 * types are subtypes of an omitted type argument.
 * @author iefremov
 * @reviewer rodionov
 * @note this test would also pass if such type arguments defaulted to Object
 * type. Object seems to be indistinguishable from dynamic as far as subtype
 * testing is concerned.
 */
import "../../../Utils/expect.dart";

class DynamicChecker<S, T> {
  DynamicChecker() {
    int func(int x) => 42;
    var foo;

    Expect.isTrue(foo is S);
    Expect.isTrue(new Object() is S);
    Expect.isTrue(1 is S);
    Expect.isTrue(() {} is S);
    Expect.isTrue(func is S);

    Expect.isTrue(foo is T);
    Expect.isTrue(new Object() is T);
    Expect.isTrue(1 is T);
    Expect.isTrue(() {} is T);
    Expect.isTrue(func is T);
  }
}

main() {
  new DynamicChecker();
}
