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

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

  // Float32List view of a byte buffer with offset2
  var res2 = buffer.asFloat32List(offset2);
  int view2Length = res2.length;

  Expect.isTrue(res1 is Float32List);
  Expect.isTrue(res2 is Float32List);
  Expect.runtimeIsType<Float32List>(res1);
  Expect.runtimeIsType<Float32List>(res2);
  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(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);
  if(!isJS) {
    check((new Int64List.fromList(list2)).buffer);
  }

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