// Copyright (c) 2024, 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.
//
// This file has been automatically generated. Please do not edit it manually.
// Generated by tests/ffi/generator/address_of_test_generator.dart.
//
// SharedObjects=ffi_test_functions
// VMOptions=
// VMOptions=--deterministic --optimization-counter-threshold=90
// VMOptions=--use-slow-path
// VMOptions=--use-slow-path --stacktrace-every=100

// ignore_for_file: unused_import

import 'dart:ffi';
import 'dart:typed_data';

import 'package:expect/expect.dart';

import 'address_of_generated_shared.dart';
import 'address_of_shared.dart';
import 'dylib_utils.dart';

final ffiTestFunctions = dlopenPlatformSpecific('ffi_test_functions');

void main() {
  // Force dlopen so @Native lookups in DynamicLibrary.process() succeed.
  dlopenGlobalPlatformSpecific('ffi_test_functions');

  for (int i = 0; i < 100; ++i) {
    testAddressOfInt8StructField();
    testAddressOfInt16StructField();
    testAddressOfInt32StructField();
    testAddressOfInt64StructField();
    testAddressOfUint8StructField();
    testAddressOfUint16StructField();
    testAddressOfUint32StructField();
    testAddressOfUint64StructField();
    testAddressOfFloatStructField();
    testAddressOfDoubleStructField();
    testAddressOfBoolStructField();
    testAddressOfStructPointerMany();
  }
}

final class Int8Struct extends Struct {
  @Int8()
  external int a0;
  @Int8()
  external int a1;
  @Int8()
  external int a2;
  @Int8()
  external int a3;
  @Int8()
  external int a4;
  @Int8()
  external int a5;
  @Int8()
  external int a6;
  @Int8()
  external int a7;
  @Int8()
  external int a8;
  @Int8()
  external int a9;
  @Int8()
  external int a10;
  @Int8()
  external int a11;
  @Int8()
  external int a12;
  @Int8()
  external int a13;
  @Int8()
  external int a14;
  @Int8()
  external int a15;
  @Int8()
  external int a16;
  @Int8()
  external int a17;
  @Int8()
  external int a18;
  @Int8()
  external int a19;
}

Int8Struct makeInt8Struct(int length) {
  assert(length == 20);
  final typedData = makeInt8List(length);
  final struct = Struct.create<Int8Struct>(typedData);
  return struct;
}

void testAddressOfInt8StructField() {
  const length = 20;
  final struct = makeInt8Struct(length);
  final expectedResult = makeExpectedResultInt8(0, length);
  final result = takeInt8PointerMany(
    struct.a0.address,
    struct.a1.address,
    struct.a2.address,
    struct.a3.address,
    struct.a4.address,
    struct.a5.address,
    struct.a6.address,
    struct.a7.address,
    struct.a8.address,
    struct.a9.address,
    struct.a10.address,
    struct.a11.address,
    struct.a12.address,
    struct.a13.address,
    struct.a14.address,
    struct.a15.address,
    struct.a16.address,
    struct.a17.address,
    struct.a18.address,
    struct.a19.address,
  );
  Expect.equals(expectedResult, result);
}

final class Int16Struct extends Struct {
  @Int16()
  external int a0;
  @Int16()
  external int a1;
  @Int16()
  external int a2;
  @Int16()
  external int a3;
  @Int16()
  external int a4;
  @Int16()
  external int a5;
  @Int16()
  external int a6;
  @Int16()
  external int a7;
  @Int16()
  external int a8;
  @Int16()
  external int a9;
  @Int16()
  external int a10;
  @Int16()
  external int a11;
  @Int16()
  external int a12;
  @Int16()
  external int a13;
  @Int16()
  external int a14;
  @Int16()
  external int a15;
  @Int16()
  external int a16;
  @Int16()
  external int a17;
  @Int16()
  external int a18;
  @Int16()
  external int a19;
}

Int16Struct makeInt16Struct(int length) {
  assert(length == 20);
  final typedData = makeInt16List(length);
  final struct = Struct.create<Int16Struct>(typedData);
  return struct;
}

