// Copyright (c) 2013, 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.
// VMOptions=--deoptimization_counter_threshold=1000 --optimization-counter-threshold=10

// Library tag to be able to run in html test framework.
library uint32x4_list_test;

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

testLoadStore(array) {
  Expect.equals(8, array.length);
  Expect.isTrue(array is List<Uint32x4>);
  array[0] = new Uint32x4(1, 2, 3, 4);
  Expect.equals(1, array[0].x);
  Expect.equals(2, array[0].y);
  Expect.equals(3, array[0].z);
  Expect.equals(4, array[0].w);
  array[1] = array[0];
  array[0] = array[0].withX(9);
  Expect.equals(9, array[0].x);
  Expect.equals(2, array[0].y);
  Expect.equals(3, array[0].z);
  Expect.equals(4, array[0].w);
  Expect.equals(1, array[1].x);
  Expect.equals(2, array[1].y);
  Expect.equals(3, array[1].z);
  Expect.equals(4, array[1].w);
}

testLoadStoreDeopt(array, index, value) {
  array[index] = value;
  Expect.equals(value.x, array[index].x);
  Expect.equals(value.y, array[index].y);
  Expect.equals(value.z, array[index].z);
  Expect.equals(value.w, array[index].w);
}

testLoadStoreDeoptDriver() {
  Uint32x4List list = new Uint32x4List(4);
  Uint32x4 value = new Uint32x4(1, 2, 3, 4);
  for (int i = 0; i < 20; i++) {
    testLoadStoreDeopt(list, 0, value);
  }
  try {
    // Invalid index.
    testLoadStoreDeopt(list, 5, value);
  } catch (_) {}
  for (int i = 0; i < 20; i++) {
    testLoadStoreDeopt(list, 0, value);
  }
  try {
    // null list.
    testLoadStoreDeopt(null, 0, value);
  } catch (_) {}
  for (int i = 0; i < 20; i++) {
    testLoadStoreDeopt(list, 0, value);
  }
  try {
    // null value.
    testLoadStoreDeopt(list, 0, null);
  } catch (_) {}
  for (int i = 0; i < 20; i++) {
    testLoadStoreDeopt(list, 0, value);
  }
  try {
    // non-smi index.
    testLoadStoreDeopt(list, 3.14159, value);
  } catch (_) {}
  for (int i = 0; i < 20; i++) {
    testLoadStoreDeopt(list, 0, value);
  }
  try {
    // non-Uint32x4 value.
    testLoadStoreDeopt(list, 0, 4.toDouble());
  } catch (_) {}
  for (int i = 0; i < 20; i++) {
    testLoadStoreDeopt(list, 0, value);
  }
  try {
    // non-Uint32x4List list.
    testLoadStoreDeopt([new Uint32x4(2, 3, 4, 5)], 0, value);
  } catch (_) {}
  for (int i = 0; i < 20; i++) {
    testLoadStoreDeopt(list, 0, value);
  }
}

testListZero() {
  Uint32x4List list = new Uint32x4List(1);
  Expect.equals(0, list[0].x);
  Expect.equals(0, list[0].y);
  Expect.equals(0, list[0].z);
  Expect.equals(0, list[0].w);
}

testView(array) {
  Expect.equals(8, array.length);
  Expect.isTrue(array is List<Uint32x4>);
  Expect.equals(0, array[0].x);
  Expect.equals(1, array[0].y);
  Expect.equals(2, array[0].z);
  Expect.equals(3, array[0].w);
  Expect.equals(4, array[1].x);
  Expect.equals(5, array[1].y);
  Expect.equals(6, array[1].z);
  Expect.equals(7, array[1].w);
}

testSublist(array) {
  Expect.equals(8, array.length);
  Expect.isTrue(array is Uint32x4List);
  var a = array.sublist(0, 1);
  Expect.equals(1, a.length);
  Expect.equals(0, a[0].x);
  Expect.equals(1, a[0].y);
  Expect.equals(2, a[0].z);
  Expect.equals(3, a[0].w);
  a = array.sublist(1, 2);
  Expect.equals(4, a[0].x);
  Expect.equals(5, a[0].y);
  Expect.equals(6, a[0].z);
  Expect.equals(7, a[0].w);
  a = array.sublist(0);
  Expect.equals(a.length, array.length);
  for (int i = 0; i < array.length; i++) {
    Expect.equals(array[i].x, a[i].x);
    Expect.equals(array[i].y, a[i].y);
    Expect.equals(array[i].z, a[i].z);
    Expect.equals(array[i].w, a[i].w);
  }
}

main() {
  var list;

  list = new Uint32x4List(8);
  for (int i = 0; i < 20; i++) {
    testLoadStore(list);
  }

  Uint32List uint32List = new Uint32List(32);
  for (int i = 0; i < uint32List.length; i++) {
    uint32List[i] = i;
  }
  list = new Uint32x4List.view(uint32List.buffer);
  for (int i = 0; i < 20; i++) {
    testView(list);
  }
  for (int i = 0; i < 20; i++) {
    testSublist(list);
  }
  for (int i = 0; i < 20; i++) {
    testLoadStore(list);
  }
  for (int i = 0; i < 20; i++) {
    testListZero();
  }
  testLoadStoreDeoptDriver();
}
