// Copyright (c) 2012, 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 test program for testing native int arrays.

// @dart = 2.9

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

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

void testInt16() {
  Int16List intArray = new Int16List(4);
  intArray[0] = 0;
  intArray[1] = -1;
  intArray[2] = -2;
  intArray[3] = -3;
  for (int i = 0; i < intArray.length; i++) {
    intArray[i]++;
  }
  var x = intArray[0];
  var y = intArray[1];
  var z = intArray[2];
  var w = intArray[3];
  Expect.equals(1, x);
  Expect.equals(0, y);
  Expect.equals(-1, z);
  Expect.equals(-2, w);
  var t = y + 1;
  intArray[0] = t;
  Expect.equals(t, intArray[0]);
}

void testUint16() {
  Uint16List intArray = new Uint16List(4);
  intArray[0] = 0;
  intArray[1] = 1;
  intArray[2] = 2;
  intArray[3] = 3;
  for (int i = 0; i < intArray.length; i++) {
    intArray[i]--;
  }
  var x = intArray[0];
  var y = intArray[1];
  var z = intArray[2];
  var w = intArray[3];
  Expect.equals(65535, x);
  Expect.equals(0, y);
  Expect.equals(1, z);
  Expect.equals(2, w);
  var t = y + 1;
  intArray[0] = t;
  Expect.equals(t, intArray[0]);
}

void testInt32ToSmi() {
  Int32List intArray;

  intArray = new Int32List(4);
  intArray[0] = 1073741823; // SmiMax
  intArray[1] = -1073741824; // SmiMin
  intArray[2] = 1073741824; // SmiMax+1
  intArray[3] = -1073741825; // SmiMin-1
  var x = intArray[0];
  var y = intArray[1];
  var z = intArray[2];
  var w = intArray[3];
  Expect.equals(1073741823, x);
  Expect.equals(-1073741824, y);
  Expect.equals(1073741824, z);
  Expect.equals(-1073741825, w);
}

void testUint32ToSmi() {
  Uint32List intArray;

  intArray = new Uint32List(4);
  intArray[0] = 1073741823; // SmiMax
  intArray[1] = -1; // 0xFFFFFFFF : 4294967295
  intArray[2] = 1073741830; // SmiMax+7
  intArray[3] = -1073741825; // 0xbfffffff : 3221225471
  var x = intArray[0];
  var y = intArray[1];
  var z = intArray[2];
  var w = intArray[3];
  Expect.equals(1073741823, x);
  Expect.equals(4294967295, y);
  Expect.equals(1073741830, z);
  Expect.equals(3221225471, w);
}

void testInt64ToSmi() {
  Int64List intArray;

  intArray = new Int64List(4);
  intArray[0] = 4611686018427387903; // SmiMax
  intArray[1] = -4611686018427387904; // SmiMin
  intArray[2] = 4611686018427387904; // SmiMax+1
  intArray[3] = -4611686018427387905; // SmiMin-1
  var x = intArray[0];
  var y = intArray[1];
  var z = intArray[2];
  var w = intArray[3];
  Expect.equals(4611686018427387903, x);
  Expect.equals(-4611686018427387904, y);
  Expect.equals(4611686018427387904, z);
  Expect.equals(-4611686018427387905, w);
}

void testUint64ToSmi() {
  Uint64List intArray;

  intArray = new Uint64List(4);
  intArray[0] = 4611686018427387903; // SmiMax
  intArray[1] = -1; // 0xFFFFFFFFFFFFFFFF : 18446744073709551615
  intArray[2] = 4611686018427387904; // SmiMax+1
  intArray[3] = -9223372036854775808;
  var x = intArray[0];
  var y = intArray[1];
  var z = intArray[2];
  var w = intArray[3];
  Expect.equals(4611686018427387903, x);
  Expect.equals(-1, y);
  Expect.equals(4611686018427387904, z);
  Expect.equals(-9223372036854775808, w);
}

main() {
  testUint64ToSmi();
  for (int i = 0; i < 2000; i++) {
    testInt16();
    testUint16();
    testInt32ToSmi();
    testUint32ToSmi();
    testInt64ToSmi();
    testUint64ToSmi();
  }
}
