// 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) {
    testAddressOfInt8Array();
    testAddressOfInt8ArrayElementAt();
    testAddressOfInt16Array();
    testAddressOfInt16ArrayElementAt();
    testAddressOfInt32Array();
    testAddressOfInt32ArrayElementAt();
    testAddressOfInt64Array();
    testAddressOfInt64ArrayElementAt();
    testAddressOfUint8Array();
    testAddressOfUint8ArrayElementAt();
    testAddressOfUint16Array();
    testAddressOfUint16ArrayElementAt();
    testAddressOfUint32Array();
    testAddressOfUint32ArrayElementAt();
    testAddressOfUint64Array();
    testAddressOfUint64ArrayElementAt();
    testAddressOfFloatArray();
    testAddressOfFloatArrayElementAt();
    testAddressOfDoubleArray();
    testAddressOfDoubleArrayElementAt();
    testAddressOfBoolArray();
    testAddressOfBoolArrayElementAt();
  }
}

final class Int8ArrayStruct extends Struct {
  @Array(20)
  external Array<Int8> array;
}

Array<Int8> makeInt8Array(int length) {
  assert(length == 20);
  final typedData = makeInt8List(length);
  final struct = Struct.create<Int8ArrayStruct>(typedData);
  return struct.array;
}

void testAddressOfInt8Array() {
  const length = 20;
  final array = makeInt8Array(length);
  final expectedResult = makeExpectedResultInt8(0, length);
  final result = takeInt8Pointer(array.address, length);
  Expect.equals(expectedResult, result);
}

void testAddressOfInt8ArrayElementAt() {
  const length = 20;
  final array = makeInt8Array(length);
  final expectedResult = makeExpectedResultInt8(0, length);
  final result = takeInt8PointerMany(
    array[0].address,
    array[1].address,
    array[2].address,
    array[3].address,
    array[4].address,
    array[5].address,
    array[6].address,
    array[7].address,
    array[8].address,
    array[9].address,
    array[10].address,
    array[11].address,
    array[12].address,
    array[13].address,
    array[14].address,
    array[15].address,
    array[16].address,
    array[17].address,
    array[18].address,
    array[19].address,
  );
  Expect.equals(expectedResult, result);
}

final class Int16ArrayStruct extends Struct {
  @Array(20)
  external Array<Int16> array;
}

Array<Int16> makeInt16Array(int length) {
  assert(length == 20);
  final typedData = makeInt16List(length);
  final struct = Struct.create<Int16ArrayStruct>(typedData);
  return struct.array;
}

void testAddressOfInt16Array() {
  const length = 20;
  final array = makeInt16Array(length);
  final expectedResult = makeExpectedResultInt16(0, length);
  final result = takeInt16Pointer(array.address, length);
  Expect.equals(expectedResult, result);
}

void testAddressOfInt16ArrayElementAt() {
  const length = 20;
  final array = makeInt16Array(length);
  final expectedResult = makeExpectedResultInt16(0, length);
  final result = takeInt16PointerMany(
    array[0].address,
    array[1].address,
    array[2].address,
    array[3].address,
    array[4].address,
    array[5].address,
    array[6].address,
    array[7].address,
    array[8].address,
    array[9].address,
    array[10].address,
    array[11].address,
    array[12].address,
    array[13].address,
    array[14].address,
    array[15].address,
    array[16].address,
    array[17].address,
    array[18].address,
    array[19].address,
  );
  Expect.equals(expectedResult, result);
}

final class Int32ArrayStruct extends Struct {
  @Array(20)
  external Array<Int32> array;
}

Array<Int32> makeInt32Array(int length) {
  assert(length == 20);
  final typedData = makeInt32List(length);
  final struct = Struct.create<Int32ArrayStruct>(typedData);
  return struct.array;
}

void testAddressOfInt32Array() {
  const length = 20;
  final array = makeInt32Array(length);
  final expectedResult = makeExpectedResultInt32(0, length);
  final result = takeInt32Pointer(array.address, length);
  Expect.equals(expectedResult, result);
}

void testAddressOfInt32ArrayElementAt() {
  const length = 20;
  final array = makeInt32Array(length);
  final expectedResult = makeExpectedResultInt32(0, length);
  final result = takeInt32PointerMany(
    array[0].address,
    array[1].address,
    array[2].address,
    array[3].address,
    array[4].address,
    array[5].address,
    array[6].address,
    array[7].address,
    array[8].address,
    array[9].address,
    array[10].address,
    array[11].address,
    array[12].address,
    array[13].address,
    array[14].address,
    array[15].address,
    array[16].address,
    array[17].address,
    array[18].address,
    array[19].address,
  );
  Expect.equals(expectedResult, result);
}

final class Int64ArrayStruct extends Struct {
  @Array(20)
  external Array<Int64> array;
}

