/* Copyright (c) 2007-2013 Timothy Wall, All Rights Reserved
*
* 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.win32;
import java.util.Arrays;
import java.util.List;
import junit.framework.TestCase;
import com.sun.jna.Library;
import com.sun.jna.Native;
import com.sun.jna.Pointer;
import com.sun.jna.Structure;
public class W32APIMapperTest extends TestCase {
// Unicode Character 'SINGLE RIGHT-POINTING ANGLE QUOTATION MARK': ›
//
// byte encoding in CP1250-CP1258 is 155
//
// The requirement is, that the encoding is present in many native windows
// encodings and outside the ASCII range
final String UNICODE = "[\u203a]";
final String MAGIC = "magic" + UNICODE;
public static void main(String[] args) {
junit.textui.TestRunner.run(W32APIMapperTest.class);
}
public interface UnicodeLibrary extends Library {
public static class TestStructure extends Structure {
public static final List<String> FIELDS = createFieldsOrder("string", "string2", "bool", "bool2");
public String string;
public String string2;
public boolean bool;
public boolean bool2;
@Override
protected List<String> getFieldOrder() {
return FIELDS;
}
}
String returnWStringArgument(String arg);
boolean returnInt32Argument(boolean arg);
String returnWideStringArrayElement(String[] args, int which);
}
public interface ASCIILibrary extends Library {
public static class TestStructure extends Structure {
public static final List<String> FIELDS = Arrays.asList("string", "string2", "bool", "bool2");
public String string;
public String string2;
public boolean bool;
public boolean bool2;
@Override
protected List<String> getFieldOrder() {
return FIELDS;
}
}
String returnStringArgument(String arg);
boolean returnInt32Argument(boolean arg);
}
UnicodeLibrary unicode;
ASCIILibrary ascii;
@Override
protected void setUp() {
unicode = Native.loadLibrary("testlib", UnicodeLibrary.class, W32APIOptions.UNICODE_OPTIONS);
ascii = Native.loadLibrary("testlib", ASCIILibrary.class, W32APIOptions.ASCII_OPTIONS);
}
@Override
protected void tearDown() {
unicode = null;
ascii = null;
}
public void testInvalidHandleValue() {
String EXPECTED = "@0xffffffff";
if (Pointer.SIZE == 8) {
EXPECTED += "ffffffff";
}
Pointer p = Pointer.createConstant(Pointer.SIZE == 8 ? -1 : 0xFFFFFFFFL);
assertTrue("Wrong value: " + p, p.toString().endsWith(EXPECTED));
}
public void testBooleanArgumentConversion() {
assertTrue("Wrong boolean TRUE argument conversion (unicode)",
unicode.returnInt32Argument(true));
assertFalse("Wrong boolean FALSE argument conversion (unicode)",
unicode.returnInt32Argument(false));
assertTrue("Wrong boolean TRUE argument conversion (ASCII)",
ascii.returnInt32Argument(true));
assertFalse("Wrong boolean FALSE argument conversion (ASCII)",
ascii.returnInt32Argument(false));
}
public void testUnicodeMapping() {
assertEquals("Strings should correspond to wide strings",
MAGIC, unicode.returnWStringArgument(MAGIC));
String[] args = { "one", "two" };
assertEquals("String arrays should be converted to wchar_t*[] and back",
args[0],
unicode.returnWideStringArrayElement(args, 0));
}
public void testASCIIMapping() {
assertEquals("Strings should correspond to C strings",
MAGIC, ascii.returnStringArgument(MAGIC));
}
public void testUnicodeStructureSize() {
UnicodeLibrary.TestStructure s = new UnicodeLibrary.TestStructure();
assertEquals("Wrong structure size",
Pointer.SIZE*2+8, s.size());
}
public void testASCIIStructureSize() {
ASCIILibrary.TestStructure s = new ASCIILibrary.TestStructure();
assertEquals("Wrong structure size",
Pointer.SIZE*2+8, s.size());
}
public void testUnicodeStructureWriteBoolean() {
UnicodeLibrary.TestStructure s = new UnicodeLibrary.TestStructure();
s.bool2 = true;
s.write();
assertEquals("Wrong value written for FALSE", 0, s.getPointer().getInt(Pointer.SIZE*2));
assertEquals("Wrong value written for TRUE", 1, s.getPointer().getInt(Pointer.SIZE*2+4));
}
public void testASCIIStructureWriteBoolean() {
ASCIILibrary.TestStructure s = new ASCIILibrary.TestStructure();
s.bool2 = true;
s.write();
assertEquals("Wrong value written for FALSE", 0, s.getPointer().getInt(Pointer.SIZE*2));
assertEquals("Wrong value written for TRUE", 1, s.getPointer().getInt(Pointer.SIZE*2+4));
}
public void testUnicodeStructureReadBoolean() {
UnicodeLibrary.TestStructure s = new UnicodeLibrary.TestStructure();
s.getPointer().setInt(Pointer.SIZE*2, 1);
s.getPointer().setInt(Pointer.SIZE*2+4, 0);
s.read();
assertTrue("Wrong value read for TRUE", s.bool);
assertFalse("Wrong value read for FALSE", s.bool2);
}
public void testASCIIStructureReadBoolean() {
ASCIILibrary.TestStructure s = new ASCIILibrary.TestStructure();
s.getPointer().setInt(Pointer.SIZE*2, 1);
s.getPointer().setInt(Pointer.SIZE*2+4, 0);
s.read();
assertTrue("Wrong value read for TRUE", s.bool);
assertFalse("Wrong value read for FALSE", s.bool2);
}
public void testUnicodeStructureWriteString() {
UnicodeLibrary.TestStructure s = new UnicodeLibrary.TestStructure();
s.string = null;
s.string2 = MAGIC;
s.write();
assertEquals("Improper null write", null, s.getPointer().getPointer(0));
assertEquals("Improper string write", MAGIC, s.getPointer().getPointer(Pointer.SIZE).getWideString(0));
}
public void testASCIIStructureWriteString() {
ASCIILibrary.TestStructure s = new ASCIILibrary.TestStructure();
s.string = null;
s.string2 = MAGIC;
s.write();
assertEquals("Improper null write", null, s.getPointer().getPointer(0));
assertEquals("Improper string write", MAGIC, s.getPointer().getPointer(Pointer.SIZE).getString(0));
}
public void testUnicodeStructureReadString() {
UnicodeLibrary.TestStructure s = new UnicodeLibrary.TestStructure();
s.string = MAGIC;
s.string2 = null;
s.write();
s.read();
assertEquals("Improper string read", MAGIC, s.string);
assertEquals("Improper null string read", null, s.string2);
}
public void testASCIIStructureReadString() {
ASCIILibrary.TestStructure s = new ASCIILibrary.TestStructure();
s.string = MAGIC;
s.string2 = null;
s.write();
s.read();
assertEquals("Improper string read", MAGIC, s.string);
assertEquals("Improper null string read: " + s, null, s.string2);
}
}