| // Copyright (c) 2016, 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. |
| |
| import 'package:expect/expect.dart'; |
| |
| class TypeTester<T> { |
| const TypeTester(); |
| bool isCorrectType(object) => object is T; |
| } |
| |
| class ClosureTypeTester<T> { |
| const ClosureTypeTester(); |
| bool isCorrectType(object) => (() => object is T)(); |
| } |
| |
| class Base<A, B> { |
| final A a; |
| final B b; |
| const Base(this.a, this.b); |
| const factory Base.fac(A a, B b) = Base<A, B>; |
| } |
| |
| class Sub1<C, D> extends Base<C, C> { |
| final D d; |
| const Sub1(C a, this.d) : super(a, a); |
| const factory Sub1.fac(C a, D d) = Sub1<C, D>; |
| } |
| |
| class Sub2<C, D> extends Base<D, C> { |
| const Sub2(C a, D b) : super(b, a); |
| const factory Sub2.fac(C a, D b) = Sub2<C, D>; |
| } |
| |
| class G<T> {} |
| |
| class I {} |
| |
| class A implements I {} |
| |
| class B extends A {} |
| |
| class C {} |
| |
| testConstantLiteralTypes() { |
| Expect.isTrue(const [1] is List); |
| Expect.isTrue(const [1] is List<int>); |
| Expect.isTrue(const ["1"] is List<String>); |
| Expect.isTrue(!(const [1] is List<String>)); |
| Expect.isTrue(const <int>[1] is List); |
| Expect.isTrue(const <int>[1] is List<int>); |
| Expect.isTrue(!(const <int>[1] is List<String>)); |
| Expect.isTrue(const {"a": 1} is Map); |
| Expect.isTrue(const {"a": 1} is Map<String, int>); |
| Expect.isTrue(const {1: "a"} is Map<int, String>); |
| Expect.isTrue(const <String, int>{"a": 1} is Map); |
| Expect.isTrue(const <String, int>{"a": 1} is Map<String, int>); |
| Expect.isTrue(!(const <String, int>{"a": 1} is Map<int, String>)); |
| } |
| |
| testNonConstantLiteralTypes() { |
| Expect.isTrue([1] is List); |
| Expect.isTrue([1] is List<int>); |
| Expect.isTrue(["1"] is List<String>); |
| Expect.isTrue(!([1] is List<String>)); |
| Expect.isTrue(<int>[1] is List); |
| Expect.isTrue(<int>[1] is List<int>); |
| Expect.isTrue(!(<int>[1] is List<String>)); |
| } |
| |
| testParametrizedClass() { |
| Expect.isTrue(new Base<int, int>(1, 1) is Base<int, int>); |
| Expect.isTrue(new Base<int, int>(1, 1) is Base); |
| Expect.isTrue(new Base<int, int>(1, 1) is Base<Object, Object>); |
| Expect.isTrue(!(new Base<int, int>(1, 1) is Base<int, String>)); |
| Expect.isTrue(!(new Base<int, int>(1, 1) is Base<String, int>)); |
| Expect.isTrue(new Sub1<int, String>(1, "1") is Base<int, int>); |
| Expect.isTrue(new Sub1<int, String>(1, "1") is Base); |
| Expect.isTrue(new Sub1<int, String>(1, "1") is Sub1<int, String>); |
| Expect.isTrue(new Sub1<int, String>(1, "1") is Sub1); |
| Expect.isTrue(!(new Sub1<int, String>(1, "1") is Base<String, int>)); |
| Expect.isTrue(!(new Sub1<int, String>(1, "1") is Base<int, String>)); |
| Expect.isTrue(!(new Sub1<int, String>(1, "1") is Sub1<String, String>)); |
| Expect.isTrue(new Sub2<int, String>(1, "1") is Base<String, int>); |
| Expect.isTrue(new Sub2<int, String>(1, "1") is Base); |
| Expect.isTrue(new Sub2<int, String>(1, "1") is Sub2<int, String>); |
| Expect.isTrue(new Sub2<int, String>(1, "1") is Sub2); |
| Expect.isTrue(!(new Sub2<int, String>(1, "1") is Base<int, int>)); |
| Expect.isTrue(!(new Sub2<int, String>(1, "1") is Base<int, String>)); |
| Expect.isTrue(!(new Sub2<int, String>(1, "1") is Sub2<String, String>)); |
| } |
| |
| testTypeTester() { |
| Expect.isTrue(new TypeTester<int>().isCorrectType(10)); |
| Expect.isTrue(!new TypeTester<int>().isCorrectType("abc")); |
| Expect.isTrue(new TypeTester<List<int>>().isCorrectType([1])); |
| Expect.isTrue(new TypeTester<List<int>>().isCorrectType(<int>[1])); |
| Expect.isTrue(!new TypeTester<List<int>>().isCorrectType(<String>["1"])); |
| Expect.isTrue(new TypeTester<Base<String, int>>() |
| .isCorrectType(new Sub2<int, String>(1, "1"))); |
| Expect.isTrue(new TypeTester<Sub2<int, String>>() |
| .isCorrectType(new Sub2<int, String>(1, "1"))); |
| } |
| |
| testClosureTypeTester() { |
| Expect.isTrue(new ClosureTypeTester<int>().isCorrectType(10)); |
| Expect.isTrue(!new ClosureTypeTester<int>().isCorrectType("abc")); |
| Expect.isTrue(new ClosureTypeTester<List<int>>().isCorrectType([1])); |
| Expect.isTrue(new ClosureTypeTester<List<int>>().isCorrectType(<int>[1])); |
| Expect |
| .isTrue(!new ClosureTypeTester<List<int>>().isCorrectType(<String>["1"])); |
| Expect.isTrue(new ClosureTypeTester<Base<String, int>>() |
| .isCorrectType(new Sub2<int, String>(1, "1"))); |
| Expect.isTrue(new ClosureTypeTester<Sub2<int, String>>() |
| .isCorrectType(new Sub2<int, String>(1, "1"))); |
| } |
| |
| testConstTypeArguments() { |
| Expect.isTrue(const Sub1<int, String>(1, "1") is Sub1<int, String>); |
| Expect.isTrue(const Sub1<int, String>.fac(1, "1") is Sub1<int, String>); |
| Expect.isTrue(!(const Sub1<int, String>(1, "1") is Sub1<String, String>)); |
| Expect.isTrue(!(const Sub1<int, String>.fac(1, "1") is Sub1<String, String>)); |
| |
| Expect.isTrue(const ClosureTypeTester<List<Base<int, String>>>() |
| .isCorrectType( |
| const <Base<int, String>>[const Base<int, String>(1, "2")])); |
| Expect.isTrue(const ClosureTypeTester<List<Base<int, String>>>() |
| .isCorrectType( |
| const <Base<int, String>>[const Base<int, String>.fac(1, "2")])); |
| Expect.isTrue(!const ClosureTypeTester<List<Base<int, String>>>() |
| .isCorrectType( |
| const <Base<String, String>>[const Base<String, String>("1", "2")])); |
| Expect.isTrue(!const ClosureTypeTester<List<Base<int, String>>>() |
| .isCorrectType(const <Base<String, String>>[ |
| const Base<String, String>.fac("1", "2") |
| ])); |
| |
| Expect.isTrue(const TypeTester<Sub2<int, String>>() |
| .isCorrectType(const Sub2<int, String>(1, "1"))); |
| Expect.isTrue(const TypeTester<Sub2<int, String>>() |
| .isCorrectType(const Sub2<int, String>.fac(1, "1"))); |
| Expect.isTrue(!const TypeTester<Sub2<int, String>>() |
| .isCorrectType(const Sub2<String, String>("a", "b"))); |
| Expect.isTrue(!const TypeTester<Sub2<int, String>>() |
| .isCorrectType(const Sub2<String, String>.fac("a", "b"))); |
| } |
| |
| testNoBound() { |
| new G<int>(); |
| new G<num>(); |
| new G<Function>(); |
| new G<Object>(); |
| new G(); |
| new G(); |
| new G<G>(); |
| } |
| |
| testSubtypeChecker() { |
| Expect.isTrue(new TypeTester<num>().isCorrectType(1)); |
| Expect.isTrue(new TypeTester<num>().isCorrectType(1.0)); |
| Expect.isTrue(new TypeTester<A>().isCorrectType(new B())); |
| Expect.isTrue(new TypeTester<Object>().isCorrectType(new C())); |
| Expect.isTrue(new TypeTester<I>().isCorrectType(new A())); |
| } |
| |
| testFunctionTypes() { |
| fun(int x, String y) => "${x}${y}"; |
| Expect.isTrue(!(fun is FunctionType)); |
| |
| fun1(num x, Pattern y) => 123; |
| Expect.isTrue(fun1 is FunctionType); |
| |
| fun2(num x, String y) => 123; |
| Expect.isTrue(!(fun2 is FunctionType)); |
| |
| Expect.isTrue(!(nan is FunctionType)); |
| Expect.isTrue(nan is Function); |
| } |
| |
| num nan(double d, Pattern p) => double.nan; |
| |
| typedef int FunctionType(num _, Pattern __); |
| |
| testLiteralTypeArguments() { |
| Expect.isTrue(new Foo<String, int>().foo() is List<String>); |
| Expect.isTrue(new Foo<int, String>().bar() is Map<int, String>); |
| } |
| |
| class Foo<T1, T2> { |
| foo() => <T1>[]; |
| bar() => <T1, T2>{}; |
| } |
| |
| regressionTest1() { |
| Expect.isTrue(!StaticTypeTester.isInt('abc')); |
| } |
| |
| class StaticTypeTester<T> { |
| static isInt(x) => x is int; |
| } |
| |
| main() { |
| testConstantLiteralTypes(); |
| testNonConstantLiteralTypes(); |
| testParametrizedClass(); |
| testTypeTester(); |
| testClosureTypeTester(); |
| testConstTypeArguments(); |
| testNoBound(); |
| testSubtypeChecker(); |
| testFunctionTypes(); |
| testLiteralTypeArguments(); |
| regressionTest1(); |
| } |