aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSam Judd <judds@google.com>2013-12-13 21:04:40 -0800
committerSam Judd <judds@google.com>2013-12-13 21:45:29 -0800
commit77ef6a07ab4d3390d90c12a0bfe83018496746c2 (patch)
tree0bd4a82a8c2e91d4857a6f4e4f2c3daf5a25bc1b
parent4f9879337237a8a2988d48509b82b00ed044fd94 (diff)
downloadglide-77ef6a07ab4d3390d90c12a0bfe83018496746c2.tar.gz
Add tests for list preloader
-rw-r--r--library/tests/src/com/bumptech/glide/ListPreloaderTest.java221
1 files changed, 221 insertions, 0 deletions
diff --git a/library/tests/src/com/bumptech/glide/ListPreloaderTest.java b/library/tests/src/com/bumptech/glide/ListPreloaderTest.java
new file mode 100644
index 00000000..3ae90507
--- /dev/null
+++ b/library/tests/src/com/bumptech/glide/ListPreloaderTest.java
@@ -0,0 +1,221 @@
+package com.bumptech.glide;
+
+import android.content.Context;
+import android.graphics.Bitmap;
+import android.test.AndroidTestCase;
+import com.bumptech.glide.loader.model.ModelLoader;
+import com.bumptech.glide.loader.stream.StreamLoader;
+import com.bumptech.glide.util.Log;
+
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.HashSet;
+import java.util.List;
+import java.util.concurrent.atomic.AtomicBoolean;
+import java.util.concurrent.atomic.AtomicInteger;
+
+public class ListPreloaderTest extends AndroidTestCase {
+
+ static {
+ Log.DEBUG = true;
+ }
+
+ @Override
+ protected void setUp() throws Exception {
+ super.setUp();
+ }
+
+ public void testGetItemsIsCalledIncreasing() {
+ final AtomicBoolean called = new AtomicBoolean(false);
+ ListPreloaderAdapter preloader = new ListPreloaderAdapter(getContext(), 10) {
+ @Override
+ protected List<Object> getItems(int start, int end) {
+ called.set(true);
+ assertEquals(11, start);
+ assertEquals(21, end);
+ return super.getItems(start, end);
+ }
+ };
+ preloader.onScroll(null, 1, 10, 30);
+ assertTrue(called.get());
+ }
+
+ public void testGetItemsIsCalledDecreasing() {
+ final AtomicBoolean called = new AtomicBoolean(false);
+ ListPreloaderAdapter preloader = new ListPreloaderAdapter(getContext(), 10) {
+ @Override
+ protected List<Object> getItems(int start, int end) {
+ // Ignore the preload caused from us starting at the end
+ if (start == 30) {
+ return Collections.EMPTY_LIST;
+ }
+ called.set(true);
+ assertEquals(19, start);
+ assertEquals(29, end);
+ return super.getItems(start, end);
+ }
+ };
+ preloader.onScroll(null, 30, 10, 30);
+ preloader.onScroll(null, 29, 10, 30);
+ assertTrue(called.get());
+ }
+
+ public void testGetItemsIsNeverCalledWithEndGreaterThanTotalItems() {
+ final AtomicBoolean called = new AtomicBoolean(false);
+ ListPreloaderAdapter preloader = new ListPreloaderAdapter(getContext(), 10) {
+ @Override
+ protected List<Object> getItems(int start, int end) {
+ called.set(true);
+ assertEquals(26, start);
+ assertEquals(30, end);
+ return super.getItems(start, end);
+ }
+ };
+ preloader.onScroll(null, 16, 10, 30);
+ assertTrue(called.get());
+ }
+
+ public void testGetItemsIsNeverCalledWithStartLessThanZero() {
+ final AtomicBoolean called = new AtomicBoolean(false);
+ ListPreloaderAdapter preloader = new ListPreloaderAdapter(getContext(), 10) {
+ @Override
+ protected List<Object> getItems(int start, int end) {
+ if (start == 17) {
+ return Collections.EMPTY_LIST;
+ }
+ called.set(true);
+ assertEquals(0, start);
+ assertEquals(6, end);
+ return super.getItems(start, end);
+ }
+ };
+ preloader.onScroll(null, 7, 10, 30);
+ preloader.onScroll(null, 6, 10, 30);
+ assertTrue(called.get());
+ }
+
+ public void testDontPreloadItemsRepeatedlyWhileIncreasing() {
+ final AtomicInteger called = new AtomicInteger();
+ ListPreloaderAdapter preloader = new ListPreloaderAdapter(getContext(), 10) {
+ @Override
+ protected List<Object> getItems(int start, int end) {
+ final int current = called.getAndIncrement();
+ if (current == 0) {
+ assertEquals(11, start);
+ assertEquals(21, end);
+ } else if (current == 1) {
+ assertEquals(21, start);
+ assertEquals(24, end);
+ }
+ return super.getItems(start, end);
+ }
+ };
+
+ preloader.onScroll(null, 1, 10, 30);
+ preloader.onScroll(null, 4, 10, 30);
+
+ assertEquals(2, called.get());
+ }
+
+ public void testDontPreloadItemsRepeatedlyWhileDecreasing() {
+ final AtomicInteger called = new AtomicInteger();
+ ListPreloaderAdapter preloader = new ListPreloaderAdapter(getContext(), 10) {
+ @Override
+ protected List<Object> getItems(int start, int end) {
+ if (start == 30) {
+ return Collections.EMPTY_LIST;
+ }
+ final int current = called.getAndIncrement();
+ if (current == 0) {
+ assertEquals(10, start);
+ assertEquals(20, end);
+ } else if (current == 1) {
+ assertEquals(7, start);
+ assertEquals(10, end);
+ }
+ return super.getItems(start, end);
+ }
+ };
+
+ preloader.onScroll(null, 21, 10, 30);
+ preloader.onScroll(null, 20, 10, 30);
+ preloader.onScroll(null, 17, 10, 30);
+ assertEquals(2, called.get());
+ }
+
+ public void testItemsArePreloadedWithGlide() {
+ final List<Object> objects = new ArrayList<Object>();
+ objects.add(new Object());
+ objects.add(new Object());
+ final HashSet<Object> loadedObjects = new HashSet<Object>();
+ ListPreloaderAdapter preloader = new ListPreloaderAdapter(getContext(), 10) {
+ @Override
+ protected List<Object> getItems(int start, int end) {
+ return objects;
+ }
+
+ @Override
+ protected Glide.Request<Object> getRequest(Object item) {
+ loadedObjects.add(item);
+ return super.getRequest(item);
+ }
+ };
+
+ preloader.onScroll(null, 1, 10, 30);
+
+ assertEquals(objects.size(), loadedObjects.size());
+ for (Object object : objects) {
+ assertTrue(loadedObjects.contains(object));
+ }
+ }
+
+ private static class ListPreloaderAdapter extends ListPreloader<Object> {
+ public Bitmap bitmap = Bitmap.createBitmap(100, 100, Bitmap.Config.ARGB_8888);
+
+ public ListPreloaderAdapter(Context context, int maxPreload) {
+ super(context, maxPreload);
+ }
+
+ @Override
+ protected int[] getDimensions(Object item) {
+ return new int[] { 100, 100 };
+ }
+
+ @Override
+ protected List<Object> getItems(int start, int end) {
+ ArrayList<Object> result = new ArrayList<Object>(end - start);
+ Collections.fill(result, new Object());
+ return result;
+ }
+
+ @Override
+ protected Glide.Request<Object> getRequest(Object item) {
+ return Glide.using(new ModelLoader<Object>() {
+ @Override
+ public StreamLoader getStreamLoader(Object model, int width, int height) {
+ return new StreamLoader() {
+ @Override
+ public void loadStream(StreamReadyCallback cb) {
+ ByteArrayOutputStream os = new ByteArrayOutputStream();
+ bitmap.compress(Bitmap.CompressFormat.JPEG, 100, os);
+ ByteArrayInputStream is = new ByteArrayInputStream(os.toByteArray());
+ cb.onStreamReady(is);
+
+ }
+
+ @Override
+ public void cancel() {
+ }
+ };
+ }
+
+ @Override
+ public String getId(Object model) {
+ return String.valueOf(model.hashCode());
+ }
+ }).load(item);
+ }
+ }
+}