package fitnesse.slim.fixtureInteraction;
import java.lang.reflect.Constructor;
import java.lang.reflect.Method;
import java.util.Collections;
import fitnesse.slim.test.TableTableIncFirstCol;
import fitnesse.testsystems.slim.SlimTestContext;
import fitnesse.testsystems.slim.Table;
import fitnesse.testsystems.slim.tables.SlimTable;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Spy;
import org.mockito.runners.MockitoJUnitRunner;
import static org.junit.Assert.*;
import static org.mockito.Mockito.*;
@RunWith(MockitoJUnitRunner.class)
public class CachedInteractionTest {
@Spy
private CachedInteraction interaction;
@Test
public void canFindClass() {
Class<? extends CachedInteractionTest> myClass = this.getClass();
Class<?> clazz = interaction.getClass(myClass.getName());
assertEquals(myClass, clazz);
verify(interaction, times(1)).handleClassCacheMiss(myClass.getName());
// 2nd call
clazz = interaction.getClass(myClass.getName());
assertEquals(myClass, clazz);
// cache hit on 2nd call
verify(interaction, times(1)).handleClassCacheMiss(myClass.getName());
}
@Test
public void canDealWithNoClassFound() {
String className = "IDontExist";
Class<?> clazz = interaction.getClass(className);
assertNull(clazz);
// 2nd call
clazz = interaction.getClass(className);
assertNull(clazz);
// cache hit on 2nd call
verify(interaction, times(1)).handleClassCacheMiss(className);
}
@Test
public void canFindConstructor() throws NoSuchMethodException {
Class<? extends CachedInteractionTest> myClass = this.getClass();
Object[] args = new Object[0];
Constructor<?> constructor = interaction.getConstructor(myClass, args);
assertEquals(myClass.getConstructor(), constructor);
verify(interaction, times(1)).handleConstructorCacheMiss(myClass, args);
// call 2nd time
constructor = interaction.getConstructor(myClass, args);
assertEquals(myClass.getConstructor(), constructor);
// cache hit on 2nd call
verify(interaction, times(1)).handleConstructorCacheMiss(myClass, args);
Constructor<?> constructor2 = interaction.getConstructor(SlimTable.class, new Object[3]);
assertEquals(SlimTable.class.getConstructor(Table.class, String.class, SlimTestContext.class), constructor2);
}
@Test
public void canFindConstructorWithArgs() throws NoSuchMethodException {
Constructor<?> constructor2 = interaction.getConstructor(SlimTable.class, new Object[3]);
assertEquals(SlimTable.class.getConstructor(Table.class, String.class, SlimTestContext.class), constructor2);
}
@Test
public void canDealWithNoConstructor() throws NoSuchMethodException {
Constructor<?> constructor2 = interaction.getConstructor(SlimTable.class, new Object[0]);
assertNull(constructor2);
constructor2 = interaction.getConstructor(SlimTable.class, new Object[0]);
assertNull(constructor2);
}
@Test
public void canFindMethod() {
String findMethod = "canFindMethod";
Method method = interaction.findMatchingMethod(findMethod, this);
assertEquals(findMethod, method.getName());
assertEquals(getClass(), method.getDeclaringClass());
verify(interaction, times(1)).handleMethodCacheMiss(findMethod, this, new Object[0]);
//2nd call
method = interaction.findMatchingMethod(findMethod, this);
assertEquals(findMethod, method.getName());
assertEquals(getClass(), method.getDeclaringClass());
// cache hit, no 2nd call
verify(interaction, times(1)).handleMethodCacheMiss(findMethod, this, new Object[0]);
}
@Test
public void canFindMethodWithArguments() {
String findMethod = "createInstance";
DefaultInteraction instance = new DefaultInteraction();
Method method = interaction.findMatchingMethod(findMethod, instance, null, null, null);
assertEquals(findMethod, method.getName());
assertEquals(DefaultInteraction.class, method.getDeclaringClass());
verify(interaction, times(1)).handleMethodCacheMiss(findMethod, instance, new Object[3]);
//2nd call
method = interaction.findMatchingMethod(findMethod, instance, null, null, null);
assertEquals(findMethod, method.getName());
assertEquals(DefaultInteraction.class, method.getDeclaringClass());
// cache hit, no 2nd call
verify(interaction, times(1)).handleMethodCacheMiss(findMethod, instance, new Object[3]);
}
@Test
public void canFindMethodWithSameSimpleClassName() {
String findMethod = "doTable";
TableTableIncFirstCol instance = new TableTableIncFirstCol();
fitnesse.slim.test.statementexecutorconsumer.TableTableIncFirstCol consInstance =
new fitnesse.slim.test.statementexecutorconsumer.TableTableIncFirstCol();
Method method = interaction.findMatchingMethod(findMethod, instance, Collections.emptyList());
assertEquals(findMethod, method.getName());
assertEquals("Method returned is defined by the wrong class (i.e. not the class of the instance passed)",
instance.getClass(), method.getDeclaringClass());
//2nd call
Method consMethod = interaction.findMatchingMethod(findMethod, consInstance, Collections.emptyList());
assertEquals(findMethod, consMethod.getName());
assertEquals("Method returned is defined by the wrong class (i.e. not the class of the instance passed)",
consInstance.getClass(), consMethod.getDeclaringClass());
}
@Test
public void canDealWithNoMethod() {
String findMethod = "addChildTable";
Method method = interaction.findMatchingMethod(findMethod, SlimTable.class, 3);
assertNull(method);
verify(interaction, times(1)).handleMethodCacheMiss(findMethod, SlimTable.class, new Integer[] { 3 });
// 2nd call cache hit
method = interaction.findMatchingMethod(findMethod, SlimTable.class, 3);
assertNull(method);
verify(interaction, times(1)).handleMethodCacheMiss(findMethod, SlimTable.class, new Integer[] { 3 });
}
}