100358e4d12e6c7ba0f1da1fa9ad57f87da9b3b1aMaurice Lam/* 200358e4d12e6c7ba0f1da1fa9ad57f87da9b3b1aMaurice Lam * Copyright (C) 2016 The Android Open Source Project 300358e4d12e6c7ba0f1da1fa9ad57f87da9b3b1aMaurice Lam * 400358e4d12e6c7ba0f1da1fa9ad57f87da9b3b1aMaurice Lam * Licensed under the Apache License, Version 2.0 (the "License"); 500358e4d12e6c7ba0f1da1fa9ad57f87da9b3b1aMaurice Lam * you may not use this file except in compliance with the License. 600358e4d12e6c7ba0f1da1fa9ad57f87da9b3b1aMaurice Lam * You may obtain a copy of the License at 700358e4d12e6c7ba0f1da1fa9ad57f87da9b3b1aMaurice Lam * 800358e4d12e6c7ba0f1da1fa9ad57f87da9b3b1aMaurice Lam * http://www.apache.org/licenses/LICENSE-2.0 900358e4d12e6c7ba0f1da1fa9ad57f87da9b3b1aMaurice Lam * 1000358e4d12e6c7ba0f1da1fa9ad57f87da9b3b1aMaurice Lam * Unless required by applicable law or agreed to in writing, software 1100358e4d12e6c7ba0f1da1fa9ad57f87da9b3b1aMaurice Lam * distributed under the License is distributed on an "AS IS" BASIS, 1200358e4d12e6c7ba0f1da1fa9ad57f87da9b3b1aMaurice Lam * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1300358e4d12e6c7ba0f1da1fa9ad57f87da9b3b1aMaurice Lam * See the License for the specific language governing permissions and 1400358e4d12e6c7ba0f1da1fa9ad57f87da9b3b1aMaurice Lam * limitations under the License. 1500358e4d12e6c7ba0f1da1fa9ad57f87da9b3b1aMaurice Lam */ 1600358e4d12e6c7ba0f1da1fa9ad57f87da9b3b1aMaurice Lam 172831318df83781bb5bada256e35726612d225052Maurice Lampackage com.android.setupwizardlib.items; 1800358e4d12e6c7ba0f1da1fa9ad57f87da9b3b1aMaurice Lam 192614260933341bd4ea7bb37a3435f46f82cacef7Maurice Lamimport static org.junit.Assert.assertEquals; 202614260933341bd4ea7bb37a3435f46f82cacef7Maurice Lamimport static org.junit.Assert.assertFalse; 212831318df83781bb5bada256e35726612d225052Maurice Lamimport static org.junit.Assert.assertNotNull; 222614260933341bd4ea7bb37a3435f46f82cacef7Maurice Lamimport static org.junit.Assert.assertNull; 232614260933341bd4ea7bb37a3435f46f82cacef7Maurice Lamimport static org.junit.Assert.assertSame; 242614260933341bd4ea7bb37a3435f46f82cacef7Maurice Lamimport static org.junit.Assert.assertTrue; 252614260933341bd4ea7bb37a3435f46f82cacef7Maurice Lamimport static org.junit.Assert.fail; 262831318df83781bb5bada256e35726612d225052Maurice Lamimport static org.mockito.Matchers.any; 272831318df83781bb5bada256e35726612d225052Maurice Lamimport static org.mockito.Matchers.same; 282831318df83781bb5bada256e35726612d225052Maurice Lamimport static org.mockito.Mockito.mock; 292831318df83781bb5bada256e35726612d225052Maurice Lamimport static org.mockito.Mockito.never; 302831318df83781bb5bada256e35726612d225052Maurice Lamimport static org.mockito.Mockito.verify; 312831318df83781bb5bada256e35726612d225052Maurice Lamimport static org.robolectric.RuntimeEnvironment.application; 322831318df83781bb5bada256e35726612d225052Maurice Lam 332831318df83781bb5bada256e35726612d225052Maurice Lamimport android.content.Context; 3400358e4d12e6c7ba0f1da1fa9ad57f87da9b3b1aMaurice Lamimport android.text.TextUtils; 352831318df83781bb5bada256e35726612d225052Maurice Lamimport android.view.ContextThemeWrapper; 3600358e4d12e6c7ba0f1da1fa9ad57f87da9b3b1aMaurice Lamimport android.view.View; 3700358e4d12e6c7ba0f1da1fa9ad57f87da9b3b1aMaurice Lamimport android.view.ViewGroup; 3800358e4d12e6c7ba0f1da1fa9ad57f87da9b3b1aMaurice Lamimport android.widget.Button; 39a8e0755e1b526174fe42b0d7215d3c6a6106aca2Maurice Lamimport android.widget.FrameLayout; 4000358e4d12e6c7ba0f1da1fa9ad57f87da9b3b1aMaurice Lamimport android.widget.LinearLayout; 4100358e4d12e6c7ba0f1da1fa9ad57f87da9b3b1aMaurice Lam 422831318df83781bb5bada256e35726612d225052Maurice Lamimport com.android.setupwizardlib.BuildConfig; 4300358e4d12e6c7ba0f1da1fa9ad57f87da9b3b1aMaurice Lamimport com.android.setupwizardlib.R; 442831318df83781bb5bada256e35726612d225052Maurice Lamimport com.android.setupwizardlib.items.ButtonItem.OnClickListener; 452831318df83781bb5bada256e35726612d225052Maurice Lamimport com.android.setupwizardlib.robolectric.SuwLibRobolectricTestRunner; 4600358e4d12e6c7ba0f1da1fa9ad57f87da9b3b1aMaurice Lam 472614260933341bd4ea7bb37a3435f46f82cacef7Maurice Lamimport org.junit.Before; 482614260933341bd4ea7bb37a3435f46f82cacef7Maurice Lamimport org.junit.Test; 492614260933341bd4ea7bb37a3435f46f82cacef7Maurice Lamimport org.junit.runner.RunWith; 502831318df83781bb5bada256e35726612d225052Maurice Lamimport org.robolectric.annotation.Config; 512831318df83781bb5bada256e35726612d225052Maurice Lam 522831318df83781bb5bada256e35726612d225052Maurice Lam@RunWith(SuwLibRobolectricTestRunner.class) 532831318df83781bb5bada256e35726612d225052Maurice Lam@Config( 542831318df83781bb5bada256e35726612d225052Maurice Lam constants = BuildConfig.class, 55d3ffc713be68823409d5dc6d2d44bb21bde5bfd0Maurice Lam sdk = { Config.OLDEST_SDK, Config.NEWEST_SDK }) 562614260933341bd4ea7bb37a3435f46f82cacef7Maurice Lampublic class ButtonItemTest { 572614260933341bd4ea7bb37a3435f46f82cacef7Maurice Lam 5800358e4d12e6c7ba0f1da1fa9ad57f87da9b3b1aMaurice Lam private ViewGroup mParent; 592831318df83781bb5bada256e35726612d225052Maurice Lam private Context mContext; 6000358e4d12e6c7ba0f1da1fa9ad57f87da9b3b1aMaurice Lam 612614260933341bd4ea7bb37a3435f46f82cacef7Maurice Lam @Before 622831318df83781bb5bada256e35726612d225052Maurice Lam public void setUp() { 632831318df83781bb5bada256e35726612d225052Maurice Lam mContext = new ContextThemeWrapper(application, R.style.SuwThemeGlif_Light); 642831318df83781bb5bada256e35726612d225052Maurice Lam mParent = new LinearLayout(mContext); 6500358e4d12e6c7ba0f1da1fa9ad57f87da9b3b1aMaurice Lam } 6600358e4d12e6c7ba0f1da1fa9ad57f87da9b3b1aMaurice Lam 672614260933341bd4ea7bb37a3435f46f82cacef7Maurice Lam @Test 6800358e4d12e6c7ba0f1da1fa9ad57f87da9b3b1aMaurice Lam public void testDefaultItem() { 6900358e4d12e6c7ba0f1da1fa9ad57f87da9b3b1aMaurice Lam ButtonItem item = new ButtonItem(); 7000358e4d12e6c7ba0f1da1fa9ad57f87da9b3b1aMaurice Lam 7100358e4d12e6c7ba0f1da1fa9ad57f87da9b3b1aMaurice Lam assertTrue("ButtonItem should be enabled by default", item.isEnabled()); 7200358e4d12e6c7ba0f1da1fa9ad57f87da9b3b1aMaurice Lam assertEquals("ButtonItem should return count = 0", 0, item.getCount()); 7300358e4d12e6c7ba0f1da1fa9ad57f87da9b3b1aMaurice Lam assertEquals("ButtonItem should return layout resource = 0", 0, item.getLayoutResource()); 7400358e4d12e6c7ba0f1da1fa9ad57f87da9b3b1aMaurice Lam assertEquals("Default theme should be @style/SuwButtonItem", R.style.SuwButtonItem, 7500358e4d12e6c7ba0f1da1fa9ad57f87da9b3b1aMaurice Lam item.getTheme()); 7600358e4d12e6c7ba0f1da1fa9ad57f87da9b3b1aMaurice Lam assertNull("Default text should be null", item.getText()); 7700358e4d12e6c7ba0f1da1fa9ad57f87da9b3b1aMaurice Lam } 7800358e4d12e6c7ba0f1da1fa9ad57f87da9b3b1aMaurice Lam 792614260933341bd4ea7bb37a3435f46f82cacef7Maurice Lam @Test 8000358e4d12e6c7ba0f1da1fa9ad57f87da9b3b1aMaurice Lam public void testOnBindView() { 8100358e4d12e6c7ba0f1da1fa9ad57f87da9b3b1aMaurice Lam ButtonItem item = new ButtonItem(); 8200358e4d12e6c7ba0f1da1fa9ad57f87da9b3b1aMaurice Lam 8300358e4d12e6c7ba0f1da1fa9ad57f87da9b3b1aMaurice Lam try { 842831318df83781bb5bada256e35726612d225052Maurice Lam item.onBindView(new View(mContext)); 8500358e4d12e6c7ba0f1da1fa9ad57f87da9b3b1aMaurice Lam fail("Calling onBindView on ButtonItem should throw UnsupportedOperationException"); 8600358e4d12e6c7ba0f1da1fa9ad57f87da9b3b1aMaurice Lam } catch (UnsupportedOperationException e) { 8700358e4d12e6c7ba0f1da1fa9ad57f87da9b3b1aMaurice Lam // pass 8800358e4d12e6c7ba0f1da1fa9ad57f87da9b3b1aMaurice Lam } 8900358e4d12e6c7ba0f1da1fa9ad57f87da9b3b1aMaurice Lam } 9000358e4d12e6c7ba0f1da1fa9ad57f87da9b3b1aMaurice Lam 912614260933341bd4ea7bb37a3435f46f82cacef7Maurice Lam @Test 9200358e4d12e6c7ba0f1da1fa9ad57f87da9b3b1aMaurice Lam public void testCreateButton() { 9300358e4d12e6c7ba0f1da1fa9ad57f87da9b3b1aMaurice Lam TestButtonItem item = new TestButtonItem(); 9400358e4d12e6c7ba0f1da1fa9ad57f87da9b3b1aMaurice Lam final Button button = item.createButton(mParent); 9500358e4d12e6c7ba0f1da1fa9ad57f87da9b3b1aMaurice Lam 9600358e4d12e6c7ba0f1da1fa9ad57f87da9b3b1aMaurice Lam assertTrue("Default button should be enabled", button.isEnabled()); 9700358e4d12e6c7ba0f1da1fa9ad57f87da9b3b1aMaurice Lam assertTrue("Default button text should be empty", TextUtils.isEmpty(button.getText())); 9800358e4d12e6c7ba0f1da1fa9ad57f87da9b3b1aMaurice Lam } 9900358e4d12e6c7ba0f1da1fa9ad57f87da9b3b1aMaurice Lam 1002614260933341bd4ea7bb37a3435f46f82cacef7Maurice Lam @Test 10105acfbb2e7c7f2c992b530b98f8a9333ec6b17f0Ajay Nadathur public void testButtonItemSetsItsId() { 10205acfbb2e7c7f2c992b530b98f8a9333ec6b17f0Ajay Nadathur TestButtonItem item = new TestButtonItem(); 10305acfbb2e7c7f2c992b530b98f8a9333ec6b17f0Ajay Nadathur final int id = 12345; 10405acfbb2e7c7f2c992b530b98f8a9333ec6b17f0Ajay Nadathur item.setId(id); 10505acfbb2e7c7f2c992b530b98f8a9333ec6b17f0Ajay Nadathur 10605acfbb2e7c7f2c992b530b98f8a9333ec6b17f0Ajay Nadathur assertEquals("Button's id should be set", item.createButton(mParent).getId(), id); 10705acfbb2e7c7f2c992b530b98f8a9333ec6b17f0Ajay Nadathur } 10805acfbb2e7c7f2c992b530b98f8a9333ec6b17f0Ajay Nadathur 1092614260933341bd4ea7bb37a3435f46f82cacef7Maurice Lam @Test 110a8e0755e1b526174fe42b0d7215d3c6a6106aca2Maurice Lam public void testCreateButtonTwice() { 111a8e0755e1b526174fe42b0d7215d3c6a6106aca2Maurice Lam TestButtonItem item = new TestButtonItem(); 112a8e0755e1b526174fe42b0d7215d3c6a6106aca2Maurice Lam final Button button = item.createButton(mParent); 113a8e0755e1b526174fe42b0d7215d3c6a6106aca2Maurice Lam 1142831318df83781bb5bada256e35726612d225052Maurice Lam FrameLayout frameLayout = new FrameLayout(mContext); 115a8e0755e1b526174fe42b0d7215d3c6a6106aca2Maurice Lam frameLayout.addView(button); 116a8e0755e1b526174fe42b0d7215d3c6a6106aca2Maurice Lam 117a8e0755e1b526174fe42b0d7215d3c6a6106aca2Maurice Lam final Button button2 = item.createButton(mParent); 118a8e0755e1b526174fe42b0d7215d3c6a6106aca2Maurice Lam assertSame("createButton should be reused", button, button2); 119a8e0755e1b526174fe42b0d7215d3c6a6106aca2Maurice Lam assertNull("Should be removed from parent after createButton", button2.getParent()); 120a8e0755e1b526174fe42b0d7215d3c6a6106aca2Maurice Lam } 121a8e0755e1b526174fe42b0d7215d3c6a6106aca2Maurice Lam 1222614260933341bd4ea7bb37a3435f46f82cacef7Maurice Lam @Test 12300358e4d12e6c7ba0f1da1fa9ad57f87da9b3b1aMaurice Lam public void testSetEnabledTrue() { 12400358e4d12e6c7ba0f1da1fa9ad57f87da9b3b1aMaurice Lam TestButtonItem item = new TestButtonItem(); 12500358e4d12e6c7ba0f1da1fa9ad57f87da9b3b1aMaurice Lam item.setEnabled(true); 12600358e4d12e6c7ba0f1da1fa9ad57f87da9b3b1aMaurice Lam 12700358e4d12e6c7ba0f1da1fa9ad57f87da9b3b1aMaurice Lam final Button button = item.createButton(mParent); 12800358e4d12e6c7ba0f1da1fa9ad57f87da9b3b1aMaurice Lam assertTrue("ButtonItem should be enabled", item.isEnabled()); 12900358e4d12e6c7ba0f1da1fa9ad57f87da9b3b1aMaurice Lam assertTrue("Button should be enabled", button.isEnabled()); 13000358e4d12e6c7ba0f1da1fa9ad57f87da9b3b1aMaurice Lam } 13100358e4d12e6c7ba0f1da1fa9ad57f87da9b3b1aMaurice Lam 1322614260933341bd4ea7bb37a3435f46f82cacef7Maurice Lam @Test 13300358e4d12e6c7ba0f1da1fa9ad57f87da9b3b1aMaurice Lam public void testSetEnabledFalse() { 13400358e4d12e6c7ba0f1da1fa9ad57f87da9b3b1aMaurice Lam TestButtonItem item = new TestButtonItem(); 13500358e4d12e6c7ba0f1da1fa9ad57f87da9b3b1aMaurice Lam item.setEnabled(false); 13600358e4d12e6c7ba0f1da1fa9ad57f87da9b3b1aMaurice Lam 13700358e4d12e6c7ba0f1da1fa9ad57f87da9b3b1aMaurice Lam final Button button = item.createButton(mParent); 13800358e4d12e6c7ba0f1da1fa9ad57f87da9b3b1aMaurice Lam assertFalse("ButtonItem should be disabled", item.isEnabled()); 13900358e4d12e6c7ba0f1da1fa9ad57f87da9b3b1aMaurice Lam assertFalse("Button should be disabled", button.isEnabled()); 14000358e4d12e6c7ba0f1da1fa9ad57f87da9b3b1aMaurice Lam } 14100358e4d12e6c7ba0f1da1fa9ad57f87da9b3b1aMaurice Lam 1422614260933341bd4ea7bb37a3435f46f82cacef7Maurice Lam @Test 14300358e4d12e6c7ba0f1da1fa9ad57f87da9b3b1aMaurice Lam public void testSetText() { 14400358e4d12e6c7ba0f1da1fa9ad57f87da9b3b1aMaurice Lam TestButtonItem item = new TestButtonItem(); 14500358e4d12e6c7ba0f1da1fa9ad57f87da9b3b1aMaurice Lam item.setText("lorem ipsum"); 14600358e4d12e6c7ba0f1da1fa9ad57f87da9b3b1aMaurice Lam 14700358e4d12e6c7ba0f1da1fa9ad57f87da9b3b1aMaurice Lam final Button button = item.createButton(mParent); 14800358e4d12e6c7ba0f1da1fa9ad57f87da9b3b1aMaurice Lam assertEquals("ButtonItem text should be \"lorem ipsum\"", "lorem ipsum", item.getText()); 14900358e4d12e6c7ba0f1da1fa9ad57f87da9b3b1aMaurice Lam assertEquals("Button text should be \"lorem ipsum\"", "lorem ipsum", button.getText()); 15000358e4d12e6c7ba0f1da1fa9ad57f87da9b3b1aMaurice Lam } 15100358e4d12e6c7ba0f1da1fa9ad57f87da9b3b1aMaurice Lam 1522614260933341bd4ea7bb37a3435f46f82cacef7Maurice Lam @Test 15300358e4d12e6c7ba0f1da1fa9ad57f87da9b3b1aMaurice Lam public void testSetTheme() { 15400358e4d12e6c7ba0f1da1fa9ad57f87da9b3b1aMaurice Lam TestButtonItem item = new TestButtonItem(); 1552831318df83781bb5bada256e35726612d225052Maurice Lam item.setTheme(R.style.SuwButtonItem_Colored); 15600358e4d12e6c7ba0f1da1fa9ad57f87da9b3b1aMaurice Lam 15700358e4d12e6c7ba0f1da1fa9ad57f87da9b3b1aMaurice Lam final Button button = item.createButton(mParent); 1582831318df83781bb5bada256e35726612d225052Maurice Lam assertEquals("ButtonItem theme should be SuwButtonItem.Colored", 1592831318df83781bb5bada256e35726612d225052Maurice Lam R.style.SuwButtonItem_Colored, item.getTheme()); 1602831318df83781bb5bada256e35726612d225052Maurice Lam assertNotNull(button.getContext().getTheme()); 16100358e4d12e6c7ba0f1da1fa9ad57f87da9b3b1aMaurice Lam } 16200358e4d12e6c7ba0f1da1fa9ad57f87da9b3b1aMaurice Lam 1632614260933341bd4ea7bb37a3435f46f82cacef7Maurice Lam @Test 16400358e4d12e6c7ba0f1da1fa9ad57f87da9b3b1aMaurice Lam public void testOnClickListener() { 16500358e4d12e6c7ba0f1da1fa9ad57f87da9b3b1aMaurice Lam TestButtonItem item = new TestButtonItem(); 1662831318df83781bb5bada256e35726612d225052Maurice Lam final OnClickListener listener = mock(OnClickListener.class); 16700358e4d12e6c7ba0f1da1fa9ad57f87da9b3b1aMaurice Lam item.setOnClickListener(listener); 16800358e4d12e6c7ba0f1da1fa9ad57f87da9b3b1aMaurice Lam 1692831318df83781bb5bada256e35726612d225052Maurice Lam verify(listener, never()).onClick(any(ButtonItem.class)); 17000358e4d12e6c7ba0f1da1fa9ad57f87da9b3b1aMaurice Lam 17100358e4d12e6c7ba0f1da1fa9ad57f87da9b3b1aMaurice Lam final Button button = item.createButton(mParent); 17200358e4d12e6c7ba0f1da1fa9ad57f87da9b3b1aMaurice Lam button.performClick(); 17300358e4d12e6c7ba0f1da1fa9ad57f87da9b3b1aMaurice Lam 1742831318df83781bb5bada256e35726612d225052Maurice Lam verify(listener).onClick(same(item)); 17500358e4d12e6c7ba0f1da1fa9ad57f87da9b3b1aMaurice Lam } 17600358e4d12e6c7ba0f1da1fa9ad57f87da9b3b1aMaurice Lam 17700358e4d12e6c7ba0f1da1fa9ad57f87da9b3b1aMaurice Lam private static class TestButtonItem extends ButtonItem { 17800358e4d12e6c7ba0f1da1fa9ad57f87da9b3b1aMaurice Lam 17900358e4d12e6c7ba0f1da1fa9ad57f87da9b3b1aMaurice Lam @Override 18000358e4d12e6c7ba0f1da1fa9ad57f87da9b3b1aMaurice Lam public Button createButton(ViewGroup parent) { 18100358e4d12e6c7ba0f1da1fa9ad57f87da9b3b1aMaurice Lam // Make this method public for testing 18200358e4d12e6c7ba0f1da1fa9ad57f87da9b3b1aMaurice Lam return super.createButton(parent); 18300358e4d12e6c7ba0f1da1fa9ad57f87da9b3b1aMaurice Lam } 18400358e4d12e6c7ba0f1da1fa9ad57f87da9b3b1aMaurice Lam } 18500358e4d12e6c7ba0f1da1fa9ad57f87da9b3b1aMaurice Lam} 186