summaryrefslogtreecommitdiff
path: root/library/test/instrumentation/src/com/android/setupwizardlib/test/SetupWizardLayoutTest.java
blob: 531d69e22ea2e49880eb845f6e56e232a94eca6a (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
/*
 * Copyright (C) 2015 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package com.android.setupwizardlib.test;

import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertSame;
import static org.junit.Assert.assertTrue;

import android.content.Context;
import android.graphics.Color;
import android.graphics.drawable.ColorDrawable;
import android.os.Parcelable;
import android.support.test.InstrumentationRegistry;
import android.support.test.filters.SmallTest;
import android.support.test.runner.AndroidJUnit4;
import android.util.SparseArray;
import android.view.AbsSavedState;
import android.view.ContextThemeWrapper;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.ProgressBar;
import android.widget.TextView;

import androidx.annotation.IdRes;

import com.android.setupwizardlib.SetupWizardLayout;
import com.android.setupwizardlib.template.HeaderMixin;
import com.android.setupwizardlib.template.NavigationBarMixin;
import com.android.setupwizardlib.template.ProgressBarMixin;
import com.android.setupwizardlib.view.NavigationBar;

import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;

@RunWith(AndroidJUnit4.class)
@SmallTest
public class SetupWizardLayoutTest {

    @IdRes
    private static final int ID1234 = 1234;

    private Context mContext;

    @Before
    public void setUp() throws Exception {
        mContext = new ContextThemeWrapper(InstrumentationRegistry.getContext(),
                R.style.SuwThemeMaterial_Light);
    }

    @Test
    public void testDefaultTemplate() {
        SetupWizardLayout layout = new SetupWizardLayout(mContext);
        assertDefaultTemplateInflated(layout);
    }

    @Test
    public void testSetHeaderText() {
        SetupWizardLayout layout = new SetupWizardLayout(mContext);
        TextView title = (TextView) layout.findViewById(R.id.suw_layout_title);
        layout.setHeaderText("Abracadabra");
        assertEquals("Header text should be \"Abracadabra\"", "Abracadabra", title.getText());
    }

    @Test
    public void testAddView() {
        SetupWizardLayout layout = new SetupWizardLayout(mContext);
        TextView tv = new TextView(mContext);
        tv.setId(R.id.test_view_id);
        layout.addView(tv);
        assertDefaultTemplateInflated(layout);
        View view = layout.findViewById(R.id.test_view_id);
        assertSame("The view added should be the same text view", tv, view);
    }

    @Test
    public void testInflateFromXml() {
        LayoutInflater inflater = LayoutInflater.from(mContext);
        SetupWizardLayout layout = (SetupWizardLayout) inflater.inflate(R.layout.test_layout, null);
        assertDefaultTemplateInflated(layout);
        View content = layout.findViewById(R.id.test_content);
        assertTrue("@id/test_content should be a TextView", content instanceof TextView);
    }

    @Test
    public void testCustomTemplate() {
        SetupWizardLayout layout = new SetupWizardLayout(mContext, R.layout.test_template);
        View templateView = layout.findViewById(R.id.test_template_view);
        assertNotNull("@id/test_template_view should exist in template", templateView);

        TextView tv = new TextView(mContext);
        tv.setId(R.id.test_view_id);
        layout.addView(tv);

        templateView = layout.findViewById(R.id.test_template_view);
        assertNotNull("@id/test_template_view should exist in template", templateView);
        View contentView = layout.findViewById(R.id.test_view_id);
        assertSame("The view added should be the same text view", tv, contentView);

        // The following methods should be no-ops because the custom template doesn't contain the
        // corresponding optional views. Just check that they don't throw exceptions.
        layout.setHeaderText("Abracadabra");
        layout.setIllustration(new ColorDrawable(Color.MAGENTA));
        layout.setLayoutBackground(new ColorDrawable(Color.RED));
    }

    @Test
    public void testGetNavigationBar() {
        final SetupWizardLayout layout = new SetupWizardLayout(mContext);
        final NavigationBar navigationBar = layout.getNavigationBar();
        assertEquals("Navigation bar should have ID = @id/suw_layout_navigation_bar",
                R.id.suw_layout_navigation_bar, navigationBar.getId());
    }

    @Test
    public void testGetNavigationBarNull() {
        // test_template does not have navigation bar so getNavigationBar() should return null.
        final SetupWizardLayout layout = new SetupWizardLayout(mContext, R.layout.test_template);
        final NavigationBar navigationBar = layout.getNavigationBar();
        assertNull("getNavigationBar() in test_template should return null", navigationBar);
    }

    @Test
    public void testShowProgressBar() {
        final SetupWizardLayout layout = new SetupWizardLayout(mContext);
        layout.showProgressBar();
        assertTrue("Progress bar should be shown", layout.isProgressBarShown());
        final View progressBar = layout.findViewById(R.id.suw_layout_progress);
        assertTrue("Progress bar view should be shown",
                progressBar instanceof ProgressBar && progressBar.getVisibility() == View.VISIBLE);
    }

    @Test
    public void testHideProgressBar() {
        final SetupWizardLayout layout = new SetupWizardLayout(mContext);
        layout.showProgressBar();
        assertTrue("Progress bar should be shown", layout.isProgressBarShown());
        layout.hideProgressBar();
        assertFalse("Progress bar should be hidden", layout.isProgressBarShown());
        final View progressBar = layout.findViewById(R.id.suw_layout_progress);
        assertTrue("Progress bar view should exist",
                progressBar == null || progressBar.getVisibility() != View.VISIBLE);
    }

    @Test
    public void testShowProgressBarNotExist() {
        // test_template does not have progress bar, so showNavigationBar() should do nothing.
        final SetupWizardLayout layout = new SetupWizardLayout(mContext, R.layout.test_template);
        layout.showProgressBar();
        assertFalse("Progress bar should not be shown", layout.isProgressBarShown());
    }

    @Test
    public void testNonMaterialTheme() {
        mContext = new ContextThemeWrapper(InstrumentationRegistry.getContext(),
                android.R.style.Theme);
        new SetupWizardLayout(mContext);
        // Inflating with a non-Material theme should not crash
    }

    @Test
    public void testOnRestoreFromInstanceState() {
        final SetupWizardLayout layout = new SetupWizardLayout(mContext);
        layout.setId(ID1234);

        SparseArray<Parcelable> container = new SparseArray<>();
        layout.saveHierarchyState(container);

        final SetupWizardLayout layout2 = new SetupWizardLayout(mContext);
        layout2.setId(ID1234);
        layout2.restoreHierarchyState(container);

        assertFalse("Progress bar should not be shown", layout2.isProgressBarShown());
    }

    @Test
    public void testOnRestoreFromInstanceStateProgressBarShown() {
        final SetupWizardLayout layout = new SetupWizardLayout(mContext);
        layout.setId(ID1234);

        layout.setProgressBarShown(true);

        SparseArray<Parcelable> container = new SparseArray<>();
        layout.saveHierarchyState(container);

        final SetupWizardLayout layout2 = new SetupWizardLayout(mContext);
        layout2.setId(ID1234);
        layout2.restoreHierarchyState(container);

        assertTrue("Progress bar should be shown", layout2.isProgressBarShown());
    }

    @Test
    public void testOnRestoreFromIncompatibleInstanceState() {
        final SetupWizardLayout layout = new SetupWizardLayout(mContext);
        layout.setId(ID1234);

        SparseArray<Parcelable> container = new SparseArray<>();
        container.put(1234, AbsSavedState.EMPTY_STATE);
        layout.restoreHierarchyState(container);

        // SetupWizardLayout shouldn't crash with incompatible Parcelable

        assertFalse("Progress bar should not be shown", layout.isProgressBarShown());
    }

    @Test
    public void testGetMixins() {
        final SetupWizardLayout layout = new SetupWizardLayout(mContext);
        assertNotNull("SetupWizardLayout should have header mixin",
                layout.getMixin(HeaderMixin.class));
        assertNotNull("SetupWizardLayout should have progress bar mixin",
                layout.getMixin(ProgressBarMixin.class));
        assertNotNull("SetupWizardLayout should have navigation bar mixin",
                layout.getMixin(NavigationBarMixin.class));
    }

    private void assertDefaultTemplateInflated(SetupWizardLayout layout) {
        View decorView = layout.findViewById(R.id.suw_layout_decor);
        View navbar = layout.findViewById(R.id.suw_layout_navigation_bar);
        View title = layout.findViewById(R.id.suw_layout_title);
        assertNotNull("@id/suw_layout_decor_view should not be null", decorView);
        assertTrue("@id/suw_layout_navigation_bar should be an instance of NavigationBar",
                navbar instanceof NavigationBar);
        assertNotNull("@id/suw_layout_title should not be null", title);
    }
}