package org.jboss.test.faces.mock;
import static org.easymock.EasyMock.createControl;
import static org.easymock.EasyMock.createNiceControl;
import static org.easymock.EasyMock.createStrictControl;
import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
import org.easymock.IMocksControl;
import org.easymock.internal.ObjectMethodsFilter;
/**
* <p class="changed_added_4_0"></p>
* @author asmirnov@exadel.com
*
*/
public class FacesMock {
private static final Class<?> MOCK_OBJECT = FacesMockController.MockObject.class;
private FacesMock() {
//hidden constructor
}
public static MockFacesEnvironment createMockEnvironment(){
return new MockFacesEnvironment(createControl());
}
public static MockFacesEnvironment createNiceEnvironment(){
return new MockFacesEnvironment(createNiceControl());
}
public static MockFacesEnvironment createStrictEnvironment(){
return new MockFacesEnvironment(createStrictControl());
}
public static <T> T createMock(String name, Class<T> clazz, IMocksControl control) {
if (MOCK_OBJECT.isAssignableFrom(clazz) || isMockClass(clazz)) {
try {
Constructor<T> constructor = clazz.getConstructor(IMocksControl.class, String.class);
return constructor.newInstance(control, name);
} catch (Exception e) {
throw new IllegalArgumentException("Class " + clazz.getName() + " cannot be created", e);
}
} else {
try {
return FacesMockController.createMock(name, clazz, control);
} catch (ClassNotFoundException e) {
return control.createMock(name, clazz);
}
}
}
public static <T> T createMock(Class<T> clazz){
return createMock(null, clazz);
}
public static <T> T createMock(String name, Class<T> clazz){
return createMock(name, clazz, createControl());
}
public static <T> T createNiceMock(Class<T> clazz){
return createNiceMock(null, clazz);
}
public static <T> T createNiceMock(String name, Class<T> clazz) {
return createMock(name, clazz, createNiceControl());
}
public static <T> T createStrictMock(Class<T> clazz){
return createStrictMock(null, clazz);
}
public static <T> T createStrictMock(String name, Class<T> clazz){
return createMock(name, clazz, createStrictControl());
}
private static IMocksControl getControl(Object mock) {
if (mock instanceof FacesMockController.MockObject) {
FacesMockController.MockObject mockObject = (FacesMockController.MockObject) mock;
return mockObject.getControl();
} else {
// Check additional test controlled created mocks.
Class<? extends Object> mockClass = mock.getClass();
if(isMockClass(mockClass)){
try {
Method getControl = mockClass.getMethod("getControl");
if(IMocksControl.class.equals(getControl.getReturnType())){
return (IMocksControl) getControl.invoke(mock);
}
} catch (SecurityException e) {
} catch (NoSuchMethodException e) {
} catch (IllegalArgumentException e) {
} catch (IllegalAccessException e) {
// TODO Auto-generated catch block
} catch (InvocationTargetException e) {
// TODO Auto-generated catch block
}
}
// Delegate to EazyMock
return ((ObjectMethodsFilter) Proxy
.getInvocationHandler(mock)).getDelegate().getControl();
}
}
private static boolean isMockClass(Class<?> clazz){
Class<?>[] interfaces = clazz.getInterfaces();
for (Class<?> interfaze : interfaces) {
if("MockObject".equals(interfaze.getSimpleName()) && null !=interfaze.getEnclosingClass()){
return true;
}
}
return false;
}
public static void replay(Object... mocks) {
for (Object mock : mocks) {
getControl(mock).replay();
}
}
public static void reset(Object... mocks) {
for (Object mock : mocks) {
getControl(mock).reset();
}
}
/**
* Resets the given mock objects (more exactly: the controls of the mock
* objects) and turn them to a mock with nice behavior. For details, see
* the EasyMock documentation.
*
* @param mocks
* the mock objects
*/
public static void resetToNice(Object... mocks) {
for (Object mock : mocks) {
getControl(mock).resetToNice();
}
}
/**
* Resets the given mock objects (more exactly: the controls of the mock
* objects) and turn them to a mock with default behavior. For details, see
* the EasyMock documentation.
*
* @param mocks
* the mock objects
*/
public static void resetToDefault(Object... mocks) {
for (Object mock : mocks) {
getControl(mock).resetToDefault();
}
}
/**
* Resets the given mock objects (more exactly: the controls of the mock
* objects) and turn them to a mock with strict behavior. For details, see
* the EasyMock documentation.
*
* @param mocks
* the mock objects
*/
public static void resetToStrict(Object... mocks) {
for (Object mock : mocks) {
getControl(mock).resetToStrict();
}
}
public static void verify(Object... mocks) {
for (Object object : mocks) {
getControl(object).verify();
}
}
/**
* Switches order checking of the given mock object (more exactly: the
* control of the mock object) the on and off. For details, see the EasyMock
* documentation.
*
* @param mock
* the mock object.
* @param state
* <code>true</code> switches order checking on,
* <code>false</code> switches it off.
*/
public static void checkOrder(Object mock, boolean state) {
getControl(mock).checkOrder(state);
}
}