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 static com.google.common.truth.Truth.assertThat; 20 import static com.google.common.truth.Truth.assertWithMessage; 21 22 import androidx.leanback.widget.ClassPresenterSelector; 23 import androidx.leanback.widget.ObjectAdapter; 24 25 import com.android.tv.testing.constants.ConfigConstants; 26 27 import org.junit.Before; 28 import org.junit.Test; 29 import org.junit.runner.RunWith; 30 import org.robolectric.RobolectricTestRunner; 31 import org.robolectric.annotation.Config; 32 33 import java.util.Arrays; 34 import java.util.Comparator; 35 import java.util.Objects; 36 37 /** Tests for {@link SortedArrayAdapter}. */ 38 @RunWith(RobolectricTestRunner.class) 39 @Config(sdk = ConfigConstants.SDK) 40 public class SortedArrayAdapterTest { 41 public static final TestData P1 = TestData.create(1, "c"); 42 public static final TestData P2 = TestData.create(2, "b"); 43 public static final TestData P3 = TestData.create(3, "a"); 44 public static final TestData EXTRA = TestData.create(4, "k"); 45 private TestSortedArrayAdapter mAdapter; 46 47 @Before setUp()48 public void setUp() { 49 mAdapter = new TestSortedArrayAdapter(Integer.MAX_VALUE, null); 50 } 51 52 @Test testContents_empty()53 public void testContents_empty() { 54 assertEmpty(); 55 } 56 57 @Test testAdd_one()58 public void testAdd_one() { 59 mAdapter.add(P1); 60 assertNotEmpty(); 61 assertContentsInOrder(mAdapter, P1); 62 } 63 64 @Test testAdd_two()65 public void testAdd_two() { 66 mAdapter.add(P1); 67 mAdapter.add(P2); 68 assertNotEmpty(); 69 assertContentsInOrder(mAdapter, P2, P1); 70 } 71 72 @Test testSetInitialItems_two()73 public void testSetInitialItems_two() { 74 mAdapter.setInitialItems(Arrays.asList(P1, P2)); 75 assertNotEmpty(); 76 assertContentsInOrder(mAdapter, P2, P1); 77 } 78 79 @Test testMaxInitialCount()80 public void testMaxInitialCount() { 81 mAdapter = new TestSortedArrayAdapter(1, null); 82 mAdapter.setInitialItems(Arrays.asList(P1, P2)); 83 assertNotEmpty(); 84 assertThat(mAdapter.size()).isEqualTo(1); 85 assertThat(mAdapter.get(0)).isEqualTo(P2); 86 } 87 88 @Test testExtraItem()89 public void testExtraItem() { 90 mAdapter = new TestSortedArrayAdapter(Integer.MAX_VALUE, EXTRA); 91 mAdapter.setInitialItems(Arrays.asList(P1, P2)); 92 assertNotEmpty(); 93 assertThat(mAdapter.size()).isEqualTo(3); 94 assertThat(mAdapter.get(0)).isEqualTo(P2); 95 assertThat(mAdapter.get(2)).isEqualTo(EXTRA); 96 mAdapter.remove(P2); 97 mAdapter.remove(P1); 98 assertThat(mAdapter.size()).isEqualTo(1); 99 assertThat(mAdapter.get(0)).isEqualTo(EXTRA); 100 } 101 102 @Test testExtraItemWithMaxCount()103 public void testExtraItemWithMaxCount() { 104 mAdapter = new TestSortedArrayAdapter(1, EXTRA); 105 mAdapter.setInitialItems(Arrays.asList(P1, P2)); 106 assertNotEmpty(); 107 assertThat(mAdapter.size()).isEqualTo(2); 108 assertThat(mAdapter.get(0)).isEqualTo(P2); 109 assertThat(mAdapter.get(1)).isEqualTo(EXTRA); 110 mAdapter.remove(P2); 111 assertThat(mAdapter.size()).isEqualTo(1); 112 assertThat(mAdapter.get(0)).isEqualTo(EXTRA); 113 } 114 115 @Test testRemove()116 public void testRemove() { 117 mAdapter.add(P1); 118 mAdapter.add(P2); 119 assertNotEmpty(); 120 assertContentsInOrder(mAdapter, P2, P1); 121 mAdapter.remove(P3); 122 assertContentsInOrder(mAdapter, P2, P1); 123 mAdapter.remove(P2); 124 assertContentsInOrder(mAdapter, P1); 125 mAdapter.remove(P1); 126 assertEmpty(); 127 mAdapter.add(P1); 128 mAdapter.add(P2); 129 mAdapter.add(P3); 130 assertContentsInOrder(mAdapter, P3, P2, P1); 131 mAdapter.removeItems(0, 2); 132 assertContentsInOrder(mAdapter, P1); 133 mAdapter.add(P2); 134 mAdapter.add(P3); 135 mAdapter.addExtraItem(EXTRA); 136 assertContentsInOrder(mAdapter, P3, P2, P1, EXTRA); 137 mAdapter.removeItems(1, 1); 138 assertContentsInOrder(mAdapter, P3, P1, EXTRA); 139 mAdapter.removeItems(1, 2); 140 assertContentsInOrder(mAdapter, P3); 141 mAdapter.addExtraItem(EXTRA); 142 mAdapter.addExtraItem(P2); 143 mAdapter.add(P1); 144 assertContentsInOrder(mAdapter, P3, P1, EXTRA, P2); 145 mAdapter.removeItems(1, 2); 146 assertContentsInOrder(mAdapter, P3, P2); 147 mAdapter.add(P1); 148 assertContentsInOrder(mAdapter, P3, P1, P2); 149 } 150 151 @Test testReplace()152 public void testReplace() { 153 mAdapter.add(P1); 154 mAdapter.add(P2); 155 assertNotEmpty(); 156 assertContentsInOrder(mAdapter, P2, P1); 157 mAdapter.replace(1, P3); 158 assertContentsInOrder(mAdapter, P3, P2); 159 mAdapter.replace(0, P1); 160 assertContentsInOrder(mAdapter, P2, P1); 161 mAdapter.addExtraItem(EXTRA); 162 assertContentsInOrder(mAdapter, P2, P1, EXTRA); 163 mAdapter.replace(2, P3); 164 assertContentsInOrder(mAdapter, P2, P1, P3); 165 } 166 167 @Test testChange_sorting()168 public void testChange_sorting() { 169 TestData p2_changed = TestData.create(2, "z changed"); 170 mAdapter.add(P1); 171 mAdapter.add(P2); 172 assertNotEmpty(); 173 assertContentsInOrder(mAdapter, P2, P1); 174 mAdapter.change(p2_changed); 175 assertContentsInOrder(mAdapter, P1, p2_changed); 176 } 177 178 @Test testChange_new()179 public void testChange_new() { 180 mAdapter.change(P1); 181 assertNotEmpty(); 182 assertContentsInOrder(mAdapter, P1); 183 } 184 assertEmpty()185 private void assertEmpty() { 186 assertWithMessage("empty").that(mAdapter.isEmpty()).isTrue(); 187 } 188 assertNotEmpty()189 private void assertNotEmpty() { 190 assertWithMessage("empty").that(mAdapter.isEmpty()).isFalse(); 191 } 192 assertContentsInOrder(ObjectAdapter adapter, Object... contents)193 private static void assertContentsInOrder(ObjectAdapter adapter, Object... contents) { 194 int ex = contents.length; 195 assertWithMessage("size").that(adapter.size()).isEqualTo(ex); 196 for (int i = 0; i < ex; i++) { 197 assertWithMessage("element " + 1).that(adapter.get(i)).isEqualTo(contents[i]); 198 } 199 } 200 201 private static class TestData { 202 @Override toString()203 public String toString() { 204 return "TestData[" + mId + "]{" + mText + '}'; 205 } 206 create(long first, String text)207 static TestData create(long first, String text) { 208 return new TestData(first, text); 209 } 210 211 private final long mId; 212 private final String mText; 213 TestData(long id, String second)214 private TestData(long id, String second) { 215 this.mId = id; 216 this.mText = second; 217 } 218 219 @Override equals(Object o)220 public boolean equals(Object o) { 221 if (this == o) return true; 222 if (!(o instanceof TestData)) return false; 223 TestData that = (TestData) o; 224 return mId == that.mId && Objects.equals(mText, that.mText); 225 } 226 227 @Override hashCode()228 public int hashCode() { 229 return Objects.hash(mId, mText); 230 } 231 } 232 233 private static class TestSortedArrayAdapter extends SortedArrayAdapter<TestData> { 234 235 private static final Comparator<TestData> TEXT_COMPARATOR = 236 new Comparator<TestData>() { 237 @Override 238 public int compare(TestData lhs, TestData rhs) { 239 return lhs.mText.compareTo(rhs.mText); 240 } 241 }; 242 TestSortedArrayAdapter(int maxInitialCount, Object extra)243 TestSortedArrayAdapter(int maxInitialCount, Object extra) { 244 super(new ClassPresenterSelector(), TEXT_COMPARATOR, maxInitialCount); 245 if (extra != null) { 246 addExtraItem((TestData) extra); 247 } 248 } 249 250 @Override getId(TestData item)251 protected long getId(TestData item) { 252 return item.mId; 253 } 254 } 255 } 256