| // Copyright (c) 2018, 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 A mixin declaration defines an interface. The interface for this |
| /// mixin declaration is equivalent to the interface of the class declared as: |
| /// abstract class A<X extends S, Y extends T> extends A$super<X, Y> |
| /// implements D, E { body' } |
| /// where body' contains abstract declarations corresponding to the instance |
| /// members of body of the mixin A. |
| /// It is a compile time error for the mixin declaration if this class |
| /// declarations would not be valid. |
| /// |
| /// @description Checks that a mixin declaration in form |
| /// mixin A<X extends S, Y extends T> on B, C implements D, E { body } |
| /// is equivalent to the interface of the class declared as |
| /// abstract class A<X extends S, Y extends T> extends A$super<X, Y> |
| /// implements D, E { body' }. |
| /// @author sgrekhov@unipro.ru |
| |
| import "../../Utils/expect.dart"; |
| |
| class S { |
| String get id => "S"; |
| } |
| class T { |
| String get id => "T"; |
| } |
| class X extends S { |
| String get id => "X"; |
| } |
| class Y extends T { |
| String get id => "Y"; |
| } |
| |
| abstract class B<T> { |
| String get b; |
| T get tb; |
| } |
| |
| abstract class C<T> { |
| String get c => "C"; |
| T get tc; |
| } |
| |
| abstract class D<T> { |
| String get d => "D"; |
| T get td; |
| } |
| |
| abstract class E<T> { |
| String get e; |
| T get te; |
| } |
| |
| mixin A<X extends S, Y extends T> on B<X>, C<Y> implements D<S>, E<T> { |
| String get d => "AD"; |
| S get td => new S(); |
| String get e => "AE"; |
| T get te => new T(); |
| } |
| |
| class AI implements A<X, Y> { |
| |
| String get b => "AI"; |
| String get c => "AI"; |
| String get d => "AI"; |
| String get e => "AI"; |
| |
| X get tb => new X(); |
| Y get tc => new Y(); |
| S get td => new S(); |
| T get te => new T(); |
| |
| test() { |
| Expect.equals("AI", this.b); |
| Expect.equals("AI", this.c); |
| Expect.equals("AI", this.d); |
| Expect.equals("AI", this.e); |
| |
| Expect.equals("X", this.tb.id); |
| Expect.equals("Y", this.tc.id); |
| Expect.equals("S", this.td.id); |
| Expect.equals("T", this.te.id); |
| } |
| } |
| |
| main() { |
| AI ai = new AI(); |
| Expect.equals("AI", ai.b); |
| Expect.equals("AI", ai.c); |
| Expect.equals("AI", ai.d); |
| Expect.equals("AI", ai.e); |
| |
| Expect.equals("X", ai.tb.id); |
| Expect.equals("Y", ai.tc.id); |
| Expect.equals("S", ai.td.id); |
| Expect.equals("T", ai.te.id); |
| ai.test(); |
| } |