void testAddressOfInt16StructField() {
  const length = 20;
  final struct = makeInt16Struct(length);
  final expectedResult = makeExpectedResultInt16(0, length);
  final result = takeInt16PointerMany(
    struct.a0.address,
    struct.a1.address,
    struct.a2.address,
    struct.a3.address,
    struct.a4.address,
    struct.a5.address,
    struct.a6.address,
    struct.a7.address,
    struct.a8.address,
    struct.a9.address,
    struct.a10.address,
    struct.a11.address,
    struct.a12.address,
    struct.a13.address,
    struct.a14.address,
    struct.a15.address,
    struct.a16.address,
    struct.a17.address,
    struct.a18.address,
    struct.a19.address,
  );
  Expect.equals(expectedResult, result);
}

final class Int32Struct extends Struct {
  @Int32()
  external int a0;
  @Int32()
  external int a1;
  @Int32()
  external int a2;
  @Int32()
  external int a3;
  @Int32()
  external int a4;
  @Int32()
  external int a5;
  @Int32()
  external int a6;
  @Int32()
  external int a7;
  @Int32()
  external int a8;
  @Int32()
  external int a9;
  @Int32()
  external int a10;
  @Int32()
  external int a11;
  @Int32()
  external int a12;
  @Int32()
  external int a13;
  @Int32()
  external int a14;
  @Int32()
  external int a15;
  @Int32()
  external int a16;
  @Int32()
  external int a17;
  @Int32()
  external int a18;
  @Int32()
  external int a19;
}

Int32Struct makeInt32Struct(int length) {
  assert(length == 20);
  final typedData = makeInt32List(length);
  final struct = Struct.create<Int32Struct>(typedData);
  return struct;
}

void testAddressOfInt32StructField() {
  const length = 20;
  final struct = makeInt32Struct(length);
  final expectedResult = makeExpectedResultInt32(0, length);
  final result = takeInt32PointerMany(
    struct.a0.address,
    struct.a1.address,
    struct.a2.address,
    struct.a3.address,
    struct.a4.address,
    struct.a5.address,
    struct.a6.address,
    struct.a7.address,
    struct.a8.address,
    struct.a9.address,
    struct.a10.address,
    struct.a11.address,
    struct.a12.address,
    struct.a13.address,
    struct.a14.address,
    struct.a15.address,
    struct.a16.address,
    struct.a17.address,
    struct.a18.address,
    struct.a19.address,
  );
  Expect.equals(expectedResult, result);
}

final class Int64Struct extends Struct {
  @Int64()
  external int a0;
  @Int64()
  external int a1;
  @Int64()
  external int a2;
  @Int64()
  external int a3;
  @Int64()
  external int a4;
  @Int64()
  external int a5;
  @Int64()
  external int a6;
  @Int64()
  external int a7;
  @Int64()
  external int a8;
  @Int64()
  external int a9;
  @Int64()
  external int a10;
  @Int64()
  external int a11;
  @Int64()
  external int a12;
  @Int64()
  external int a13;
  @Int64()
  external int a14;
  @Int64()
  external int a15;
  @Int64()
  external int a16;
  @Int64()
  external int a17;
  @Int64()
  external int a18;
  @Int64()
  external int a19;
}

Int64Struct makeInt64Struct(int length) {
  assert(length == 20);
  final typedData = makeInt64List(length);
  final struct = Struct.create<Int64Struct>(typedData);
  return struct;
}

void testAddressOfInt64StructField() {
  const length = 20;
  final struct = makeInt64Struct(length);
  final expectedResult = makeExpectedResultInt64(0, length);
  final result = takeInt64PointerMany(
    struct.a0.address,
    struct.a1.address,
    struct.a2.address,
    struct.a3.address,
    struct.a4.address,
    struct.a5.address,
    struct.a6.address,
    struct.a7.address,
    struct.a8.address,
    struct.a9.address,
    struct.a10.address,
    struct.a11.address,
    struct.a12.address,
    struct.a13.address,
    struct.a14.address,
    struct.a15.address,
    struct.a16.address,
    struct.a17.address,
    struct.a18.address,
    struct.a19.address,
  );
  Expect.equals(expectedResult, result);
}