Array<Int64> makeInt64Array(int length) {
  assert(length == 20);
  final typedData = makeInt64List(length);
  final struct = Struct.create<Int64ArrayStruct>(typedData);
  return struct.array;
}

void testAddressOfInt64Array() {
  const length = 20;
  final array = makeInt64Array(length);
  final expectedResult = makeExpectedResultInt64(0, length);
  final result = takeInt64Pointer(array.address, length);
  Expect.equals(expectedResult, result);
}

void testAddressOfInt64ArrayElementAt() {
  const length = 20;
  final array = makeInt64Array(length);
  final expectedResult = makeExpectedResultInt64(0, length);
  final result = takeInt64PointerMany(
    array[0].address,
    array[1].address,
    array[2].address,
    array[3].address,
    array[4].address,
    array[5].address,
    array[6].address,
    array[7].address,
    array[8].address,
    array[9].address,
    array[10].address,
    array[11].address,
    array[12].address,
    array[13].address,
    array[14].address,
    array[15].address,
    array[16].address,
    array[17].address,
    array[18].address,
    array[19].address,
  );
  Expect.equals(expectedResult, result);
}

final class Uint8ArrayStruct extends Struct {
  @Array(20)
  external Array<Uint8> array;
}

Array<Uint8> makeUint8Array(int length) {
  assert(length == 20);
  final typedData = makeUint8List(length);
  final struct = Struct.create<Uint8ArrayStruct>(typedData);
  return struct.array;
}

void testAddressOfUint8Array() {
  const length = 20;
  final array = makeUint8Array(length);
  final expectedResult = makeExpectedResultUint8(0, length);
  final result = takeUint8Pointer(array.address, length);
  Expect.equals(expectedResult, result);
}

void testAddressOfUint8ArrayElementAt() {
  const length = 20;
  final array = makeUint8Array(length);
  final expectedResult = makeExpectedResultUint8(0, length);
  final result = takeUint8PointerMany(
    array[0].address,
    array[1].address,
    array[2].address,
    array[3].address,
    array[4].address,
    array[5].address,
    array[6].address,
    array[7].address,
    array[8].address,
    array[9].address,
    array[10].address,
    array[11].address,
    array[12].address,
    array[13].address,
    array[14].address,
    array[15].address,
    array[16].address,
    array[17].address,
    array[18].address,
    array[19].address,
  );
  Expect.equals(expectedResult, result);
}

final class Uint16ArrayStruct extends Struct {
  @Array(20)
  external Array<Uint16> array;
}

Array<Uint16> makeUint16Array(int length) {
  assert(length == 20);
  final typedData = makeUint16List(length);
  final struct = Struct.create<Uint16ArrayStruct>(typedData);
  return struct.array;
}

void testAddressOfUint16Array() {
  const length = 20;
  final array = makeUint16Array(length);
  final expectedResult = makeExpectedResultUint16(0, length);
  final result = takeUint16Pointer(array.address, length);
  Expect.equals(expectedResult, result);
}

void testAddressOfUint16ArrayElementAt() {
  const length = 20;
  final array = makeUint16Array(length);
  final expectedResult = makeExpectedResultUint16(0, length);
  final result = takeUint16PointerMany(
    array[0].address,
    array[1].address,
    array[2].address,
    array[3].address,
    array[4].address,
    array[5].address,
    array[6].address,
    array[7].address,
    array[8].address,
    array[9].address,
    array[10].address,
    array[11].address,
    array[12].address,
    array[13].address,
    array[14].address,
    array[15].address,
    array[16].address,
    array[17].address,
    array[18].address,
    array[19].address,
  );
  Expect.equals(expectedResult, result);
}

final class Uint32ArrayStruct extends Struct {
  @Array(20)
  external Array<Uint32> array;
}

Array<Uint32> makeUint32Array(int length) {
  assert(length == 20);
  final typedData = makeUint32List(length);
  final struct = Struct.create<Uint32ArrayStruct>(typedData);
  return struct.array;
}

void testAddressOfUint32Array() {
  const length = 20;
  final array = makeUint32Array(length);
  final expectedResult = makeExpectedResultUint32(0, length);
  final result = takeUint32Pointer(array.address, length);
  Expect.equals(expectedResult, result);
}

void testAddressOfUint32ArrayElementAt() {
  const length = 20;
  final array = makeUint32Array(length);
  final expectedResult = makeExpectedResultUint32(0, length);
  final result = takeUint32PointerMany(
    array[0].address,
    array[1].address,
    array[2].address,
    array[3].address,
    array[4].address,
    array[5].address,
    array[6].address,
    array[7].address,
    array[8].address,
    array[9].address,
    array[10].address,
    array[11].address,
    array[12].address,
    array[13].address,
    array[14].address,
    array[15].address,
    array[16].address,
    array[17].address,
    array[18].address,
    array[19].address,
  );
  Expect.equals(expectedResult, result);
}

final class Uint64ArrayStruct extends Struct {
  @Array(20)
  external Array<Uint64> array;
}

