| // 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)); | |
| } | |
| } |