final class Uint8Struct extends Struct {
  @Uint8()
  external int a0;
  @Uint8()
  external int a1;
  @Uint8()
  external int a2;
  @Uint8()
  external int a3;
  @Uint8()
  external int a4;
  @Uint8()
  external int a5;
  @Uint8()
  external int a6;
  @Uint8()
  external int a7;
  @Uint8()
  external int a8;
  @Uint8()
  external int a9;
  @Uint8()
  external int a10;
  @Uint8()
  external int a11;
  @Uint8()
  external int a12;
  @Uint8()
  external int a13;
  @Uint8()
  external int a14;
  @Uint8()
  external int a15;
  @Uint8()
  external int a16;
  @Uint8()
  external int a17;
  @Uint8()
  external int a18;
  @Uint8()
  external int a19;
}

Uint8Struct makeUint8Struct(int length) {
  assert(length == 20);
  final typedData = makeUint8List(length);
  final struct = Struct.create<Uint8Struct>(typedData);
  return struct;
}

void testAddressOfUint8StructField() {
  const length = 20;
  final struct = makeUint8Struct(length);
  final expectedResult = makeExpectedResultUint8(0, length);
  final result = takeUint8PointerMany(
    struct.a0.address,
    struct.a1.address,
    struct.a2.address,
    struct.a3.address,
    struct.a4.address,
    struct.a5.address,
    struct.a6.address,
    struct.a7.address,
    struct.a8.address,
    struct.a9.address,
    struct.a10.address,
    struct.a11.address,
    struct.a12.address,
    struct.a13.address,
    struct.a14.address,
    struct.a15.address,
    struct.a16.address,
    struct.a17.address,
    struct.a18.address,
    struct.a19.address,
  );
  Expect.equals(expectedResult, result);
}

final class Uint16Struct extends Struct {
  @Uint16()
  external int a0;
  @Uint16()
  external int a1;
  @Uint16()
  external int a2;
  @Uint16()
  external int a3;
  @Uint16()
  external int a4;
  @Uint16()
  external int a5;
  @Uint16()
  external int a6;
  @Uint16()
  external int a7;
  @Uint16()
  external int a8;
  @Uint16()
  external int a9;
  @Uint16()
  external int a10;
  @Uint16()
  external int a11;
  @Uint16()
  external int a12;
  @Uint16()
  external int a13;
  @Uint16()
  external int a14;
  @Uint16()
  external int a15;
  @Uint16()
  external int a16;
  @Uint16()
  external int a17;
  @Uint16()
  external int a18;
  @Uint16()
  external int a19;
}

Uint16Struct makeUint16Struct(int length) {
  assert(length == 20);
  final typedData = makeUint16List(length);
  final struct = Struct.create<Uint16Struct>(typedData);
  return struct;
}

void testAddressOfUint16StructField() {
  const length = 20;
  final struct = makeUint16Struct(length);
  final expectedResult = makeExpectedResultUint16(0, length);
  final result = takeUint16PointerMany(
    struct.a0.address,
    struct.a1.address,
    struct.a2.address,
    struct.a3.address,
    struct.a4.address,
    struct.a5.address,
    struct.a6.address,
    struct.a7.address,
    struct.a8.address,
    struct.a9.address,
    struct.a10.address,
    struct.a11.address,
    struct.a12.address,
    struct.a13.address,
    struct.a14.address,
    struct.a15.address,
    struct.a16.address,
    struct.a17.address,
    struct.a18.address,
    struct.a19.address,
  );
  Expect.equals(expectedResult, result);
}

final class Uint32Struct extends Struct {
  @Uint32()
  external int a0;
  @Uint32()
  external int a1;
  @Uint32()
  external int a2;
  @Uint32()
  external int a3;
  @Uint32()
  external int a4;
  @Uint32()
  external int a5;
  @Uint32()
  external int a6;
  @Uint32()
  external int a7;
  @Uint32()
  external int a8;
  @Uint32()
  external int a9;
  @Uint32()
  external int a10;
  @Uint32()
  external int a11;
  @Uint32()
  external int a12;
  @Uint32()
  external int a13;
  @Uint32()
  external int a14;
  @Uint32()
  external int a15;
  @Uint32()
  external int a16;
  @Uint32()
  external int a17;
  @Uint32()
  external int a18;
  @Uint32()
  external int a19;
}

