/**
* The contents of this file is dual-licensed under 2
* alternative Open Source/Free licenses: LGPL 2.1 or later and
* Apache License 2.0. (starting with JNA version 4.0.0).
*
* You can freely decide which license you want to apply to
* the project.
*
* You may obtain a copy of the LGPL License at:
*
* http://www.gnu.org/licenses/licenses.html
*
* A copy is also included in the downloadable source code package
* containing JNA, in file "LGPL2.1".
*
* You may obtain a copy of the Apache License at:
*
* http://www.apache.org/licenses/
*
* A copy is also included in the downloadable source code package
* containing JNA, in file "AL2.0".
*/
package com.sun.jna;
import java.util.Arrays;
import java.util.List;
import junit.framework.TestCase;
public class IntegerTypeTest extends TestCase {
public static class Sized extends IntegerType {
private static final long serialVersionUID = 1L;
public Sized() { this(4, 0); }
public Sized(int size, long value) { super(size, value); }
}
public void testWriteNull() {
class NTStruct extends Structure {
public Sized field;
@Override
protected List<String> getFieldOrder() {
return Arrays.asList("field");
}
}
NTStruct s = new NTStruct();
assertNotNull("Field not initialized", s.field);
}
public void testReadNull() {
class NTStruct extends Structure {
public Sized field;
@Override
protected List<String> getFieldOrder() {
return Arrays.asList("field");
}
}
NTStruct s = new NTStruct();
s.read();
assertNotNull("Integer type field should be initialized on read", s.field);
}
public void testCheckArgumentSize() {
for (int i=1;i <= 8;i*=2) {
long value = -1L << (i*8-1);
new Sized(i, value);
new Sized(i, -1);
new Sized(i, 0);
new Sized(i, 1);
value = 1L << (i*8-1);
new Sized(i, value);
value = -1L & ~(-1L << (i*8));
new Sized(i, value);
if (i < 8) {
try {
value = 1L << (i*8);
new Sized(i, value);
fail("Value exceeding size (" + i + ") should fail");
}
catch(IllegalArgumentException e) {
}
}
if (i < 8) {
try {
value = -1L << (i*8);
new Sized(i, value);
fail("Negative value (" + value + ") exceeding size (" + i + ") should fail");
}
catch(IllegalArgumentException e) {
}
}
}
}
public void testInitialValue() {
long VALUE = 20;
NativeLong nl = new NativeLong(VALUE);
assertEquals("Wrong initial value", VALUE, nl.longValue());
}
public void testValueBoundaries() {
class TestType extends IntegerType {
private static final long serialVersionUID = 1L;
public TestType(int size, long value) {
super(size, value);
}
}
try {
new TestType(1, 0x100L);
fail("Exception should be thrown if byte value out of bounds");
}
catch(IllegalArgumentException e) {
}
try {
new TestType(2, 0x10000L);
fail("Exception should be thrown if short value out of bounds");
}
catch(IllegalArgumentException e) {
}
try {
new TestType(4, 0x100000000L);
fail("Exception should be thrown if int value out of bounds");
}
catch(IllegalArgumentException e) {
}
}
public void testUnsignedValues() {
class TestType extends IntegerType {
private static final long serialVersionUID = 1L;
public TestType(int size, long value) {
super(size, value);
}
}
long VALUE = 0xFF;
assertEquals("Wrong unsigned byte value", VALUE, new TestType(1, VALUE).longValue());
VALUE = 0xFFFF;
assertEquals("Wrong unsigned short value", VALUE, new TestType(2, VALUE).longValue());
VALUE = 0xFFFFFFFF;
assertEquals("Wrong unsigned int value", VALUE, new TestType(4, VALUE).longValue());
class UnsignedTestType extends IntegerType {
private static final long serialVersionUID = 1L;
public UnsignedTestType(int size, long value) {
super(size, value, true);
}
}
UnsignedTestType tt = new UnsignedTestType(4, -1);
assertTrue("Expected an unsigned value (ctor): " + tt.longValue(), tt.longValue() > 0);
tt.setValue(-2);
assertTrue("Expected an unsigned value: " + tt.longValue(), tt.longValue() > 0);
}
public void testCompareLongs() {
final long v1 = 7365L;
final long v2 = 3777347L;
assertEquals("Mismatched same value comparison", 0, IntegerType.compare(v1, v1));
assertEquals("Mismatched natural order comparison", (-1), IntegerType.compare(v1, v2));
assertEquals("Mismatched reversed order comparison", 1, IntegerType.compare(v2, v1));
}
public static void main(String[] args) {
junit.textui.TestRunner.run(IntegerTypeTest.class);
}
}