BufferTest.java
/*
* Copyright (C) 2018 Samuel Audet
*
* Licensed either under the Apache License, Version 2.0, or (at your option)
* under the terms of the GNU General Public License as published by
* the Free Software Foundation (subject to the "Classpath" exception),
* either version 2, or any later version (collectively, the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
* http://www.gnu.org/licenses/
* http://www.gnu.org/software/classpath/license.html
*
* or as provided in the LICENSE.txt file that accompanied this code.
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.bytedeco.javacpp;
import java.io.File;
import java.nio.ByteBuffer;
import java.nio.DoubleBuffer;
import java.nio.FloatBuffer;
import java.nio.IntBuffer;
import java.nio.LongBuffer;
import java.nio.ShortBuffer;
import org.bytedeco.javacpp.annotation.CriticalRegion;
import org.bytedeco.javacpp.annotation.Platform;
import org.bytedeco.javacpp.tools.Builder;
import org.junit.Test;
import org.junit.BeforeClass;
import static org.junit.Assert.*;
/**
* Test cases for the set of NIO Buffer classes. Relies on other classes from JavaCPP.
*
* @author Samuel Audet
*/
@Platform(compiler = "cpp11", include = "BufferTest.h")
public class BufferTest {
public static class BufferCallback extends FunctionPointer {
static { Loader.load(); }
protected BufferCallback() { allocate(); }
private native void allocate();
static ByteBuffer value = new BytePointer(new byte[] {34}).asBuffer();
public ByteBuffer call(ByteBuffer buffer) {
assertEquals(12, buffer.get(0));
return value;
}
}
public static native ByteBuffer bufferCallback(BufferCallback f);
@CriticalRegion
public static native byte getByte(ByteBuffer buffer);
public static native void putByte(ByteBuffer buffer, byte value);
public static native short getShort(ShortBuffer buffer);
@CriticalRegion
public static native void putShort(ShortBuffer buffer, short value);
public static native int getInt(IntBuffer buffer);
public static native void putInt(IntBuffer buffer, int value);
@CriticalRegion
public static native long getLong(LongBuffer buffer);
public static native void putLong(LongBuffer buffer, long value);
public static native float getFloat(FloatBuffer buffer);
@CriticalRegion
public static native void putFloat(FloatBuffer buffer, float value);
public static native double getDouble(DoubleBuffer buffer);
public static native void putDouble(DoubleBuffer buffer, double value);
@BeforeClass public static void setUpClass() throws Exception {
System.out.println("Builder");
Class c = BufferTest.class;
Builder builder = new Builder().classesOrPackages(c.getName());
File[] outputFiles = builder.build();
System.out.println("Loader");
Loader.load(c);
}
@Test public void testBufferCallback() {
System.out.println("BufferCallback");
assertEquals(34, bufferCallback(new BufferCallback()).get(0));
}
@Test public void testByteBuffer() {
System.out.println("ByteBuffer");
byte[] array = {-22, -11, 0, 11, 22};
ByteBuffer arrayBuffer = ByteBuffer.wrap(array, 2, 3);
putByte(arrayBuffer, (byte)42);
assertEquals(42, array[2]);
BytePointer pointer = new BytePointer(arrayBuffer);
ByteBuffer directBuffer = pointer.asBuffer();
assertEquals(pointer.address(), new BytePointer(directBuffer).address());
assertEquals(pointer.address(), Pointer.getDirectBufferAddress(directBuffer));
assertTrue(directBuffer.compareTo(arrayBuffer) == 0);
assertEquals(arrayBuffer.position(), directBuffer.position());
assertEquals(arrayBuffer.limit(), directBuffer.limit());
assertEquals(arrayBuffer.capacity(), directBuffer.capacity());
assertEquals(getByte(arrayBuffer), getByte(directBuffer));
assertEquals(getByte((ByteBuffer)arrayBuffer.position(arrayBuffer.position() + 2)),
getByte((ByteBuffer)directBuffer.position(directBuffer.position() + 2)));
}
@Test public void testShortBuffer() {
System.out.println("ShortBuffer");
short[] array = {-222, -111, 0, 111, 222};
ShortBuffer arrayBuffer = ShortBuffer.wrap(array, 2, 3);
putShort(arrayBuffer, (short)420);
assertEquals(420, array[2]);
ShortPointer pointer = new ShortPointer(arrayBuffer);
ShortBuffer directBuffer = pointer.asBuffer();
assertEquals(pointer.address() + pointer.position() * pointer.sizeof(), new ShortPointer(directBuffer).address());
assertEquals(pointer.address() + pointer.position() * pointer.sizeof(), Pointer.getDirectBufferAddress(directBuffer));
assertTrue(directBuffer.compareTo(arrayBuffer) == 0);
assertEquals(arrayBuffer.limit() - arrayBuffer.position(), directBuffer.limit());
assertEquals(arrayBuffer.capacity() - arrayBuffer.position(), directBuffer.capacity());
assertEquals(getShort(arrayBuffer), getShort(directBuffer));
assertEquals(getShort((ShortBuffer)arrayBuffer.position(arrayBuffer.position() + 2)),
getShort((ShortBuffer)directBuffer.position(directBuffer.position() + 2)));
}
@Test public void testIntBuffer() {
System.out.println("IntBuffer");
int[] array = {-2222, -1111, 0, 1111, 2222};
IntBuffer arrayBuffer = IntBuffer.wrap(array, 2, 3);
putInt(arrayBuffer, 4200);
assertEquals(4200, array[2]);
IntPointer pointer = new IntPointer(arrayBuffer);
IntBuffer directBuffer = pointer.asBuffer();
assertEquals(pointer.address() + pointer.position() * pointer.sizeof(), new IntPointer(directBuffer).address());
assertEquals(pointer.address() + pointer.position() * pointer.sizeof(), Pointer.getDirectBufferAddress(directBuffer));
assertTrue(directBuffer.compareTo(arrayBuffer) == 0);
assertEquals(arrayBuffer.limit() - arrayBuffer.position(), directBuffer.limit());
assertEquals(arrayBuffer.capacity() - arrayBuffer.position(), directBuffer.capacity());
assertEquals(getInt(arrayBuffer), getInt(directBuffer));
assertEquals(getInt((IntBuffer)arrayBuffer.position(arrayBuffer.position() + 2)),
getInt((IntBuffer)directBuffer.position(directBuffer.position() + 2)));
}
@Test public void testLongBuffer() {
System.out.println("LongBuffer");
long[] array = {-22222, -11111, 0, 11111, 22222};
LongBuffer arrayBuffer = LongBuffer.wrap(array, 2, 3);
putLong(arrayBuffer, 42000);
assertEquals(42000, array[2]);
LongPointer pointer = new LongPointer(arrayBuffer);
LongBuffer directBuffer = pointer.asBuffer();
assertEquals(pointer.address() + pointer.position() * pointer.sizeof(), new LongPointer(directBuffer).address());
assertEquals(pointer.address() + pointer.position() * pointer.sizeof(), Pointer.getDirectBufferAddress(directBuffer));
assertTrue(directBuffer.compareTo(arrayBuffer) == 0);
assertEquals(arrayBuffer.limit() - arrayBuffer.position(), directBuffer.limit());
assertEquals(arrayBuffer.capacity() - arrayBuffer.position(), directBuffer.capacity());
assertEquals(getLong(arrayBuffer), getLong(directBuffer));
assertEquals(getLong((LongBuffer)arrayBuffer.position(arrayBuffer.position() + 2)),
getLong((LongBuffer)directBuffer.position(directBuffer.position() + 2)));
}
@Test public void testFloatBuffer() {
System.out.println("FloatBuffer");
float[] array = {-222222, -111111, 0, 111111, 222222};
FloatBuffer arrayBuffer = FloatBuffer.wrap(array, 2, 3);
putFloat(arrayBuffer, 420000);
assertEquals(420000, array[2], 0.0);
FloatPointer pointer = new FloatPointer(arrayBuffer);
FloatBuffer directBuffer = pointer.asBuffer();
assertEquals(pointer.address() + pointer.position() * pointer.sizeof(), new FloatPointer(directBuffer).address());
assertEquals(pointer.address() + pointer.position() * pointer.sizeof(), Pointer.getDirectBufferAddress(directBuffer));
assertTrue(directBuffer.compareTo(arrayBuffer) == 0);
assertEquals(arrayBuffer.limit() - arrayBuffer.position(), directBuffer.limit());
assertEquals(arrayBuffer.capacity() - arrayBuffer.position(), directBuffer.capacity());
assertEquals(getFloat(arrayBuffer), getFloat(directBuffer), 0.0);
assertEquals(getFloat((FloatBuffer)arrayBuffer.position(arrayBuffer.position() + 2)),
getFloat((FloatBuffer)directBuffer.position(directBuffer.position() + 2)), 0.0);
}
@Test public void testDoubleBuffer() {
System.out.println("DoubleBuffer");
double[] array = {-2222222, -1111111, 0, 1111111, 2222222};
DoubleBuffer arrayBuffer = DoubleBuffer.wrap(array, 2, 3);
putDouble(arrayBuffer, 4200000);
assertEquals(4200000, array[2], 0.0);
DoublePointer pointer = new DoublePointer(arrayBuffer);
DoubleBuffer directBuffer = pointer.asBuffer();
assertEquals(pointer.address() + pointer.position() * pointer.sizeof(), new DoublePointer(directBuffer).address());
assertEquals(pointer.address() + pointer.position() * pointer.sizeof(), Pointer.getDirectBufferAddress(directBuffer));
assertTrue(directBuffer.compareTo(arrayBuffer) == 0);
assertEquals(arrayBuffer.limit() - arrayBuffer.position(), directBuffer.limit());
assertEquals(arrayBuffer.capacity() - arrayBuffer.position(), directBuffer.capacity());
assertEquals(getDouble(arrayBuffer), getDouble(directBuffer), 0.0);
assertEquals(getDouble((DoubleBuffer)arrayBuffer.position(arrayBuffer.position() + 2)),
getDouble((DoubleBuffer)directBuffer.position(directBuffer.position() + 2)), 0.0);
}
}