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

/// @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 the values of iterable may change, if iterable is
/// based on this list.
/// @author ngl@unipro.ru
/// @issue 43227


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

Int32x4 i32x4(n) => new Int32x4(n, n, n, n);

equal(o1, o2) => o1.x == o2.x && o1.y == o2.y && o1.z == o2.z && o1.w == o2.w;

void listEquals(l, expected) {
  for (int i = 0; i < l.length; ++i) {
    Expect.isTrue(equal(l[i], expected[i]));
  }
}

main() {
  var list = [i32x4(0), i32x4(1), i32x4(2), i32x4(3), i32x4(4), i32x4(5)];
  var l = new Int32x4List.fromList(list);
  var buffer = l.buffer;
  var view = new Int32x4List.view(buffer, Int32x4List.bytesPerElement * 2, 3);

  listEquals([i32x4(2), i32x4(3), i32x4(4)], view);
  l.setAll(1, view);
  listEquals([i32x4(0), i32x4(2), i32x4(3), i32x4(4), i32x4(4), i32x4(5)], l);

  listEquals([i32x4(3), i32x4(4), i32x4(4)], view);
  l.setAll(3, view);
  listEquals([i32x4(0), i32x4(2), i32x4(3), i32x4(3), i32x4(4), i32x4(4)], l);

  listEquals([i32x4(3), i32x4(3), i32x4(4)], view);
  l.setAll(0, view);
  listEquals([i32x4(3), i32x4(3), i32x4(4), i32x4(3), i32x4(4), i32x4(4)], l);

  listEquals([i32x4(4), i32x4(3), i32x4(4)], view);
}
