// 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. // @dart = 2.7 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; } class 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. class 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)); } }