1356880d3de117b067522ad452f4e3eed85ce444cChris Craik/* 2356880d3de117b067522ad452f4e3eed85ce444cChris Craik * Copyright (C) 2016 The Android Open Source Project 3356880d3de117b067522ad452f4e3eed85ce444cChris Craik * 4356880d3de117b067522ad452f4e3eed85ce444cChris Craik * Licensed under the Apache License, Version 2.0 (the "License"); 5356880d3de117b067522ad452f4e3eed85ce444cChris Craik * you may not use this file except in compliance with the License. 6356880d3de117b067522ad452f4e3eed85ce444cChris Craik * You may obtain a copy of the License at 7356880d3de117b067522ad452f4e3eed85ce444cChris Craik * 8356880d3de117b067522ad452f4e3eed85ce444cChris Craik * http://www.apache.org/licenses/LICENSE-2.0 9356880d3de117b067522ad452f4e3eed85ce444cChris Craik * 10356880d3de117b067522ad452f4e3eed85ce444cChris Craik * Unless required by applicable law or agreed to in writing, software 11356880d3de117b067522ad452f4e3eed85ce444cChris Craik * distributed under the License is distributed on an "AS IS" BASIS, 12356880d3de117b067522ad452f4e3eed85ce444cChris Craik * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13356880d3de117b067522ad452f4e3eed85ce444cChris Craik * See the License for the specific language governing permissions and 14356880d3de117b067522ad452f4e3eed85ce444cChris Craik * limitations under the License. 15356880d3de117b067522ad452f4e3eed85ce444cChris Craik */ 16356880d3de117b067522ad452f4e3eed85ce444cChris Craikpackage android.support.v7.widget; 17356880d3de117b067522ad452f4e3eed85ce444cChris Craik 18356880d3de117b067522ad452f4e3eed85ce444cChris Craikimport static org.junit.Assert.assertEquals; 19356880d3de117b067522ad452f4e3eed85ce444cChris Craikimport static org.junit.Assert.assertFalse; 20356880d3de117b067522ad452f4e3eed85ce444cChris Craikimport static org.junit.Assert.assertNotNull; 21356880d3de117b067522ad452f4e3eed85ce444cChris Craikimport static org.junit.Assert.assertNull; 22356880d3de117b067522ad452f4e3eed85ce444cChris Craikimport static org.junit.Assert.assertTrue; 23356880d3de117b067522ad452f4e3eed85ce444cChris Craik 24356880d3de117b067522ad452f4e3eed85ce444cChris Craikimport android.content.Context; 25f19f48914b734b04b60555774e8b772ab4545fa8Chris Craikimport android.os.Build; 26356880d3de117b067522ad452f4e3eed85ce444cChris Craikimport android.support.test.InstrumentationRegistry; 27f19f48914b734b04b60555774e8b772ab4545fa8Chris Craikimport android.support.test.filters.SdkSuppress; 28356880d3de117b067522ad452f4e3eed85ce444cChris Craikimport android.support.test.filters.SmallTest; 29356880d3de117b067522ad452f4e3eed85ce444cChris Craikimport android.support.test.runner.AndroidJUnit4; 30356880d3de117b067522ad452f4e3eed85ce444cChris Craik 31356880d3de117b067522ad452f4e3eed85ce444cChris Craikimport org.junit.Test; 32356880d3de117b067522ad452f4e3eed85ce444cChris Craikimport org.junit.runner.RunWith; 33356880d3de117b067522ad452f4e3eed85ce444cChris Craik 34356880d3de117b067522ad452f4e3eed85ce444cChris Craikimport java.util.ArrayList; 35356880d3de117b067522ad452f4e3eed85ce444cChris Craikimport java.util.Collections; 36356880d3de117b067522ad452f4e3eed85ce444cChris Craik 37356880d3de117b067522ad452f4e3eed85ce444cChris Craik@SmallTest 38356880d3de117b067522ad452f4e3eed85ce444cChris Craik@RunWith(AndroidJUnit4.class) 39356880d3de117b067522ad452f4e3eed85ce444cChris Craikpublic class GapWorkerTest { 40356880d3de117b067522ad452f4e3eed85ce444cChris Craik 41356880d3de117b067522ad452f4e3eed85ce444cChris Craik private Context getContext() { 42356880d3de117b067522ad452f4e3eed85ce444cChris Craik return InstrumentationRegistry.getContext(); 43356880d3de117b067522ad452f4e3eed85ce444cChris Craik } 44356880d3de117b067522ad452f4e3eed85ce444cChris Craik 45356880d3de117b067522ad452f4e3eed85ce444cChris Craik @Test 469d8319a04ccdb4785ca86fac3a4ff3fc6a368647Chris Craik public void registrySimple() { 479d8319a04ccdb4785ca86fac3a4ff3fc6a368647Chris Craik GapWorker.LayoutPrefetchRegistryImpl registry = new GapWorker.LayoutPrefetchRegistryImpl(); 489d8319a04ccdb4785ca86fac3a4ff3fc6a368647Chris Craik registry.addPosition(0, 0); 499d8319a04ccdb4785ca86fac3a4ff3fc6a368647Chris Craik registry.addPosition(2, 0); 509d8319a04ccdb4785ca86fac3a4ff3fc6a368647Chris Craik registry.addPosition(3, 0); 519d8319a04ccdb4785ca86fac3a4ff3fc6a368647Chris Craik assertTrue(registry.lastPrefetchIncludedPosition(0)); 529d8319a04ccdb4785ca86fac3a4ff3fc6a368647Chris Craik assertFalse(registry.lastPrefetchIncludedPosition(1)); 539d8319a04ccdb4785ca86fac3a4ff3fc6a368647Chris Craik assertTrue(registry.lastPrefetchIncludedPosition(2)); 549d8319a04ccdb4785ca86fac3a4ff3fc6a368647Chris Craik assertTrue(registry.lastPrefetchIncludedPosition(3)); 559d8319a04ccdb4785ca86fac3a4ff3fc6a368647Chris Craik } 569d8319a04ccdb4785ca86fac3a4ff3fc6a368647Chris Craik 579d8319a04ccdb4785ca86fac3a4ff3fc6a368647Chris Craik @Test(expected = IllegalArgumentException.class) 589d8319a04ccdb4785ca86fac3a4ff3fc6a368647Chris Craik public void registryNegativeLayout() { 599d8319a04ccdb4785ca86fac3a4ff3fc6a368647Chris Craik GapWorker.LayoutPrefetchRegistryImpl registry = new GapWorker.LayoutPrefetchRegistryImpl(); 609d8319a04ccdb4785ca86fac3a4ff3fc6a368647Chris Craik registry.addPosition(-1, 0); 619d8319a04ccdb4785ca86fac3a4ff3fc6a368647Chris Craik } 629d8319a04ccdb4785ca86fac3a4ff3fc6a368647Chris Craik 639d8319a04ccdb4785ca86fac3a4ff3fc6a368647Chris Craik @Test(expected = IllegalArgumentException.class) 649d8319a04ccdb4785ca86fac3a4ff3fc6a368647Chris Craik public void registryNegativeDistance() { 659d8319a04ccdb4785ca86fac3a4ff3fc6a368647Chris Craik GapWorker.LayoutPrefetchRegistryImpl registry = new GapWorker.LayoutPrefetchRegistryImpl(); 669d8319a04ccdb4785ca86fac3a4ff3fc6a368647Chris Craik registry.addPosition(0, -1); 679d8319a04ccdb4785ca86fac3a4ff3fc6a368647Chris Craik } 689d8319a04ccdb4785ca86fac3a4ff3fc6a368647Chris Craik 699d8319a04ccdb4785ca86fac3a4ff3fc6a368647Chris Craik @Test 709d8319a04ccdb4785ca86fac3a4ff3fc6a368647Chris Craik public void registryResetCorrectly() { 719d8319a04ccdb4785ca86fac3a4ff3fc6a368647Chris Craik GapWorker.LayoutPrefetchRegistryImpl registry = new GapWorker.LayoutPrefetchRegistryImpl(); 729d8319a04ccdb4785ca86fac3a4ff3fc6a368647Chris Craik registry.addPosition(0, 0); 739d8319a04ccdb4785ca86fac3a4ff3fc6a368647Chris Craik assertFalse(registry.lastPrefetchIncludedPosition(-1)); 749d8319a04ccdb4785ca86fac3a4ff3fc6a368647Chris Craik assertTrue(registry.lastPrefetchIncludedPosition(0)); 759d8319a04ccdb4785ca86fac3a4ff3fc6a368647Chris Craik 769d8319a04ccdb4785ca86fac3a4ff3fc6a368647Chris Craik registry.clearPrefetchPositions(); 779d8319a04ccdb4785ca86fac3a4ff3fc6a368647Chris Craik 789d8319a04ccdb4785ca86fac3a4ff3fc6a368647Chris Craik assertFalse(registry.lastPrefetchIncludedPosition(-1)); 799d8319a04ccdb4785ca86fac3a4ff3fc6a368647Chris Craik assertFalse(registry.lastPrefetchIncludedPosition(0)); 809d8319a04ccdb4785ca86fac3a4ff3fc6a368647Chris Craik } 819d8319a04ccdb4785ca86fac3a4ff3fc6a368647Chris Craik 829d8319a04ccdb4785ca86fac3a4ff3fc6a368647Chris Craik @Test 83356880d3de117b067522ad452f4e3eed85ce444cChris Craik public void taskOrderViewPresence() { 84356880d3de117b067522ad452f4e3eed85ce444cChris Craik ArrayList<GapWorker.Task> list = new ArrayList<>(); 85356880d3de117b067522ad452f4e3eed85ce444cChris Craik list.add(new GapWorker.Task()); 86356880d3de117b067522ad452f4e3eed85ce444cChris Craik list.add(new GapWorker.Task()); 87356880d3de117b067522ad452f4e3eed85ce444cChris Craik list.add(new GapWorker.Task()); 88356880d3de117b067522ad452f4e3eed85ce444cChris Craik 89356880d3de117b067522ad452f4e3eed85ce444cChris Craik list.get(0).view = null; 90356880d3de117b067522ad452f4e3eed85ce444cChris Craik list.get(1).view = new RecyclerView(getContext()); 91356880d3de117b067522ad452f4e3eed85ce444cChris Craik list.get(2).view = null; 92356880d3de117b067522ad452f4e3eed85ce444cChris Craik 93356880d3de117b067522ad452f4e3eed85ce444cChris Craik Collections.sort(list, GapWorker.sTaskComparator); 94356880d3de117b067522ad452f4e3eed85ce444cChris Craik 95356880d3de117b067522ad452f4e3eed85ce444cChris Craik assertNotNull(list.get(0).view); 96356880d3de117b067522ad452f4e3eed85ce444cChris Craik assertNull(list.get(1).view); 97356880d3de117b067522ad452f4e3eed85ce444cChris Craik assertNull(list.get(2).view); 98356880d3de117b067522ad452f4e3eed85ce444cChris Craik } 99356880d3de117b067522ad452f4e3eed85ce444cChris Craik @Test 100356880d3de117b067522ad452f4e3eed85ce444cChris Craik public void taskOrderImmediate() { 101356880d3de117b067522ad452f4e3eed85ce444cChris Craik ArrayList<GapWorker.Task> list = new ArrayList<>(); 102356880d3de117b067522ad452f4e3eed85ce444cChris Craik list.add(new GapWorker.Task()); 103356880d3de117b067522ad452f4e3eed85ce444cChris Craik list.add(new GapWorker.Task()); 104356880d3de117b067522ad452f4e3eed85ce444cChris Craik list.add(new GapWorker.Task()); 105356880d3de117b067522ad452f4e3eed85ce444cChris Craik 106356880d3de117b067522ad452f4e3eed85ce444cChris Craik list.get(0).immediate = true; 107356880d3de117b067522ad452f4e3eed85ce444cChris Craik list.get(1).immediate = false; 108356880d3de117b067522ad452f4e3eed85ce444cChris Craik list.get(2).immediate = true; 109356880d3de117b067522ad452f4e3eed85ce444cChris Craik 110356880d3de117b067522ad452f4e3eed85ce444cChris Craik Collections.sort(list, GapWorker.sTaskComparator); 111356880d3de117b067522ad452f4e3eed85ce444cChris Craik 112356880d3de117b067522ad452f4e3eed85ce444cChris Craik assertTrue(list.get(0).immediate); 113356880d3de117b067522ad452f4e3eed85ce444cChris Craik assertTrue(list.get(1).immediate); 114356880d3de117b067522ad452f4e3eed85ce444cChris Craik assertFalse(list.get(2).immediate); 115356880d3de117b067522ad452f4e3eed85ce444cChris Craik } 116356880d3de117b067522ad452f4e3eed85ce444cChris Craik 117356880d3de117b067522ad452f4e3eed85ce444cChris Craik @Test 118356880d3de117b067522ad452f4e3eed85ce444cChris Craik public void taskOrderImmediateVelocity() { 119356880d3de117b067522ad452f4e3eed85ce444cChris Craik ArrayList<GapWorker.Task> list = new ArrayList<>(); 120356880d3de117b067522ad452f4e3eed85ce444cChris Craik list.add(new GapWorker.Task()); 121356880d3de117b067522ad452f4e3eed85ce444cChris Craik list.add(new GapWorker.Task()); 122356880d3de117b067522ad452f4e3eed85ce444cChris Craik list.add(new GapWorker.Task()); 123356880d3de117b067522ad452f4e3eed85ce444cChris Craik 124356880d3de117b067522ad452f4e3eed85ce444cChris Craik list.get(0).immediate = true; 125356880d3de117b067522ad452f4e3eed85ce444cChris Craik list.get(0).viewVelocity = 10; 126356880d3de117b067522ad452f4e3eed85ce444cChris Craik 127356880d3de117b067522ad452f4e3eed85ce444cChris Craik list.get(1).immediate = false; 128356880d3de117b067522ad452f4e3eed85ce444cChris Craik list.get(1).viewVelocity = 99; 129356880d3de117b067522ad452f4e3eed85ce444cChris Craik 130356880d3de117b067522ad452f4e3eed85ce444cChris Craik list.get(2).immediate = true; 131356880d3de117b067522ad452f4e3eed85ce444cChris Craik list.get(2).viewVelocity = 20; 132356880d3de117b067522ad452f4e3eed85ce444cChris Craik 133356880d3de117b067522ad452f4e3eed85ce444cChris Craik Collections.sort(list, GapWorker.sTaskComparator); 134356880d3de117b067522ad452f4e3eed85ce444cChris Craik 135356880d3de117b067522ad452f4e3eed85ce444cChris Craik assertEquals(20, list.get(0).viewVelocity); 136356880d3de117b067522ad452f4e3eed85ce444cChris Craik assertEquals(10, list.get(1).viewVelocity); 137356880d3de117b067522ad452f4e3eed85ce444cChris Craik assertEquals(99, list.get(2).viewVelocity); 138356880d3de117b067522ad452f4e3eed85ce444cChris Craik } 139356880d3de117b067522ad452f4e3eed85ce444cChris Craik 140356880d3de117b067522ad452f4e3eed85ce444cChris Craik @Test 141356880d3de117b067522ad452f4e3eed85ce444cChris Craik public void taskOrderImmediateVelocityDistance() { 142356880d3de117b067522ad452f4e3eed85ce444cChris Craik ArrayList<GapWorker.Task> list = new ArrayList<>(); 143356880d3de117b067522ad452f4e3eed85ce444cChris Craik list.add(new GapWorker.Task()); 144356880d3de117b067522ad452f4e3eed85ce444cChris Craik list.add(new GapWorker.Task()); 145356880d3de117b067522ad452f4e3eed85ce444cChris Craik list.add(new GapWorker.Task()); 146356880d3de117b067522ad452f4e3eed85ce444cChris Craik list.add(new GapWorker.Task()); 147356880d3de117b067522ad452f4e3eed85ce444cChris Craik 148356880d3de117b067522ad452f4e3eed85ce444cChris Craik list.get(0).immediate = true; 149356880d3de117b067522ad452f4e3eed85ce444cChris Craik list.get(0).viewVelocity = 400; 150356880d3de117b067522ad452f4e3eed85ce444cChris Craik list.get(0).distanceToItem = 300; 151356880d3de117b067522ad452f4e3eed85ce444cChris Craik 152356880d3de117b067522ad452f4e3eed85ce444cChris Craik list.get(1).immediate = false; 153356880d3de117b067522ad452f4e3eed85ce444cChris Craik list.get(1).viewVelocity = 800; 154356880d3de117b067522ad452f4e3eed85ce444cChris Craik list.get(1).distanceToItem = 900; 155356880d3de117b067522ad452f4e3eed85ce444cChris Craik 156356880d3de117b067522ad452f4e3eed85ce444cChris Craik list.get(2).immediate = true; 157356880d3de117b067522ad452f4e3eed85ce444cChris Craik list.get(2).viewVelocity = 300; 158356880d3de117b067522ad452f4e3eed85ce444cChris Craik list.get(2).distanceToItem = 200; 159356880d3de117b067522ad452f4e3eed85ce444cChris Craik 160356880d3de117b067522ad452f4e3eed85ce444cChris Craik list.get(3).immediate = true; 161356880d3de117b067522ad452f4e3eed85ce444cChris Craik list.get(3).viewVelocity = 300; 162356880d3de117b067522ad452f4e3eed85ce444cChris Craik list.get(3).distanceToItem = 100; 163356880d3de117b067522ad452f4e3eed85ce444cChris Craik 164356880d3de117b067522ad452f4e3eed85ce444cChris Craik Collections.sort(list, GapWorker.sTaskComparator); 165356880d3de117b067522ad452f4e3eed85ce444cChris Craik 166356880d3de117b067522ad452f4e3eed85ce444cChris Craik assertEquals(300, list.get(0).distanceToItem); 167356880d3de117b067522ad452f4e3eed85ce444cChris Craik assertEquals(100, list.get(1).distanceToItem); 168356880d3de117b067522ad452f4e3eed85ce444cChris Craik assertEquals(200, list.get(2).distanceToItem); 169356880d3de117b067522ad452f4e3eed85ce444cChris Craik assertEquals(900, list.get(3).distanceToItem); 170356880d3de117b067522ad452f4e3eed85ce444cChris Craik } 171f19f48914b734b04b60555774e8b772ab4545fa8Chris Craik 172f19f48914b734b04b60555774e8b772ab4545fa8Chris Craik @SdkSuppress(minSdkVersion = Build.VERSION_CODES.LOLLIPOP) 173f19f48914b734b04b60555774e8b772ab4545fa8Chris Craik @Test 174f19f48914b734b04b60555774e8b772ab4545fa8Chris Craik public void gapWorkerWithoutLayout() { 175f19f48914b734b04b60555774e8b772ab4545fa8Chris Craik RecyclerView recyclerView = new RecyclerView(getContext()); 176f19f48914b734b04b60555774e8b772ab4545fa8Chris Craik try { 177f19f48914b734b04b60555774e8b772ab4545fa8Chris Craik assertFalse(recyclerView.mIsAttached); 178f19f48914b734b04b60555774e8b772ab4545fa8Chris Craik recyclerView.onAttachedToWindow(); 179f19f48914b734b04b60555774e8b772ab4545fa8Chris Craik recyclerView.mGapWorker.prefetch(RecyclerView.FOREVER_NS); 180f19f48914b734b04b60555774e8b772ab4545fa8Chris Craik } finally { 181f19f48914b734b04b60555774e8b772ab4545fa8Chris Craik recyclerView.onDetachedFromWindow(); 182f19f48914b734b04b60555774e8b772ab4545fa8Chris Craik } 183f19f48914b734b04b60555774e8b772ab4545fa8Chris Craik } 184356880d3de117b067522ad452f4e3eed85ce444cChris Craik} 185