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