Uint32Struct makeUint32Struct(int length) {
  assert(length == 20);
  final typedData = makeUint32List(length);
  final struct = Struct.create<Uint32Struct>(typedData);
  return struct;
}

void testAddressOfUint32StructField() {
  const length = 20;
  final struct = makeUint32Struct(length);
  final expectedResult = makeExpectedResultUint32(0, length);
  final result = takeUint32PointerMany(
    struct.a0.address,
    struct.a1.address,
    struct.a2.address,
    struct.a3.address,
    struct.a4.address,
    struct.a5.address,
    struct.a6.address,
    struct.a7.address,
    struct.a8.address,
    struct.a9.address,
    struct.a10.address,
    struct.a11.address,
    struct.a12.address,
    struct.a13.address,
    struct.a14.address,
    struct.a15.address,
    struct.a16.address,
    struct.a17.address,
    struct.a18.address,
    struct.a19.address,
  );
  Expect.equals(expectedResult, result);
}

final class Uint64Struct extends Struct {
  @Uint64()
  external int a0;
  @Uint64()
  external int a1;
  @Uint64()
  external int a2;
  @Uint64()
  external int a3;
  @Uint64()
  external int a4;
  @Uint64()
  external int a5;
  @Uint64()
  external int a6;
  @Uint64()
  external int a7;
  @Uint64()
  external int a8;
  @Uint64()
  external int a9;
  @Uint64()
  external int a10;
  @Uint64()
  external int a11;
  @Uint64()
  external int a12;
  @Uint64()
  external int a13;
  @Uint64()
  external int a14;
  @Uint64()
  external int a15;
  @Uint64()
  external int a16;
  @Uint64()
  external int a17;
  @Uint64()
  external int a18;
  @Uint64()
  external int a19;
}

Uint64Struct makeUint64Struct(int length) {
  assert(length == 20);
  final typedData = makeUint64List(length);
  final struct = Struct.create<Uint64Struct>(typedData);
  return struct;
}

void testAddressOfUint64StructField() {
  const length = 20;
  final struct = makeUint64Struct(length);
  final expectedResult = makeExpectedResultUint64(0, length);
  final result = takeUint64PointerMany(
    struct.a0.address,
    struct.a1.address,
    struct.a2.address,
    struct.a3.address,
    struct.a4.address,
    struct.a5.address,
    struct.a6.address,
    struct.a7.address,
    struct.a8.address,
    struct.a9.address,
    struct.a10.address,
    struct.a11.address,
    struct.a12.address,
    struct.a13.address,
    struct.a14.address,
    struct.a15.address,
    struct.a16.address,
    struct.a17.address,
    struct.a18.address,
    struct.a19.address,
  );
  Expect.equals(expectedResult, result);
}

final class FloatStruct extends Struct {
  @Float()
  external double a0;
  @Float()
  external double a1;
  @Float()
  external double a2;
  @Float()
  external double a3;
  @Float()
  external double a4;
  @Float()
  external double a5;
  @Float()
  external double a6;
  @Float()
  external double a7;
  @Float()
  external double a8;
  @Float()
  external double a9;
  @Float()
  external double a10;
  @Float()
  external double a11;
  @Float()
  external double a12;
  @Float()
  external double a13;
  @Float()
  external double a14;
  @Float()
  external double a15;
  @Float()
  external double a16;
  @Float()
  external double a17;
  @Float()
  external double a18;
  @Float()
  external double a19;
}

FloatStruct makeFloatStruct(int length) {
  assert(length == 20);
  final typedData = makeFloat32List(length);
  final struct = Struct.create<FloatStruct>(typedData);
  return struct;
}

void testAddressOfFloatStructField() {
  const length = 20;
  final struct = makeFloatStruct(length);
  final expectedResult = makeExpectedResultFloat(0, length);
  final result = takeFloatPointerMany(
    struct.a0.address,
    struct.a1.address,
    struct.a2.address,
    struct.a3.address,
    struct.a4.address,
    struct.a5.address,
    struct.a6.address,
    struct.a7.address,
    struct.a8.address,
    struct.a9.address,
    struct.a10.address,
    struct.a11.address,
    struct.a12.address,
    struct.a13.address,
    struct.a14.address,
    struct.a15.address,
    struct.a16.address,
    struct.a17.address,
    struct.a18.address,
    struct.a19.address,
  );
  Expect.approxEquals(expectedResult, result);
}

