diff options
author | Sam Judd <judds@google.com> | 2013-12-13 21:04:40 -0800 |
---|---|---|
committer | Sam Judd <judds@google.com> | 2013-12-13 21:45:29 -0800 |
commit | 77ef6a07ab4d3390d90c12a0bfe83018496746c2 (patch) | |
tree | 0bd4a82a8c2e91d4857a6f4e4f2c3daf5a25bc1b | |
parent | 4f9879337237a8a2988d48509b82b00ed044fd94 (diff) | |
download | glide-77ef6a07ab4d3390d90c12a0bfe83018496746c2.tar.gz |
Add tests for list preloader
-rw-r--r-- | library/tests/src/com/bumptech/glide/ListPreloaderTest.java | 221 |
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); + } + } +} |