package junit.extensions.eclipse.quick;
import static org.mockito.Matchers.any;
import static org.mockito.Matchers.anyChar;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;
import java.util.ArrayList;
import java.util.List;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.jdt.core.Flags;
import org.eclipse.jdt.core.ICompilationUnit;
import org.eclipse.jdt.core.IImportDeclaration;
import org.eclipse.jdt.core.IMethod;
import org.eclipse.jdt.core.IType;
import org.eclipse.jdt.core.ITypeHierarchy;
import org.eclipse.jdt.core.JavaModelException;
public class ITypeMockBuilder {
private IType result = mock(IType.class);
private int flags;
private List<IMethod> methods = new ArrayList<IMethod>();
private StringBuilder source = new StringBuilder();
private IImportDeclaration importDeclaration;
{
ITypeHierarchy typeHierarchy = mock(ITypeHierarchy.class);
when(typeHierarchy.getAllInterfaces()).thenReturn(new IType[]{});
try {
when(result.newSupertypeHierarchy((IProgressMonitor)any())).thenReturn(typeHierarchy);
when(result.isClass()).thenReturn(true);
when(result.getMethods()).thenReturn(new IMethod[]{});
ICompilationUnit compilationUnit = mock(ICompilationUnit.class);
when(result.getCompilationUnit()).thenReturn(compilationUnit);
importDeclaration = mock(IImportDeclaration.class);
when(compilationUnit.getImport(JavaTypes.TEST_ANNOTATION_FULL_NAME)).thenReturn(importDeclaration);
} catch (JavaModelException e) {
}
}
public IType build(){
return result;
}
public ITypeMockBuilder setPublic() {
flags |= Flags.AccPublic;
try {
when(result.getFlags()).thenReturn(flags);
} catch (JavaModelException e) {
}
return this;
}
public ITypeMockBuilder normal_class() {
setPublic();
return this;
}
public ITypeMockBuilder addMethod(IMethod method) {
try {
methods.add(method);
IMethod[] methodsArray = (IMethod[]) methods.toArray(new IMethod[]{});
when(result.getMethods()).thenReturn(methodsArray);
when(method.getDeclaringType()).thenReturn(result);
} catch (JavaModelException e) {
e.printStackTrace();
}
return this;
}
public ITypeMockBuilder junit3_class() {
setPublic();
ITypeHierarchy typeHierarchy = mock(ITypeHierarchy.class);
IType test = mock(IType.class);
when(test.getFullyQualifiedName()).thenReturn(JavaTypes.TEST_INTERFACE_NAME);
when(test.getFullyQualifiedName(anyChar())).thenReturn(JavaTypes.TEST_INTERFACE_NAME);
when(typeHierarchy.getAllInterfaces()).thenReturn(new IType[]{test });
try {
when(result.newSupertypeHierarchy((IProgressMonitor)any())).thenReturn(typeHierarchy);
} catch (JavaModelException e) {
e.printStackTrace();
}
return this;
}
public ITypeMockBuilder setRunWith(String clazz) {
try {
source.append("@RunWith(" + clazz + ")");
when(result.getSource()).thenReturn(source.toString());
} catch (JavaModelException e) {
e.printStackTrace();
}
return this;
}
public ITypeMockBuilder setSuiteClasses() {
try {
source.append("@SuiteClasses");
when(result.getSource()).thenReturn(source.toString());
} catch (JavaModelException e) {
e.printStackTrace();
}
return this;
}
public ITypeMockBuilder junit4_suite() {
setPublic();
setSuiteClasses();
setRunWith("Suite.class");
return this;
}
}