Array<Uint64> makeUint64Array(int length) {
  assert(length == 20);
  final typedData = makeUint64List(length);
  final struct = Struct.create<Uint64ArrayStruct>(typedData);
  return struct.array;
}

void testAddressOfUint64Array() {
  const length = 20;
  final array = makeUint64Array(length);
  final expectedResult = makeExpectedResultUint64(0, length);
  final result = takeUint64Pointer(array.address, length);
  Expect.equals(expectedResult, result);
}

void testAddressOfUint64ArrayElementAt() {
  const length = 20;
  final array = makeUint64Array(length);
  final expectedResult = makeExpectedResultUint64(0, length);
  final result = takeUint64PointerMany(
    array[0].address,
    array[1].address,
    array[2].address,
    array[3].address,
    array[4].address,
    array[5].address,
    array[6].address,
    array[7].address,
    array[8].address,
    array[9].address,
    array[10].address,
    array[11].address,
    array[12].address,
    array[13].address,
    array[14].address,
    array[15].address,
    array[16].address,
    array[17].address,
    array[18].address,
    array[19].address,
  );
  Expect.equals(expectedResult, result);
}

final class FloatArrayStruct extends Struct {
  @Array(20)
  external Array<Float> array;
}

Array<Float> makeFloatArray(int length) {
  assert(length == 20);
  final typedData = makeFloat32List(length);
  final struct = Struct.create<FloatArrayStruct>(typedData);
  return struct.array;
}

void testAddressOfFloatArray() {
  const length = 20;
  final array = makeFloatArray(length);
  final expectedResult = makeExpectedResultFloat(0, length);
  final result = takeFloatPointer(array.address, length);
  Expect.approxEquals(expectedResult, result);
}

void testAddressOfFloatArrayElementAt() {
  const length = 20;
  final array = makeFloatArray(length);
  final expectedResult = makeExpectedResultFloat(0, length);
  final result = takeFloatPointerMany(
    array[0].address,
    array[1].address,
    array[2].address,
    array[3].address,
    array[4].address,
    array[5].address,
    array[6].address,
    array[7].address,
    array[8].address,
    array[9].address,
    array[10].address,
    array[11].address,
    array[12].address,
    array[13].address,
    array[14].address,
    array[15].address,
    array[16].address,
    array[17].address,
    array[18].address,
    array[19].address,
  );
  Expect.approxEquals(expectedResult, result);
}

final class DoubleArrayStruct extends Struct {
  @Array(20)
  external Array<Double> array;
}

Array<Double> makeDoubleArray(int length) {
  assert(length == 20);
  final typedData = makeFloat64List(length);
  final struct = Struct.create<DoubleArrayStruct>(typedData);
  return struct.array;
}

void testAddressOfDoubleArray() {
  const length = 20;
  final array = makeDoubleArray(length);
  final expectedResult = makeExpectedResultDouble(0, length);
  final result = takeDoublePointer(array.address, length);
  Expect.approxEquals(expectedResult, result);
}

void testAddressOfDoubleArrayElementAt() {
  const length = 20;
  final array = makeDoubleArray(length);
  final expectedResult = makeExpectedResultDouble(0, length);
  final result = takeDoublePointerMany(
    array[0].address,
    array[1].address,
    array[2].address,
    array[3].address,
    array[4].address,
    array[5].address,
    array[6].address,
    array[7].address,
    array[8].address,
    array[9].address,
    array[10].address,
    array[11].address,
    array[12].address,
    array[13].address,
    array[14].address,
    array[15].address,
    array[16].address,
    array[17].address,
    array[18].address,
    array[19].address,
  );
  Expect.approxEquals(expectedResult, result);
}

final class BoolArrayStruct extends Struct {
  @Array(20)
  external Array<Bool> array;
}

Array<Bool> makeBoolArray(int length) {
  assert(length == 20);
  final typedData = makeBoolList(length);
  final struct = Struct.create<BoolArrayStruct>(typedData);
  return struct.array;
}

void testAddressOfBoolArray() {
  const length = 20;
  final array = makeBoolArray(length);
  final expectedResult = makeExpectedResultBool(0, length);
  final result = takeBoolPointer(array.address, length);
  Expect.equals(expectedResult, result);
}

void testAddressOfBoolArrayElementAt() {
  const length = 20;
  final array = makeBoolArray(length);
  final expectedResult = makeExpectedResultBool(0, length);
  final result = takeBoolPointerMany(
    array[0].address,
    array[1].address,
    array[2].address,
    array[3].address,
    array[4].address,
    array[5].address,
    array[6].address,
    array[7].address,
    array[8].address,
    array[9].address,
    array[10].address,
    array[11].address,
    array[12].address,
    array[13].address,
    array[14].address,
    array[15].address,
    array[16].address,
    array[17].address,
    array[18].address,
    array[19].address,
  );
  Expect.equals(expectedResult, result);
}
