blob: 75ad654f7c292d2213ff50e8b74dd5cc80c940d3 [file] [log] [blame]
// Copyright (c) 2015, 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 MS<T> {
foo() {
return "MS<$T>.foo\n";
}
}
mixin M<T> on MS<List<T>> {
foo() {
return super.foo() + "M<$T>.foo\n";
}
}
class NS<T> {
foo() {
return "NS<$T>.foo\n";
}
}
mixin N<T> on NS<List<T>> {
foo() {
return super.foo() + "N<$T>.foo\n";
}
}
class S<T, V, W> implements MS<List<V>>, NS<List<W>> {
foo() {
return "S<$T,$V,$W>.foo\n";
}
}
class SM<U, V, W> = S<U, V, W> with M<V>;
class MNA1<U, V, W> extends S<U, V, W> with M<V>, N<W> {
foo() {
return super.foo() + "MNA1<$U, $V, $W>.foo\n";
}
}
class MNA2<U, V, W> extends SM<U, V, W> with N<W> {
foo() {
return super.foo() + "MNA2<$U, $V, $W>.foo\n";
}
}
class MNA3<U, V, W> extends S<U, V, W> with M<V>, N<W> {
foo() {
return super.foo() + "MNA3<$U, $V, $W>.foo\n";
}
}
main() {
Expect.equals(
"S<int,String,bool>.foo\n"
"M<String>.foo\n",
SM<int, String, bool>().foo());
Expect.equals(
"S<int,String,bool>.foo\n"
"M<String>.foo\n"
"N<bool>.foo\n"
"MNA1<int, String, bool>.foo\n",
MNA1<int, String, bool>().foo());
Expect.equals(
"S<int,String,bool>.foo\n"
"M<String>.foo\n"
"N<bool>.foo\n"
"MNA2<int, String, bool>.foo\n",
MNA2<int, String, bool>().foo());
Expect.equals(
"S<int,String,bool>.foo\n"
"M<String>.foo\n"
"N<bool>.foo\n"
"MNA3<int, String, bool>.foo\n",
MNA3<int, String, bool>().foo());
}