package ns.foundation;
import java.lang.reflect.InvocationTargetException;
import ns.foundation.NSForwardException;
import ns.foundation.NSSelectable;
import ns.foundation.NSSelector;
public class TestNSSelector extends BaseTestCase {
private static final String TEST_EXCEPTION = "testException";
private static final String TEST_METHOD = "test";
private boolean invoked = false;
public class TestSelectable implements NSSelectable {
public TestSelectable() {
}
public void test() {
invoked = true;
}
public void setInvoked(Boolean value) {
invoked = value;
}
public void testException() throws IllegalArgumentException {
throw new IllegalArgumentException(TEST_EXCEPTION);
}
public boolean testBoolean(boolean value) { return value; }
public byte testByte(byte value) { return value; }
public char testChar(char value) { return value; }
public double testDouble(double value) { return value; }
public float testFloat(float value) { return value; }
public int testInteger(int value) { return value; }
public long testLong(long value) { return value; }
public short testShort(short value) { return value; }
public int[] testIntArray(int[] value) { return value; }
}
public void testNSSelectorBinding() {
NSSelector<?> selector = new NSSelector<Object>(TEST_METHOD);
assertTrue(selector instanceof NSSelector<?>);
}
public void testNSSelectorNullBinding() {
try {
new NSSelector<Object>(null);
} catch (IllegalArgumentException e) {
return;
}
fail("null selector name should not be allowed");
}
public void testNSSelectorBindingParams() {
NSSelector<?> selector = new NSSelector<Object>("setInvoked", new Class[] { Boolean.class });
assertTrue(selector.parameterTypes() != null);
assertEquals(1, selector.parameterTypes().length);
}
public void testInvokeSelectable() throws IllegalArgumentException, NoSuchMethodException, InvocationTargetException, IllegalAccessException {
NSSelector<?> selector = new NSSelector<Object>(TEST_METHOD);
invoked = false;
selector.invoke(new TestSelectable());
assertTrue(invoked);
}
public void testInvokeSelectableMissingMethod() throws IllegalArgumentException, InvocationTargetException, IllegalAccessException {
try {
NSSelector<?> selector = new NSSelector<Object>("missingMethod");
invoked = false;
selector.invoke(new TestSelectable());
} catch (NoSuchMethodException e) {
assertFalse(invoked);
return;
}
fail("failed to throw nosuchmethod exception on missing method");
}
public void testInvokeSelectableArgs() throws IllegalArgumentException, NoSuchMethodException, InvocationTargetException, IllegalAccessException {
NSSelector<?> selector = new NSSelector<Object>("setInvoked", new Class[] { Boolean.class } );
invoked = false;
selector.invoke(new TestSelectable(), new Object[] { true });
assertTrue(invoked);
}
public void testSafeInvokeSelector() {
NSSelector<?> selector = new NSSelector<Object>("setInvoked", new Class[] { Boolean.class } );
invoked = false;
NSSelector._safeInvokeSelector(selector, new TestSelectable(), new Object[] { true });
assertTrue(invoked);
}
public void testSafeInvokeSelectorMissingMethod() {
try {
NSSelector<?> selector = new NSSelector<Object>("missingMethod");
invoked = false;
NSSelector._safeInvokeSelector(selector, new TestSelectable(), new Object[] { true });
} catch (IllegalArgumentException e) {
assertFalse(invoked);
return;
}
fail("missing method did not throw illegal argument exception");
}
public void testSafeInvokeSelectorNullTarget() {
try {
NSSelector<?> selector = new NSSelector<Object>(TEST_METHOD);
invoked = false;
NSSelector._safeInvokeSelector(selector, null, new Object[0]);
} catch (Exception e) {
assertFalse(invoked);
return;
}
fail("missing method did not throw illegal argument exception");
}
public void testInvokeClassCache() {
NSSelector<?> selector = new NSSelector<Object>("setInvoked", new Class[] { Boolean.class });
NSSelector._safeInvokeSelector(selector, new TestSelectable(), new Object[] { true });
assertTrue(invoked);
invoked = false;
NSSelector._safeInvokeSelector(selector, new TestSelectable(), new Object[] { true });
assertTrue(invoked);
}
public void testSafeInvokeSelectorNotSelectable() {
try {
NSSelector<?> selector = new NSSelector<Object>("setInvoked", new Class[] { Boolean.class });
NSSelector._safeInvokeSelector(selector, new Object(), new Object[] { true });
} catch (IllegalArgumentException e) {
return;
}
fail("missing method did not throw class cast exception");
}
public void testSafeInvokeSelectorRethrowsException() {
try {
NSSelector<?> selector = new NSSelector<Object>(TEST_EXCEPTION);
NSSelector._safeInvokeSelector(selector, new TestSelectable(), (Object[])null);
} catch (NSForwardException e) {
return;
} catch (IllegalArgumentException e) {
return;
}
fail("missing method did not throw class cast exception");
}
public void testPrimitiveParams() throws IllegalArgumentException, NoSuchMethodException, InvocationTargetException, IllegalAccessException {
NSSelectable target = new TestSelectable();
NSSelector<Object> selector;
Object obj = null;
selector = new NSSelector<Object>("testBoolean", new Class[] { boolean.class });
obj = selector.invoke(target, new Object[] { Boolean.valueOf(false) });
assertTrue(obj instanceof Boolean);
assertFalse((Boolean)obj);
selector = new NSSelector<Object>("testByte", new Class[] { byte.class });
obj = selector.invoke(target, new Object[] { Integer.valueOf(0).byteValue() });
assertTrue(obj instanceof Byte);
assertEquals((byte)0, (byte)(Byte)obj);
selector = new NSSelector<Object>("testChar", new Class[] { char.class });
obj = selector.invoke(target, new Object[] { Character.valueOf((char)0) });
assertTrue(obj instanceof Character);
assertEquals((char)0, (char)(Character)obj);
selector = new NSSelector<Object>("testDouble", new Class[] { double.class });
obj = selector.invoke(target, new Object[] { Double.valueOf(0) });
assertTrue(obj instanceof Double);
assertEquals((double)0, (double)(Double)obj);
selector = new NSSelector<Object>("testFloat", new Class[] { float.class });
obj = selector.invoke(target, new Object[] { Float.valueOf(0) });
assertTrue(obj instanceof Float);
assertEquals((float)0, (float)(Float)obj);
selector = new NSSelector<Object>("testInteger", new Class[] { int.class });
obj = selector.invoke(target, new Object[] { Integer.valueOf(0) });
assertTrue(obj instanceof Integer);
assertEquals((int)0, (int)(Integer)obj);
selector = new NSSelector<Object>("testLong", new Class[] { long.class });
obj = selector.invoke(target, new Object[] { Long.valueOf(0) });
assertTrue(obj instanceof Long);
assertEquals((long)0, (long)(Long)obj);
selector = new NSSelector<Object>("testShort", new Class[] { short.class });
obj = selector.invoke(target, new Object[] { Short.valueOf("0") });
assertTrue(obj instanceof Short);
assertEquals((short)0, (short)(Short)obj);
}
public void testArrayParams() throws IllegalArgumentException, NoSuchMethodException, InvocationTargetException, IllegalAccessException {
int[] arg = new int[0];
NSSelector<?> selector = new NSSelector<Object>("testIntArray", new Class[] { arg.getClass() });
Object obj = selector.invoke(new TestSelectable(), new Object[] { arg });
assertTrue(obj instanceof int[]);
assertEquals(obj, arg);
}
}