/* Copyright (c) 2009 Timothy Wall, All Rights Reserved
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library 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
* Lesser General Public License for more details.
*/
package com.sun.jna;
import java.util.Map;
import java.util.HashMap;
import java.lang.reflect.Method;
import junit.framework.TestCase;
public class LastErrorTest extends TestCase {
private static final Map OPTIONS = new HashMap() {{
put(Library.OPTION_FUNCTION_MAPPER, new FunctionMapper() {
public String getFunctionName(NativeLibrary library, Method m) {
if (m.getName().equals("noThrowLastError")
|| m.getName().equals("throwLastError")) {
return "setLastError";
}
return m.getName();
}
});
}};
public interface TestLibrary extends Library {
void noThrowLastError(int code);
void throwLastError(int code) throws LastErrorException;
}
public static class DirectTestLibrary implements TestLibrary {
public native void noThrowLastError(int code);
public native void throwLastError(int code) throws LastErrorException;
static {
Native.register(NativeLibrary.getInstance("testlib", OPTIONS));
}
}
public void testThrowLastError() {
Map options = new HashMap();
TestLibrary lib = (TestLibrary)Native.loadLibrary("testlib", TestLibrary.class, OPTIONS);
final int ERROR = -1;
lib.noThrowLastError(ERROR);
assertEquals("Last error not preserved", ERROR, Native.getLastError());
try {
lib.throwLastError(ERROR);
fail("Method should throw LastErrorException");
}
catch(LastErrorException e) {
assertEquals("Exception should contain error code", ERROR, e.errorCode);
}
}
public void testThrowLastErrorDirect() {
TestLibrary lib = new DirectTestLibrary();
final int ERROR = -1;
lib.noThrowLastError(ERROR);
assertEquals("Last error not preserved", ERROR, Native.getLastError());
try {
lib.throwLastError(ERROR);
fail("Method should throw LastErrorException");
}
catch(LastErrorException e) {
assertEquals("Exception should contain error code", ERROR, e.errorCode);
}
}
public static void main(String[] args) {
junit.textui.TestRunner.run(LastErrorTest.class);
}
}