| // 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 { | 
 |   var foo = "S-foo"; | 
 | } | 
 |  | 
 | class M1 { | 
 |   final bar = "M1-bar"; | 
 | } | 
 |  | 
 | class M2 { | 
 |   var baz = "M2-baz"; | 
 | } | 
 |  | 
 | class C extends S with M1 { } | 
 | class D extends S with M1, M2 { } | 
 | class E extends S with M2, M1 { } | 
 |  | 
 | class F extends E { | 
 |   var fez = "F-fez"; | 
 | } | 
 |  | 
 | main() { | 
 |   var c = new C(); | 
 |   var d = new D(); | 
 |   var e = new E(); | 
 |   var f = new F(); | 
 |  | 
 |   Expect.equals("S-foo", c.foo); | 
 |   Expect.equals("S-foo", d.foo); | 
 |   Expect.equals("S-foo", e.foo); | 
 |   Expect.equals("S-foo", f.foo); | 
 |  | 
 |   Expect.equals("M1-bar", c.bar); | 
 |   Expect.equals("M1-bar", d.bar); | 
 |   Expect.equals("M1-bar", e.bar); | 
 |   Expect.equals("M1-bar", f.bar); | 
 |  | 
 |   Expect.throws(() => c.baz, (error) => error is NoSuchMethodError); | 
 |   Expect.equals("M2-baz", d.baz); | 
 |   Expect.equals("M2-baz", e.baz); | 
 |   Expect.equals("M2-baz", f.baz); | 
 |  | 
 |   Expect.throws(() => c.fez, (error) => error is NoSuchMethodError); | 
 |   Expect.throws(() => d.fez, (error) => error is NoSuchMethodError); | 
 |   Expect.throws(() => e.fez, (error) => error is NoSuchMethodError); | 
 |   Expect.equals("F-fez", f.fez); | 
 |  | 
 |   c.foo = "S-foo-c"; | 
 |   Expect.equals("S-foo-c", c.foo); | 
 |   Expect.equals("S-foo", d.foo); | 
 |   Expect.equals("S-foo", e.foo); | 
 |   Expect.equals("S-foo", f.foo); | 
 |  | 
 |   d.foo = "S-foo-d"; | 
 |   Expect.equals("S-foo-c", c.foo); | 
 |   Expect.equals("S-foo-d", d.foo); | 
 |   Expect.equals("S-foo", e.foo); | 
 |   Expect.equals("S-foo", f.foo); | 
 |  | 
 |   e.foo = "S-foo-e"; | 
 |   Expect.equals("S-foo-c", c.foo); | 
 |   Expect.equals("S-foo-d", d.foo); | 
 |   Expect.equals("S-foo-e", e.foo); | 
 |   Expect.equals("S-foo", f.foo); | 
 |  | 
 |   f.foo = "S-foo-f"; | 
 |   Expect.equals("S-foo-c", c.foo); | 
 |   Expect.equals("S-foo-d", d.foo); | 
 |   Expect.equals("S-foo-e", e.foo); | 
 |   Expect.equals("S-foo-f", f.foo); | 
 |  | 
 |   Expect.throws(() => c.bar = 0, (error) => error is NoSuchMethodError); | 
 |   Expect.throws(() => d.bar = 0, (error) => error is NoSuchMethodError); | 
 |   Expect.throws(() => e.bar = 0, (error) => error is NoSuchMethodError); | 
 |   Expect.throws(() => f.bar = 0, (error) => error is NoSuchMethodError); | 
 |   Expect.equals("M1-bar", c.bar); | 
 |   Expect.equals("M1-bar", d.bar); | 
 |   Expect.equals("M1-bar", e.bar); | 
 |   Expect.equals("M1-bar", f.bar); | 
 |  | 
 |   Expect.throws(() => c.baz = 0, (error) => error is NoSuchMethodError); | 
 |   Expect.throws(() => c.baz, (error) => error is NoSuchMethodError); | 
 |   Expect.equals("M2-baz", d.baz); | 
 |   Expect.equals("M2-baz", e.baz); | 
 |   Expect.equals("M2-baz", f.baz); | 
 |  | 
 |   d.baz = "M2-baz-d"; | 
 |   Expect.throws(() => c.baz, (error) => error is NoSuchMethodError); | 
 |   Expect.equals("M2-baz-d", d.baz); | 
 |   Expect.equals("M2-baz", e.baz); | 
 |   Expect.equals("M2-baz", f.baz); | 
 |   Expect.equals("M2-baz", f.baz); | 
 |  | 
 |   e.baz = "M2-baz-e"; | 
 |   Expect.throws(() => c.baz, (error) => error is NoSuchMethodError); | 
 |   Expect.equals("M2-baz-d", d.baz); | 
 |   Expect.equals("M2-baz-e", e.baz); | 
 |   Expect.equals("M2-baz", f.baz); | 
 |  | 
 |   f.baz = "M2-baz-f"; | 
 |   Expect.throws(() => c.baz, (error) => error is NoSuchMethodError); | 
 |   Expect.equals("M2-baz-d", d.baz); | 
 |   Expect.equals("M2-baz-e", e.baz); | 
 |   Expect.equals("M2-baz-f", f.baz); | 
 |  | 
 |   Expect.throws(() => c.fez = 0, (error) => error is NoSuchMethodError); | 
 |   Expect.throws(() => d.fez = 0, (error) => error is NoSuchMethodError); | 
 |   Expect.throws(() => e.fez = 0, (error) => error is NoSuchMethodError); | 
 |  | 
 |   f.fez = "F-fez-f"; | 
 |   Expect.throws(() => c.fez, (error) => error is NoSuchMethodError); | 
 |   Expect.throws(() => d.fez, (error) => error is NoSuchMethodError); | 
 |   Expect.throws(() => e.fez, (error) => error is NoSuchMethodError); | 
 |   Expect.equals("F-fez-f", f.fez); | 
 | } |