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