|  | // Copyright (c) 2011, 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"; | 
|  |  | 
|  | // A plain class that implements many fields. | 
|  | class A { | 
|  | var fieldA1 = 0x1; | 
|  | var fieldA2 = 0x2; | 
|  | var fieldA3 = 0x4; | 
|  | var fieldA4 = 0x8; | 
|  |  | 
|  | var fieldB1 = 0x10; | 
|  | var fieldB2 = 0x20; | 
|  | var fieldB3 = 0x40; | 
|  | var fieldB4 = 0x80; | 
|  |  | 
|  | var fieldC1 = 0x100; | 
|  | var fieldC2 = 0x200; | 
|  | var fieldC3 = 0x400; | 
|  | var fieldC4 = 0x800; | 
|  |  | 
|  | var fieldD1 = 0x1000; | 
|  | var fieldD2 = 0x2000; | 
|  | var fieldD3 = 0x4000; | 
|  | var fieldD4 = 0x8000; | 
|  |  | 
|  | var fieldXA1 = 0x1; | 
|  | var fieldXA2 = 0x2; | 
|  | var fieldXA3 = 0x4; | 
|  | var fieldXA4 = 0x8; | 
|  |  | 
|  | var fieldXB1 = 0x10; | 
|  | var fieldXB2 = 0x20; | 
|  | var fieldXB3 = 0x40; | 
|  | var fieldXB4 = 0x80; | 
|  |  | 
|  | var fieldXC1 = 0x1; | 
|  | var fieldXC2 = 0x2; | 
|  | var fieldXC3 = 0x4; | 
|  | var fieldXC4 = 0x8; | 
|  |  | 
|  | var fieldXD1 = 0x10; | 
|  | var fieldXD2 = 0x20; | 
|  | var fieldXD3 = 0x40; | 
|  | var fieldXD4 = 0x80; | 
|  |  | 
|  | var fieldYA1 = 0x1; | 
|  | var fieldYA2 = 0x200; | 
|  | var fieldYA3 = 0x400; | 
|  | var fieldYA4 = 0x800; | 
|  |  | 
|  | var fieldYB1 = 0x10; | 
|  | var fieldYB2 = 0x200; | 
|  | var fieldYB3 = 0x400; | 
|  | var fieldYB4 = 0x800; | 
|  |  | 
|  | var fieldYC1 = 0x100; | 
|  | var fieldYC2 = 0x2000; | 
|  | var fieldYC3 = 0x4000; | 
|  | var fieldYC4 = 0x8000; | 
|  |  | 
|  | var fieldYD1 = 0x1000; | 
|  | var fieldYD2 = 0x2000; | 
|  | var fieldYD3 = 0x4000; | 
|  | var fieldYD4 = 0x8000; | 
|  | } | 
|  |  | 
|  | // Implementing the same fields using inheritance and a mixin. | 
|  | class B { | 
|  | var fieldA1 = 0x0011; | 
|  | var fieldA2 = 0x0002; | 
|  | var fieldA3 = 0x0044; | 
|  | var fieldA4 = 0x0008; | 
|  |  | 
|  | var fieldB1 = 0x0010; | 
|  | var fieldB2 = 0x0220; | 
|  | var fieldB3 = 0x0040; | 
|  | var fieldB4 = 0x0880; | 
|  |  | 
|  | var fieldC1 = 0x0101; | 
|  | var fieldC2 = 0x0200; | 
|  | var fieldC3 = 0x0404; | 
|  | var fieldC4 = 0x0810; | 
|  |  | 
|  | var fieldD1 = 0x1000; | 
|  | var fieldD2 = 0x2204; | 
|  | var fieldD3 = 0x4040; | 
|  | var fieldD4 = 0x8801; | 
|  | } | 
|  |  | 
|  | mixin C { | 
|  | var fieldXA1 = 0x8001; | 
|  | var fieldXA2 = 0x4002; | 
|  | var fieldXA3 = 0x2004; | 
|  | var fieldXA4 = 0x1008; | 
|  |  | 
|  | var fieldXB1 = 0x810; | 
|  | var fieldXB2 = 0x420; | 
|  | var fieldXB3 = 0x240; | 
|  | var fieldXB4 = 0x180; | 
|  |  | 
|  | var fieldXC1 = 0x180; | 
|  | var fieldXC2 = 0x240; | 
|  | var fieldXC3 = 0x420; | 
|  | var fieldXC4 = 0x810; | 
|  |  | 
|  | var fieldXD1 = 0x1008; | 
|  | var fieldXD2 = 0x2004; | 
|  | var fieldXD3 = 0x4002; | 
|  | var fieldXD4 = 0x8001; | 
|  | } | 
|  |  | 
|  | class D extends B with C { | 
|  | var fieldYA1 = 0x8001; | 
|  | var fieldYA2 = 0x4002; | 
|  | var fieldYA3 = 0x2004; | 
|  | var fieldYA4 = 0x0008; | 
|  |  | 
|  | var fieldYB1 = 0x810; | 
|  | var fieldYB2 = 0x420; | 
|  | var fieldYB3 = 0x240; | 
|  | var fieldYB4 = 0x080; | 
|  |  | 
|  | var fieldYC1 = 0x180; | 
|  | var fieldYC2 = 0x240; | 
|  | var fieldYC3 = 0x420; | 
|  | var fieldYC4 = 0x800; | 
|  |  | 
|  | var fieldYD1 = 0x1008; | 
|  | var fieldYD2 = 0x2004; | 
|  | var fieldYD3 = 0x4002; | 
|  | var fieldYD4 = 0x8000; | 
|  | } | 
|  |  | 
|  | // Mix in the mixin into the full implementation, shadowing some fields. | 
|  | class E extends A with C {} | 
|  |  | 
|  | // Another mixin for block C. | 
|  | mixin F { | 
|  | var fieldYA1 = 0x0001; | 
|  | var fieldYA2 = 0x1022; | 
|  | var fieldYA3 = 0x0004; | 
|  | var fieldYA4 = 0x0088; | 
|  |  | 
|  | var fieldYB1 = 0x0410; | 
|  | var fieldYB2 = 0x0022; | 
|  | var fieldYB3 = 0x0040; | 
|  | var fieldYB4 = 0x0880; | 
|  |  | 
|  | var fieldYC1 = 0x1001; | 
|  | var fieldYC2 = 0x2200; | 
|  | var fieldYC3 = 0x4400; | 
|  | var fieldYC4 = 0x8800; | 
|  |  | 
|  | var fieldYD1 = 0x1108; | 
|  | var fieldYD2 = 0x2200; | 
|  | var fieldYD3 = 0x4044; | 
|  | var fieldYD4 = 0x8001; | 
|  | } | 
|  |  | 
|  | // Use two mixins in a single class. | 
|  | class G extends B with C, F {} | 
|  |  | 
|  | bool checkFields(cls) { | 
|  | var blockA = cls.fieldA1 ^ | 
|  | cls.fieldA2 ^ | 
|  | cls.fieldA3 ^ | 
|  | cls.fieldA4 ^ | 
|  | cls.fieldB1 ^ | 
|  | cls.fieldB2 ^ | 
|  | cls.fieldB3 ^ | 
|  | cls.fieldB4 ^ | 
|  | cls.fieldC1 ^ | 
|  | cls.fieldC2 ^ | 
|  | cls.fieldC3 ^ | 
|  | cls.fieldC4 ^ | 
|  | cls.fieldD1 ^ | 
|  | cls.fieldD2 ^ | 
|  | cls.fieldD3 ^ | 
|  | cls.fieldD4; | 
|  | var blockB = cls.fieldXA1 ^ | 
|  | cls.fieldXA2 ^ | 
|  | cls.fieldXA3 ^ | 
|  | cls.fieldXA4 ^ | 
|  | cls.fieldXB1 ^ | 
|  | cls.fieldXB2 ^ | 
|  | cls.fieldXB3 ^ | 
|  | cls.fieldXB4 ^ | 
|  | cls.fieldXC1 ^ | 
|  | cls.fieldXC2 ^ | 
|  | cls.fieldXC3 ^ | 
|  | cls.fieldXC4 ^ | 
|  | cls.fieldXD1 ^ | 
|  | cls.fieldXD2 ^ | 
|  | cls.fieldXD3 ^ | 
|  | cls.fieldXD4; | 
|  | var blockC = cls.fieldYA1 ^ | 
|  | cls.fieldYA2 ^ | 
|  | cls.fieldYA3 ^ | 
|  | cls.fieldYA4 ^ | 
|  | cls.fieldYB1 ^ | 
|  | cls.fieldYB2 ^ | 
|  | cls.fieldYB3 ^ | 
|  | cls.fieldYB4 ^ | 
|  | cls.fieldYC1 ^ | 
|  | cls.fieldYC2 ^ | 
|  | cls.fieldYC3 ^ | 
|  | cls.fieldYC4 ^ | 
|  | cls.fieldYD1 ^ | 
|  | cls.fieldYD2 ^ | 
|  | cls.fieldYD3 ^ | 
|  | cls.fieldYD4; | 
|  | return blockA == 0xFFFF && blockB == 0x0000 && blockC == 0x1111; | 
|  | } | 
|  |  | 
|  | main() { | 
|  | var instances = [new A(), new D(), new E(), new G()]; | 
|  | for (var instance in instances) { | 
|  | Expect.isTrue(checkFields(instance)); | 
|  | } | 
|  | } |