18721e6e37afdda2d3aba487334f96e270a57ad19Maurice Lam/*
28721e6e37afdda2d3aba487334f96e270a57ad19Maurice Lam * Copyright (C) 2017 The Android Open Source Project
38721e6e37afdda2d3aba487334f96e270a57ad19Maurice Lam *
48721e6e37afdda2d3aba487334f96e270a57ad19Maurice Lam * Licensed under the Apache License, Version 2.0 (the "License");
58721e6e37afdda2d3aba487334f96e270a57ad19Maurice Lam * you may not use this file except in compliance with the License.
68721e6e37afdda2d3aba487334f96e270a57ad19Maurice Lam * You may obtain a copy of the License at
78721e6e37afdda2d3aba487334f96e270a57ad19Maurice Lam *
88721e6e37afdda2d3aba487334f96e270a57ad19Maurice Lam *      http://www.apache.org/licenses/LICENSE-2.0
98721e6e37afdda2d3aba487334f96e270a57ad19Maurice Lam *
108721e6e37afdda2d3aba487334f96e270a57ad19Maurice Lam * Unless required by applicable law or agreed to in writing, software
118721e6e37afdda2d3aba487334f96e270a57ad19Maurice Lam * distributed under the License is distributed on an "AS IS" BASIS,
128721e6e37afdda2d3aba487334f96e270a57ad19Maurice Lam * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
138721e6e37afdda2d3aba487334f96e270a57ad19Maurice Lam * See the License for the specific language governing permissions and
148721e6e37afdda2d3aba487334f96e270a57ad19Maurice Lam * limitations under the License.
158721e6e37afdda2d3aba487334f96e270a57ad19Maurice Lam */
168721e6e37afdda2d3aba487334f96e270a57ad19Maurice Lam
178721e6e37afdda2d3aba487334f96e270a57ad19Maurice Lampackage com.android.setupwizardlib.template;
188721e6e37afdda2d3aba487334f96e270a57ad19Maurice Lam
198721e6e37afdda2d3aba487334f96e270a57ad19Maurice Lamimport static org.junit.Assert.assertEquals;
208721e6e37afdda2d3aba487334f96e270a57ad19Maurice Lamimport static org.junit.Assert.assertNotNull;
218721e6e37afdda2d3aba487334f96e270a57ad19Maurice Lamimport static org.junit.Assert.assertNull;
228721e6e37afdda2d3aba487334f96e270a57ad19Maurice Lamimport static org.mockito.Matchers.eq;
238721e6e37afdda2d3aba487334f96e270a57ad19Maurice Lamimport static org.mockito.Mockito.doReturn;
248721e6e37afdda2d3aba487334f96e270a57ad19Maurice Lamimport static org.mockito.Mockito.spy;
258721e6e37afdda2d3aba487334f96e270a57ad19Maurice Lam
268721e6e37afdda2d3aba487334f96e270a57ad19Maurice Lamimport android.content.Context;
278721e6e37afdda2d3aba487334f96e270a57ad19Maurice Lamimport android.support.annotation.IdRes;
288721e6e37afdda2d3aba487334f96e270a57ad19Maurice Lamimport android.support.test.InstrumentationRegistry;
298721e6e37afdda2d3aba487334f96e270a57ad19Maurice Lamimport android.support.test.filters.SmallTest;
308721e6e37afdda2d3aba487334f96e270a57ad19Maurice Lamimport android.support.test.runner.AndroidJUnit4;
318721e6e37afdda2d3aba487334f96e270a57ad19Maurice Lamimport android.util.DisplayMetrics;
328721e6e37afdda2d3aba487334f96e270a57ad19Maurice Lamimport android.util.TypedValue;
338721e6e37afdda2d3aba487334f96e270a57ad19Maurice Lamimport android.view.View;
348721e6e37afdda2d3aba487334f96e270a57ad19Maurice Lamimport android.view.ViewStub;
358721e6e37afdda2d3aba487334f96e270a57ad19Maurice Lamimport android.widget.Button;
368721e6e37afdda2d3aba487334f96e270a57ad19Maurice Lamimport android.widget.FrameLayout;
378721e6e37afdda2d3aba487334f96e270a57ad19Maurice Lamimport android.widget.LinearLayout;
388721e6e37afdda2d3aba487334f96e270a57ad19Maurice Lam
398721e6e37afdda2d3aba487334f96e270a57ad19Maurice Lamimport com.android.setupwizardlib.TemplateLayout;
408721e6e37afdda2d3aba487334f96e270a57ad19Maurice Lamimport com.android.setupwizardlib.test.R;
418721e6e37afdda2d3aba487334f96e270a57ad19Maurice Lam
428721e6e37afdda2d3aba487334f96e270a57ad19Maurice Lamimport org.junit.Before;
438721e6e37afdda2d3aba487334f96e270a57ad19Maurice Lamimport org.junit.Test;
448721e6e37afdda2d3aba487334f96e270a57ad19Maurice Lamimport org.junit.runner.RunWith;
458721e6e37afdda2d3aba487334f96e270a57ad19Maurice Lam
468721e6e37afdda2d3aba487334f96e270a57ad19Maurice Lam@RunWith(AndroidJUnit4.class)
478721e6e37afdda2d3aba487334f96e270a57ad19Maurice Lam@SmallTest
488721e6e37afdda2d3aba487334f96e270a57ad19Maurice Lampublic class ButtonFooterMixinTest {
498721e6e37afdda2d3aba487334f96e270a57ad19Maurice Lam
508721e6e37afdda2d3aba487334f96e270a57ad19Maurice Lam    private Context mContext;
518721e6e37afdda2d3aba487334f96e270a57ad19Maurice Lam    private TemplateLayout mTemplateLayout;
528721e6e37afdda2d3aba487334f96e270a57ad19Maurice Lam
538721e6e37afdda2d3aba487334f96e270a57ad19Maurice Lam    // The parent view to contain the view stub and views it inflates.
548721e6e37afdda2d3aba487334f96e270a57ad19Maurice Lam    private FrameLayout mStubParent;
558721e6e37afdda2d3aba487334f96e270a57ad19Maurice Lam    private ViewStub mFooterStub;
568721e6e37afdda2d3aba487334f96e270a57ad19Maurice Lam
578721e6e37afdda2d3aba487334f96e270a57ad19Maurice Lam    @Before
588721e6e37afdda2d3aba487334f96e270a57ad19Maurice Lam    public void setUp() {
598721e6e37afdda2d3aba487334f96e270a57ad19Maurice Lam        mContext = InstrumentationRegistry.getTargetContext();
608721e6e37afdda2d3aba487334f96e270a57ad19Maurice Lam        mTemplateLayout = spy(new TemplateLayout(mContext, R.layout.test_template,
618721e6e37afdda2d3aba487334f96e270a57ad19Maurice Lam                R.id.suw_layout_content));
628721e6e37afdda2d3aba487334f96e270a57ad19Maurice Lam
638721e6e37afdda2d3aba487334f96e270a57ad19Maurice Lam        mFooterStub = new ViewStub(mContext, R.layout.suw_glif_footer_button_bar);
648721e6e37afdda2d3aba487334f96e270a57ad19Maurice Lam        mStubParent = new FrameLayout(mContext);
658721e6e37afdda2d3aba487334f96e270a57ad19Maurice Lam        mStubParent.addView(mFooterStub);
668721e6e37afdda2d3aba487334f96e270a57ad19Maurice Lam        doReturn(mFooterStub).when(mTemplateLayout).findManagedViewById(eq(R.id.suw_layout_footer));
678721e6e37afdda2d3aba487334f96e270a57ad19Maurice Lam    }
688721e6e37afdda2d3aba487334f96e270a57ad19Maurice Lam
698721e6e37afdda2d3aba487334f96e270a57ad19Maurice Lam    @Test
708721e6e37afdda2d3aba487334f96e270a57ad19Maurice Lam    public void testAddButton() {
718721e6e37afdda2d3aba487334f96e270a57ad19Maurice Lam        ButtonFooterMixin mixin = new ButtonFooterMixin(mTemplateLayout);
728721e6e37afdda2d3aba487334f96e270a57ad19Maurice Lam        final Button button = mixin.addButton("foobar", R.style.SuwGlifButton_Primary);
738721e6e37afdda2d3aba487334f96e270a57ad19Maurice Lam
748721e6e37afdda2d3aba487334f96e270a57ad19Maurice Lam        assertNotNull(button);
758721e6e37afdda2d3aba487334f96e270a57ad19Maurice Lam        @IdRes final int id = 12345;
768721e6e37afdda2d3aba487334f96e270a57ad19Maurice Lam        button.setId(id);
778721e6e37afdda2d3aba487334f96e270a57ad19Maurice Lam        assertNotNull(mStubParent.findViewById(id));
788721e6e37afdda2d3aba487334f96e270a57ad19Maurice Lam
798721e6e37afdda2d3aba487334f96e270a57ad19Maurice Lam        assertEquals("foobar", button.getText());
808721e6e37afdda2d3aba487334f96e270a57ad19Maurice Lam
818721e6e37afdda2d3aba487334f96e270a57ad19Maurice Lam        // Make sure the style is applied by checking the paddings
828721e6e37afdda2d3aba487334f96e270a57ad19Maurice Lam        assertEquals(dp2Px(16), button.getPaddingLeft());
838721e6e37afdda2d3aba487334f96e270a57ad19Maurice Lam        assertEquals(dp2Px(16), button.getPaddingRight());
848721e6e37afdda2d3aba487334f96e270a57ad19Maurice Lam    }
858721e6e37afdda2d3aba487334f96e270a57ad19Maurice Lam
868721e6e37afdda2d3aba487334f96e270a57ad19Maurice Lam    @Test
878721e6e37afdda2d3aba487334f96e270a57ad19Maurice Lam    public void testAddButtonTextRes() {
888721e6e37afdda2d3aba487334f96e270a57ad19Maurice Lam        ButtonFooterMixin mixin = new ButtonFooterMixin(mTemplateLayout);
898721e6e37afdda2d3aba487334f96e270a57ad19Maurice Lam        final Button button = mixin.addButton(R.string.suw_next_button_label,
908721e6e37afdda2d3aba487334f96e270a57ad19Maurice Lam                R.style.SuwGlifButton_Primary);
918721e6e37afdda2d3aba487334f96e270a57ad19Maurice Lam
928721e6e37afdda2d3aba487334f96e270a57ad19Maurice Lam        assertNotNull(button);
938721e6e37afdda2d3aba487334f96e270a57ad19Maurice Lam        button.setTag("button");
948721e6e37afdda2d3aba487334f96e270a57ad19Maurice Lam        assertNotNull(mStubParent.findViewWithTag("button"));
958721e6e37afdda2d3aba487334f96e270a57ad19Maurice Lam
968721e6e37afdda2d3aba487334f96e270a57ad19Maurice Lam        assertEquals("Next", button.getText());
978721e6e37afdda2d3aba487334f96e270a57ad19Maurice Lam
988721e6e37afdda2d3aba487334f96e270a57ad19Maurice Lam        // Make sure the style is applied by checking the paddings
998721e6e37afdda2d3aba487334f96e270a57ad19Maurice Lam        assertEquals(dp2Px(16), button.getPaddingLeft());
1008721e6e37afdda2d3aba487334f96e270a57ad19Maurice Lam        assertEquals(dp2Px(16), button.getPaddingRight());
1018721e6e37afdda2d3aba487334f96e270a57ad19Maurice Lam    }
1028721e6e37afdda2d3aba487334f96e270a57ad19Maurice Lam
1038721e6e37afdda2d3aba487334f96e270a57ad19Maurice Lam    @Test
1048721e6e37afdda2d3aba487334f96e270a57ad19Maurice Lam    public void testAddSpace() {
1058721e6e37afdda2d3aba487334f96e270a57ad19Maurice Lam        ButtonFooterMixin mixin = new ButtonFooterMixin(mTemplateLayout);
1068721e6e37afdda2d3aba487334f96e270a57ad19Maurice Lam        mixin.addButton("foo", R.style.SuwGlifButton_Secondary);
1078721e6e37afdda2d3aba487334f96e270a57ad19Maurice Lam        final View space = mixin.addSpace();
1088721e6e37afdda2d3aba487334f96e270a57ad19Maurice Lam        mixin.addButton("bar", R.style.SuwGlifButton_Primary);
1098721e6e37afdda2d3aba487334f96e270a57ad19Maurice Lam
1108721e6e37afdda2d3aba487334f96e270a57ad19Maurice Lam        space.setTag("space");
1118721e6e37afdda2d3aba487334f96e270a57ad19Maurice Lam        assertNotNull(mStubParent.findViewWithTag("space"));
1128721e6e37afdda2d3aba487334f96e270a57ad19Maurice Lam        assertEquals("Space should have weight of 1",
1138721e6e37afdda2d3aba487334f96e270a57ad19Maurice Lam                1f, ((LinearLayout.LayoutParams) space.getLayoutParams()).weight, 0.001);
1148721e6e37afdda2d3aba487334f96e270a57ad19Maurice Lam    }
1158721e6e37afdda2d3aba487334f96e270a57ad19Maurice Lam
1168721e6e37afdda2d3aba487334f96e270a57ad19Maurice Lam    @Test
1178721e6e37afdda2d3aba487334f96e270a57ad19Maurice Lam    public void testRemoveButton() {
1188721e6e37afdda2d3aba487334f96e270a57ad19Maurice Lam        ButtonFooterMixin mixin = new ButtonFooterMixin(mTemplateLayout);
1198721e6e37afdda2d3aba487334f96e270a57ad19Maurice Lam        final Button fooButton = mixin.addButton("foo", R.style.SuwGlifButton_Secondary);
1208721e6e37afdda2d3aba487334f96e270a57ad19Maurice Lam        final Button barButton = mixin.addButton("bar", R.style.SuwGlifButton_Secondary);
1218721e6e37afdda2d3aba487334f96e270a57ad19Maurice Lam
1228721e6e37afdda2d3aba487334f96e270a57ad19Maurice Lam        fooButton.setTag("foo");
1238721e6e37afdda2d3aba487334f96e270a57ad19Maurice Lam        barButton.setTag("bar");
1248721e6e37afdda2d3aba487334f96e270a57ad19Maurice Lam        assertNotNull("Foo button should exist", mStubParent.findViewWithTag("foo"));
1258721e6e37afdda2d3aba487334f96e270a57ad19Maurice Lam        assertNotNull("Bar button should exist", mStubParent.findViewWithTag("bar"));
1268721e6e37afdda2d3aba487334f96e270a57ad19Maurice Lam
1278721e6e37afdda2d3aba487334f96e270a57ad19Maurice Lam        mixin.removeButton(fooButton);
1288721e6e37afdda2d3aba487334f96e270a57ad19Maurice Lam
1298721e6e37afdda2d3aba487334f96e270a57ad19Maurice Lam        assertNull("Foo button should be removed", mStubParent.findViewWithTag("foo"));
1308721e6e37afdda2d3aba487334f96e270a57ad19Maurice Lam        assertNotNull("Bar button should not be removed", mStubParent.findViewWithTag("bar"));
1318721e6e37afdda2d3aba487334f96e270a57ad19Maurice Lam    }
1328721e6e37afdda2d3aba487334f96e270a57ad19Maurice Lam
1338721e6e37afdda2d3aba487334f96e270a57ad19Maurice Lam    @Test
1348721e6e37afdda2d3aba487334f96e270a57ad19Maurice Lam    public void testRemoveSpace() {
1358721e6e37afdda2d3aba487334f96e270a57ad19Maurice Lam        ButtonFooterMixin mixin = new ButtonFooterMixin(mTemplateLayout);
1368721e6e37afdda2d3aba487334f96e270a57ad19Maurice Lam        final Button fooButton = mixin.addButton("foo", R.style.SuwGlifButton_Secondary);
1378721e6e37afdda2d3aba487334f96e270a57ad19Maurice Lam        final View space = mixin.addSpace();
1388721e6e37afdda2d3aba487334f96e270a57ad19Maurice Lam
1398721e6e37afdda2d3aba487334f96e270a57ad19Maurice Lam        fooButton.setTag("foo");
1408721e6e37afdda2d3aba487334f96e270a57ad19Maurice Lam        space.setTag("space");
1418721e6e37afdda2d3aba487334f96e270a57ad19Maurice Lam        assertNotNull("Foo button should exist", mStubParent.findViewWithTag("foo"));
1428721e6e37afdda2d3aba487334f96e270a57ad19Maurice Lam        assertNotNull("space should exist", mStubParent.findViewWithTag("space"));
1438721e6e37afdda2d3aba487334f96e270a57ad19Maurice Lam
1448721e6e37afdda2d3aba487334f96e270a57ad19Maurice Lam        mixin.removeSpace(space);
1458721e6e37afdda2d3aba487334f96e270a57ad19Maurice Lam
1468721e6e37afdda2d3aba487334f96e270a57ad19Maurice Lam        assertNotNull("Foo button should not be removed", mStubParent.findViewWithTag("foo"));
1478721e6e37afdda2d3aba487334f96e270a57ad19Maurice Lam        assertNull("Space should be removed", mStubParent.findViewWithTag("space"));
1488721e6e37afdda2d3aba487334f96e270a57ad19Maurice Lam    }
1498721e6e37afdda2d3aba487334f96e270a57ad19Maurice Lam
1508721e6e37afdda2d3aba487334f96e270a57ad19Maurice Lam    @Test
1518721e6e37afdda2d3aba487334f96e270a57ad19Maurice Lam    public void testRemoveAllViews() {
1528721e6e37afdda2d3aba487334f96e270a57ad19Maurice Lam        ButtonFooterMixin mixin = new ButtonFooterMixin(mTemplateLayout);
1538721e6e37afdda2d3aba487334f96e270a57ad19Maurice Lam        final Button fooButton = mixin.addButton("foo", R.style.SuwGlifButton_Secondary);
1548721e6e37afdda2d3aba487334f96e270a57ad19Maurice Lam        final View space = mixin.addSpace();
1558721e6e37afdda2d3aba487334f96e270a57ad19Maurice Lam
1568721e6e37afdda2d3aba487334f96e270a57ad19Maurice Lam        fooButton.setTag("foo");
1578721e6e37afdda2d3aba487334f96e270a57ad19Maurice Lam        space.setTag("space");
1588721e6e37afdda2d3aba487334f96e270a57ad19Maurice Lam        assertNotNull("Foo button should exist", mStubParent.findViewWithTag("foo"));
1598721e6e37afdda2d3aba487334f96e270a57ad19Maurice Lam        assertNotNull("space should exist", mStubParent.findViewWithTag("space"));
1608721e6e37afdda2d3aba487334f96e270a57ad19Maurice Lam
1618721e6e37afdda2d3aba487334f96e270a57ad19Maurice Lam        mixin.removeAllViews();
1628721e6e37afdda2d3aba487334f96e270a57ad19Maurice Lam
1638721e6e37afdda2d3aba487334f96e270a57ad19Maurice Lam        assertNull("Foo button should be removed", mStubParent.findViewWithTag("foo"));
1648721e6e37afdda2d3aba487334f96e270a57ad19Maurice Lam        assertNull("Space should be removed", mStubParent.findViewWithTag("space"));
1658721e6e37afdda2d3aba487334f96e270a57ad19Maurice Lam    }
1668721e6e37afdda2d3aba487334f96e270a57ad19Maurice Lam
1678721e6e37afdda2d3aba487334f96e270a57ad19Maurice Lam    private int dp2Px(float dp) {
1688721e6e37afdda2d3aba487334f96e270a57ad19Maurice Lam        DisplayMetrics displayMetrics = mContext.getResources().getDisplayMetrics();
1698721e6e37afdda2d3aba487334f96e270a57ad19Maurice Lam        return (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, dp, displayMetrics);
1708721e6e37afdda2d3aba487334f96e270a57ad19Maurice Lam    }
1718721e6e37afdda2d3aba487334f96e270a57ad19Maurice Lam}
172