blob: dfa3f55c0ff069f0c624bd11c1ff483556596bce [file] [log] [blame]
/*
* Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation.
*
* This code is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
* or visit www.oracle.com if you need additional information or have any
* questions.
*/
/* @test
* @summary Binary data and view tests for byte buffers
* @bug 8159257
* @run testng ByteBufferViews
*/
import org.testng.annotations.DataProvider;
import org.testng.annotations.Test;
import java.nio.Buffer;
import java.nio.ByteBuffer;
import java.nio.ByteOrder;
import java.nio.CharBuffer;
import java.nio.DoubleBuffer;
import java.nio.FloatBuffer;
import java.nio.IntBuffer;
import java.nio.LongBuffer;
import java.nio.ShortBuffer;
import java.util.List;
import java.util.Map;
import java.util.function.Function;
import java.util.function.IntFunction;
import java.util.function.IntUnaryOperator;
import java.util.function.UnaryOperator;
import java.util.stream.Collectors;
import static org.testng.Assert.*;
public class ByteBufferViews {
static final int SIZE = 32;
// List of buffer allocator functions
static final List<Map.Entry<String, IntFunction<ByteBuffer>>> BYTE_BUFFER_ALLOCATE_FUNCTIONS = List.of(
// Heap
Map.entry("ByteBuffer.allocate(ba)",
size -> ByteBuffer.allocate(size)),
// Aligned
Map.entry("ByteBuffer.allocate(size).position(8)",
size -> ByteBuffer.allocate(size).position(8)),
Map.entry("ByteBuffer.allocate(size).position(8).slice()",
size -> ByteBuffer.allocate(size).position(8).slice()),
Map.entry("ByteBuffer.allocate(size).position(8).slice().duplicate()",
size -> ByteBuffer.allocate(size).position(8).slice().duplicate()),
// Unaligned
Map.entry("ByteBuffer.allocate(size).position(1)",
size -> ByteBuffer.allocate(size).position(1)),
Map.entry("ByteBuffer.allocate(size).position(1).slice()",
size -> ByteBuffer.allocate(size).position(1).slice()),
Map.entry("ByteBuffer.allocate(size).position(1).slice().duplicate()",
size -> ByteBuffer.allocate(size).position(1).slice().duplicate()),
// Off-heap
Map.entry("ByteBuffer.allocateDirect(size)",
size -> ByteBuffer.allocateDirect(size)),
// Aligned
Map.entry("ByteBuffer.allocateDirect(size).position(8)",
size -> ByteBuffer.allocateDirect(size).position(8)),
Map.entry("ByteBuffer.allocateDirect(size).position(8).slice()",
size -> ByteBuffer.allocateDirect(size).position(8).slice()),
Map.entry("ByteBuffer.allocateDirect(size).position(8).slice().duplicate()",
size -> ByteBuffer.allocateDirect(size).position(8).slice().duplicate()),
// Unaligned
Map.entry("ByteBuffer.allocateDirect(size).position(1)",
size -> ByteBuffer.allocateDirect(size).position(1)),
Map.entry("ByteBuffer.allocateDirect(size).position(1).slice()",
size -> ByteBuffer.allocateDirect(size).position(1).slice()),
Map.entry("ByteBuffer.allocateDirect(size).position(1).slice().duplicate()",
size -> ByteBuffer.allocateDirect(size).position(1).slice().duplicate())
);
// List of buffer byte order functions
static final List<Map.Entry<String, UnaryOperator<ByteBuffer>>> BYTE_BUFFER_ORDER_FUNCTIONS = List.of(
Map.entry("order(ByteOrder.BIG_ENDIAN)",
(ByteBuffer bb) -> bb.order(ByteOrder.BIG_ENDIAN)),
Map.entry("order(ByteOrder.LITTLE_ENDIAN)",
(ByteBuffer bb) -> bb.order(ByteOrder.LITTLE_ENDIAN))
);
// Produce a composition of allocation and byte order buffer functions
static List<Map.Entry<String, IntFunction<ByteBuffer>>> composeBufferFunctions(
List<Map.Entry<String, IntFunction<ByteBuffer>>> af,
List<Map.Entry<String, UnaryOperator<ByteBuffer>>> of) {
return af.stream().flatMap(afe -> of.stream().
map(ofe -> {
String s = afe.getKey() + "." + ofe.getKey();
IntFunction<ByteBuffer> f = size -> ofe.getValue().
apply(afe.getValue().apply(size));
return Map.entry(s, f);
})
).collect(Collectors.toList());
}
// List of buffer allocator functions to test
static final List<Map.Entry<String, IntFunction<ByteBuffer>>> BYTE_BUFFER_FUNCTIONS =
composeBufferFunctions(BYTE_BUFFER_ALLOCATE_FUNCTIONS, BYTE_BUFFER_ORDER_FUNCTIONS);
// Creates a cross product of test arguments for
// buffer allocator functions and buffer view functions
static Object[][] product(List<? extends Map.Entry<String, ?>> la,
List<? extends Map.Entry<String, ?>> lb) {
return la.stream().flatMap(lae -> lb.stream().
map(lbe -> List.of(
lae.getKey() + " -> " + lbe.getKey(),
lae.getValue(),
lbe.getValue()).toArray()
)).toArray(Object[][]::new);
}
static void assertValues(int i, Object bValue, Object bbValue, ByteBuffer bb) {
if (!bValue.equals(bbValue)) {
fail(String.format("Values %s and %s differ at index %d for %s",
bValue, bbValue, i, bb));
}
}
static void assertValues(int i, Object bbValue, Object bvValue, ByteBuffer bb, Buffer bv) {
if (!bbValue.equals(bvValue)) {
fail(String.format("Values %s and %s differ at index %d for %s and %s",
bbValue, bvValue, i, bb, bv));
}
}
static ByteBuffer allocate(IntFunction<ByteBuffer> f) {
return allocate(f, i -> i);
}
static ByteBuffer allocate(IntFunction<ByteBuffer> f, IntUnaryOperator o) {
return fill(f.apply(SIZE), o);
}
static ByteBuffer fill(ByteBuffer bb, IntUnaryOperator o) {
for (int i = 0; i < bb.limit(); i++) {
bb.put(i, (byte) o.applyAsInt(i));
}
return bb;
}
@DataProvider
public static Object[][] shortViewProvider() {
List<Map.Entry<String, Function<ByteBuffer, ShortBuffer>>> bfs = List.of(
Map.entry("bb.asShortBuffer()",
bb -> bb.asShortBuffer()),
Map.entry("bb.asShortBuffer().slice()",
bb -> bb.asShortBuffer().slice()),
Map.entry("bb.asShortBuffer().slice().duplicate()",
bb -> bb.asShortBuffer().slice().duplicate())
);
return product(BYTE_BUFFER_FUNCTIONS, bfs);
}
@Test(dataProvider = "shortViewProvider")
public void testShortGet(String desc, IntFunction<ByteBuffer> fbb,
Function<ByteBuffer, ShortBuffer> fbi) {
ByteBuffer bb = allocate(fbb);
ShortBuffer vb = fbi.apply(bb);
int o = bb.position();
for (int i = 0; i < vb.limit(); i++) {
short fromBytes = getShortFromBytes(bb, o + i * 2);
short fromMethodView = bb.getShort(o + i * 2);
assertValues(i, fromBytes, fromMethodView, bb);
short fromBufferView = vb.get(i);
assertValues(i, fromMethodView, fromBufferView, bb, vb);
}
for (int i = 0; i < vb.limit(); i++) {
short v = getShortFromBytes(bb, o + i * 2);
short a = bb.getShort();
assertValues(i, v, a, bb);
short b = vb.get();
assertValues(i, a, b, bb, vb);
}
}
@Test(dataProvider = "shortViewProvider")
public void testShortPut(String desc, IntFunction<ByteBuffer> fbb,
Function<ByteBuffer, ShortBuffer> fbi) {
ByteBuffer bbfilled = allocate(fbb);
ByteBuffer bb = allocate(fbb, i -> 0);
ShortBuffer vb = fbi.apply(bb);
int o = bb.position();
for (int i = 0; i < vb.limit(); i++) {
short fromFilled = bbfilled.getShort(o + i * 2);
vb.put(i, fromFilled);
short fromMethodView = bb.getShort(o + i * 2);
assertValues(i, fromFilled, fromMethodView, bb, vb);
}
for (int i = 0; i < vb.limit(); i++) {
short fromFilled = bbfilled.getShort(o + i * 2);
vb.put(fromFilled);
short fromMethodView = bb.getShort();
assertValues(i, fromFilled, fromMethodView, bb, vb);
}
fill(bb, i -> 0);
bb.clear().position(o);
vb.clear();
for (int i = 0; i < vb.limit(); i++) {
short fromFilled = bbfilled.getShort(o + i * 2);
bb.putShort(o + i * 2, fromFilled);
short fromBufferView = vb.get(i);
assertValues(i, fromFilled, fromBufferView, bb, vb);
}
for (int i = 0; i < vb.limit(); i++) {
short fromFilled = bbfilled.getShort(o + i * 2);
bb.putShort(fromFilled);
short fromBufferView = vb.get();
assertValues(i, fromFilled, fromBufferView, bb, vb);
}
}
static short getShortFromBytes(ByteBuffer bb, int i) {
int a = bb.get(i) & 0xFF;
int b = bb.get(i + 1) & 0xFF;
if (bb.order() == ByteOrder.BIG_ENDIAN) {
return (short) ((a << 8) | b);
}
else {
return (short) ((b << 8) | a);
}
}
@DataProvider
public static Object[][] charViewProvider() {
List<Map.Entry<String, Function<ByteBuffer, CharBuffer>>> bfs = List.of(
Map.entry("bb.asCharBuffer()",
bb -> bb.asCharBuffer()),
Map.entry("bb.asCharBuffer().slice()",
bb -> bb.asCharBuffer().slice()),
Map.entry("bb.asCharBuffer().slice().duplicate()",
bb -> bb.asCharBuffer().slice().duplicate())
);
return product(BYTE_BUFFER_FUNCTIONS, bfs);
}
@Test(dataProvider = "charViewProvider")
public void testCharGet(String desc, IntFunction<ByteBuffer> fbb,
Function<ByteBuffer, CharBuffer> fbi) {
ByteBuffer bb = allocate(fbb);
CharBuffer vb = fbi.apply(bb);
int o = bb.position();
for (int i = 0; i < vb.limit(); i++) {
char fromBytes = getCharFromBytes(bb, o + i * 2);
char fromMethodView = bb.getChar(o + i * 2);
assertValues(i, fromBytes, fromMethodView, bb);
char fromBufferView = vb.get(i);
assertValues(i, fromMethodView, fromBufferView, bb, vb);
}
for (int i = 0; i < vb.limit(); i++) {
char fromBytes = getCharFromBytes(bb, o + i * 2);
char fromMethodView = bb.getChar();
assertValues(i, fromBytes, fromMethodView, bb);
char fromBufferView = vb.get();
assertValues(i, fromMethodView, fromBufferView, bb, vb);
}
}
@Test(dataProvider = "charViewProvider")
public void testCharPut(String desc, IntFunction<ByteBuffer> fbb,
Function<ByteBuffer, CharBuffer> fbi) {
ByteBuffer bbfilled = allocate(fbb);
ByteBuffer bb = allocate(fbb, i -> 0);
CharBuffer vb = fbi.apply(bb);
int o = bb.position();
for (int i = 0; i < vb.limit(); i++) {
char fromFilled = bbfilled.getChar(o + i * 2);
vb.put(i, fromFilled);
char fromMethodView = bb.getChar(o + i * 2);
assertValues(i, fromFilled, fromMethodView, bb, vb);
}
for (int i = 0; i < vb.limit(); i++) {
char fromFilled = bbfilled.getChar(o + i * 2);
vb.put(fromFilled);
char fromMethodView = bb.getChar();
assertValues(i, fromFilled, fromMethodView, bb, vb);
}
fill(bb, i -> 0);
bb.clear().position(o);
vb.clear();
for (int i = 0; i < vb.limit(); i++) {
char fromFilled = bbfilled.getChar(o + i * 2);
bb.putChar(o + i * 2, fromFilled);
char fromBufferView = vb.get(i);
assertValues(i, fromFilled, fromBufferView, bb, vb);
}
for (int i = 0; i < vb.limit(); i++) {
char fromFilled = bbfilled.getChar(o + i * 2);
bb.putChar(fromFilled);
char fromBufferView = vb.get();
assertValues(i, fromFilled, fromBufferView, bb, vb);
}
}
static char getCharFromBytes(ByteBuffer bb, int i) {
return (char) getShortFromBytes(bb, i);
}
@DataProvider
public static Object[][] intViewProvider() {
List<Map.Entry<String, Function<ByteBuffer, IntBuffer>>> bfs = List.of(
Map.entry("bb.asIntBuffer()",
bb -> bb.asIntBuffer()),
Map.entry("bb.asIntBuffer().slice()",
bb -> bb.asIntBuffer().slice()),
Map.entry("bb.asIntBuffer().slice().duplicate()",
bb -> bb.asIntBuffer().slice().duplicate())
);
return product(BYTE_BUFFER_FUNCTIONS, bfs);
}
@Test(dataProvider = "intViewProvider")
public void testIntGet(String desc, IntFunction<ByteBuffer> fbb,
Function<ByteBuffer, IntBuffer> fbi) {
ByteBuffer bb = allocate(fbb);
IntBuffer vb = fbi.apply(bb);
int o = bb.position();
for (int i = 0; i < vb.limit(); i++) {
int fromBytes = getIntFromBytes(bb, o + i * 4);
int fromMethodView = bb.getInt(o + i * 4);
assertValues(i, fromBytes, fromMethodView, bb);
int fromBufferView = vb.get(i);
assertValues(i, fromMethodView, fromBufferView, bb, vb);
}
for (int i = 0; i < vb.limit(); i++) {
int v = getIntFromBytes(bb, o + i * 4);
int a = bb.getInt();
assertValues(i, v, a, bb);
int b = vb.get();
assertValues(i, a, b, bb, vb);
}
}
@Test(dataProvider = "intViewProvider")
public void testIntPut(String desc, IntFunction<ByteBuffer> fbb,
Function<ByteBuffer, IntBuffer> fbi) {
ByteBuffer bbfilled = allocate(fbb);
ByteBuffer bb = allocate(fbb, i -> 0);
IntBuffer vb = fbi.apply(bb);
int o = bb.position();
for (int i = 0; i < vb.limit(); i++) {
int fromFilled = bbfilled.getInt(o + i * 4);
vb.put(i, fromFilled);
int fromMethodView = bb.getInt(o + i * 4);
assertValues(i, fromFilled, fromMethodView, bb, vb);
}
for (int i = 0; i < vb.limit(); i++) {
int fromFilled = bbfilled.getInt(o + i * 4);
vb.put(fromFilled);
int fromMethodView = bb.getInt();
assertValues(i, fromFilled, fromMethodView, bb, vb);
}
fill(bb, i -> 0);
bb.clear().position(o);
vb.clear();
for (int i = 0; i < vb.limit(); i++) {
int fromFilled = bbfilled.getInt(o + i * 4);
bb.putInt(o + i * 4, fromFilled);
int fromBufferView = vb.get(i);
assertValues(i, fromFilled, fromBufferView, bb, vb);
}
for (int i = 0; i < vb.limit(); i++) {
int fromFilled = bbfilled.getInt(o + i * 4);
bb.putInt(fromFilled);
int fromBufferView = vb.get();
assertValues(i, fromFilled, fromBufferView, bb, vb);
}
}
static int getIntFromBytes(ByteBuffer bb, int i) {
int a = bb.get(i) & 0xFF;
int b = bb.get(i + 1) & 0xFF;
int c = bb.get(i + 2) & 0xFF;
int d = bb.get(i + 3) & 0xFF;
if (bb.order() == ByteOrder.BIG_ENDIAN) {
return ((a << 24) | (b << 16) | (c << 8) | d);
}
else {
return ((d << 24) | (c << 16) | (b << 8) | a);
}
}
@DataProvider
public static Object[][] longViewProvider() {
List<Map.Entry<String, Function<ByteBuffer, LongBuffer>>> bfs = List.of(
Map.entry("bb.asLongBuffer()",
bb -> bb.asLongBuffer()),
Map.entry("bb.asLongBuffer().slice()",
bb -> bb.asLongBuffer().slice()),
Map.entry("bb.asLongBuffer().slice().duplicate()",
bb -> bb.asLongBuffer().slice().duplicate())
);
return product(BYTE_BUFFER_FUNCTIONS, bfs);
}
@Test(dataProvider = "longViewProvider")
public void testLongGet(String desc, IntFunction<ByteBuffer> fbb,
Function<ByteBuffer, LongBuffer> fbi) {
ByteBuffer bb = allocate(fbb);
LongBuffer vb = fbi.apply(bb);
int o = bb.position();
for (int i = 0; i < vb.limit(); i++) {
long fromBytes = getLongFromBytes(bb, o + i * 8);
long fromMethodView = bb.getLong(o + i * 8);
assertValues(i, fromBytes, fromMethodView, bb);
long fromBufferView = vb.get(i);
assertValues(i, fromMethodView, fromBufferView, bb, vb);
}
for (int i = 0; i < vb.limit(); i++) {
long v = getLongFromBytes(bb, o + i * 8);
long a = bb.getLong();
assertValues(i, v, a, bb);
long b = vb.get();
assertValues(i, a, b, bb, vb);
}
}
@Test(dataProvider = "longViewProvider")
public void testLongPut(String desc, IntFunction<ByteBuffer> fbb,
Function<ByteBuffer, LongBuffer> fbi) {
ByteBuffer bbfilled = allocate(fbb);
ByteBuffer bb = allocate(fbb, i -> 0);
LongBuffer vb = fbi.apply(bb);
int o = bb.position();
for (int i = 0; i < vb.limit(); i++) {
long fromFilled = bbfilled.getLong(o + i * 8);
vb.put(i, fromFilled);
long fromMethodView = bb.getLong(o + i * 8);
assertValues(i, fromFilled, fromMethodView, bb, vb);
}
for (int i = 0; i < vb.limit(); i++) {
long fromFilled = bbfilled.getLong(o + i * 8);
vb.put(fromFilled);
long fromMethodView = bb.getLong();
assertValues(i, fromFilled, fromMethodView, bb, vb);
}
fill(bb, i -> 0);
bb.clear().position(o);
vb.clear();
for (int i = 0; i < vb.limit(); i++) {
long fromFilled = bbfilled.getLong(o + i * 8);
bb.putLong(o + i * 8, fromFilled);
long fromBufferView = vb.get(i);
assertValues(i, fromFilled, fromBufferView, bb, vb);
}
for (int i = 0; i < vb.limit(); i++) {
long fromFilled = bbfilled.getLong(o + i * 8);
bb.putLong(fromFilled);
long fromBufferView = vb.get();
assertValues(i, fromFilled, fromBufferView, bb, vb);
}
}
static long getLongFromBytes(ByteBuffer bb, int i) {
long a = bb.get(i) & 0xFF;
long b = bb.get(i + 1) & 0xFF;
long c = bb.get(i + 2) & 0xFF;
long d = bb.get(i + 3) & 0xFF;
long e = bb.get(i + 4) & 0xFF;
long f = bb.get(i + 5) & 0xFF;
long g = bb.get(i + 6) & 0xFF;
long h = bb.get(i + 7) & 0xFF;
if (bb.order() == ByteOrder.BIG_ENDIAN) {
return ((a << 56) | (b << 48) | (c << 40) | (d << 32) |
(e << 24) | (f << 16) | (g << 8) | h);
}
else {
return ((h << 56) | (g << 48) | (f << 40) | (e << 32) |
(d << 24) | (c << 16) | (b << 8) | a);
}
}
@DataProvider
public static Object[][] floatViewProvider() {
List<Map.Entry<String, Function<ByteBuffer, FloatBuffer>>> bfs = List.of(
Map.entry("bb.asFloatBuffer()",
bb -> bb.asFloatBuffer()),
Map.entry("bb.asFloatBuffer().slice()",
bb -> bb.asFloatBuffer().slice()),
Map.entry("bb.asFloatBuffer().slice().duplicate()",
bb -> bb.asFloatBuffer().slice().duplicate())
);
return product(BYTE_BUFFER_FUNCTIONS, bfs);
}
@Test(dataProvider = "floatViewProvider")
public void testFloatGet(String desc, IntFunction<ByteBuffer> fbb,
Function<ByteBuffer, FloatBuffer> fbi) {
ByteBuffer bb = allocate(fbb);
FloatBuffer vb = fbi.apply(bb);
int o = bb.position();
for (int i = 0; i < vb.limit(); i++) {
float fromBytes = getFloatFromBytes(bb, o + i * 4);
float fromMethodView = bb.getFloat(o + i * 4);
assertValues(i, fromBytes, fromMethodView, bb);
float fromBufferView = vb.get(i);
assertValues(i, fromMethodView, fromBufferView, bb, vb);
}
for (int i = 0; i < vb.limit(); i++) {
float v = getFloatFromBytes(bb, o + i * 4);
float a = bb.getFloat();
assertValues(i, v, a, bb);
float b = vb.get();
assertValues(i, a, b, bb, vb);
}
}
@Test(dataProvider = "floatViewProvider")
public void testFloatPut(String desc, IntFunction<ByteBuffer> fbb,
Function<ByteBuffer, FloatBuffer> fbi) {
ByteBuffer bbfilled = allocate(fbb);
ByteBuffer bb = allocate(fbb, i -> 0);
FloatBuffer vb = fbi.apply(bb);
int o = bb.position();
for (int i = 0; i < vb.limit(); i++) {
float fromFilled = bbfilled.getFloat(o + i * 4);
vb.put(i, fromFilled);
float fromMethodView = bb.getFloat(o + i * 4);
assertValues(i, fromFilled, fromMethodView, bb, vb);
}
for (int i = 0; i < vb.limit(); i++) {
float fromFilled = bbfilled.getFloat(o + i * 4);
vb.put(fromFilled);
float fromMethodView = bb.getFloat();
assertValues(i, fromFilled, fromMethodView, bb, vb);
}
fill(bb, i -> 0);
bb.clear().position(o);
vb.clear();
for (int i = 0; i < vb.limit(); i++) {
float fromFilled = bbfilled.getFloat(o + i * 4);
bb.putFloat(o + i * 4, fromFilled);
float fromBufferView = vb.get(i);
assertValues(i, fromFilled, fromBufferView, bb, vb);
}
for (int i = 0; i < vb.limit(); i++) {
float fromFilled = bbfilled.getFloat(o + i * 4);
bb.putFloat(fromFilled);
float fromBufferView = vb.get();
assertValues(i, fromFilled, fromBufferView, bb, vb);
}
}
static float getFloatFromBytes(ByteBuffer bb, int i) {
return Float.intBitsToFloat(getIntFromBytes(bb, i));
}
@DataProvider
public static Object[][] doubleViewProvider() {
List<Map.Entry<String, Function<ByteBuffer, DoubleBuffer>>> bfs = List.of(
Map.entry("bb.asDoubleBuffer()",
bb -> bb.asDoubleBuffer()),
Map.entry("bb.asDoubleBuffer().slice()",
bb -> bb.asDoubleBuffer().slice()),
Map.entry("bb.asDoubleBuffer().slice().duplicate()",
bb -> bb.asDoubleBuffer().slice().duplicate())
);
return product(BYTE_BUFFER_FUNCTIONS, bfs);
}
@Test(dataProvider = "doubleViewProvider")
public void testDoubleGet(String desc, IntFunction<ByteBuffer> fbb,
Function<ByteBuffer, DoubleBuffer> fbi) {
ByteBuffer bb = allocate(fbb);
DoubleBuffer vb = fbi.apply(bb);
int o = bb.position();
for (int i = 0; i < vb.limit(); i++) {
double fromBytes = getDoubleFromBytes(bb, o + i * 8);
double fromMethodView = bb.getDouble(o + i * 8);
assertValues(i, fromBytes, fromMethodView, bb);
double fromBufferView = vb.get(i);
assertValues(i, fromMethodView, fromBufferView, bb, vb);
}
for (int i = 0; i < vb.limit(); i++) {
double v = getDoubleFromBytes(bb, o + i * 8);
double a = bb.getDouble();
assertValues(i, v, a, bb);
double b = vb.get();
assertValues(i, a, b, bb, vb);
}
}
@Test(dataProvider = "doubleViewProvider")
public void testDoublePut(String desc, IntFunction<ByteBuffer> fbb,
Function<ByteBuffer, DoubleBuffer> fbi) {
ByteBuffer bbfilled = allocate(fbb);
ByteBuffer bb = allocate(fbb, i -> 0);
DoubleBuffer vb = fbi.apply(bb);
int o = bb.position();
for (int i = 0; i < vb.limit(); i++) {
double fromFilled = bbfilled.getDouble(o + i * 8);
vb.put(i, fromFilled);
double fromMethodView = bb.getDouble(o + i * 8);
assertValues(i, fromFilled, fromMethodView, bb, vb);
}
for (int i = 0; i < vb.limit(); i++) {
double fromFilled = bbfilled.getDouble(o + i * 8);
vb.put(fromFilled);
double fromMethodView = bb.getDouble();
assertValues(i, fromFilled, fromMethodView, bb, vb);
}
fill(bb, i -> 0);
bb.clear().position(o);
vb.clear();
for (int i = 0; i < vb.limit(); i++) {
double fromFilled = bbfilled.getDouble(o + i * 8);
bb.putDouble(o + i * 8, fromFilled);
double fromBufferView = vb.get(i);
assertValues(i, fromFilled, fromBufferView, bb, vb);
}
for (int i = 0; i < vb.limit(); i++) {
double fromFilled = bbfilled.getDouble(o + i * 8);
bb.putDouble(fromFilled);
double fromBufferView = vb.get();
assertValues(i, fromFilled, fromBufferView, bb, vb);
}
}
static double getDoubleFromBytes(ByteBuffer bb, int i) {
return Double.longBitsToDouble(getLongFromBytes(bb, i));
}
}