// 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 DoubleArray extension Null safety
/// Bounds checking indexing methods on Arrays of Double.
///
/// @description Checks that this extension contains bounds checking indexing
/// methods on Arrays of Double
/// @author sgrekhov@unipro.ru

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

class MyStruct extends Struct {
  @Array(2)
  external Array<Double> a0;
  @Array.multi([2, 3])
  external Array<Array<Double>> a1;
}

void main() {
  final pointer = calloc<MyStruct>();
  try {
    final array1 = pointer.ref.a0;
    for (int i = 0; i < 2; i++) {
      array1[i] = 3.14;
      Expect.approxEquals(3.14, array1[i]);
      array1[i] = -3.14;
      Expect.approxEquals(-3.14, array1[i]);
    }
    final array2 = pointer.ref.a1;
    for (int i = 0; i < 2; i++) {
      for (int j = 0; j < 3; j++) {
        array2[i][j] = 3.14;
        Expect.approxEquals(3.14, array2[i][j]);
        array2[i][j] = -3.14;
        Expect.approxEquals(-3.14, array2[i][j]);
      }
    }
  } finally {
    calloc.free(pointer);
  }
}
