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