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

library TypedArrays2Test;
import '../../pkg/unittest/lib/unittest.dart';
import '../../pkg/unittest/lib/html_config.dart';
import 'dart:html';


main() {
  useHtmlConfiguration();

  // Only perform tests if ArrayBuffer is supported.
  if (!ArrayBuffer.supported) {
    return;
  }

  test('fromBufferTest_dynamic', () {
      var a1 = new Uint8Array(1024);
      for (int i = 0; i < a1.length; i++) {
        a1[i] = i; // 0,1,2,...,254,255,0,1,2,...
      }

      var a2 = new Uint32Array.fromBuffer(a1.buffer);
      expect(1024 ~/ 4, a2.length);
      expect(a2[0], 0x03020100);
      expect(a2[1], 0x07060504);
      expect(a2[2], 0x0B0A0908);
      expect(a2[50], 0xCBCAC9C8);
      expect(a2[51], 0xCFCECDCC);
      expect(a2[64], 0x03020100);

      a2 = new Uint32Array.fromBuffer(a1.buffer, 200);
      expect(a2.length, (1024 - 200) ~/ 4);
      expect(a2[0], 0xCBCAC9C8);
      expect(a2[1], 0xCFCECDCC);
      expect(a2[14], 0x03020100);

      a2 = new Uint32Array.fromBuffer(a1.buffer, 456, 20);
      expect(a2.length, 20);
      expect(a2[0], 0xCBCAC9C8);
      expect(a2[1], 0xCFCECDCC);
      expect(a2[14], 0x03020100);

      // OPTIONALS a2 = new Uint32Array.fromBuffer(a1.buffer, length: 30, byteOffset: 456);
      a2 = new Uint32Array.fromBuffer(a1.buffer, 456, 30);
      expect(a2.length, 30);
      expect(a2[0], 0xCBCAC9C8);
      expect(a2[1], 0xCFCECDCC);
      expect(a2[14], 0x03020100);
  });

  test('fromBufferTest_typed', () {
      Uint8Array a1 = new Uint8Array(1024);
      for (int i = 0; i < a1.length; i++) {
        a1[i] = i;
      }

      Uint32Array a2 = new Uint32Array.fromBuffer(a1.buffer);
      expect(a2.length, 1024 ~/ 4);
      expect(a2[0], 0x03020100);
      expect(a2[50], 0xCBCAC9C8);
      expect(a2[51], 0xCFCECDCC);
      expect(a2[64], 0x03020100);

      a2 = new Uint32Array.fromBuffer(a1.buffer, 200);
      expect(a2.length, (1024 - 200) ~/ 4);
      expect(a2[0], 0xCBCAC9C8);
      expect(a2[1], 0xCFCECDCC);
      expect(a2[14], 0x03020100);

      a2 = new Uint32Array.fromBuffer(a1.buffer, 456, 20);
      expect(20, a2.length);
      expect(a2[0], 0xCBCAC9C8);
      expect(a2[1], 0xCFCECDCC);
      expect(a2[14], 0x03020100);

      // OPTIONALS a2 = new Uint32Array.fromBuffer(a1.buffer, length: 30, byteOffset: 456);
      a2 = new Uint32Array.fromBuffer(a1.buffer, 456, 30);
      expect(a2.length, 30);
      expect(a2[0], 0xCBCAC9C8);
      expect(a2[1], 0xCFCECDCC);
      expect(a2[14], 0x03020100);
  });
}
