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

import 'dart:html';
import 'dart:typed_data';

import 'package:expect/minitest.dart';

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

  test('create', () {
    var bd = new ByteData(100);
    expect(bd.lengthInBytes, 100);
    expect(bd.offsetInBytes, 0);

    var a1 = new Uint8List.fromList([1, 2, 3, 4, 5, 6, 7, 8]);

    var bd2 = new ByteData.view(a1.buffer);
    expect(bd2.lengthInBytes, 8);
    expect(bd2.offsetInBytes, 0);

    var bd3 = new ByteData.view(a1.buffer, 2);
    expect(bd3.lengthInBytes, 6);
    expect(bd3.offsetInBytes, 2);

    var bd4 = new ByteData.view(a1.buffer, 3, 4);
    expect(bd4.lengthInBytes, 4);
    expect(bd4.offsetInBytes, 3);
  });

  test('access8', () {
    var a1 = new Uint8List.fromList([0, 0, 3, 255, 0, 0, 0, 0, 0, 0]);

    var bd = new ByteData.view(a1.buffer, 2, 6);

    expect(bd.getInt8(0), equals(3));
    expect(bd.getInt8(1), equals(-1));
    expect(bd.getUint8(0), equals(3));
    expect(bd.getUint8(1), equals(255));

    bd.setInt8(2, -56);
    expect(bd.getInt8(2), equals(-56));
    expect(bd.getUint8(2), equals(200));

    bd.setUint8(3, 200);
    expect(bd.getInt8(3), equals(-56));
    expect(bd.getUint8(3), equals(200));
  });

  test('access16', () {
    var a1 = new Uint8List.fromList([0, 0, 3, 255, 0, 0, 0, 0, 0, 0]);

    var bd = new ByteData.view(a1.buffer, 2);

    expect(bd.lengthInBytes, equals(10 - 2));

    expect(bd.getInt16(0), equals(1023));
    expect(bd.getInt16(0, Endian.big), equals(1023));
    expect(bd.getInt16(0, Endian.little), equals(-253));

    expect(bd.getUint16(0), equals(1023));
    expect(bd.getUint16(0, Endian.big), equals(1023));
    expect(bd.getUint16(0, Endian.little), equals(0xFF03));

    bd.setInt16(2, -1);
    expect(bd.getInt16(2), equals(-1));
    expect(bd.getUint16(2), equals(0xFFFF));
  });

  test('access32', () {
    var a1 = new Uint8List.fromList([0, 0, 3, 255, 0, 0, 0, 0, 0, 0]);

    var bd = new ByteData.view(a1.buffer);

    expect(bd.getInt32(0), equals(1023));
    expect(bd.getInt32(0, Endian.big), equals(1023));
    expect(bd.getInt32(0, Endian.little), equals(-0xFD0000));

    expect(bd.getUint32(0), equals(1023));
    expect(bd.getUint32(0, Endian.big), equals(1023));
    expect(bd.getUint32(0, Endian.little), equals(0xFF030000));
  });
}
