// 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 ByteData asByteData([int offsetInBytes = 0, int length ])
/// Creates a ByteData view of a region of this byte buffer.
/// The view is backed by the bytes of this byte buffer. Any changes made to
/// the ByteData will also change the buffer, and vice versa.
/// @description Checks that method asByteData creates a ByteData view of a
/// region of this byte buffer, and any changes made to ByteData will also change
/// the buffer, and vice versa. The checking is done for buffers of lists with
/// different elements size.
/// @author ngl@unipro.ru


import "dart:typed_data";
import "../../../Utils/expect.dart";

void check(ByteBuffer buffer) {
  int bufSizeInBytes = buffer.lengthInBytes;
  ByteData res = buffer.asByteData(0);
  ByteData res1 = buffer.asByteData(0);
  int viewSizeInBytes = res.lengthInBytes;

  Expect.isTrue(res is ByteData);
  Expect.equals(bufSizeInBytes, viewSizeInBytes);

  if (viewSizeInBytes != 0) {
    // set value to the first byte of res1
    res1.setInt8(0, 2);
    // the first byte of res is equal to the set value
    Expect.equals(2, res.getInt8(0));

    // set value to the last byte of res
    res.setInt8(viewSizeInBytes - 1, 4);
    // the last byte of res1 is equal to the set value
    Expect.equals(4, res1.getInt8(viewSizeInBytes - 1));
  }
  Expect.notEquals(res, res1);
  Expect.equals(res.buffer, res1.buffer);
}

main() {
  var list0 = <int>[];
  var list1 = new List.filled(1, 0);
  var list2 = new List.filled(5, 0);
  var list3 = new Int32x4List(1);
  var list4 = new Int32x4List(5);
  var list5 = new Int32x4List(0);

  check((new Int8List.fromList(list0)).buffer);
  check((new Int8List.fromList(list1)).buffer);
  check((new Int8List.fromList(list2)).buffer);

  check((new Int16List.fromList(list0)).buffer);
  check((new Int16List.fromList(list1)).buffer);
  check((new Int16List.fromList(list2)).buffer);

  check((new Int32List.fromList(list0)).buffer);
  check((new Int32List.fromList(list1)).buffer);
  check((new Int32List.fromList(list2)).buffer);

  check((new Int64List.fromList(list0)).buffer);
  check((new Int64List.fromList(list1)).buffer);
  check((new Int64List.fromList(list2)).buffer);

  check((new Int32x4List.fromList(list5)).buffer);
  check((new Int32x4List.fromList(list3)).buffer);
  check((new Int32x4List.fromList(list4)).buffer);
}