final class DoubleStruct extends Struct {
  @Double()
  external double a0;
  @Double()
  external double a1;
  @Double()
  external double a2;
  @Double()
  external double a3;
  @Double()
  external double a4;
  @Double()
  external double a5;
  @Double()
  external double a6;
  @Double()
  external double a7;
  @Double()
  external double a8;
  @Double()
  external double a9;
  @Double()
  external double a10;
  @Double()
  external double a11;
  @Double()
  external double a12;
  @Double()
  external double a13;
  @Double()
  external double a14;
  @Double()
  external double a15;
  @Double()
  external double a16;
  @Double()
  external double a17;
  @Double()
  external double a18;
  @Double()
  external double a19;
}

DoubleStruct makeDoubleStruct(int length) {
  assert(length == 20);
  final typedData = makeFloat64List(length);
  final struct = Struct.create<DoubleStruct>(typedData);
  return struct;
}

void testAddressOfDoubleStructField() {
  const length = 20;
  final struct = makeDoubleStruct(length);
  final expectedResult = makeExpectedResultDouble(0, length);
  final result = takeDoublePointerMany(
    struct.a0.address,
    struct.a1.address,
    struct.a2.address,
    struct.a3.address,
    struct.a4.address,
    struct.a5.address,
    struct.a6.address,
    struct.a7.address,
    struct.a8.address,
    struct.a9.address,
    struct.a10.address,
    struct.a11.address,
    struct.a12.address,
    struct.a13.address,
    struct.a14.address,
    struct.a15.address,
    struct.a16.address,
    struct.a17.address,
    struct.a18.address,
    struct.a19.address,
  );
  Expect.approxEquals(expectedResult, result);
}

final class BoolStruct extends Struct {
  @Bool()
  external bool a0;
  @Bool()
  external bool a1;
  @Bool()
  external bool a2;
  @Bool()
  external bool a3;
  @Bool()
  external bool a4;
  @Bool()
  external bool a5;
  @Bool()
  external bool a6;
  @Bool()
  external bool a7;
  @Bool()
  external bool a8;
  @Bool()
  external bool a9;
  @Bool()
  external bool a10;
  @Bool()
  external bool a11;
  @Bool()
  external bool a12;
  @Bool()
  external bool a13;
  @Bool()
  external bool a14;
  @Bool()
  external bool a15;
  @Bool()
  external bool a16;
  @Bool()
  external bool a17;
  @Bool()
  external bool a18;
  @Bool()
  external bool a19;
}

BoolStruct makeBoolStruct(int length) {
  assert(length == 20);
  final typedData = makeBoolList(length);
  final struct = Struct.create<BoolStruct>(typedData);
  return struct;
}

void testAddressOfBoolStructField() {
  const length = 20;
  final struct = makeBoolStruct(length);
  final expectedResult = makeExpectedResultBool(0, length);
  final result = takeBoolPointerMany(
    struct.a0.address,
    struct.a1.address,
    struct.a2.address,
    struct.a3.address,
    struct.a4.address,
    struct.a5.address,
    struct.a6.address,
    struct.a7.address,
    struct.a8.address,
    struct.a9.address,
    struct.a10.address,
    struct.a11.address,
    struct.a12.address,
    struct.a13.address,
    struct.a14.address,
    struct.a15.address,
    struct.a16.address,
    struct.a17.address,
    struct.a18.address,
    struct.a19.address,
  );
  Expect.equals(expectedResult, result);
}

final class Struct2BytesInt extends Struct {
  @Int16()
  external int a0;

  String toString() => "(${a0})";
}

