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 17package com.android.setupwizardlib.items; 18 19import static org.junit.Assert.assertEquals; 20import static org.junit.Assert.assertFalse; 21import static org.junit.Assert.assertNotNull; 22import static org.junit.Assert.assertNull; 23import static org.junit.Assert.assertSame; 24import static org.junit.Assert.assertTrue; 25import static org.junit.Assert.fail; 26import static org.mockito.Matchers.any; 27import static org.mockito.Matchers.same; 28import static org.mockito.Mockito.mock; 29import static org.mockito.Mockito.never; 30import static org.mockito.Mockito.verify; 31import static org.robolectric.RuntimeEnvironment.application; 32 33import android.content.Context; 34import android.text.TextUtils; 35import android.view.ContextThemeWrapper; 36import android.view.View; 37import android.view.ViewGroup; 38import android.widget.Button; 39import android.widget.FrameLayout; 40import android.widget.LinearLayout; 41 42import com.android.setupwizardlib.BuildConfig; 43import com.android.setupwizardlib.R; 44import com.android.setupwizardlib.items.ButtonItem.OnClickListener; 45import com.android.setupwizardlib.robolectric.SuwLibRobolectricTestRunner; 46 47import org.junit.Before; 48import org.junit.Test; 49import org.junit.runner.RunWith; 50import org.robolectric.annotation.Config; 51 52@RunWith(SuwLibRobolectricTestRunner.class) 53@Config( 54 constants = BuildConfig.class, 55 sdk = { Config.OLDEST_SDK, Config.NEWEST_SDK }) 56public class ButtonItemTest { 57 58 private ViewGroup mParent; 59 private Context mContext; 60 61 @Before 62 public void setUp() { 63 mContext = new ContextThemeWrapper(application, R.style.SuwThemeGlif_Light); 64 mParent = new LinearLayout(mContext); 65 } 66 67 @Test 68 public void testDefaultItem() { 69 ButtonItem item = new ButtonItem(); 70 71 assertTrue("ButtonItem should be enabled by default", item.isEnabled()); 72 assertEquals("ButtonItem should return count = 0", 0, item.getCount()); 73 assertEquals("ButtonItem should return layout resource = 0", 0, item.getLayoutResource()); 74 assertEquals("Default theme should be @style/SuwButtonItem", R.style.SuwButtonItem, 75 item.getTheme()); 76 assertNull("Default text should be null", item.getText()); 77 } 78 79 @Test 80 public void testOnBindView() { 81 ButtonItem item = new ButtonItem(); 82 83 try { 84 item.onBindView(new View(mContext)); 85 fail("Calling onBindView on ButtonItem should throw UnsupportedOperationException"); 86 } catch (UnsupportedOperationException e) { 87 // pass 88 } 89 } 90 91 @Test 92 public void testCreateButton() { 93 TestButtonItem item = new TestButtonItem(); 94 final Button button = item.createButton(mParent); 95 96 assertTrue("Default button should be enabled", button.isEnabled()); 97 assertTrue("Default button text should be empty", TextUtils.isEmpty(button.getText())); 98 } 99 100 @Test 101 public void testButtonItemSetsItsId() { 102 TestButtonItem item = new TestButtonItem(); 103 final int id = 12345; 104 item.setId(id); 105 106 assertEquals("Button's id should be set", item.createButton(mParent).getId(), id); 107 } 108 109 @Test 110 public void testCreateButtonTwice() { 111 TestButtonItem item = new TestButtonItem(); 112 final Button button = item.createButton(mParent); 113 114 FrameLayout frameLayout = new FrameLayout(mContext); 115 frameLayout.addView(button); 116 117 final Button button2 = item.createButton(mParent); 118 assertSame("createButton should be reused", button, button2); 119 assertNull("Should be removed from parent after createButton", button2.getParent()); 120 } 121 122 @Test 123 public void testSetEnabledTrue() { 124 TestButtonItem item = new TestButtonItem(); 125 item.setEnabled(true); 126 127 final Button button = item.createButton(mParent); 128 assertTrue("ButtonItem should be enabled", item.isEnabled()); 129 assertTrue("Button should be enabled", button.isEnabled()); 130 } 131 132 @Test 133 public void testSetEnabledFalse() { 134 TestButtonItem item = new TestButtonItem(); 135 item.setEnabled(false); 136 137 final Button button = item.createButton(mParent); 138 assertFalse("ButtonItem should be disabled", item.isEnabled()); 139 assertFalse("Button should be disabled", button.isEnabled()); 140 } 141 142 @Test 143 public void testSetText() { 144 TestButtonItem item = new TestButtonItem(); 145 item.setText("lorem ipsum"); 146 147 final Button button = item.createButton(mParent); 148 assertEquals("ButtonItem text should be \"lorem ipsum\"", "lorem ipsum", item.getText()); 149 assertEquals("Button text should be \"lorem ipsum\"", "lorem ipsum", button.getText()); 150 } 151 152 @Test 153 public void testSetTheme() { 154 TestButtonItem item = new TestButtonItem(); 155 item.setTheme(R.style.SuwButtonItem_Colored); 156 157 final Button button = item.createButton(mParent); 158 assertEquals("ButtonItem theme should be SuwButtonItem.Colored", 159 R.style.SuwButtonItem_Colored, item.getTheme()); 160 assertNotNull(button.getContext().getTheme()); 161 } 162 163 @Test 164 public void testOnClickListener() { 165 TestButtonItem item = new TestButtonItem(); 166 final OnClickListener listener = mock(OnClickListener.class); 167 item.setOnClickListener(listener); 168 169 verify(listener, never()).onClick(any(ButtonItem.class)); 170 171 final Button button = item.createButton(mParent); 172 button.performClick(); 173 174 verify(listener).onClick(same(item)); 175 } 176 177 private static class TestButtonItem extends ButtonItem { 178 179 @Override 180 public Button createButton(ViewGroup parent) { 181 // Make this method public for testing 182 return super.createButton(parent); 183 } 184 } 185} 186