blob: 020221981d5294fe8fb3d73ad95c46a0db76c2d1 [file] [log] [blame]
// 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.
import "package:expect/expect.dart";
class S<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 M {
}
typedef C0<T> = S with M;
typedef C1<T> = S<T> with M;
typedef C2<T> = S<int> with M;
typedef C3 = S<String> with M;
main() {
var c0 = new C0();
Expect.isTrue(c0 is S);
Expect.isTrue(c0 is S<int>);
Expect.isTrue(c0 is S<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 S);
Expect.isTrue(c0_int is S<int>);
Expect.isTrue(c0_int is S<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 S);
Expect.isTrue(c0_String is S<int>);
Expect.isTrue(c0_String is S<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 S);
Expect.isTrue(c1 is S<int>);
Expect.isTrue(c1 is S<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 S);
Expect.isTrue(c1_int is S<int>);
Expect.isFalse(c1_int is S<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 S);
Expect.isFalse(c1_String is S<int>);
Expect.isTrue(c1_String is S<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 S);
Expect.isTrue(c2 is S<int>);
Expect.isFalse(c2 is S<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 S);
Expect.isTrue(c2_int is S<int>);
Expect.isFalse(c2_int is S<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 S);
Expect.isTrue(c2_String is S<int>);
Expect.isFalse(c2_String is S<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 S);
Expect.isFalse(c3 is S<int>);
Expect.isTrue(c3 is S<String>);
Expect.isFalse(c3.matches(c2));
Expect.isFalse(c3.matches(42));
Expect.isTrue(c3.matches("hello"));
}