/*
 * 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 All field declarations in a Struct subclass declaration must
 * either have type int or double and be annotated with a NativeType
 * representing the native type, or must be of type Pointer or subtype of Struct.
 *
 * @description Checks that 'Struct' subtype value depends on annotation
 * @author sgrekhov@unipro.ru
 * @issue 45025
 */
import "dart:ffi";
import "package:ffi/ffi.dart";
import "../../../Utils/expect.dart";

class S1 extends Struct {
  @Int64()
  external int x;
}

class S2 extends Struct {
  @Int8()
  external int x;
}

class S3 extends Struct {
  @Uint8()
  external int x;
}

void main() {
  Pointer<S1> s1 = calloc<S1>();
  try {
    s1.ref.x = 0x1122334455667712;
    Expect.equals(0x1122334455667712, s1.ref.x);

    Pointer<S2> s2 = new Pointer.fromAddress(s1.address);
    Expect.equals(0x12, s2.ref.x);
    Expect.equals(0x77, s2.elementAt(1).ref.x);
    Expect.equals(0x66, s2.elementAt(2).ref.x);
    Expect.equals(0x55, s2.elementAt(3).ref.x);
    Expect.equals(0x44, s2.elementAt(4).ref.x);
    Expect.equals(0x33, s2.elementAt(5).ref.x);
    Expect.equals(0x22, s2.elementAt(6).ref.x);
    Expect.equals(0x11, s2.elementAt(7).ref.x);

    Pointer<S3> s3 = new Pointer.fromAddress(s1.address);
    Expect.equals(0x12, s3.ref.x);
    Expect.equals(0x77, s3.elementAt(1).ref.x);
    Expect.equals(0x66, s3.elementAt(2).ref.x);
    Expect.equals(0x55, s3.elementAt(3).ref.x);
    Expect.equals(0x44, s3.elementAt(4).ref.x);
    Expect.equals(0x33, s3.elementAt(5).ref.x);
    Expect.equals(0x22, s3.elementAt(6).ref.x);
    Expect.equals(0x11, s3.elementAt(7).ref.x);

    s1.ref.x = 0xFFFFFFFFFFFFFFFF;
    Expect.equals(-1, s2.ref.x);
    Expect.equals(255, s3.ref.x);
  } finally {
    calloc.free(s1);
  }
}
