1/* 2 * Copyright (C) 2015 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 17package com.android.setupwizardlib.test; 18 19import static org.junit.Assert.assertEquals; 20import static org.junit.Assert.assertFalse; 21import static org.junit.Assert.assertNull; 22import static org.junit.Assert.assertSame; 23import static org.junit.Assert.assertTrue; 24import static org.mockito.Matchers.eq; 25import static org.mockito.Mockito.inOrder; 26import static org.mockito.Mockito.verify; 27 28import android.content.Context; 29import android.graphics.drawable.Drawable; 30import android.graphics.drawable.ShapeDrawable; 31import android.support.test.InstrumentationRegistry; 32import android.support.test.filters.SmallTest; 33import android.support.test.runner.AndroidJUnit4; 34import android.view.View; 35import android.view.ViewGroup; 36import android.widget.FrameLayout; 37import android.widget.ImageView; 38import android.widget.TextView; 39 40import com.android.setupwizardlib.R; 41import com.android.setupwizardlib.items.Item; 42import com.android.setupwizardlib.items.ItemHierarchy.Observer; 43 44import org.junit.Before; 45import org.junit.Test; 46import org.junit.runner.RunWith; 47import org.mockito.InOrder; 48import org.mockito.Mock; 49import org.mockito.MockitoAnnotations; 50 51@RunWith(AndroidJUnit4.class) 52@SmallTest 53public class ItemTest { 54 55 private TextView mTitleView; 56 private TextView mSummaryView; 57 private ImageView mIconView; 58 private FrameLayout mIconContainer; 59 60 @Mock 61 private Observer mObserver; 62 63 @Before 64 public void setUp() { 65 MockitoAnnotations.initMocks(this); 66 } 67 68 @Test 69 public void testOnBindView() { 70 Item item = new Item(); 71 item.setTitle("TestTitle"); 72 item.setSummary("TestSummary"); 73 Drawable icon = new ShapeDrawable(); 74 icon.setLevel(4); 75 item.setIcon(icon); 76 View view = createLayout(); 77 78 mIconView.setImageLevel(1); 79 Drawable recycledIcon = new ShapeDrawable(); 80 mIconView.setImageDrawable(recycledIcon); 81 82 item.onBindView(view); 83 84 assertEquals("Title should be \"TestTitle\"", "TestTitle", mTitleView.getText().toString()); 85 assertEquals("Summary should be \"TestSummary\"", "TestSummary", 86 mSummaryView.getText().toString()); 87 assertSame("Icon should be the icon shape drawable", icon, mIconView.getDrawable()); 88 assertEquals("Recycled icon level should not change", 1, recycledIcon.getLevel()); 89 assertEquals("Icon should be level 4", 4, icon.getLevel()); 90 } 91 92 @Test 93 public void testSingleLineItem() { 94 Item item = new Item(); 95 item.setTitle("TestTitle"); 96 View view = createLayout(); 97 98 item.onBindView(view); 99 100 assertEquals("Title should be \"TestTitle\"", "TestTitle", mTitleView.getText().toString()); 101 assertEquals("Summary should be gone", View.GONE, mSummaryView.getVisibility()); 102 assertEquals("IconContainer should be gone", View.GONE, mIconContainer.getVisibility()); 103 } 104 105 @Test 106 public void testProperties() { 107 Item item = new Item(); 108 item.registerObserver(mObserver); 109 final InOrder inOrder = inOrder(mObserver); 110 111 item.setTitle("TestTitle"); 112 inOrder.verify(mObserver).onItemRangeChanged(eq(item), eq(0), eq(1)); 113 114 item.setSummary("TestSummary"); 115 inOrder.verify(mObserver).onItemRangeChanged(eq(item), eq(0), eq(1)); 116 117 item.setEnabled(false); 118 inOrder.verify(mObserver).onItemRangeChanged(eq(item), eq(0), eq(1)); 119 120 ShapeDrawable icon = new ShapeDrawable(); 121 item.setIcon(icon); 122 inOrder.verify(mObserver).onItemRangeChanged(eq(item), eq(0), eq(1)); 123 124 item.setId(12345); 125 126 item.setLayoutResource(56789); 127 inOrder.verify(mObserver).onItemRangeChanged(eq(item), eq(0), eq(1)); 128 129 assertEquals("Title should be \"TestTitle\"", "TestTitle", item.getTitle()); 130 assertEquals("Summary should be \"TestSummary\"", "TestSummary", item.getSummary()); 131 assertFalse("Enabled should be false", item.isEnabled()); 132 assertSame("Icon should be same as set", icon, item.getIcon()); 133 assertEquals("ID should be 12345", 12345, item.getId()); 134 assertEquals("Layout resource should be 56789", 56789, item.getLayoutResource()); 135 } 136 137 @Test 138 public void testDefaultValues() { 139 Item item = new Item(); 140 141 assertNull("Default title should be null", item.getTitle()); 142 assertNull("Default summary should be null", item.getSummary()); 143 assertNull("Default icon should be null", item.getIcon()); 144 assertTrue("Default enabled should be true", item.isEnabled()); 145 assertEquals("Default ID should be 0", 0, item.getId()); 146 assertEquals("Default layout resource should be R.layout.suw_items_text", 147 R.layout.suw_items_default, item.getLayoutResource()); 148 assertTrue("Default visible should be true", item.isVisible()); 149 } 150 151 @Test 152 public void testHierarchyImplementation() { 153 Item item = new Item(); 154 item.setId(12345); 155 156 assertEquals("getCount should be 1", 1, item.getCount()); 157 assertSame("getItemAt should return itself", item, item.getItemAt(0)); 158 assertSame("findItemById with same ID should return itself", item, 159 item.findItemById(12345)); 160 assertNull("findItemById with different ID should return null", item.findItemById(34567)); 161 } 162 163 @Test 164 public void testVisible() { 165 Item item = new Item(); 166 item.registerObserver(mObserver); 167 item.setVisible(false); 168 169 assertFalse("Item should not be visible", item.isVisible()); 170 assertEquals("Item count should be 0 when not visible", 0, item.getCount()); 171 172 verify(mObserver).onItemRangeRemoved(eq(item), eq(0), eq(1)); 173 174 item.setVisible(true); 175 verify(mObserver).onItemRangeInserted(eq(item), eq(0), eq(1)); 176 } 177 178 private ViewGroup createLayout() { 179 Context context = InstrumentationRegistry.getContext(); 180 ViewGroup root = new FrameLayout(context); 181 182 mTitleView = new TextView(context); 183 mTitleView.setId(R.id.suw_items_title); 184 root.addView(mTitleView); 185 186 mSummaryView = new TextView(context); 187 mSummaryView.setId(R.id.suw_items_summary); 188 root.addView(mSummaryView); 189 190 mIconContainer = new FrameLayout(context); 191 mIconContainer.setId(R.id.suw_items_icon_container); 192 root.addView(mIconContainer); 193 194 mIconView = new ImageView(context); 195 mIconView.setId(R.id.suw_items_icon); 196 mIconContainer.addView(mIconView); 197 198 return root; 199 } 200} 201