ViewGroupTest.java revision 88fd0dbccc29a37545c186115f2a6b6f91302a56
133873d2b41a5cd2597b20a4e88eb8942944c0f23Tyler Schultzpackage com.xtremelabs.robolectric.shadows; 2a89236397e869467b3fc6f7208f551da61235795Christian Williams & Tyler Schultz 386e98619f5f1b5f6b1fd5742ba911d7ebc83c2ddChristian Williamsimport android.app.Application; 4a89236397e869467b3fc6f7208f551da61235795Christian Williams & Tyler Schultzimport android.view.View; 5a89236397e869467b3fc6f7208f551da61235795Christian Williams & Tyler Schultzimport android.view.ViewGroup; 6a89236397e869467b3fc6f7208f551da61235795Christian Williams & Tyler Schultzimport android.widget.FrameLayout; 786e98619f5f1b5f6b1fd5742ba911d7ebc83c2ddChristian Williamsimport com.xtremelabs.robolectric.R; 807257335f88da163910cc0bd039e6163edc38580Gregg Van Hove & Phil Goodwinimport com.xtremelabs.robolectric.WithTestDefaultsRunner; 986e98619f5f1b5f6b1fd5742ba911d7ebc83c2ddChristian Williamsimport com.xtremelabs.robolectric.res.ResourceLoader; 10f68306afa7b75d4e375d00d433f3432ffb68d4e4unknownimport org.junit.After; 11a89236397e869467b3fc6f7208f551da61235795Christian Williams & Tyler Schultzimport org.junit.Before; 12a89236397e869467b3fc6f7208f551da61235795Christian Williams & Tyler Schultzimport org.junit.Test; 13a89236397e869467b3fc6f7208f551da61235795Christian Williams & Tyler Schultzimport org.junit.runner.RunWith; 14a89236397e869467b3fc6f7208f551da61235795Christian Williams & Tyler Schultz 1586e98619f5f1b5f6b1fd5742ba911d7ebc83c2ddChristian Williamsimport java.io.ByteArrayOutputStream; 1686e98619f5f1b5f6b1fd5742ba911d7ebc83c2ddChristian Williamsimport java.io.PrintStream; 1786e98619f5f1b5f6b1fd5742ba911d7ebc83c2ddChristian Williams 1886e98619f5f1b5f6b1fd5742ba911d7ebc83c2ddChristian Williamsimport static com.xtremelabs.robolectric.Robolectric.shadowOf; 19a89236397e869467b3fc6f7208f551da61235795Christian Williams & Tyler Schultzimport static org.hamcrest.CoreMatchers.equalTo; 20a89236397e869467b3fc6f7208f551da61235795Christian Williams & Tyler Schultzimport static org.hamcrest.CoreMatchers.sameInstance; 21a89236397e869467b3fc6f7208f551da61235795Christian Williams & Tyler Schultzimport static org.hamcrest.MatcherAssert.assertThat; 22a89236397e869467b3fc6f7208f551da61235795Christian Williams & Tyler Schultzimport static org.hamcrest.core.IsNull.nullValue; 23adc0e08f20f0c0df8303e304c460865f1b25e190Christian Williamsimport static org.junit.Assert.*; 24a89236397e869467b3fc6f7208f551da61235795Christian Williams & Tyler Schultz 2507257335f88da163910cc0bd039e6163edc38580Gregg Van Hove & Phil Goodwin@RunWith(WithTestDefaultsRunner.class) 26a89236397e869467b3fc6f7208f551da61235795Christian Williams & Tyler Schultzpublic class ViewGroupTest { 2740c6251719cccc0a84ae99c976d2836b14374ce6Christian Williams private String defaultLineSeparator; 289729911f8638b6bb4d55b3d67e6d68a6b3f19dc7Phil Goodwin private ViewGroup root; 299729911f8638b6bb4d55b3d67e6d68a6b3f19dc7Phil Goodwin private View child1; 309729911f8638b6bb4d55b3d67e6d68a6b3f19dc7Phil Goodwin private View child2; 319729911f8638b6bb4d55b3d67e6d68a6b3f19dc7Phil Goodwin private ViewGroup child3; 329729911f8638b6bb4d55b3d67e6d68a6b3f19dc7Phil Goodwin private View child3a; 339729911f8638b6bb4d55b3d67e6d68a6b3f19dc7Phil Goodwin private View child3b; 34a89236397e869467b3fc6f7208f551da61235795Christian Williams & Tyler Schultz 35a89236397e869467b3fc6f7208f551da61235795Christian Williams & Tyler Schultz @Before public void setUp() throws Exception { 3686e98619f5f1b5f6b1fd5742ba911d7ebc83c2ddChristian Williams Application context = new Application(); 37e04e87dd1d1b5399264d7be0ed3ae8670dc175a8Ryan Richard ShadowApplication.bind(context, new ResourceLoader(10, R.class, null, null)); 3886e98619f5f1b5f6b1fd5742ba911d7ebc83c2ddChristian Williams 3986e98619f5f1b5f6b1fd5742ba911d7ebc83c2ddChristian Williams root = new FrameLayout(context); 409729911f8638b6bb4d55b3d67e6d68a6b3f19dc7Phil Goodwin 4186e98619f5f1b5f6b1fd5742ba911d7ebc83c2ddChristian Williams child1 = new View(context); 4286e98619f5f1b5f6b1fd5742ba911d7ebc83c2ddChristian Williams child2 = new View(context); 4386e98619f5f1b5f6b1fd5742ba911d7ebc83c2ddChristian Williams child3 = new FrameLayout(context); 4486e98619f5f1b5f6b1fd5742ba911d7ebc83c2ddChristian Williams child3a = new View(context); 4586e98619f5f1b5f6b1fd5742ba911d7ebc83c2ddChristian Williams child3b = new View(context); 469729911f8638b6bb4d55b3d67e6d68a6b3f19dc7Phil Goodwin 479729911f8638b6bb4d55b3d67e6d68a6b3f19dc7Phil Goodwin root.addView(child1); 489729911f8638b6bb4d55b3d67e6d68a6b3f19dc7Phil Goodwin root.addView(child2); 499729911f8638b6bb4d55b3d67e6d68a6b3f19dc7Phil Goodwin root.addView(child3); 509729911f8638b6bb4d55b3d67e6d68a6b3f19dc7Phil Goodwin 519729911f8638b6bb4d55b3d67e6d68a6b3f19dc7Phil Goodwin child3.addView(child3a); 529729911f8638b6bb4d55b3d67e6d68a6b3f19dc7Phil Goodwin child3.addView(child3b); 5340c6251719cccc0a84ae99c976d2836b14374ce6Christian Williams 54f68306afa7b75d4e375d00d433f3432ffb68d4e4unknown defaultLineSeparator = System.getProperty("line.separator"); 55f68306afa7b75d4e375d00d433f3432ffb68d4e4unknown System.setProperty("line.separator", "\n"); 56f68306afa7b75d4e375d00d433f3432ffb68d4e4unknown } 5740c6251719cccc0a84ae99c976d2836b14374ce6Christian Williams 58f68306afa7b75d4e375d00d433f3432ffb68d4e4unknown @After 59f68306afa7b75d4e375d00d433f3432ffb68d4e4unknown public void tearDown() throws Exception { 6040c6251719cccc0a84ae99c976d2836b14374ce6Christian Williams System.setProperty("line.separator", defaultLineSeparator); 61a89236397e869467b3fc6f7208f551da61235795Christian Williams & Tyler Schultz } 62a89236397e869467b3fc6f7208f551da61235795Christian Williams & Tyler Schultz 63a89236397e869467b3fc6f7208f551da61235795Christian Williams & Tyler Schultz @Test 64a89236397e869467b3fc6f7208f551da61235795Christian Williams & Tyler Schultz public void testRemoveChildAt() throws Exception { 659729911f8638b6bb4d55b3d67e6d68a6b3f19dc7Phil Goodwin root.removeViewAt(1); 66a89236397e869467b3fc6f7208f551da61235795Christian Williams & Tyler Schultz 679729911f8638b6bb4d55b3d67e6d68a6b3f19dc7Phil Goodwin assertThat(root.getChildCount(), equalTo(2)); 689729911f8638b6bb4d55b3d67e6d68a6b3f19dc7Phil Goodwin assertThat(root.getChildAt(0), sameInstance(child1)); 699729911f8638b6bb4d55b3d67e6d68a6b3f19dc7Phil Goodwin assertThat(root.getChildAt(1), sameInstance((View) child3)); 70a89236397e869467b3fc6f7208f551da61235795Christian Williams & Tyler Schultz 71a89236397e869467b3fc6f7208f551da61235795Christian Williams & Tyler Schultz assertThat(child2.getParent(), nullValue()); 72a89236397e869467b3fc6f7208f551da61235795Christian Williams & Tyler Schultz } 739729911f8638b6bb4d55b3d67e6d68a6b3f19dc7Phil Goodwin 749729911f8638b6bb4d55b3d67e6d68a6b3f19dc7Phil Goodwin @Test 75adc0e08f20f0c0df8303e304c460865f1b25e190Christian Williams public void testAddViewAt() throws Exception { 76adc0e08f20f0c0df8303e304c460865f1b25e190Christian Williams root.removeAllViews(); 77adc0e08f20f0c0df8303e304c460865f1b25e190Christian Williams root.addView(child1); 78adc0e08f20f0c0df8303e304c460865f1b25e190Christian Williams root.addView(child2); 79adc0e08f20f0c0df8303e304c460865f1b25e190Christian Williams root.addView(child3, 1); 80adc0e08f20f0c0df8303e304c460865f1b25e190Christian Williams assertThat(root.getChildAt(0), sameInstance(child1)); 81adc0e08f20f0c0df8303e304c460865f1b25e190Christian Williams assertThat(root.getChildAt(1), sameInstance((View) child3)); 82adc0e08f20f0c0df8303e304c460865f1b25e190Christian Williams assertThat(root.getChildAt(2), sameInstance(child2)); 83adc0e08f20f0c0df8303e304c460865f1b25e190Christian Williams } 84593543dfecc0d06e016c66504f24cd361b353a44Chris Van Vranken 85593543dfecc0d06e016c66504f24cd361b353a44Chris Van Vranken @Test 86593543dfecc0d06e016c66504f24cd361b353a44Chris Van Vranken public void shouldfindViewWithTag() { 87593543dfecc0d06e016c66504f24cd361b353a44Chris Van Vranken root.removeAllViews(); 88593543dfecc0d06e016c66504f24cd361b353a44Chris Van Vranken String tag1 = "tag1"; 89593543dfecc0d06e016c66504f24cd361b353a44Chris Van Vranken String tag2 = "tag2"; 90593543dfecc0d06e016c66504f24cd361b353a44Chris Van Vranken String tag3 = "tag3"; 91593543dfecc0d06e016c66504f24cd361b353a44Chris Van Vranken child1.setTag(tag1); 92593543dfecc0d06e016c66504f24cd361b353a44Chris Van Vranken child2.setTag(tag2); 93593543dfecc0d06e016c66504f24cd361b353a44Chris Van Vranken child3.setTag(tag3); 94593543dfecc0d06e016c66504f24cd361b353a44Chris Van Vranken root.addView(child1); 95593543dfecc0d06e016c66504f24cd361b353a44Chris Van Vranken root.addView(child2); 96593543dfecc0d06e016c66504f24cd361b353a44Chris Van Vranken root.addView(child3, 1); 97593543dfecc0d06e016c66504f24cd361b353a44Chris Van Vranken assertThat(root.findViewWithTag("tag1"), sameInstance(child1)); 98593543dfecc0d06e016c66504f24cd361b353a44Chris Van Vranken assertThat(root.findViewWithTag("tag2"), sameInstance((View) child2)); 99593543dfecc0d06e016c66504f24cd361b353a44Chris Van Vranken assertThat((ViewGroup)root.findViewWithTag("tag3"), sameInstance(child3)); 100593543dfecc0d06e016c66504f24cd361b353a44Chris Van Vranken } 101593543dfecc0d06e016c66504f24cd361b353a44Chris Van Vranken 10288fd0dbccc29a37545c186115f2a6b6f91302a56Chris Van Vranken @Test 10388fd0dbccc29a37545c186115f2a6b6f91302a56Chris Van Vranken public void shouldNotfindViewWithTagReturnNull() { 10488fd0dbccc29a37545c186115f2a6b6f91302a56Chris Van Vranken root.removeAllViews(); 10588fd0dbccc29a37545c186115f2a6b6f91302a56Chris Van Vranken String tag1 = "tag1"; 10688fd0dbccc29a37545c186115f2a6b6f91302a56Chris Van Vranken String tag2 = "tag2"; 10788fd0dbccc29a37545c186115f2a6b6f91302a56Chris Van Vranken String tag3 = "tag3"; 10888fd0dbccc29a37545c186115f2a6b6f91302a56Chris Van Vranken child1.setTag(tag1); 10988fd0dbccc29a37545c186115f2a6b6f91302a56Chris Van Vranken child2.setTag(tag2); 11088fd0dbccc29a37545c186115f2a6b6f91302a56Chris Van Vranken child3.setTag(tag3); 11188fd0dbccc29a37545c186115f2a6b6f91302a56Chris Van Vranken root.addView(child1); 11288fd0dbccc29a37545c186115f2a6b6f91302a56Chris Van Vranken root.addView(child2); 11388fd0dbccc29a37545c186115f2a6b6f91302a56Chris Van Vranken root.addView(child3, 1); 11488fd0dbccc29a37545c186115f2a6b6f91302a56Chris Van Vranken assertThat(root.findViewWithTag("tag21"), equalTo(null)); 11588fd0dbccc29a37545c186115f2a6b6f91302a56Chris Van Vranken assertThat((ViewGroup)root.findViewWithTag("tag23"), equalTo(null)); 11688fd0dbccc29a37545c186115f2a6b6f91302a56Chris Van Vranken } 11788fd0dbccc29a37545c186115f2a6b6f91302a56Chris Van Vranken 11888fd0dbccc29a37545c186115f2a6b6f91302a56Chris Van Vranken @Test 11988fd0dbccc29a37545c186115f2a6b6f91302a56Chris Van Vranken public void shouldfindViewWithTagFromCorrectViewGroup() { 12088fd0dbccc29a37545c186115f2a6b6f91302a56Chris Van Vranken root.removeAllViews(); 12188fd0dbccc29a37545c186115f2a6b6f91302a56Chris Van Vranken String tag1 = "tag1"; 12288fd0dbccc29a37545c186115f2a6b6f91302a56Chris Van Vranken String tag2 = "tag2"; 12388fd0dbccc29a37545c186115f2a6b6f91302a56Chris Van Vranken String tag3 = "tag3"; 12488fd0dbccc29a37545c186115f2a6b6f91302a56Chris Van Vranken child1.setTag(tag1); 12588fd0dbccc29a37545c186115f2a6b6f91302a56Chris Van Vranken child2.setTag(tag2); 12688fd0dbccc29a37545c186115f2a6b6f91302a56Chris Van Vranken child3.setTag(tag3); 12788fd0dbccc29a37545c186115f2a6b6f91302a56Chris Van Vranken root.addView(child1); 12888fd0dbccc29a37545c186115f2a6b6f91302a56Chris Van Vranken root.addView(child2); 12988fd0dbccc29a37545c186115f2a6b6f91302a56Chris Van Vranken root.addView(child3); 13088fd0dbccc29a37545c186115f2a6b6f91302a56Chris Van Vranken 13188fd0dbccc29a37545c186115f2a6b6f91302a56Chris Van Vranken child3a.setTag(tag1); 13288fd0dbccc29a37545c186115f2a6b6f91302a56Chris Van Vranken child3b.setTag(tag2); 13388fd0dbccc29a37545c186115f2a6b6f91302a56Chris Van Vranken 13488fd0dbccc29a37545c186115f2a6b6f91302a56Chris Van Vranken //can find views by tag from root 13588fd0dbccc29a37545c186115f2a6b6f91302a56Chris Van Vranken assertThat(root.findViewWithTag("tag1"), sameInstance(child1)); 13688fd0dbccc29a37545c186115f2a6b6f91302a56Chris Van Vranken assertThat(root.findViewWithTag("tag2"), sameInstance((View) child2)); 13788fd0dbccc29a37545c186115f2a6b6f91302a56Chris Van Vranken assertThat((ViewGroup)root.findViewWithTag("tag3"), sameInstance(child3)); 13888fd0dbccc29a37545c186115f2a6b6f91302a56Chris Van Vranken 13988fd0dbccc29a37545c186115f2a6b6f91302a56Chris Van Vranken //can find views by tag from child3 14088fd0dbccc29a37545c186115f2a6b6f91302a56Chris Van Vranken assertThat(child3.findViewWithTag("tag1"), sameInstance(child3a)); 14188fd0dbccc29a37545c186115f2a6b6f91302a56Chris Van Vranken assertThat(child3.findViewWithTag("tag2"), sameInstance(child3b)); 14288fd0dbccc29a37545c186115f2a6b6f91302a56Chris Van Vranken } 14388fd0dbccc29a37545c186115f2a6b6f91302a56Chris Van Vranken 14488fd0dbccc29a37545c186115f2a6b6f91302a56Chris Van Vranken 145adc0e08f20f0c0df8303e304c460865f1b25e190Christian Williams @Test 1469729911f8638b6bb4d55b3d67e6d68a6b3f19dc7Phil Goodwin public void hasFocus_shouldReturnTrueIfAnyChildHasFocus() throws Exception { 1479729911f8638b6bb4d55b3d67e6d68a6b3f19dc7Phil Goodwin assertFalse(root.hasFocus()); 1489729911f8638b6bb4d55b3d67e6d68a6b3f19dc7Phil Goodwin 1499729911f8638b6bb4d55b3d67e6d68a6b3f19dc7Phil Goodwin child1.requestFocus(); 1509729911f8638b6bb4d55b3d67e6d68a6b3f19dc7Phil Goodwin assertTrue(root.hasFocus()); 1519729911f8638b6bb4d55b3d67e6d68a6b3f19dc7Phil Goodwin 1529729911f8638b6bb4d55b3d67e6d68a6b3f19dc7Phil Goodwin child1.clearFocus(); 1539729911f8638b6bb4d55b3d67e6d68a6b3f19dc7Phil Goodwin assertFalse(root.hasFocus()); 1549729911f8638b6bb4d55b3d67e6d68a6b3f19dc7Phil Goodwin 1559729911f8638b6bb4d55b3d67e6d68a6b3f19dc7Phil Goodwin child3b.requestFocus(); 1569729911f8638b6bb4d55b3d67e6d68a6b3f19dc7Phil Goodwin assertTrue(root.hasFocus()); 1579729911f8638b6bb4d55b3d67e6d68a6b3f19dc7Phil Goodwin 1589729911f8638b6bb4d55b3d67e6d68a6b3f19dc7Phil Goodwin child3b.clearFocus(); 1599729911f8638b6bb4d55b3d67e6d68a6b3f19dc7Phil Goodwin assertFalse(root.hasFocus()); 1609729911f8638b6bb4d55b3d67e6d68a6b3f19dc7Phil Goodwin 1619729911f8638b6bb4d55b3d67e6d68a6b3f19dc7Phil Goodwin root.requestFocus(); 1629729911f8638b6bb4d55b3d67e6d68a6b3f19dc7Phil Goodwin assertTrue(root.hasFocus()); 1639729911f8638b6bb4d55b3d67e6d68a6b3f19dc7Phil Goodwin } 1649729911f8638b6bb4d55b3d67e6d68a6b3f19dc7Phil Goodwin 1659729911f8638b6bb4d55b3d67e6d68a6b3f19dc7Phil Goodwin @Test 1669729911f8638b6bb4d55b3d67e6d68a6b3f19dc7Phil Goodwin public void clearFocus_shouldRecursivelyClearTheFocusOfAllChildren() throws Exception { 1679729911f8638b6bb4d55b3d67e6d68a6b3f19dc7Phil Goodwin child3a.requestFocus(); 1689729911f8638b6bb4d55b3d67e6d68a6b3f19dc7Phil Goodwin 1699729911f8638b6bb4d55b3d67e6d68a6b3f19dc7Phil Goodwin root.clearFocus(); 1709729911f8638b6bb4d55b3d67e6d68a6b3f19dc7Phil Goodwin 1719729911f8638b6bb4d55b3d67e6d68a6b3f19dc7Phil Goodwin assertFalse(child3a.hasFocus()); 1729729911f8638b6bb4d55b3d67e6d68a6b3f19dc7Phil Goodwin assertFalse(child3.hasFocus()); 1739729911f8638b6bb4d55b3d67e6d68a6b3f19dc7Phil Goodwin assertFalse(root.hasFocus()); 1749729911f8638b6bb4d55b3d67e6d68a6b3f19dc7Phil Goodwin 1759729911f8638b6bb4d55b3d67e6d68a6b3f19dc7Phil Goodwin root.requestFocus(); 1769729911f8638b6bb4d55b3d67e6d68a6b3f19dc7Phil Goodwin root.clearFocus(); 1779729911f8638b6bb4d55b3d67e6d68a6b3f19dc7Phil Goodwin assertFalse(root.hasFocus()); 1789729911f8638b6bb4d55b3d67e6d68a6b3f19dc7Phil Goodwin } 17986e98619f5f1b5f6b1fd5742ba911d7ebc83c2ddChristian Williams 18086e98619f5f1b5f6b1fd5742ba911d7ebc83c2ddChristian Williams @Test 18186e98619f5f1b5f6b1fd5742ba911d7ebc83c2ddChristian Williams public void dump_shouldDumpStructure() throws Exception { 18286e98619f5f1b5f6b1fd5742ba911d7ebc83c2ddChristian Williams child3.setId(R.id.snippet_text); 183adfaceabbda4c8c51f24a0def8926075bd7306adChristian Williams 18486e98619f5f1b5f6b1fd5742ba911d7ebc83c2ddChristian Williams ByteArrayOutputStream out = new ByteArrayOutputStream(); 18586e98619f5f1b5f6b1fd5742ba911d7ebc83c2ddChristian Williams shadowOf(root).dump(new PrintStream(out), 0); 18686e98619f5f1b5f6b1fd5742ba911d7ebc83c2ddChristian Williams assertEquals("<FrameLayout>\n" + 18786e98619f5f1b5f6b1fd5742ba911d7ebc83c2ddChristian Williams " <View/>\n" + 18886e98619f5f1b5f6b1fd5742ba911d7ebc83c2ddChristian Williams " <View/>\n" + 18986e98619f5f1b5f6b1fd5742ba911d7ebc83c2ddChristian Williams " <FrameLayout id=\"id/snippet_text\">\n" + 19086e98619f5f1b5f6b1fd5742ba911d7ebc83c2ddChristian Williams " <View/>\n" + 19186e98619f5f1b5f6b1fd5742ba911d7ebc83c2ddChristian Williams " <View/>\n" + 19286e98619f5f1b5f6b1fd5742ba911d7ebc83c2ddChristian Williams " </FrameLayout>\n" + 19386e98619f5f1b5f6b1fd5742ba911d7ebc83c2ddChristian Williams "</FrameLayout>\n", out.toString()); 19486e98619f5f1b5f6b1fd5742ba911d7ebc83c2ddChristian Williams } 195a89236397e869467b3fc6f7208f551da61235795Christian Williams & Tyler Schultz} 196