blob: ed591fcf220eeced0b4463baece37edf7b43b89b [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.
// Tests self referencing types.
import "package:expect/expect.dart";
class Base<T> {
get t => T;
}
// Derived<T> is contractive.
class Derived<T> extends Base<Derived<T>> {} /// 00: ok
// Derived<T> is contractive.
class Derived<T> extends Base<Derived<Derived<int>>> {} /// 01: ok
// Derived<T> is non-contractive.
class Derived<T> extends Base<Derived<Derived<T>>> {} /// 02: ok
// Derived1<U> and Derived2<V> are contractive.
class Derived1<U> extends Base<Derived2<U>> {} /// 03: ok
class Derived2<V> extends Base<Derived1<V>> {} /// 03: ok
// Derived1<U> and Derived2<V> are non-contractive.
class Derived1<U> extends Base<Derived2<U>> {} /// 04: ok
class Derived2<V> extends Base<Derived1<Derived2<V>>> {} /// 04: ok
main() {
// In the tests below we test that we get "int" and "bool" when calling
// toString() on the int and bool type respectively. This is not required
// behavior. However, we want to keep the original names for the most common
// core types so we make sure to handle these specifically in the compiler.
var d;
d = new Derived(); /// 00: continued
Expect.equals("Derived", d.t.toString()); /// 00: continued
d = new Derived<bool>(); /// 00: continued
Expect.equals("Derived<bool>", d.t.toString()); /// 00: continued
d = new Derived<Derived>(); /// 00: continued
Expect.equals("Derived<Derived>", d.t.toString()); /// 00: continued
d = new Derived(); /// 01: continued
Expect.equals("Derived<Derived<int>>", d.t.toString()); /// 01: continued
d = new Derived<bool>(); /// 01: continued
Expect.equals("Derived<Derived<int>>", d.t.toString()); /// 01: continued
d = new Derived<Derived>(); /// 01: continued
Expect.equals("Derived<Derived<int>>", d.t.toString()); /// 01: continued
d = new Derived(); /// 02: continued
Expect.equals("Derived<Derived>", d.t.toString()); /// 02: continued
d = new Derived<bool>(); /// 02: continued
Expect.equals("Derived<Derived<bool>>", d.t.toString()); /// 02: continued
d = new Derived<Derived>(); /// 02: continued
Expect.equals("Derived<Derived<Derived>>", d.t.toString()); /// 02: continued
d = new Derived1(); /// 03: continued
Expect.equals("Derived2", d.t.toString()); /// 03: continued
d = new Derived2(); /// 03: continued
Expect.equals("Derived1", d.t.toString()); /// 03: continued
d = new Derived2<Derived1<int>>(); /// 03: continued
Expect.equals("Derived1<Derived1<int>>", d.t.toString()); /// 03: continued
d = new Derived1(); /// 04: continued
Expect.equals("Derived2", d.t.toString()); /// 04: continued
d = new Derived2(); /// 04: continued
Expect.equals("Derived1<Derived2>", d.t.toString()); /// 04: continued
d = new Derived2<Derived1<int>>(); /// 04: continued
Expect.equals("Derived1<Derived2<Derived1<int>>>", d.t.toString()); /// 04: continued
}