// 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 viewed region start at offsetInBytes and contains length bytes. If length
/// is omitted, the range extends to the end of the buffer.
/// @description Checks that the created viewed region begins with offsetInBytes
/// byte and contains length bytes. When length is omitted, the range extends to
/// the end of the buffer.
/// @author ngl@unipro.ru


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

void check(ByteBuffer buffer) {
  ByteData res = buffer.asByteData(0);
  int viewSizeInBytes = res.lengthInBytes;
  int offset1 = 1;
  int length1 = viewSizeInBytes - offset1 - 1;
  int offset2 = 3;
  ByteData res1 = buffer.asByteData(offset1, length1);
  ByteData res2 = buffer.asByteData(offset2);
  int view1SizeInBytes = res1.lengthInBytes;
  int view2SizeInBytes = res2.lengthInBytes;

  Expect.isTrue(res is ByteData);
  Expect.isTrue(res1 is ByteData);
  Expect.isTrue(res2 is ByteData);
  Expect.equals(length1, view1SizeInBytes);
  Expect.equals(viewSizeInBytes - offset2, view2SizeInBytes);

  if (viewSizeInBytes != 0) {
    // set value to the first byte of res1
    res1.setInt8(0, 2);
    // offset1 byte of res is equal to the set value
    Expect.equals(2, res.getInt8(offset1));
    // set value to the last byte of res1
    res1.setInt8(view1SizeInBytes - 1, 4);
    // (offset1 + view1_size_in_bytes - 1) byte of res is equal to the set value
    Expect.equals(4, res.getInt8(offset1 + view1SizeInBytes - 1));

    // set value to the first byte of res2
    res2.setInt8(0, 3);
    // offset2 byte of res is equal to the set value
    Expect.equals(3, res.getInt8(offset2));
    // set value to the last byte of res2
    res2.setInt8(view2SizeInBytes - 1, 5);
    // the last byte of res is equal to the set value
    Expect.equals(5, res.getInt8(viewSizeInBytes - 1));
  }
}

main() {
  var list2 = new List.filled(6, 0);
  var list4 = new Int32x4List(6);

  check((new Int8List.fromList(list2)).buffer);
  check((new Int16List.fromList(list2)).buffer);
  check((new Int32List.fromList(list2)).buffer);
  check((new Int64List.fromList(list2)).buffer);
  check((new Int32x4List.fromList(list4)).buffer);
}
