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;
62c9c757ef2fb2ffd9dffb5b4227144d15922bcf4adriancowhamimport android.view.animation.Animation;
72c9c757ef2fb2ffd9dffb5b4227144d15922bcf4adriancowhamimport android.view.animation.Animation.AnimationListener;
8a89236397e869467b3fc6f7208f551da61235795Christian Williams & Tyler Schultzimport android.widget.FrameLayout;
9b551a870eb9fb9acae0f8a6632fefea12a5f8598Ryan Richard & Tyler Schultzimport android.widget.LinearLayout;
1086e98619f5f1b5f6b1fd5742ba911d7ebc83c2ddChristian Williamsimport com.xtremelabs.robolectric.R;
11b551a870eb9fb9acae0f8a6632fefea12a5f8598Ryan Richard & Tyler Schultzimport com.xtremelabs.robolectric.Robolectric;
1207257335f88da163910cc0bd039e6163edc38580Gregg Van Hove & Phil Goodwinimport com.xtremelabs.robolectric.WithTestDefaultsRunner;
1386e98619f5f1b5f6b1fd5742ba911d7ebc83c2ddChristian Williamsimport com.xtremelabs.robolectric.res.ResourceLoader;
14b551a870eb9fb9acae0f8a6632fefea12a5f8598Ryan Richard & Tyler Schultzimport org.junit.After;
15b551a870eb9fb9acae0f8a6632fefea12a5f8598Ryan Richard & Tyler Schultzimport org.junit.Before;
16b551a870eb9fb9acae0f8a6632fefea12a5f8598Ryan Richard & Tyler Schultzimport org.junit.Test;
17b551a870eb9fb9acae0f8a6632fefea12a5f8598Ryan Richard & Tyler Schultzimport org.junit.runner.RunWith;
18b551a870eb9fb9acae0f8a6632fefea12a5f8598Ryan Richard & Tyler Schultz
19b551a870eb9fb9acae0f8a6632fefea12a5f8598Ryan Richard & Tyler Schultzimport java.io.ByteArrayOutputStream;
20b551a870eb9fb9acae0f8a6632fefea12a5f8598Ryan Richard & Tyler Schultzimport java.io.PrintStream;
21b551a870eb9fb9acae0f8a6632fefea12a5f8598Ryan Richard & Tyler Schultz
22b551a870eb9fb9acae0f8a6632fefea12a5f8598Ryan Richard & Tyler Schultzimport static com.xtremelabs.robolectric.Robolectric.shadowOf;
23b551a870eb9fb9acae0f8a6632fefea12a5f8598Ryan Richard & Tyler Schultzimport static org.hamcrest.CoreMatchers.equalTo;
24b551a870eb9fb9acae0f8a6632fefea12a5f8598Ryan Richard & Tyler Schultzimport static org.hamcrest.CoreMatchers.sameInstance;
25b551a870eb9fb9acae0f8a6632fefea12a5f8598Ryan Richard & Tyler Schultzimport static org.hamcrest.MatcherAssert.assertThat;
26b551a870eb9fb9acae0f8a6632fefea12a5f8598Ryan Richard & Tyler Schultzimport static org.hamcrest.core.IsNull.nullValue;
27b551a870eb9fb9acae0f8a6632fefea12a5f8598Ryan Richard & Tyler Schultzimport static org.junit.Assert.*;
28a89236397e869467b3fc6f7208f551da61235795Christian Williams & Tyler Schultz
2907257335f88da163910cc0bd039e6163edc38580Gregg Van Hove & Phil Goodwin@RunWith(WithTestDefaultsRunner.class)
30a89236397e869467b3fc6f7208f551da61235795Christian Williams & Tyler Schultzpublic class ViewGroupTest {
3140c6251719cccc0a84ae99c976d2836b14374ce6Christian Williams    private String defaultLineSeparator;
329729911f8638b6bb4d55b3d67e6d68a6b3f19dc7Phil Goodwin    private ViewGroup root;
339729911f8638b6bb4d55b3d67e6d68a6b3f19dc7Phil Goodwin    private View child1;
349729911f8638b6bb4d55b3d67e6d68a6b3f19dc7Phil Goodwin    private View child2;
359729911f8638b6bb4d55b3d67e6d68a6b3f19dc7Phil Goodwin    private ViewGroup child3;
369729911f8638b6bb4d55b3d67e6d68a6b3f19dc7Phil Goodwin    private View child3a;
379729911f8638b6bb4d55b3d67e6d68a6b3f19dc7Phil Goodwin    private View child3b;
38b551a870eb9fb9acae0f8a6632fefea12a5f8598Ryan Richard & Tyler Schultz    private Application context;
39a89236397e869467b3fc6f7208f551da61235795Christian Williams & Tyler Schultz
40b551a870eb9fb9acae0f8a6632fefea12a5f8598Ryan Richard & Tyler Schultz    @Before
41b551a870eb9fb9acae0f8a6632fefea12a5f8598Ryan Richard & Tyler Schultz    public void setUp() throws Exception {
42b551a870eb9fb9acae0f8a6632fefea12a5f8598Ryan Richard & Tyler Schultz        context = new Application();
43e04e87dd1d1b5399264d7be0ed3ae8670dc175a8Ryan Richard        ShadowApplication.bind(context, new ResourceLoader(10, R.class, null, null));
4486e98619f5f1b5f6b1fd5742ba911d7ebc83c2ddChristian Williams
4586e98619f5f1b5f6b1fd5742ba911d7ebc83c2ddChristian Williams        root = new FrameLayout(context);
469729911f8638b6bb4d55b3d67e6d68a6b3f19dc7Phil Goodwin
4786e98619f5f1b5f6b1fd5742ba911d7ebc83c2ddChristian Williams        child1 = new View(context);
4886e98619f5f1b5f6b1fd5742ba911d7ebc83c2ddChristian Williams        child2 = new View(context);
4986e98619f5f1b5f6b1fd5742ba911d7ebc83c2ddChristian Williams        child3 = new FrameLayout(context);
5086e98619f5f1b5f6b1fd5742ba911d7ebc83c2ddChristian Williams        child3a = new View(context);
5186e98619f5f1b5f6b1fd5742ba911d7ebc83c2ddChristian Williams        child3b = new View(context);
529729911f8638b6bb4d55b3d67e6d68a6b3f19dc7Phil Goodwin
539729911f8638b6bb4d55b3d67e6d68a6b3f19dc7Phil Goodwin        root.addView(child1);
549729911f8638b6bb4d55b3d67e6d68a6b3f19dc7Phil Goodwin        root.addView(child2);
559729911f8638b6bb4d55b3d67e6d68a6b3f19dc7Phil Goodwin        root.addView(child3);
569729911f8638b6bb4d55b3d67e6d68a6b3f19dc7Phil Goodwin
579729911f8638b6bb4d55b3d67e6d68a6b3f19dc7Phil Goodwin        child3.addView(child3a);
589729911f8638b6bb4d55b3d67e6d68a6b3f19dc7Phil Goodwin        child3.addView(child3b);
5940c6251719cccc0a84ae99c976d2836b14374ce6Christian Williams
60f68306afa7b75d4e375d00d433f3432ffb68d4e4unknown        defaultLineSeparator = System.getProperty("line.separator");
61f68306afa7b75d4e375d00d433f3432ffb68d4e4unknown        System.setProperty("line.separator", "\n");
62f68306afa7b75d4e375d00d433f3432ffb68d4e4unknown    }
6340c6251719cccc0a84ae99c976d2836b14374ce6Christian Williams
64f68306afa7b75d4e375d00d433f3432ffb68d4e4unknown    @After
65f68306afa7b75d4e375d00d433f3432ffb68d4e4unknown    public void tearDown() throws Exception {
6640c6251719cccc0a84ae99c976d2836b14374ce6Christian Williams        System.setProperty("line.separator", defaultLineSeparator);
67a89236397e869467b3fc6f7208f551da61235795Christian Williams & Tyler Schultz    }
68a89236397e869467b3fc6f7208f551da61235795Christian Williams & Tyler Schultz
69a89236397e869467b3fc6f7208f551da61235795Christian Williams & Tyler Schultz    @Test
702c9c757ef2fb2ffd9dffb5b4227144d15922bcf4adriancowham    public void testLayoutAnimationListener() {
71b551a870eb9fb9acae0f8a6632fefea12a5f8598Ryan Richard & Tyler Schultz        assertThat(root.getLayoutAnimationListener(), nullValue());
72b551a870eb9fb9acae0f8a6632fefea12a5f8598Ryan Richard & Tyler Schultz
73b551a870eb9fb9acae0f8a6632fefea12a5f8598Ryan Richard & Tyler Schultz        AnimationListener animationListener = new AnimationListener() {
74b551a870eb9fb9acae0f8a6632fefea12a5f8598Ryan Richard & Tyler Schultz            @Override
75b551a870eb9fb9acae0f8a6632fefea12a5f8598Ryan Richard & Tyler Schultz            public void onAnimationEnd(Animation a) { }
76b551a870eb9fb9acae0f8a6632fefea12a5f8598Ryan Richard & Tyler Schultz
77b551a870eb9fb9acae0f8a6632fefea12a5f8598Ryan Richard & Tyler Schultz            @Override
78b551a870eb9fb9acae0f8a6632fefea12a5f8598Ryan Richard & Tyler Schultz            public void onAnimationRepeat(Animation a) { }
79b551a870eb9fb9acae0f8a6632fefea12a5f8598Ryan Richard & Tyler Schultz
80b551a870eb9fb9acae0f8a6632fefea12a5f8598Ryan Richard & Tyler Schultz            @Override
81b551a870eb9fb9acae0f8a6632fefea12a5f8598Ryan Richard & Tyler Schultz            public void onAnimationStart(Animation a) { }
82b551a870eb9fb9acae0f8a6632fefea12a5f8598Ryan Richard & Tyler Schultz        };
83b551a870eb9fb9acae0f8a6632fefea12a5f8598Ryan Richard & Tyler Schultz        root.setLayoutAnimationListener(animationListener);
84b551a870eb9fb9acae0f8a6632fefea12a5f8598Ryan Richard & Tyler Schultz
85b551a870eb9fb9acae0f8a6632fefea12a5f8598Ryan Richard & Tyler Schultz        assertThat(root.getLayoutAnimationListener(), sameInstance(animationListener));
862c9c757ef2fb2ffd9dffb5b4227144d15922bcf4adriancowham    }
87b551a870eb9fb9acae0f8a6632fefea12a5f8598Ryan Richard & Tyler Schultz
882c9c757ef2fb2ffd9dffb5b4227144d15922bcf4adriancowham    @Test
89a89236397e869467b3fc6f7208f551da61235795Christian Williams & Tyler Schultz    public void testRemoveChildAt() throws Exception {
909729911f8638b6bb4d55b3d67e6d68a6b3f19dc7Phil Goodwin        root.removeViewAt(1);
91a89236397e869467b3fc6f7208f551da61235795Christian Williams & Tyler Schultz
929729911f8638b6bb4d55b3d67e6d68a6b3f19dc7Phil Goodwin        assertThat(root.getChildCount(), equalTo(2));
939729911f8638b6bb4d55b3d67e6d68a6b3f19dc7Phil Goodwin        assertThat(root.getChildAt(0), sameInstance(child1));
949729911f8638b6bb4d55b3d67e6d68a6b3f19dc7Phil Goodwin        assertThat(root.getChildAt(1), sameInstance((View) child3));
95a89236397e869467b3fc6f7208f551da61235795Christian Williams & Tyler Schultz
96a89236397e869467b3fc6f7208f551da61235795Christian Williams & Tyler Schultz        assertThat(child2.getParent(), nullValue());
97a89236397e869467b3fc6f7208f551da61235795Christian Williams & Tyler Schultz    }
989729911f8638b6bb4d55b3d67e6d68a6b3f19dc7Phil Goodwin
999729911f8638b6bb4d55b3d67e6d68a6b3f19dc7Phil Goodwin    @Test
100adc0e08f20f0c0df8303e304c460865f1b25e190Christian Williams    public void testAddViewAt() throws Exception {
101adc0e08f20f0c0df8303e304c460865f1b25e190Christian Williams        root.removeAllViews();
102adc0e08f20f0c0df8303e304c460865f1b25e190Christian Williams        root.addView(child1);
103adc0e08f20f0c0df8303e304c460865f1b25e190Christian Williams        root.addView(child2);
104adc0e08f20f0c0df8303e304c460865f1b25e190Christian Williams        root.addView(child3, 1);
105adc0e08f20f0c0df8303e304c460865f1b25e190Christian Williams        assertThat(root.getChildAt(0), sameInstance(child1));
106adc0e08f20f0c0df8303e304c460865f1b25e190Christian Williams        assertThat(root.getChildAt(1), sameInstance((View) child3));
107adc0e08f20f0c0df8303e304c460865f1b25e190Christian Williams        assertThat(root.getChildAt(2), sameInstance(child2));
108adc0e08f20f0c0df8303e304c460865f1b25e190Christian Williams    }
109b551a870eb9fb9acae0f8a6632fefea12a5f8598Ryan Richard & Tyler Schultz
110593543dfecc0d06e016c66504f24cd361b353a44Chris Van Vranken    @Test
111593543dfecc0d06e016c66504f24cd361b353a44Chris Van Vranken    public void shouldfindViewWithTag() {
112b551a870eb9fb9acae0f8a6632fefea12a5f8598Ryan Richard & Tyler Schultz        root.removeAllViews();
113b551a870eb9fb9acae0f8a6632fefea12a5f8598Ryan Richard & Tyler Schultz        child1.setTag("tag1");
114b551a870eb9fb9acae0f8a6632fefea12a5f8598Ryan Richard & Tyler Schultz        child2.setTag("tag2");
115b551a870eb9fb9acae0f8a6632fefea12a5f8598Ryan Richard & Tyler Schultz        child3.setTag("tag3");
116b551a870eb9fb9acae0f8a6632fefea12a5f8598Ryan Richard & Tyler Schultz        root.addView(child1);
117b551a870eb9fb9acae0f8a6632fefea12a5f8598Ryan Richard & Tyler Schultz        root.addView(child2);
118b551a870eb9fb9acae0f8a6632fefea12a5f8598Ryan Richard & Tyler Schultz        root.addView(child3, 1);
119b551a870eb9fb9acae0f8a6632fefea12a5f8598Ryan Richard & Tyler Schultz        assertThat(root.findViewWithTag("tag1"), sameInstance(child1));
12010afa627a8dc3aba930189ee6b15d1aa99531ec8Cristian Esquivias        assertThat(root.findViewWithTag("tag2"), sameInstance(child2));
121b551a870eb9fb9acae0f8a6632fefea12a5f8598Ryan Richard & Tyler Schultz        assertThat((ViewGroup) root.findViewWithTag("tag3"), sameInstance(child3));
122593543dfecc0d06e016c66504f24cd361b353a44Chris Van Vranken    }
123b551a870eb9fb9acae0f8a6632fefea12a5f8598Ryan Richard & Tyler Schultz
12488fd0dbccc29a37545c186115f2a6b6f91302a56Chris Van Vranken    @Test
12588fd0dbccc29a37545c186115f2a6b6f91302a56Chris Van Vranken    public void shouldNotfindViewWithTagReturnNull() {
126b551a870eb9fb9acae0f8a6632fefea12a5f8598Ryan Richard & Tyler Schultz        root.removeAllViews();
127b551a870eb9fb9acae0f8a6632fefea12a5f8598Ryan Richard & Tyler Schultz        child1.setTag("tag1");
128b551a870eb9fb9acae0f8a6632fefea12a5f8598Ryan Richard & Tyler Schultz        child2.setTag("tag2");
129b551a870eb9fb9acae0f8a6632fefea12a5f8598Ryan Richard & Tyler Schultz        child3.setTag("tag3");
130b551a870eb9fb9acae0f8a6632fefea12a5f8598Ryan Richard & Tyler Schultz        root.addView(child1);
131b551a870eb9fb9acae0f8a6632fefea12a5f8598Ryan Richard & Tyler Schultz        root.addView(child2);
132b551a870eb9fb9acae0f8a6632fefea12a5f8598Ryan Richard & Tyler Schultz        root.addView(child3, 1);
133b551a870eb9fb9acae0f8a6632fefea12a5f8598Ryan Richard & Tyler Schultz        assertThat(root.findViewWithTag("tag21"), equalTo(null));
134b551a870eb9fb9acae0f8a6632fefea12a5f8598Ryan Richard & Tyler Schultz        assertThat((ViewGroup) root.findViewWithTag("tag23"), equalTo(null));
13588fd0dbccc29a37545c186115f2a6b6f91302a56Chris Van Vranken    }
136b551a870eb9fb9acae0f8a6632fefea12a5f8598Ryan Richard & Tyler Schultz
13788fd0dbccc29a37545c186115f2a6b6f91302a56Chris Van Vranken    @Test
13888fd0dbccc29a37545c186115f2a6b6f91302a56Chris Van Vranken    public void shouldfindViewWithTagFromCorrectViewGroup() {
139b551a870eb9fb9acae0f8a6632fefea12a5f8598Ryan Richard & Tyler Schultz        root.removeAllViews();
140b551a870eb9fb9acae0f8a6632fefea12a5f8598Ryan Richard & Tyler Schultz        child1.setTag("tag1");
141b551a870eb9fb9acae0f8a6632fefea12a5f8598Ryan Richard & Tyler Schultz        child2.setTag("tag2");
142b551a870eb9fb9acae0f8a6632fefea12a5f8598Ryan Richard & Tyler Schultz        child3.setTag("tag3");
143b551a870eb9fb9acae0f8a6632fefea12a5f8598Ryan Richard & Tyler Schultz        root.addView(child1);
144b551a870eb9fb9acae0f8a6632fefea12a5f8598Ryan Richard & Tyler Schultz        root.addView(child2);
145b551a870eb9fb9acae0f8a6632fefea12a5f8598Ryan Richard & Tyler Schultz        root.addView(child3);
146b551a870eb9fb9acae0f8a6632fefea12a5f8598Ryan Richard & Tyler Schultz
147b551a870eb9fb9acae0f8a6632fefea12a5f8598Ryan Richard & Tyler Schultz        child3a.setTag("tag1");
148b551a870eb9fb9acae0f8a6632fefea12a5f8598Ryan Richard & Tyler Schultz        child3b.setTag("tag2");
149b551a870eb9fb9acae0f8a6632fefea12a5f8598Ryan Richard & Tyler Schultz
150b551a870eb9fb9acae0f8a6632fefea12a5f8598Ryan Richard & Tyler Schultz        //can find views by tag from root
151b551a870eb9fb9acae0f8a6632fefea12a5f8598Ryan Richard & Tyler Schultz        assertThat(root.findViewWithTag("tag1"), sameInstance(child1));
15210afa627a8dc3aba930189ee6b15d1aa99531ec8Cristian Esquivias        assertThat(root.findViewWithTag("tag2"), sameInstance(child2));
153b551a870eb9fb9acae0f8a6632fefea12a5f8598Ryan Richard & Tyler Schultz        assertThat((ViewGroup) root.findViewWithTag("tag3"), sameInstance(child3));
154b551a870eb9fb9acae0f8a6632fefea12a5f8598Ryan Richard & Tyler Schultz
155b551a870eb9fb9acae0f8a6632fefea12a5f8598Ryan Richard & Tyler Schultz        //can find views by tag from child3
156b551a870eb9fb9acae0f8a6632fefea12a5f8598Ryan Richard & Tyler Schultz        assertThat(child3.findViewWithTag("tag1"), sameInstance(child3a));
157b551a870eb9fb9acae0f8a6632fefea12a5f8598Ryan Richard & Tyler Schultz        assertThat(child3.findViewWithTag("tag2"), sameInstance(child3b));
158b551a870eb9fb9acae0f8a6632fefea12a5f8598Ryan Richard & Tyler Schultz    }
159b551a870eb9fb9acae0f8a6632fefea12a5f8598Ryan Richard & Tyler Schultz
160b551a870eb9fb9acae0f8a6632fefea12a5f8598Ryan Richard & Tyler Schultz    @Test
161b551a870eb9fb9acae0f8a6632fefea12a5f8598Ryan Richard & Tyler Schultz    public void shouldFindViewWithTag_whenViewGroupOverridesGetTag() throws Exception {
162b551a870eb9fb9acae0f8a6632fefea12a5f8598Ryan Richard & Tyler Schultz        ViewGroup viewGroup = new LinearLayout(Robolectric.application) {
163b551a870eb9fb9acae0f8a6632fefea12a5f8598Ryan Richard & Tyler Schultz            @Override
164b551a870eb9fb9acae0f8a6632fefea12a5f8598Ryan Richard & Tyler Schultz            public Object getTag() {
165b551a870eb9fb9acae0f8a6632fefea12a5f8598Ryan Richard & Tyler Schultz                return "blarg";
166b551a870eb9fb9acae0f8a6632fefea12a5f8598Ryan Richard & Tyler Schultz            }
167b551a870eb9fb9acae0f8a6632fefea12a5f8598Ryan Richard & Tyler Schultz        };
168b551a870eb9fb9acae0f8a6632fefea12a5f8598Ryan Richard & Tyler Schultz        assertThat((ViewGroup) viewGroup.findViewWithTag("blarg"), sameInstance(viewGroup));
16988fd0dbccc29a37545c186115f2a6b6f91302a56Chris Van Vranken    }
170b551a870eb9fb9acae0f8a6632fefea12a5f8598Ryan Richard & Tyler Schultz
171adc0e08f20f0c0df8303e304c460865f1b25e190Christian Williams    @Test
1729729911f8638b6bb4d55b3d67e6d68a6b3f19dc7Phil Goodwin    public void hasFocus_shouldReturnTrueIfAnyChildHasFocus() throws Exception {
1739729911f8638b6bb4d55b3d67e6d68a6b3f19dc7Phil Goodwin        assertFalse(root.hasFocus());
1749729911f8638b6bb4d55b3d67e6d68a6b3f19dc7Phil Goodwin
1759729911f8638b6bb4d55b3d67e6d68a6b3f19dc7Phil Goodwin        child1.requestFocus();
1769729911f8638b6bb4d55b3d67e6d68a6b3f19dc7Phil Goodwin        assertTrue(root.hasFocus());
1779729911f8638b6bb4d55b3d67e6d68a6b3f19dc7Phil Goodwin
1789729911f8638b6bb4d55b3d67e6d68a6b3f19dc7Phil Goodwin        child1.clearFocus();
1799729911f8638b6bb4d55b3d67e6d68a6b3f19dc7Phil Goodwin        assertFalse(root.hasFocus());
1809729911f8638b6bb4d55b3d67e6d68a6b3f19dc7Phil Goodwin
1819729911f8638b6bb4d55b3d67e6d68a6b3f19dc7Phil Goodwin        child3b.requestFocus();
1829729911f8638b6bb4d55b3d67e6d68a6b3f19dc7Phil Goodwin        assertTrue(root.hasFocus());
1839729911f8638b6bb4d55b3d67e6d68a6b3f19dc7Phil Goodwin
1849729911f8638b6bb4d55b3d67e6d68a6b3f19dc7Phil Goodwin        child3b.clearFocus();
1859729911f8638b6bb4d55b3d67e6d68a6b3f19dc7Phil Goodwin        assertFalse(root.hasFocus());
1869729911f8638b6bb4d55b3d67e6d68a6b3f19dc7Phil Goodwin
1879729911f8638b6bb4d55b3d67e6d68a6b3f19dc7Phil Goodwin        root.requestFocus();
1889729911f8638b6bb4d55b3d67e6d68a6b3f19dc7Phil Goodwin        assertTrue(root.hasFocus());
1899729911f8638b6bb4d55b3d67e6d68a6b3f19dc7Phil Goodwin    }
1909729911f8638b6bb4d55b3d67e6d68a6b3f19dc7Phil Goodwin
1919729911f8638b6bb4d55b3d67e6d68a6b3f19dc7Phil Goodwin    @Test
1929729911f8638b6bb4d55b3d67e6d68a6b3f19dc7Phil Goodwin    public void clearFocus_shouldRecursivelyClearTheFocusOfAllChildren() throws Exception {
1939729911f8638b6bb4d55b3d67e6d68a6b3f19dc7Phil Goodwin        child3a.requestFocus();
1949729911f8638b6bb4d55b3d67e6d68a6b3f19dc7Phil Goodwin
1959729911f8638b6bb4d55b3d67e6d68a6b3f19dc7Phil Goodwin        root.clearFocus();
1969729911f8638b6bb4d55b3d67e6d68a6b3f19dc7Phil Goodwin
1979729911f8638b6bb4d55b3d67e6d68a6b3f19dc7Phil Goodwin        assertFalse(child3a.hasFocus());
1989729911f8638b6bb4d55b3d67e6d68a6b3f19dc7Phil Goodwin        assertFalse(child3.hasFocus());
1999729911f8638b6bb4d55b3d67e6d68a6b3f19dc7Phil Goodwin        assertFalse(root.hasFocus());
2009729911f8638b6bb4d55b3d67e6d68a6b3f19dc7Phil Goodwin
2019729911f8638b6bb4d55b3d67e6d68a6b3f19dc7Phil Goodwin        root.requestFocus();
2029729911f8638b6bb4d55b3d67e6d68a6b3f19dc7Phil Goodwin        root.clearFocus();
2039729911f8638b6bb4d55b3d67e6d68a6b3f19dc7Phil Goodwin        assertFalse(root.hasFocus());
2049729911f8638b6bb4d55b3d67e6d68a6b3f19dc7Phil Goodwin    }
20586e98619f5f1b5f6b1fd5742ba911d7ebc83c2ddChristian Williams
20686e98619f5f1b5f6b1fd5742ba911d7ebc83c2ddChristian Williams    @Test
20710afa627a8dc3aba930189ee6b15d1aa99531ec8Cristian Esquivias    public void findFocus_shouldRecursivelyFindTheViewWithFocus() {
20810afa627a8dc3aba930189ee6b15d1aa99531ec8Cristian Esquivias        child3a.requestFocus();
20910afa627a8dc3aba930189ee6b15d1aa99531ec8Cristian Esquivias
21010afa627a8dc3aba930189ee6b15d1aa99531ec8Cristian Esquivias        assertSame(child3a, root.findFocus());
21110afa627a8dc3aba930189ee6b15d1aa99531ec8Cristian Esquivias    }
21210afa627a8dc3aba930189ee6b15d1aa99531ec8Cristian Esquivias
21310afa627a8dc3aba930189ee6b15d1aa99531ec8Cristian Esquivias    @Test
21410afa627a8dc3aba930189ee6b15d1aa99531ec8Cristian Esquivias    public void findFocus_shouldReturnThisBeforeChildrenWithFocus() {
21510afa627a8dc3aba930189ee6b15d1aa99531ec8Cristian Esquivias        child3a.requestFocus();
21610afa627a8dc3aba930189ee6b15d1aa99531ec8Cristian Esquivias        child3.requestFocus();
21710afa627a8dc3aba930189ee6b15d1aa99531ec8Cristian Esquivias
21810afa627a8dc3aba930189ee6b15d1aa99531ec8Cristian Esquivias        assertSame(child3, root.findFocus());
21910afa627a8dc3aba930189ee6b15d1aa99531ec8Cristian Esquivias    }
22010afa627a8dc3aba930189ee6b15d1aa99531ec8Cristian Esquivias
22110afa627a8dc3aba930189ee6b15d1aa99531ec8Cristian Esquivias    @Test
22286e98619f5f1b5f6b1fd5742ba911d7ebc83c2ddChristian Williams    public void dump_shouldDumpStructure() throws Exception {
22386e98619f5f1b5f6b1fd5742ba911d7ebc83c2ddChristian Williams        child3.setId(R.id.snippet_text);
224adfaceabbda4c8c51f24a0def8926075bd7306adChristian Williams
22586e98619f5f1b5f6b1fd5742ba911d7ebc83c2ddChristian Williams        ByteArrayOutputStream out = new ByteArrayOutputStream();
22686e98619f5f1b5f6b1fd5742ba911d7ebc83c2ddChristian Williams        shadowOf(root).dump(new PrintStream(out), 0);
22786e98619f5f1b5f6b1fd5742ba911d7ebc83c2ddChristian Williams        assertEquals("<FrameLayout>\n" +
22886e98619f5f1b5f6b1fd5742ba911d7ebc83c2ddChristian Williams                "  <View/>\n" +
22986e98619f5f1b5f6b1fd5742ba911d7ebc83c2ddChristian Williams                "  <View/>\n" +
23086e98619f5f1b5f6b1fd5742ba911d7ebc83c2ddChristian Williams                "  <FrameLayout id=\"id/snippet_text\">\n" +
23186e98619f5f1b5f6b1fd5742ba911d7ebc83c2ddChristian Williams                "    <View/>\n" +
23286e98619f5f1b5f6b1fd5742ba911d7ebc83c2ddChristian Williams                "    <View/>\n" +
23386e98619f5f1b5f6b1fd5742ba911d7ebc83c2ddChristian Williams                "  </FrameLayout>\n" +
23486e98619f5f1b5f6b1fd5742ba911d7ebc83c2ddChristian Williams                "</FrameLayout>\n", out.toString());
23586e98619f5f1b5f6b1fd5742ba911d7ebc83c2ddChristian Williams    }
236dfd21b7f55f0f13f01db5b46170f779b5149da20Farand Koo
237dfd21b7f55f0f13f01db5b46170f779b5149da20Farand Koo    @Test
238dfd21b7f55f0f13f01db5b46170f779b5149da20Farand Koo    public void testRemoveView() {
239dfd21b7f55f0f13f01db5b46170f779b5149da20Farand Koo        root.removeView(new View(context));
240dfd21b7f55f0f13f01db5b46170f779b5149da20Farand Koo        assertThat(root.getChildCount(), equalTo(3));
241dfd21b7f55f0f13f01db5b46170f779b5149da20Farand Koo
242dfd21b7f55f0f13f01db5b46170f779b5149da20Farand Koo        root.removeView(child2);
243dfd21b7f55f0f13f01db5b46170f779b5149da20Farand Koo        assertThat(root.getChildCount(), equalTo(2));
244dfd21b7f55f0f13f01db5b46170f779b5149da20Farand Koo        assertThat(root.getChildAt(0), sameInstance(child1));
245dfd21b7f55f0f13f01db5b46170f779b5149da20Farand Koo        assertThat(root.getChildAt(1), sameInstance((View) child3));
246dfd21b7f55f0f13f01db5b46170f779b5149da20Farand Koo
247dfd21b7f55f0f13f01db5b46170f779b5149da20Farand Koo        root.removeView(child2);
248dfd21b7f55f0f13f01db5b46170f779b5149da20Farand Koo        assertThat(root.getChildCount(), equalTo(2));
249dfd21b7f55f0f13f01db5b46170f779b5149da20Farand Koo        assertThat(root.getChildAt(0), sameInstance(child1));
250dfd21b7f55f0f13f01db5b46170f779b5149da20Farand Koo        assertThat(root.getChildAt(1), sameInstance((View) child3));
251dfd21b7f55f0f13f01db5b46170f779b5149da20Farand Koo
252dfd21b7f55f0f13f01db5b46170f779b5149da20Farand Koo        root.removeView(child1);
253dfd21b7f55f0f13f01db5b46170f779b5149da20Farand Koo        root.removeView(child3);
254dfd21b7f55f0f13f01db5b46170f779b5149da20Farand Koo        assertThat(root.getChildCount(), equalTo(0));
255dfd21b7f55f0f13f01db5b46170f779b5149da20Farand Koo    }
256dfd21b7f55f0f13f01db5b46170f779b5149da20Farand Koo
257dfd21b7f55f0f13f01db5b46170f779b5149da20Farand Koo    @Test
258dfd21b7f55f0f13f01db5b46170f779b5149da20Farand Koo    public void testRemoveViewInLayout() {
259dfd21b7f55f0f13f01db5b46170f779b5149da20Farand Koo        root.removeViewInLayout(new View(context));
260dfd21b7f55f0f13f01db5b46170f779b5149da20Farand Koo        assertThat(root.getChildCount(), equalTo(3));
261dfd21b7f55f0f13f01db5b46170f779b5149da20Farand Koo
262dfd21b7f55f0f13f01db5b46170f779b5149da20Farand Koo        root.removeViewInLayout(child2);
263dfd21b7f55f0f13f01db5b46170f779b5149da20Farand Koo        assertThat(root.getChildCount(), equalTo(2));
264dfd21b7f55f0f13f01db5b46170f779b5149da20Farand Koo        assertThat(root.getChildAt(0), sameInstance(child1));
265dfd21b7f55f0f13f01db5b46170f779b5149da20Farand Koo        assertThat(root.getChildAt(1), sameInstance((View) child3));
266dfd21b7f55f0f13f01db5b46170f779b5149da20Farand Koo
267dfd21b7f55f0f13f01db5b46170f779b5149da20Farand Koo        root.removeViewInLayout(child2);
268dfd21b7f55f0f13f01db5b46170f779b5149da20Farand Koo        assertThat(root.getChildCount(), equalTo(2));
269dfd21b7f55f0f13f01db5b46170f779b5149da20Farand Koo        assertThat(root.getChildAt(0), sameInstance(child1));
270dfd21b7f55f0f13f01db5b46170f779b5149da20Farand Koo        assertThat(root.getChildAt(1), sameInstance((View) child3));
271dfd21b7f55f0f13f01db5b46170f779b5149da20Farand Koo
272dfd21b7f55f0f13f01db5b46170f779b5149da20Farand Koo        root.removeViewInLayout(child1);
273dfd21b7f55f0f13f01db5b46170f779b5149da20Farand Koo        root.removeViewInLayout(child3);
274dfd21b7f55f0f13f01db5b46170f779b5149da20Farand Koo        assertThat(root.getChildCount(), equalTo(0));
275dfd21b7f55f0f13f01db5b46170f779b5149da20Farand Koo    }
276dfd21b7f55f0f13f01db5b46170f779b5149da20Farand Koo
277dfd21b7f55f0f13f01db5b46170f779b5149da20Farand Koo    @Test
278dfd21b7f55f0f13f01db5b46170f779b5149da20Farand Koo    public void testRemoveViews() {
279dfd21b7f55f0f13f01db5b46170f779b5149da20Farand Koo        root.removeViews(0, 0);
280dfd21b7f55f0f13f01db5b46170f779b5149da20Farand Koo        assertThat(root.getChildCount(), equalTo(3));
281dfd21b7f55f0f13f01db5b46170f779b5149da20Farand Koo
282dfd21b7f55f0f13f01db5b46170f779b5149da20Farand Koo        root.removeViews(2, 1);
283dfd21b7f55f0f13f01db5b46170f779b5149da20Farand Koo        assertThat(root.getChildCount(), equalTo(2));
284dfd21b7f55f0f13f01db5b46170f779b5149da20Farand Koo        assertThat(root.getChildAt(0), sameInstance(child1));
285dfd21b7f55f0f13f01db5b46170f779b5149da20Farand Koo        assertThat(root.getChildAt(1), sameInstance(child2));
286dfd21b7f55f0f13f01db5b46170f779b5149da20Farand Koo
287dfd21b7f55f0f13f01db5b46170f779b5149da20Farand Koo        root.removeViews(0, 1);
288dfd21b7f55f0f13f01db5b46170f779b5149da20Farand Koo        assertThat(root.getChildCount(), equalTo(1));
289dfd21b7f55f0f13f01db5b46170f779b5149da20Farand Koo        assertThat(root.getChildAt(0), sameInstance(child2));
290dfd21b7f55f0f13f01db5b46170f779b5149da20Farand Koo
291dfd21b7f55f0f13f01db5b46170f779b5149da20Farand Koo        root.removeViews(0, 1);
292dfd21b7f55f0f13f01db5b46170f779b5149da20Farand Koo        assertThat(root.getChildCount(), equalTo(0));
293dfd21b7f55f0f13f01db5b46170f779b5149da20Farand Koo
294dfd21b7f55f0f13f01db5b46170f779b5149da20Farand Koo        root.addView(child1);
295dfd21b7f55f0f13f01db5b46170f779b5149da20Farand Koo        root.addView(child2);
296dfd21b7f55f0f13f01db5b46170f779b5149da20Farand Koo        root.addView(child3);
297dfd21b7f55f0f13f01db5b46170f779b5149da20Farand Koo
298dfd21b7f55f0f13f01db5b46170f779b5149da20Farand Koo        root.removeViews(1, 1);
299dfd21b7f55f0f13f01db5b46170f779b5149da20Farand Koo        assertThat(root.getChildCount(), equalTo(2));
300dfd21b7f55f0f13f01db5b46170f779b5149da20Farand Koo        assertThat(root.getChildAt(0), sameInstance(child1));
301dfd21b7f55f0f13f01db5b46170f779b5149da20Farand Koo        assertThat(root.getChildAt(1), sameInstance((View) child3));
302dfd21b7f55f0f13f01db5b46170f779b5149da20Farand Koo
303dfd21b7f55f0f13f01db5b46170f779b5149da20Farand Koo        root.removeViews(0, 2);
304dfd21b7f55f0f13f01db5b46170f779b5149da20Farand Koo        assertThat(root.getChildCount(), equalTo(0));
305dfd21b7f55f0f13f01db5b46170f779b5149da20Farand Koo    }
306dfd21b7f55f0f13f01db5b46170f779b5149da20Farand Koo
307dfd21b7f55f0f13f01db5b46170f779b5149da20Farand Koo    @Test
308dfd21b7f55f0f13f01db5b46170f779b5149da20Farand Koo    public void testRemoveViewsInLayout() {
309dfd21b7f55f0f13f01db5b46170f779b5149da20Farand Koo        root.removeViewsInLayout(0, 0);
310dfd21b7f55f0f13f01db5b46170f779b5149da20Farand Koo        assertThat(root.getChildCount(), equalTo(3));
311dfd21b7f55f0f13f01db5b46170f779b5149da20Farand Koo
312dfd21b7f55f0f13f01db5b46170f779b5149da20Farand Koo        root.removeViewsInLayout(2, 1);
313dfd21b7f55f0f13f01db5b46170f779b5149da20Farand Koo        assertThat(root.getChildCount(), equalTo(2));
314dfd21b7f55f0f13f01db5b46170f779b5149da20Farand Koo        assertThat(root.getChildAt(0), sameInstance(child1));
315dfd21b7f55f0f13f01db5b46170f779b5149da20Farand Koo        assertThat(root.getChildAt(1), sameInstance(child2));
316dfd21b7f55f0f13f01db5b46170f779b5149da20Farand Koo
317dfd21b7f55f0f13f01db5b46170f779b5149da20Farand Koo        root.removeViewsInLayout(0, 1);
318dfd21b7f55f0f13f01db5b46170f779b5149da20Farand Koo        assertThat(root.getChildCount(), equalTo(1));
319dfd21b7f55f0f13f01db5b46170f779b5149da20Farand Koo        assertThat(root.getChildAt(0), sameInstance(child2));
320dfd21b7f55f0f13f01db5b46170f779b5149da20Farand Koo
321dfd21b7f55f0f13f01db5b46170f779b5149da20Farand Koo        root.removeViewsInLayout(0, 1);
322dfd21b7f55f0f13f01db5b46170f779b5149da20Farand Koo        assertThat(root.getChildCount(), equalTo(0));
323dfd21b7f55f0f13f01db5b46170f779b5149da20Farand Koo
324dfd21b7f55f0f13f01db5b46170f779b5149da20Farand Koo        root.addView(child1);
325dfd21b7f55f0f13f01db5b46170f779b5149da20Farand Koo        root.addView(child2);
326dfd21b7f55f0f13f01db5b46170f779b5149da20Farand Koo        root.addView(child3);
327dfd21b7f55f0f13f01db5b46170f779b5149da20Farand Koo
328dfd21b7f55f0f13f01db5b46170f779b5149da20Farand Koo        root.removeViewsInLayout(1, 1);
329dfd21b7f55f0f13f01db5b46170f779b5149da20Farand Koo        assertThat(root.getChildCount(), equalTo(2));
330dfd21b7f55f0f13f01db5b46170f779b5149da20Farand Koo        assertThat(root.getChildAt(0), sameInstance(child1));
331dfd21b7f55f0f13f01db5b46170f779b5149da20Farand Koo        assertThat(root.getChildAt(1), sameInstance((View) child3));
332dfd21b7f55f0f13f01db5b46170f779b5149da20Farand Koo
333dfd21b7f55f0f13f01db5b46170f779b5149da20Farand Koo        root.removeViewsInLayout(0, 2);
334dfd21b7f55f0f13f01db5b46170f779b5149da20Farand Koo        assertThat(root.getChildCount(), equalTo(0));
335dfd21b7f55f0f13f01db5b46170f779b5149da20Farand Koo    }
336a89236397e869467b3fc6f7208f551da61235795Christian Williams & Tyler Schultz}
337