// 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 setRange(
///     int start,
///     int end,
///     Iterable<E> iterable, [
///     int skipCount = 0
/// ])
/// Copies the objects of iterable, skipping skipCount objects first, into the
/// range start, inclusive, to end, exclusive, of the list.
/// @description Checks that the elements of this list are set correctly.
/// @author ngl@unipro.ru


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);
  l.setRange(1, 3, [i32x4(11), i32x4(12)]);
  Expect.equals(list.length, l.length);
  listEquals([i32x4(0), i32x4(11), i32x4(12), i32x4(3), i32x4(4), i32x4(5)], l);

  l.setRange(4, 6, [i32x4(1), i32x4(0), i32x4(0), i32x4(1)], 1);
  Expect.equals(list.length, l.length);
  listEquals([i32x4(0), i32x4(11), i32x4(12), i32x4(3), i32x4(0), i32x4(0)], l);

  l.setRange(2, 6, [i32x4(1), i32x4(1), i32x4(1), i32x4(1), i32x4(1)]);
  Expect.equals(list.length, l.length);
  listEquals([i32x4(0), i32x4(11), i32x4(1), i32x4(1), i32x4(1), i32x4(1)], l);

  l.setRange(3, 6, [i32x4(1), i32x4(2), i32x4(3), i32x4(4), i32x4(5), i32x4(6)],
      2);
  Expect.equals(list.length, l.length);
  listEquals([i32x4(0), i32x4(11), i32x4(1), i32x4(3), i32x4(4), i32x4(5)], l);

  l.setRange(4, 4, [i32x4(1), i32x4(2), i32x4(3), i32x4(4)], 3);
  Expect.equals(list.length, l.length);
  listEquals([i32x4(0), i32x4(11), i32x4(1), i32x4(3), i32x4(4), i32x4(5)], l);
}