@Native<
    Int16 Function(
      Pointer<Struct2BytesInt>,
      Pointer<Struct2BytesInt>,
      Pointer<Struct2BytesInt>,
      Pointer<Struct2BytesInt>,
      Pointer<Struct2BytesInt>,
      Pointer<Struct2BytesInt>,
      Pointer<Struct2BytesInt>,
      Pointer<Struct2BytesInt>,
      Pointer<Struct2BytesInt>,
      Pointer<Struct2BytesInt>,
      Pointer<Struct2BytesInt>,
      Pointer<Struct2BytesInt>,
      Pointer<Struct2BytesInt>,
      Pointer<Struct2BytesInt>,
      Pointer<Struct2BytesInt>,
      Pointer<Struct2BytesInt>,
      Pointer<Struct2BytesInt>,
      Pointer<Struct2BytesInt>,
      Pointer<Struct2BytesInt>,
      Pointer<Struct2BytesInt>,
    )>(symbol: 'TakeStruct2BytesIntPointerMany', isLeaf: true)
external int takeStruct2BytesIntPointerMany(
  Pointer<Struct2BytesInt> pointer0,
  Pointer<Struct2BytesInt> pointer1,
  Pointer<Struct2BytesInt> pointer2,
  Pointer<Struct2BytesInt> pointer3,
  Pointer<Struct2BytesInt> pointer4,
  Pointer<Struct2BytesInt> pointer5,
  Pointer<Struct2BytesInt> pointer6,
  Pointer<Struct2BytesInt> pointer7,
  Pointer<Struct2BytesInt> pointer8,
  Pointer<Struct2BytesInt> pointer9,
  Pointer<Struct2BytesInt> pointer10,
  Pointer<Struct2BytesInt> pointer11,
  Pointer<Struct2BytesInt> pointer12,
  Pointer<Struct2BytesInt> pointer13,
  Pointer<Struct2BytesInt> pointer14,
  Pointer<Struct2BytesInt> pointer15,
  Pointer<Struct2BytesInt> pointer16,
  Pointer<Struct2BytesInt> pointer17,
  Pointer<Struct2BytesInt> pointer18,
  Pointer<Struct2BytesInt> pointer19,
);

void testAddressOfStructPointerMany() {
  const length = 20;
  final typedData = makeInt16List(length);
  final struct0 = Struct.create<Struct2BytesInt>(typedData, 0);
  final struct1 = Struct.create<Struct2BytesInt>(typedData, 1);
  final struct2 = Struct.create<Struct2BytesInt>(typedData, 2);
  final struct3 = Struct.create<Struct2BytesInt>(typedData, 3);
  final struct4 = Struct.create<Struct2BytesInt>(typedData, 4);
  final struct5 = Struct.create<Struct2BytesInt>(typedData, 5);
  final struct6 = Struct.create<Struct2BytesInt>(typedData, 6);
  final struct7 = Struct.create<Struct2BytesInt>(typedData, 7);
  final struct8 = Struct.create<Struct2BytesInt>(typedData, 8);
  final struct9 = Struct.create<Struct2BytesInt>(typedData, 9);
  final struct10 = Struct.create<Struct2BytesInt>(typedData, 10);
  final struct11 = Struct.create<Struct2BytesInt>(typedData, 11);
  final struct12 = Struct.create<Struct2BytesInt>(typedData, 12);
  final struct13 = Struct.create<Struct2BytesInt>(typedData, 13);
  final struct14 = Struct.create<Struct2BytesInt>(typedData, 14);
  final struct15 = Struct.create<Struct2BytesInt>(typedData, 15);
  final struct16 = Struct.create<Struct2BytesInt>(typedData, 16);
  final struct17 = Struct.create<Struct2BytesInt>(typedData, 17);
  final struct18 = Struct.create<Struct2BytesInt>(typedData, 18);
  final struct19 = Struct.create<Struct2BytesInt>(typedData, 19);
  final expectedResult = makeExpectedResultInt16(0, length);
  final result = takeStruct2BytesIntPointerMany(
    struct0.address,
    struct1.address,
    struct2.address,
    struct3.address,
    struct4.address,
    struct5.address,
    struct6.address,
    struct7.address,
    struct8.address,
    struct9.address,
    struct10.address,
    struct11.address,
    struct12.address,
    struct13.address,
    struct14.address,
    struct15.address,
    struct16.address,
    struct17.address,
    struct18.address,
    struct19.address,
  );
  Expect.equals(expectedResult, result);
}

final class Union2BytesInt extends Union {
  @Int16()
  external int a0;

  String toString() => "(${a0})";
}

