// Copyright (c) 2021, 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.

/**
 * @assertion Annotation to specify on Struct subtypes to indicate that its
 * members need to be packed.
 *
 * Valid values for memberAlignment are 1, 2, 4, 8, and 16.
 *
 * @description Checks that valid values for memberAlignment are accepted
 * @author sgrekhov@unipro.ru
 */
import "dart:ffi";
import "../../../Utils/expect.dart";

@Packed(1)
class S1 extends Struct {
  @Double()
  external double x;
  @Int32()
  external int y;
}

@Packed(2)
class S2 extends Struct {
  @Double()
  external double x;
  @Int32()
  external int y;
}

@Packed(4)
class S4 extends Struct {
  @Double()
  external double x;
  @Int32()
  external int y;
}

@Packed(8)
class S8 extends Struct {
  @Double()
  external double x;
  @Int32()
  external int y;
}

@Packed(16)
class S16 extends Struct {
  @Double()
  external double x;
  @Int32()
  external int y;
}

void main() {
  Expect.equals(12, sizeOf<S1>());
  Expect.equals(12, sizeOf<S2>());
  Expect.equals(12, sizeOf<S4>());
  Expect.isTrue(sizeOf<S8>() >= 12);
  Expect.isTrue(sizeOf<S16>() >= 12);
}
