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