// 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.
//
// SharedObjects=ffi_test_functions

// @dart = 2.9

import 'dart:ffi';

import "package:expect/expect.dart";
import 'package:ffi/ffi.dart';

// Reuse struct definitions.
import 'function_structs_by_value_generated_test.dart';

void main() {
  testSizeOf();
  testLoad();
  testStore();
  testToString();
  testRange();
}

void testSizeOf() {
  Expect.equals(8, sizeOf<Struct8BytesInlineArrayInt>());
  Expect.equals(10, sizeOf<StructInlineArrayIrregular>());
  Expect.equals(4008, sizeOf<StructInlineArrayBig>());
}

// Only tests with Pointer as backing store.
void testLoad() {
  final pointer = calloc<Struct8BytesInlineArrayInt>();
  final struct = pointer.ref;
  final array = struct.a0;
  pointer.cast<Uint8>()[0] = 42;
  pointer.cast<Uint8>()[7] = 3;
  Expect.equals(42, array[0]);
  Expect.equals(3, array[7]);
  calloc.free(pointer);
}

// Only tests with Pointer as backing store.
void testStore() {
  final pointer = calloc<Struct8BytesInlineArrayInt>();
  pointer.cast<Uint8>()[0] = 42;
  pointer.cast<Uint8>()[7] = 3;
  final pointer2 = calloc<Struct8BytesInlineArrayInt>();
  pointer2.ref.a0 = pointer.ref.a0;
  Expect.equals(42, pointer2.ref.a0[0]);
  Expect.equals(3, pointer2.ref.a0[7]);
  calloc.free(pointer);
  calloc.free(pointer2);
}

// Tests the toString of the test generator.
void testToString() {
  final pointer = calloc<Struct8BytesInlineArrayInt>();
  final struct = pointer.ref;
  final array = struct.a0;
  for (var i = 0; i < 8; i++) {
    array[i] = i;
  }
  Expect.equals("([0, 1, 2, 3, 4, 5, 6, 7])", struct.toString());
  calloc.free(pointer);

  final pointer2 = calloc<StructInlineArrayIrregular>();
  final struct2 = pointer2.ref;
  struct2.a0[0].a0 = 0;
  struct2.a0[0].a1 = 1;
  struct2.a0[1].a0 = 2;
  struct2.a0[1].a1 = 3;
  struct2.a1 = 4;
  print(struct2);
  Expect.equals("([(0, 1), (2, 3)], 4)", struct2.toString());
  calloc.free(pointer2);
}

void testRange() {
  final pointer = calloc<Struct8BytesInlineArrayInt>();
  final struct = pointer.ref;
  final array = struct.a0;
  array[0] = 1;
  Expect.equals(1, array[0]);
  array[7] = 7;
  Expect.equals(7, array[7]);
  Expect.throws(() => array[-1]);
  Expect.throws(() => array[-1] = 0);
  Expect.throws(() => array[8]);
  Expect.throws(() => array[8] = 0);
  calloc.free(pointer);
}
