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