1 /* 2 * Copyright (C) 2016 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17 package com.android.tv.dvr.ui; 18 19 import android.support.test.filters.SmallTest; 20 import android.support.v17.leanback.widget.ClassPresenterSelector; 21 import android.support.v17.leanback.widget.ObjectAdapter; 22 23 import junit.framework.TestCase; 24 25 import org.junit.Before; 26 import org.junit.Test; 27 28 import java.util.Arrays; 29 import java.util.Comparator; 30 import java.util.Objects; 31 32 /** 33 * Tests for {@link SortedArrayAdapter}. 34 */ 35 @SmallTest 36 public class SortedArrayAdapterTest extends TestCase { 37 public static final TestData P1 = TestData.create(1, "c"); 38 public static final TestData P2 = TestData.create(2, "b"); 39 public static final TestData P3 = TestData.create(3, "a"); 40 public static final TestData EXTRA = TestData.create(4, "k"); 41 private TestSortedArrayAdapter mAdapter; 42 43 @Before 44 public void setUp() { 45 mAdapter = new TestSortedArrayAdapter(Integer.MAX_VALUE, null); 46 } 47 48 @Test 49 public void testContents_empty() { 50 assertEmpty(); 51 } 52 53 @Test 54 public void testAdd_one() { 55 mAdapter.add(P1); 56 assertNotEmpty(); 57 assertContentsInOrder(mAdapter, P1); 58 } 59 60 @Test 61 public void testAdd_two() { 62 mAdapter.add(P1); 63 mAdapter.add(P2); 64 assertNotEmpty(); 65 assertContentsInOrder(mAdapter, P2, P1); 66 } 67 68 @Test 69 public void testSetInitialItems_two() { 70 mAdapter.setInitialItems(Arrays.asList(P1, P2)); 71 assertNotEmpty(); 72 assertContentsInOrder(mAdapter, P2, P1); 73 } 74 75 @Test 76 public void testMaxInitialCount() { 77 mAdapter = new TestSortedArrayAdapter(1, null); 78 mAdapter.setInitialItems(Arrays.asList(P1, P2)); 79 assertNotEmpty(); 80 assertEquals(mAdapter.size(), 1); 81 assertEquals(mAdapter.get(0), P2); 82 } 83 84 @Test 85 public void testExtraItem() { 86 mAdapter = new TestSortedArrayAdapter(Integer.MAX_VALUE, EXTRA); 87 mAdapter.setInitialItems(Arrays.asList(P1, P2)); 88 assertNotEmpty(); 89 assertEquals(mAdapter.size(), 3); 90 assertEquals(mAdapter.get(0), P2); 91 assertEquals(mAdapter.get(2), EXTRA); 92 mAdapter.remove(P2); 93 mAdapter.remove(P1); 94 assertEquals(mAdapter.size(), 1); 95 assertEquals(mAdapter.get(0), EXTRA); 96 } 97 98 @Test 99 public void testExtraItemWithMaxCount() { 100 mAdapter = new TestSortedArrayAdapter(1, EXTRA); 101 mAdapter.setInitialItems(Arrays.asList(P1, P2)); 102 assertNotEmpty(); 103 assertEquals(mAdapter.size(), 2); 104 assertEquals(mAdapter.get(0), P2); 105 assertEquals(mAdapter.get(1), EXTRA); 106 mAdapter.remove(P2); 107 assertEquals(mAdapter.size(), 1); 108 assertEquals(mAdapter.get(0), EXTRA); 109 } 110 111 @Test 112 public void testRemove() { 113 mAdapter.add(P1); 114 mAdapter.add(P2); 115 assertNotEmpty(); 116 assertContentsInOrder(mAdapter, P2, P1); 117 mAdapter.remove(P3); 118 assertContentsInOrder(mAdapter, P2, P1); 119 mAdapter.remove(P2); 120 assertContentsInOrder(mAdapter, P1); 121 mAdapter.remove(P1); 122 assertEmpty(); 123 mAdapter.add(P1); 124 mAdapter.add(P2); 125 mAdapter.add(P3); 126 assertContentsInOrder(mAdapter, P3, P2, P1); 127 mAdapter.removeItems(0, 2); 128 assertContentsInOrder(mAdapter, P1); 129 mAdapter.add(P2); 130 mAdapter.add(P3); 131 mAdapter.addExtraItem(EXTRA); 132 assertContentsInOrder(mAdapter, P3, P2, P1, EXTRA); 133 mAdapter.removeItems(1, 1); 134 assertContentsInOrder(mAdapter, P3, P1, EXTRA); 135 mAdapter.removeItems(1, 2); 136 assertContentsInOrder(mAdapter, P3); 137 mAdapter.addExtraItem(EXTRA); 138 mAdapter.addExtraItem(P2); 139 mAdapter.add(P1); 140 assertContentsInOrder(mAdapter, P3, P1, EXTRA, P2); 141 mAdapter.removeItems(1, 2); 142 assertContentsInOrder(mAdapter, P3, P2); 143 mAdapter.add(P1); 144 assertContentsInOrder(mAdapter, P3, P1, P2); 145 } 146 147 @Test 148 public void testReplace() { 149 mAdapter.add(P1); 150 mAdapter.add(P2); 151 assertNotEmpty(); 152 assertContentsInOrder(mAdapter, P2, P1); 153 mAdapter.replace(1, P3); 154 assertContentsInOrder(mAdapter, P3, P2); 155 mAdapter.replace(0, P1); 156 assertContentsInOrder(mAdapter, P2, P1); 157 mAdapter.addExtraItem(EXTRA); 158 assertContentsInOrder(mAdapter, P2, P1, EXTRA); 159 mAdapter.replace(2, P3); 160 assertContentsInOrder(mAdapter, P2, P1, P3); 161 } 162 163 @Test 164 public void testChange_sorting() { 165 TestData p2_changed = TestData.create(2, "z changed"); 166 mAdapter.add(P1); 167 mAdapter.add(P2); 168 assertNotEmpty(); 169 assertContentsInOrder(mAdapter, P2, P1); 170 mAdapter.change(p2_changed); 171 assertContentsInOrder(mAdapter, P1, p2_changed); 172 } 173 174 @Test 175 public void testChange_new() { 176 mAdapter.change(P1); 177 assertNotEmpty(); 178 assertContentsInOrder(mAdapter, P1); 179 } 180 181 private void assertEmpty() { 182 assertEquals("empty", true, mAdapter.isEmpty()); 183 } 184 185 private void assertNotEmpty() { 186 assertEquals("empty", false, mAdapter.isEmpty()); 187 } 188 189 private static void assertContentsInOrder(ObjectAdapter adapter, Object... contents) { 190 int ex = contents.length; 191 assertEquals("size", ex, adapter.size()); 192 for (int i = 0; i < ex; i++) { 193 assertEquals("element " + 1, contents[i], adapter.get(i)); 194 } 195 } 196 197 private static class TestData { 198 @Override 199 public String toString() { 200 return "TestData[" + mId + "]{" + mText + '}'; 201 } 202 203 static TestData create(long first, String text) { 204 return new TestData(first, text); 205 } 206 207 private final long mId; 208 private final String mText; 209 210 private TestData(long id, String second) { 211 this.mId = id; 212 this.mText = second; 213 } 214 215 @Override 216 public boolean equals(Object o) { 217 if (this == o) return true; 218 if (!(o instanceof TestData)) return false; 219 TestData that = (TestData) o; 220 return mId == that.mId && Objects.equals(mText, that.mText); 221 } 222 223 @Override 224 public int hashCode() { 225 return Objects.hash(mId, mText); 226 } 227 } 228 229 private static class TestSortedArrayAdapter extends SortedArrayAdapter<TestData> { 230 231 private static final Comparator<TestData> TEXT_COMPARATOR = new Comparator<TestData>() { 232 @Override 233 public int compare(TestData lhs, TestData rhs) { 234 return lhs.mText.compareTo(rhs.mText); 235 } 236 }; 237 238 TestSortedArrayAdapter(int maxInitialCount, Object extra) { 239 super(new ClassPresenterSelector(), TEXT_COMPARATOR, maxInitialCount); 240 if (extra != null) { 241 addExtraItem((TestData) extra); 242 } 243 } 244 245 @Override 246 protected long getId(TestData item) { 247 return item.mId; 248 } 249 } 250 }