blob: 5a2559005e9079313a66b65afe31a830c7bf41a5 [file] [log] [blame]
// 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));
}
}