package com.bumptech.glide.tests;
import static org.junit.Assert.assertEquals;
import static org.mockito.Matchers.any;
import static org.mockito.Matchers.isA;
import static org.mockito.Mockito.RETURNS_DEFAULTS;
import static org.mockito.Mockito.mock;
import android.content.Context;
import android.graphics.Bitmap;
import android.os.Build;
import com.bumptech.glide.load.DataSource;
import com.bumptech.glide.load.data.DataFetcher;
import com.bumptech.glide.load.engine.Resource;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.security.MessageDigest;
import org.mockito.ArgumentCaptor;
import org.mockito.invocation.InvocationOnMock;
import org.mockito.stubbing.Answer;
import org.robolectric.util.ReflectionHelpers;
// FIXME move to testutil module
public class Util {
public static String getExpectedClassId(Class<?> clazz) {
return clazz.getSimpleName() + "." + clazz.getPackage().getName();
}
/**
* Gives the proper generic type to the {@link ArgumentCaptor}.
* Only useful when the captor's {@code T} is also a generic type.
* Without this it's really ugly to have a properly typed captor object.
*/
@SuppressWarnings("unchecked")
public static <T> ArgumentCaptor<T> cast(ArgumentCaptor<?> captor) {
return (ArgumentCaptor<T>) captor;
}
public static DataSource isADataSource() {
return isA(DataSource.class);
}
public static Context anyContext() {
return any(Context.class);
}
/**
* Creates a Mockito argument matcher to be used in verify.
* It returns a generic typed {@link Resource} to prevent unchecked warnings.
*/
@SuppressWarnings("unchecked")
public static <T> Resource<T> anyResource() {
return any(Resource.class);
}
/**
* Creates a Mockito mock object.
* It returns a generic typed {@link Resource} to prevent unchecked warnings.
*/
@SuppressWarnings("unchecked")
public static <T> Resource<T> mockResource() {
return mock(Resource.class);
}
public static boolean isWindows() {
return System.getProperty("os.name").startsWith("Windows");
}
public static void writeFile(File file, byte[] data) throws IOException {
OutputStream out = new FileOutputStream(file);
try {
out.write(data);
out.flush();
out.close();
} finally {
try {
out.close();
} catch (IOException ex) {
// Do nothing.
}
}
}
public static byte[] readFile(File file, int expectedLength) throws IOException {
InputStream is = new FileInputStream(file);
byte[] result = new byte[expectedLength];
try {
assertEquals(expectedLength, is.read(result));
assertEquals(-1, is.read());
} finally {
try {
is.close();
} catch (IOException e) {
// Do nothing.
}
}
return result;
}
public static void setSdkVersionInt(int version) {
ReflectionHelpers.setStaticField(Build.VERSION.class, "SDK_INT", version);
}
public static class WriteDigest implements Answer<Void> {
private String toWrite;
public WriteDigest(String toWrite) {
this.toWrite = toWrite;
}
@Override
public Void answer(InvocationOnMock invocationOnMock) throws Throwable {
MessageDigest md = (MessageDigest) invocationOnMock.getArguments()[0];
md.update(toWrite.getBytes());
return null;
}
}
public static class ReturnsSelfAnswer implements Answer<Object> {
public Object answer(InvocationOnMock invocation) throws Throwable {
Object mock = invocation.getMock();
if (invocation.getMethod().getReturnType().isInstance(mock)) {
return mock;
} else {
return RETURNS_DEFAULTS.answer(invocation);
}
}
}
public static class CallDataReady<T> implements Answer<Void> {
private T data;
public CallDataReady(T data) {
this.data = data;
}
@SuppressWarnings("unchecked")
@Override
public Void answer(InvocationOnMock invocationOnMock) throws Throwable {
DataFetcher.DataCallback<T> callback =
(DataFetcher.DataCallback<T>) invocationOnMock.getArguments()[1];
callback.onDataReady(data);
return null;
}
}
public static class CreateBitmap implements Answer<Bitmap> {
@Override
public Bitmap answer(InvocationOnMock invocation) throws Throwable {
int width = (Integer) invocation.getArguments()[0];
int height = (Integer) invocation.getArguments()[1];
Bitmap.Config config = (Bitmap.Config) invocation.getArguments()[2];
return Bitmap.createBitmap(width, height, config);
}
}
}