// 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  Float64List asFloat64List([int offsetInBytes = 0, int length ])
/// Creates a Float64List view of a region of this byte buffer.
/// ...
/// The viewed region start at offsetInBytes, which must be 64-bit aligned, and
/// contains length 64-bit integers. If length is omitted, the range extends as
/// far towards the end of the buffer as possible - if lengthInBytes is not
/// divisible by eight, the last bytes can't be part of the view.
///
/// @description Checks that the viewed region begins with offsetInBytes byte,
/// which must be 64-bit aligned, and contains length 64-bit integers. If length
/// is omitted, the range extends to the end of the buffer (if buffer length in
/// bytes is divisible by eight), 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;
  // Float64List view of a byte buffer
  Float64List res = buffer.asFloat64List(0);
  int viewSizeInBytes = res.lengthInBytes;
  int viewLength = res.length;
  int shift = (Float64List.bytesPerElement == 8) ? 3 : 0;
  int offset1 = 8;
  int length1 = ((viewSizeInBytes - offset1) >> shift) - 1;
  int offset2 = 16;

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

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

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

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

    // set value to the first element of res2
    res2[0] = 3.0;
    Expect.equals(3.0, res[offset2 >> shift]);
    // set value to the last element of res2
    res2[view2Length - 1] = 5.0;
    Expect.equals(5.0, 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(24, 0);
  var list2 = new List.filled(27, 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);
}
