package com.bumptech.glide.manager;
import static org.junit.Assert.assertEquals;
import static org.mockito.Matchers.any;
import static org.mockito.Matchers.eq;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.never;
import static org.mockito.Mockito.verify;
import android.app.Activity;
import android.support.v4.app.FragmentActivity;
import com.bumptech.glide.RequestManager;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.exceptions.base.MockitoAssertionError;
import org.robolectric.Robolectric;
import org.robolectric.RobolectricTestRunner;
import org.robolectric.android.controller.ActivityController;
import org.robolectric.annotation.Config;
@RunWith(RobolectricTestRunner.class)
@Config(manifest = Config.NONE, sdk = 18)
public class RequestManagerFragmentTest {
private static final String TAG = "tag";
private Harness[] harnesses;
@Before
public void setUp() {
harnesses = new Harness[] { new RequestManagerHarness(), new SupportRequestManagerHarness() };
}
@Test
public void testSupportCanSetAndGetRequestManager() {
runTest(new TestCase() {
@Override
public void runTest(Harness harness) {
RequestManager manager = mock(RequestManager.class);
harness.setRequestManager(manager);
assertEquals(manager, harness.getManager());
}
});
}
@Test
public void testReturnsLifecycle() {
runTest(new TestCase() {
@Override
public void runTest(Harness harness) {
assertEquals(harness.getHarnessLifecycle(), harness.getFragmentLifecycle());
}
});
}
@Test
public void testDoesNotAddNullRequestManagerToLifecycleWhenSet() {
runTest(new TestCase() {
@Override
public void runTest(Harness harness) {
harness.setRequestManager(null);
verify(harness.getHarnessLifecycle(), never()).addListener(any(LifecycleListener.class));
}
});
}
@Test
public void testCallsLifecycleStart() {
runTest(new TestCase() {
@Override
public void runTest(Harness harness) {
harness.getController().start();
verify(harness.getHarnessLifecycle()).onStart();
}
});
}
@Test
public void testCallsRequestManagerStop() {
runTest(new TestCase() {
@Override
public void runTest(Harness harness) {
harness.getController().start().resume().pause().stop();
verify(harness.getHarnessLifecycle()).onStop();
}
});
}
@Test
public void testCallsRequestManagerDestroy() {
runTest(new TestCase() {
@Override
public void runTest(Harness harness) {
harness.getController().start().resume().pause().stop().destroy();
verify(harness.getHarnessLifecycle()).onDestroy();
}
});
}
@Test
public void testCallsRequestManagerOnLowMemory() {
runTest(new TestCase() {
@Override
public void runTest(Harness harness) {
RequestManager requestManager = mock(RequestManager.class);
harness.setRequestManager(requestManager);
harness.onLowMemory();
verify(requestManager).onLowMemory();
}
});
}
@Test
public void testNonSupportFragmentCallsOnTrimMemory() {
RequestManagerHarness requestManagerHarness = new RequestManagerHarness();
int level = 100;
RequestManager requestManager = mock(RequestManager.class);
requestManagerHarness.setRequestManager(requestManager);
requestManagerHarness.onTrimMemory(level);
verify(requestManager).onTrimMemory(eq(level));
}
@Test
public void testOnLowMemoryCallOnNullRequestManagerDoesNotCrash() {
runTest(new TestCase() {
@Override
public void runTest(Harness harness) {
harness.onLowMemory();
}
});
}
@Test
public void testOnTrimMemoryCallOnNullRequestManagerDoesNotCrash() {
runTest(new TestCase() {
@Override
public void runTest(Harness harness) {
harness.onTrimMemory(100 /*level*/);
}
});
}
private void runTest(TestCase testCase) {
for (Harness harness : harnesses) {
try {
testCase.runTest(harness);
} catch (MockitoAssertionError e) {
throw new Error("Failed to get expected call on " + harness, e);
}
}
}
private interface TestCase {
public void runTest(Harness harness);
}
private interface Harness {
RequestManager getManager();
void setRequestManager(RequestManager manager);
ActivityFragmentLifecycle getHarnessLifecycle();
ActivityFragmentLifecycle getFragmentLifecycle();
ActivityController<?> getController();
void onLowMemory();
void onTrimMemory(int level);
}
private static class RequestManagerHarness implements Harness {
private final ActivityController<Activity> controller;
private final RequestManagerFragment fragment;
private final ActivityFragmentLifecycle lifecycle = mock(ActivityFragmentLifecycle.class);
public RequestManagerHarness() {
fragment = new RequestManagerFragment(lifecycle);
controller = Robolectric.buildActivity(Activity.class).create();
controller.get()
.getFragmentManager()
.beginTransaction()
.add(fragment, TAG)
.commit();
controller.get()
.getFragmentManager()
.executePendingTransactions();
}
@Override
public String toString() {
return "DefaultHarness";
}
@Override
public RequestManager getManager() {
return fragment.getRequestManager();
}
@Override
public void setRequestManager(RequestManager requestManager) {
fragment.setRequestManager(requestManager);
}
@Override
public ActivityFragmentLifecycle getHarnessLifecycle() {
return lifecycle;
}
@Override
public ActivityFragmentLifecycle getFragmentLifecycle() {
return fragment.getLifecycle();
}
@Override
public ActivityController<?> getController() {
return controller;
}
@Override
public void onLowMemory() {
fragment.onLowMemory();
}
@Override
public void onTrimMemory(int level) {
fragment.onTrimMemory(level);
}
}
private static class SupportRequestManagerHarness implements Harness {
private final SupportRequestManagerFragment supportFragment;
private final ActivityController<FragmentActivity> supportController;
private final ActivityFragmentLifecycle lifecycle = mock(ActivityFragmentLifecycle.class);
public SupportRequestManagerHarness() {
supportFragment = new SupportRequestManagerFragment(lifecycle);
supportController = Robolectric.buildActivity(FragmentActivity.class).create();
supportController.get()
.getSupportFragmentManager()
.beginTransaction()
.add(supportFragment, TAG)
.commit();
supportController.get().getSupportFragmentManager().executePendingTransactions();
}
@Override
public String toString() {
return "SupportHarness";
}
@Override
public RequestManager getManager() {
return supportFragment.getRequestManager();
}
@Override
public void setRequestManager(RequestManager manager) {
supportFragment.setRequestManager(manager);
}
@Override
public ActivityFragmentLifecycle getHarnessLifecycle() {
return lifecycle;
}
@Override
public ActivityFragmentLifecycle getFragmentLifecycle() {
return supportFragment.getLifecycle();
}
@Override
public ActivityController<?> getController() {
return supportController;
}
@Override
public void onLowMemory() {
supportFragment.onLowMemory();
}
@Override
public void onTrimMemory(int level) {
// Do nothing.
}
}
}