// 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.

// @dart = 2.9

import 'dart:ffi';
import 'dart:io';

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

import 'abi_specific_ints.dart';

void main() {
  testSizeOf();
  testStoreLoad();
  testStoreLoadIndexed();
  testStruct();
  testInlineArray();
  testInlineArray2();
}

void testSizeOf() {
  final size = sizeOf<WChar>();
  if (Platform.isWindows) {
    Expect.equals(2, size);
  } else {
    Expect.equals(4, size);
  }
}

void testStoreLoad() {
  final p = calloc<WChar>();
  p.value = 10;
  Expect.equals(10, p.value);
  calloc.free(p);
}

void testStoreLoadIndexed() {
  final p = calloc<WChar>(2);
  p[0] = 10;
  p[1] = 3;
  Expect.equals(10, p[0]);
  Expect.equals(3, p[1]);
  calloc.free(p);
}

class WCharStruct extends Struct {
  @WChar()
  int a0;

  @WChar()
  int a1;
}

void testStruct() {
  final p = calloc<WCharStruct>();
  p.ref.a0 = 1;
  Expect.equals(1, p.ref.a0);
  p.ref.a0 = 2;
  Expect.equals(2, p.ref.a0);
  calloc.free(p);
}

class WCharArrayStruct extends Struct {
  @Array(100)
  Array<WChar> a0;
}

void testInlineArray() {
  final p = calloc<WCharArrayStruct>();
  final array = p.ref.a0;
  for (int i = 0; i < 100; i++) {
    array[i] = i;
  }
  for (int i = 0; i < 100; i++) {
    Expect.equals(i, array[i]);
  }
  calloc.free(p);
}

const _dim0 = 3;
const _dim1 = 8;
const _dim2 = 4;

class WCharArrayArrayStruct extends Struct {
  @Array(_dim1, _dim2)
  Array<Array<WChar>> a0;
}

void testInlineArray2() {
  int someValue(int a, int b, int c) => a * 1337 + b * 42 + c;
  final p = calloc<WCharArrayArrayStruct>(_dim0);
  for (int i0 = 0; i0 < _dim0; i0++) {
    final array = p.elementAt(i0).ref.a0;
    for (int i1 = 0; i1 < _dim1; i1++) {
      final array2 = array[i1];
      for (int i2 = 0; i2 < _dim2; i2++) {
        array2[i2] = someValue(i0, i1, i2);
      }
    }
  }
  for (int i0 = 0; i0 < _dim0; i0++) {
    final array = p.elementAt(i0).ref.a0;
    for (int i1 = 0; i1 < _dim1; i1++) {
      final array2 = array[i1];
      for (int i2 = 0; i2 < _dim2; i2++) {
        Expect.equals(someValue(i0, i1, i2), array2[i2]);
      }
    }
  }
  calloc.free(p);
}
