/***********************************************************************************
* Copyright (c) 2013. Nickolay Gerilovich. Russia.
* Some Rights Reserved.
************************************************************************************/
package com.github.nickvl.xspring.core.log.aop;
import java.lang.reflect.Method;
import org.junit.Test;
import org.springframework.core.LocalVariableTableParameterNameDiscoverer;
import com.github.nickvl.xspring.core.log.aop.annotation.Lp;
import static org.junit.Assert.assertArrayEquals;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertTrue;
/**
* Tests {@link com.github.nickvl.xspring.core.log.aop.ArgumentDescriptor}.
*/
public class ArgumentDescriptorTestCase {
private LocalVariableTableParameterNameDiscoverer parameterNameDiscoverer = new LocalVariableTableParameterNameDiscoverer();
private Method getMethod(Class<?> clazz, String methodName) throws NoSuchMethodException {
for (Method method : clazz.getDeclaredMethods()) {
if (methodName.equals(method.getName())) {
return method;
}
}
throw new NoSuchMethodException(methodName);
}
@Test
public void testNoArguments() throws Exception {
Method method = getMethod(getClass(), "noArguments");
ArgumentDescriptor descriptor = new ArgumentDescriptor.Builder(method, method.getParameterTypes().length, parameterNameDiscoverer).build();
assertEquals(-1, descriptor.nextArgumentIndex(0));
assertNull(descriptor.getNames());
}
private void noArguments() {
// used in test methods viq reflection
}
@Test
public void testOneArgument() throws Exception {
Method method = getMethod(getClass(), "oneArgument");
ArgumentDescriptor descriptor = new ArgumentDescriptor.Builder(method, method.getParameterTypes().length, parameterNameDiscoverer).build();
assertEquals(0, descriptor.nextArgumentIndex(0));
assertTrue(descriptor.isArgumentIndex(0));
assertEquals(-1, descriptor.nextArgumentIndex(1));
if (descriptor.getNames() != null) {
assertArrayEquals(new String[]{"foo"}, descriptor.getNames());
}
}
private void oneArgument(String foo) {
// used in test methods viq reflection
}
@Test
public void testTwoArguments() throws Exception {
Method method = getMethod(getClass(), "twoArguments");
ArgumentDescriptor descriptor = new ArgumentDescriptor.Builder(method, method.getParameterTypes().length, parameterNameDiscoverer).build();
assertEquals(0, descriptor.nextArgumentIndex(0));
assertTrue(descriptor.isArgumentIndex(0));
assertEquals(-1, descriptor.nextArgumentIndex(1));
if (descriptor.getNames() != null) {
assertArrayEquals(new String[]{"foo", "foo2"}, descriptor.getNames());
}
}
private void twoArguments(@Lp String foo, String foo2) {
// used in test methods viq reflection
}
@Test
public void testVarArguments() throws Exception {
Method method = getMethod(getClass(), "varArguments");
ArgumentDescriptor descriptor = new ArgumentDescriptor.Builder(method, method.getParameterTypes().length, parameterNameDiscoverer).build();
assertEquals(1, descriptor.nextArgumentIndex(0));
assertFalse(descriptor.isArgumentIndex(0));
assertTrue(descriptor.isArgumentIndex(1));
assertEquals(1, descriptor.nextArgumentIndex(1));
assertEquals(-1, descriptor.nextArgumentIndex(2));
if (descriptor.getNames() != null) {
assertArrayEquals(new String[]{"foo", "foo2"}, descriptor.getNames());
}
}
private void varArguments(String foo, @Lp String... foo2) {
// used in test methods viq reflection
}
}