 // 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 Int16List asInt16List([int offsetInBytes = 0, int length ])
/// Creates a Int16List view of a region of this byte buffer.
/// ...
/// The viewed region start at offsetInBytes, which must be 16-bit aligned, and
/// contains length 16-bit integers. If length is omitted, the range extends as
/// far towards the end of the buffer as possible - if lengthInBytes is not even,
/// the last byte can't be part of the view.
/// @description Checks that the viewed region begins with offsetInBytes byte,
/// which must be 16-bit aligned, and contains length 16-bit integers. If length
/// is omitted, the range extends to the end of the buffer (if buffer length in
/// bytes is divisible by two), otherwise, the last bytes can't be part of the
/// view.
/// @author ngl@unipro.ru
/// @issue 43204


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

void check(ByteBuffer buffer) {
  int bufSizeInBytes = buffer.lengthInBytes;
  // Int16List view of a byte buffer
  Int16List res = buffer.asInt16List(0);
  int viewSizeInBytes = res.lengthInBytes;
  int viewLength = res.length;
  int shift = (Int16List.bytesPerElement == 2) ? 1 : 0;
  int offset1 = 4;
  int length1 = ((viewSizeInBytes - offset1) >> shift) - 1;
  int offset2 = 8;

  // Int16List view of a byte buffer with offset1 and length1
  Int16List res1 = buffer.asInt16List(offset1, length1);
  int view1Length = res1.length;

  // Int16List view of a byte buffer with offset2
  Int16List res2 = buffer.asInt16List(offset2);
  int view2Length = res2.length;

  Expect.isTrue(res1 is Int16List);
  Expect.isTrue(res2 is Int16List);
  Expect.equals(length1, view1Length);
  Expect.equals((viewSizeInBytes - offset2) >> shift, view2Length);

  if (viewSizeInBytes != 0) {
    // set value to the first element of res1
    res1[0] = 2;
    Expect.equals(2, res[offset1 >> shift]);
    //set value to the last element if res1
    res1[view1Length - 1] = 4;
    Expect.equals(4, res[(offset1 >> shift) + view1Length - 1]);

    // set value to the first element of res2
    res2[0] = 3;
    Expect.equals(3, res[offset2 >> shift]);
    // set value to the last element of res2
    res2[view2Length - 1] = 5;
    Expect.equals(5, res[viewLength - 1]);

    if (bufSizeInBytes != viewSizeInBytes) {
      ByteData resb = buffer.asByteData(0);
      int cv = 0;
      // checks that last 'bufSizeInBytes - viewSizeInBytes' bytes contain 0
      for (int i = viewSizeInBytes; i < bufSizeInBytes; i++) {
        int v = resb.getInt8(i);
        cv |= v;
      }
      Expect.equals(0, cv);
    }
  }
}

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

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

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

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

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

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