@Native<
    Int16 Function(
      Pointer<Union2BytesInt>,
      Pointer<Union2BytesInt>,
      Pointer<Union2BytesInt>,
      Pointer<Union2BytesInt>,
      Pointer<Union2BytesInt>,
      Pointer<Union2BytesInt>,
      Pointer<Union2BytesInt>,
      Pointer<Union2BytesInt>,
      Pointer<Union2BytesInt>,
      Pointer<Union2BytesInt>,
      Pointer<Union2BytesInt>,
      Pointer<Union2BytesInt>,
      Pointer<Union2BytesInt>,
      Pointer<Union2BytesInt>,
      Pointer<Union2BytesInt>,
      Pointer<Union2BytesInt>,
      Pointer<Union2BytesInt>,
      Pointer<Union2BytesInt>,
      Pointer<Union2BytesInt>,
      Pointer<Union2BytesInt>,
    )>(symbol: 'TakeUnion2BytesIntPointerMany', isLeaf: true)
external int takeUnion2BytesIntPointerMany(
  Pointer<Union2BytesInt> pointer0,
  Pointer<Union2BytesInt> pointer1,
  Pointer<Union2BytesInt> pointer2,
  Pointer<Union2BytesInt> pointer3,
  Pointer<Union2BytesInt> pointer4,
  Pointer<Union2BytesInt> pointer5,
  Pointer<Union2BytesInt> pointer6,
  Pointer<Union2BytesInt> pointer7,
  Pointer<Union2BytesInt> pointer8,
  Pointer<Union2BytesInt> pointer9,
  Pointer<Union2BytesInt> pointer10,
  Pointer<Union2BytesInt> pointer11,
  Pointer<Union2BytesInt> pointer12,
  Pointer<Union2BytesInt> pointer13,
  Pointer<Union2BytesInt> pointer14,
  Pointer<Union2BytesInt> pointer15,
  Pointer<Union2BytesInt> pointer16,
  Pointer<Union2BytesInt> pointer17,
  Pointer<Union2BytesInt> pointer18,
  Pointer<Union2BytesInt> pointer19,
);

void testAddressOfUnionPointerMany() {
  const length = 20;
  final typedData = makeInt16List(length);
  final struct0 = Union.create<Union2BytesInt>(typedData, 0);
  final struct1 = Union.create<Union2BytesInt>(typedData, 1);
  final struct2 = Union.create<Union2BytesInt>(typedData, 2);
  final struct3 = Union.create<Union2BytesInt>(typedData, 3);
  final struct4 = Union.create<Union2BytesInt>(typedData, 4);
  final struct5 = Union.create<Union2BytesInt>(typedData, 5);
  final struct6 = Union.create<Union2BytesInt>(typedData, 6);
  final struct7 = Union.create<Union2BytesInt>(typedData, 7);
  final struct8 = Union.create<Union2BytesInt>(typedData, 8);
  final struct9 = Union.create<Union2BytesInt>(typedData, 9);
  final struct10 = Union.create<Union2BytesInt>(typedData, 10);
  final struct11 = Union.create<Union2BytesInt>(typedData, 11);
  final struct12 = Union.create<Union2BytesInt>(typedData, 12);
  final struct13 = Union.create<Union2BytesInt>(typedData, 13);
  final struct14 = Union.create<Union2BytesInt>(typedData, 14);
  final struct15 = Union.create<Union2BytesInt>(typedData, 15);
  final struct16 = Union.create<Union2BytesInt>(typedData, 16);
  final struct17 = Union.create<Union2BytesInt>(typedData, 17);
  final struct18 = Union.create<Union2BytesInt>(typedData, 18);
  final struct19 = Union.create<Union2BytesInt>(typedData, 19);
  final expectedResult = makeExpectedResultInt16(0, length);
  final result = takeUnion2BytesIntPointerMany(
    struct0.address,
    struct1.address,
    struct2.address,
    struct3.address,
    struct4.address,
    struct5.address,
    struct6.address,
    struct7.address,
    struct8.address,
    struct9.address,
    struct10.address,
    struct11.address,
    struct12.address,
    struct13.address,
    struct14.address,
    struct15.address,
    struct16.address,
    struct17.address,
    struct18.address,
    struct19.address,
  );
  Expect.equals(expectedResult, result);
}
