// Copyright (c) 2017, 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

/// @assertion void setAll(int index, Iterable<E> iterable)
/// ...
/// If iterable is based on this list, its values may change /during/ the setAll
/// operation.
///
/// @description Checks that if iterable is based on this list, its values may
/// change during the setAll operation.
/// @author ngl@unipro.ru
/// @issue 43227


import "dart:typed_data";
import "../../../Utils/expect.dart";

Float64x2 f64x2(v) => new Float64x2.splat(v);

listEquals(List<Float64x2> expected, Float64x2List actual) {
  Expect.equals(expected.length, actual.length);
  for (int i = 0; i < expected.length; ++i) {
    Expect.equals(expected[i].x, actual[i].x);
    Expect.equals(expected[i].y, actual[i].y);
  }
}

main() {
  var list = [
    f64x2(1.0), f64x2(2.0), f64x2(3.0), f64x2(4.0), f64x2(5.0),
    f64x2(6.0), f64x2(7.0), f64x2(8.0), f64x2(9.0)
  ];

  var l = new Float64x2List.fromList(list);
  var buffer = l.buffer;
  var view = new Float64x2List.view(buffer,
      3 * Float64x2List.bytesPerElement, 3);

  listEquals([f64x2(4.0), f64x2(5.0), f64x2(6.0)], view);
  l.setAll(2, view);
  listEquals([
    f64x2(1.0), f64x2(2.0), f64x2(4.0), f64x2(5.0), f64x2(6.0),
    f64x2(6.0), f64x2(7.0), f64x2(8.0), f64x2(9.0)
  ], l);

  listEquals([f64x2(5.0), f64x2(6.0), f64x2(6.0)], view);
  l.setAll(4, view);
  listEquals([
    f64x2(1.0), f64x2(2.0), f64x2(4.0), f64x2(5.0), f64x2(5.0),
    f64x2(6.0), f64x2(6.0), f64x2(8.0), f64x2(9.0)
  ], l);

  listEquals([f64x2(5.0), f64x2(5.0), f64x2(6.0)], view);
  l.setAll(0, view);
  listEquals([
    f64x2(5.0), f64x2(5.0), f64x2(6.0), f64x2(5.0), f64x2(5.0),
      f64x2(6.0), f64x2(6.0), f64x2(8.0), f64x2(9.0)
  ], l);

  listEquals([f64x2(5.0), f64x2(5.0), f64x2(6.0)], view);
}
