14b6829f0d28990dd645e16386eb226d0f10c8731shiqianpackage com.xtremelabs.robolectric.bytecode;
24b6829f0d28990dd645e16386eb226d0f10c8731shiqian
34b6829f0d28990dd645e16386eb226d0f10c8731shiqianimport android.accounts.AccountManager;
44b6829f0d28990dd645e16386eb226d0f10c8731shiqianimport android.content.Context;
54b6829f0d28990dd645e16386eb226d0f10c8731shiqianimport android.graphics.Paint;
64b6829f0d28990dd645e16386eb226d0f10c8731shiqianimport android.graphics.drawable.Drawable;
74b6829f0d28990dd645e16386eb226d0f10c8731shiqianimport android.util.Log;
84b6829f0d28990dd645e16386eb226d0f10c8731shiqianimport android.view.View;
94b6829f0d28990dd645e16386eb226d0f10c8731shiqianimport android.widget.TextView;
104b6829f0d28990dd645e16386eb226d0f10c8731shiqianimport com.google.android.maps.ItemizedOverlay;
114b6829f0d28990dd645e16386eb226d0f10c8731shiqianimport com.google.android.maps.OverlayItem;
124b6829f0d28990dd645e16386eb226d0f10c8731shiqianimport com.xtremelabs.robolectric.Robolectric;
134b6829f0d28990dd645e16386eb226d0f10c8731shiqianimport com.xtremelabs.robolectric.WithTestDefaultsRunner;
144b6829f0d28990dd645e16386eb226d0f10c8731shiqianimport com.xtremelabs.robolectric.internal.Implementation;
154b6829f0d28990dd645e16386eb226d0f10c8731shiqianimport com.xtremelabs.robolectric.internal.Implements;
164b6829f0d28990dd645e16386eb226d0f10c8731shiqianimport com.xtremelabs.robolectric.internal.Instrument;
174b6829f0d28990dd645e16386eb226d0f10c8731shiqianimport com.xtremelabs.robolectric.shadows.ShadowItemizedOverlay;
184b6829f0d28990dd645e16386eb226d0f10c8731shiqianimport org.junit.Test;
194b6829f0d28990dd645e16386eb226d0f10c8731shiqianimport org.junit.runner.RunWith;
204b6829f0d28990dd645e16386eb226d0f10c8731shiqian
214b6829f0d28990dd645e16386eb226d0f10c8731shiqianimport java.lang.reflect.Constructor;
224b6829f0d28990dd645e16386eb226d0f10c8731shiqian
234b6829f0d28990dd645e16386eb226d0f10c8731shiqianimport static com.xtremelabs.robolectric.Robolectric.directlyOn;
244b6829f0d28990dd645e16386eb226d0f10c8731shiqianimport static com.xtremelabs.robolectric.RobolectricForMaps.shadowOf;
254b6829f0d28990dd645e16386eb226d0f10c8731shiqianimport static org.hamcrest.CoreMatchers.*;
264b6829f0d28990dd645e16386eb226d0f10c8731shiqianimport static org.hamcrest.core.StringContains.containsString;
274b6829f0d28990dd645e16386eb226d0f10c8731shiqianimport static org.hamcrest.core.StringStartsWith.startsWith;
284b6829f0d28990dd645e16386eb226d0f10c8731shiqianimport static org.junit.Assert.*;
294b6829f0d28990dd645e16386eb226d0f10c8731shiqianimport static org.mockito.Mockito.mock;
304b6829f0d28990dd645e16386eb226d0f10c8731shiqian
314b6829f0d28990dd645e16386eb226d0f10c8731shiqian@RunWith(WithTestDefaultsRunner.class)
324b6829f0d28990dd645e16386eb226d0f10c8731shiqianpublic class AndroidTranslatorTest {
334b6829f0d28990dd645e16386eb226d0f10c8731shiqian
344b6829f0d28990dd645e16386eb226d0f10c8731shiqian    @Test
354b6829f0d28990dd645e16386eb226d0f10c8731shiqian    public void testStaticMethodsAreDelegated() throws Exception {
364b6829f0d28990dd645e16386eb226d0f10c8731shiqian        Robolectric.bindShadowClass(ShadowAccountManagerForTests.class);
374b6829f0d28990dd645e16386eb226d0f10c8731shiqian
384b6829f0d28990dd645e16386eb226d0f10c8731shiqian        Context context = mock(Context.class);
394b6829f0d28990dd645e16386eb226d0f10c8731shiqian        AccountManager.get(context);
404b6829f0d28990dd645e16386eb226d0f10c8731shiqian        assertThat(ShadowAccountManagerForTests.wasCalled, is(true));
414b6829f0d28990dd645e16386eb226d0f10c8731shiqian        assertThat(ShadowAccountManagerForTests.context, sameInstance(context));
424b6829f0d28990dd645e16386eb226d0f10c8731shiqian    }
434b6829f0d28990dd645e16386eb226d0f10c8731shiqian
444b6829f0d28990dd645e16386eb226d0f10c8731shiqian    @Test
454b6829f0d28990dd645e16386eb226d0f10c8731shiqian    public void testProtectedMethodsAreDelegated() throws Exception {
464b6829f0d28990dd645e16386eb226d0f10c8731shiqian        Robolectric.bindShadowClass(ShadowItemizedOverlay.class);
474b6829f0d28990dd645e16386eb226d0f10c8731shiqian
484b6829f0d28990dd645e16386eb226d0f10c8731shiqian        ItemizedOverlayForTests overlay = new ItemizedOverlayForTests(null);
49e8ff148b4309e115da1c55089dc3b9a241a928dcshiqian        overlay.triggerProtectedCall();
50e8ff148b4309e115da1c55089dc3b9a241a928dcshiqian
51e8ff148b4309e115da1c55089dc3b9a241a928dcshiqian        assertThat(shadowOf(overlay).isPopulated(), is(true));
52e8ff148b4309e115da1c55089dc3b9a241a928dcshiqian    }
53e8ff148b4309e115da1c55089dc3b9a241a928dcshiqian
544b6829f0d28990dd645e16386eb226d0f10c8731shiqian    @Test
554b6829f0d28990dd645e16386eb226d0f10c8731shiqian    public void testNativeMethodsAreDelegated() throws Exception {
564b6829f0d28990dd645e16386eb226d0f10c8731shiqian        Robolectric.bindShadowClass(ShadowPaintForTests.class);
57e8ff148b4309e115da1c55089dc3b9a241a928dcshiqian
584b6829f0d28990dd645e16386eb226d0f10c8731shiqian        Paint paint = new Paint();
594b6829f0d28990dd645e16386eb226d0f10c8731shiqian        paint.setColor(1234);
604b6829f0d28990dd645e16386eb226d0f10c8731shiqian
614b6829f0d28990dd645e16386eb226d0f10c8731shiqian        assertThat(paint.getColor(), is(1234));
624b6829f0d28990dd645e16386eb226d0f10c8731shiqian    }
634b6829f0d28990dd645e16386eb226d0f10c8731shiqian
644b6829f0d28990dd645e16386eb226d0f10c8731shiqian    @Test
654b6829f0d28990dd645e16386eb226d0f10c8731shiqian    public void testPrintlnWorks() throws Exception {
664b6829f0d28990dd645e16386eb226d0f10c8731shiqian        Log.println(1, "tag", "msg");
67e44602ec83c65102035ce5304ae8de0cb16e9e56shiqian    }
68e44602ec83c65102035ce5304ae8de0cb16e9e56shiqian
694b6829f0d28990dd645e16386eb226d0f10c8731shiqian    @Test
704b6829f0d28990dd645e16386eb226d0f10c8731shiqian    public void testGeneratedDefaultConstructorIsWired() throws Exception {
714b6829f0d28990dd645e16386eb226d0f10c8731shiqian        Robolectric.bindShadowClass(ShadowClassWithNoDefaultConstructor.class);
724b6829f0d28990dd645e16386eb226d0f10c8731shiqian
734b6829f0d28990dd645e16386eb226d0f10c8731shiqian        Constructor<ClassWithNoDefaultConstructor> ctor = ClassWithNoDefaultConstructor.class.getDeclaredConstructor();
744b6829f0d28990dd645e16386eb226d0f10c8731shiqian        ctor.setAccessible(true);
754b6829f0d28990dd645e16386eb226d0f10c8731shiqian        ClassWithNoDefaultConstructor instance = ctor.newInstance();
764b6829f0d28990dd645e16386eb226d0f10c8731shiqian        assertThat(Robolectric.shadowOf_(instance), not(nullValue()));
774b6829f0d28990dd645e16386eb226d0f10c8731shiqian        assertThat(Robolectric.shadowOf_(instance), instanceOf(ShadowClassWithNoDefaultConstructor.class));
784b6829f0d28990dd645e16386eb226d0f10c8731shiqian    }
794b6829f0d28990dd645e16386eb226d0f10c8731shiqian
804b6829f0d28990dd645e16386eb226d0f10c8731shiqian    @Test
814b6829f0d28990dd645e16386eb226d0f10c8731shiqian    public void testDirectlyOn() throws Exception {
824b6829f0d28990dd645e16386eb226d0f10c8731shiqian        View view = new View(null);
834b6829f0d28990dd645e16386eb226d0f10c8731shiqian        view.bringToFront();
844b6829f0d28990dd645e16386eb226d0f10c8731shiqian
854b6829f0d28990dd645e16386eb226d0f10c8731shiqian        Exception e = null;
864b6829f0d28990dd645e16386eb226d0f10c8731shiqian        try {
874b6829f0d28990dd645e16386eb226d0f10c8731shiqian            directlyOn(view).bringToFront();
884b6829f0d28990dd645e16386eb226d0f10c8731shiqian        } catch (RuntimeException e1) {
894b6829f0d28990dd645e16386eb226d0f10c8731shiqian            e = e1;
904b6829f0d28990dd645e16386eb226d0f10c8731shiqian        }
914b6829f0d28990dd645e16386eb226d0f10c8731shiqian        assertNotNull(e);
924b6829f0d28990dd645e16386eb226d0f10c8731shiqian        assertEquals("Stub!", e.getMessage());
934b6829f0d28990dd645e16386eb226d0f10c8731shiqian
944b6829f0d28990dd645e16386eb226d0f10c8731shiqian        view.bringToFront();
954b6829f0d28990dd645e16386eb226d0f10c8731shiqian    }
964b6829f0d28990dd645e16386eb226d0f10c8731shiqian
974b6829f0d28990dd645e16386eb226d0f10c8731shiqian    @Test
984b6829f0d28990dd645e16386eb226d0f10c8731shiqian    public void testDirectlyOn_Statics() throws Exception {
994b6829f0d28990dd645e16386eb226d0f10c8731shiqian        View.resolveSize(0, 0);
1004b6829f0d28990dd645e16386eb226d0f10c8731shiqian
1014b6829f0d28990dd645e16386eb226d0f10c8731shiqian        Exception e = null;
1024b6829f0d28990dd645e16386eb226d0f10c8731shiqian        try {
1034b6829f0d28990dd645e16386eb226d0f10c8731shiqian            directlyOn(View.class);
1044b6829f0d28990dd645e16386eb226d0f10c8731shiqian            View.resolveSize(0, 0);
1054834581321d60c17997d65a2360c7674f15f9bbcshiqian        } catch (RuntimeException e1) {
1064b6829f0d28990dd645e16386eb226d0f10c8731shiqian            e = e1;
1074b6829f0d28990dd645e16386eb226d0f10c8731shiqian        }
1084b6829f0d28990dd645e16386eb226d0f10c8731shiqian        assertNotNull(e);
1094b6829f0d28990dd645e16386eb226d0f10c8731shiqian        assertEquals("Stub!", e.getMessage());
1104b6829f0d28990dd645e16386eb226d0f10c8731shiqian
1114b6829f0d28990dd645e16386eb226d0f10c8731shiqian        View.resolveSize(0, 0);
1124b6829f0d28990dd645e16386eb226d0f10c8731shiqian    }
1134b6829f0d28990dd645e16386eb226d0f10c8731shiqian
1144b6829f0d28990dd645e16386eb226d0f10c8731shiqian    @Test
1154b6829f0d28990dd645e16386eb226d0f10c8731shiqian    public void testDirectlyOn_InstanceChecking() throws Exception {
1164b6829f0d28990dd645e16386eb226d0f10c8731shiqian        View view1 = new View(null);
1174b6829f0d28990dd645e16386eb226d0f10c8731shiqian        View view2 = new View(null);
1184b6829f0d28990dd645e16386eb226d0f10c8731shiqian
1194b6829f0d28990dd645e16386eb226d0f10c8731shiqian        Exception e = null;
1204b6829f0d28990dd645e16386eb226d0f10c8731shiqian        try {
1214b6829f0d28990dd645e16386eb226d0f10c8731shiqian            directlyOn(view1);
1224b6829f0d28990dd645e16386eb226d0f10c8731shiqian            view2.bringToFront();
1234b6829f0d28990dd645e16386eb226d0f10c8731shiqian        } catch (RuntimeException e1) {
124e44602ec83c65102035ce5304ae8de0cb16e9e56shiqian            e = e1;
125e44602ec83c65102035ce5304ae8de0cb16e9e56shiqian        }
126e44602ec83c65102035ce5304ae8de0cb16e9e56shiqian        assertNotNull(e);
127e44602ec83c65102035ce5304ae8de0cb16e9e56shiqian        assertThat(e.getMessage(), startsWith("expected to perform direct call on <android.view.View"));
1284b6829f0d28990dd645e16386eb226d0f10c8731shiqian        assertThat(e.getMessage(), containsString("> but got <android.view.View"));
1294b6829f0d28990dd645e16386eb226d0f10c8731shiqian    }
1304b6829f0d28990dd645e16386eb226d0f10c8731shiqian
1314b6829f0d28990dd645e16386eb226d0f10c8731shiqian    @Test
1324b6829f0d28990dd645e16386eb226d0f10c8731shiqian    public void testDirectlyOn_Statics_InstanceChecking() throws Exception {
1334b6829f0d28990dd645e16386eb226d0f10c8731shiqian        TextView.getTextColors(null, null);
1344b6829f0d28990dd645e16386eb226d0f10c8731shiqian
1354b6829f0d28990dd645e16386eb226d0f10c8731shiqian        Exception e = null;
1364b6829f0d28990dd645e16386eb226d0f10c8731shiqian        try {
1374b6829f0d28990dd645e16386eb226d0f10c8731shiqian            directlyOn(View.class);
1384b6829f0d28990dd645e16386eb226d0f10c8731shiqian            TextView.getTextColors(null, null);
1394b6829f0d28990dd645e16386eb226d0f10c8731shiqian        } catch (RuntimeException e1) {
1404b6829f0d28990dd645e16386eb226d0f10c8731shiqian            e = e1;
1414b6829f0d28990dd645e16386eb226d0f10c8731shiqian        }
1424b6829f0d28990dd645e16386eb226d0f10c8731shiqian        assertNotNull(e);
1434b6829f0d28990dd645e16386eb226d0f10c8731shiqian        assertThat(e.getMessage(), equalTo("expected to perform direct call on <class android.view.View> but got <class android.widget.TextView>"));
1444b6829f0d28990dd645e16386eb226d0f10c8731shiqian    }
1454b6829f0d28990dd645e16386eb226d0f10c8731shiqian
1464b6829f0d28990dd645e16386eb226d0f10c8731shiqian    @Test
1474b6829f0d28990dd645e16386eb226d0f10c8731shiqian    public void testDirectlyOn_CallTwiceChecking() throws Exception {
1484b6829f0d28990dd645e16386eb226d0f10c8731shiqian        directlyOn(View.class);
1494b6829f0d28990dd645e16386eb226d0f10c8731shiqian
1504b6829f0d28990dd645e16386eb226d0f10c8731shiqian        Exception e = null;
1514b6829f0d28990dd645e16386eb226d0f10c8731shiqian        try {
1524b6829f0d28990dd645e16386eb226d0f10c8731shiqian            directlyOn(View.class);
153941b5ee8ebaad627df59eaa03509021b3cfa3bafshiqian        } catch (RuntimeException e1) {
154941b5ee8ebaad627df59eaa03509021b3cfa3bafshiqian            e = e1;
155941b5ee8ebaad627df59eaa03509021b3cfa3bafshiqian        }
156941b5ee8ebaad627df59eaa03509021b3cfa3bafshiqian        assertNotNull(e);
157941b5ee8ebaad627df59eaa03509021b3cfa3bafshiqian        assertThat(e.getMessage(), equalTo("already expecting a direct call on <class android.view.View> but here's a new request for <class android.view.View>"));
158941b5ee8ebaad627df59eaa03509021b3cfa3bafshiqian    }
159e44602ec83c65102035ce5304ae8de0cb16e9e56shiqian
160941b5ee8ebaad627df59eaa03509021b3cfa3bafshiqian    @Test
161e44602ec83c65102035ce5304ae8de0cb16e9e56shiqian    public void shouldDelegateToObjectToStringIfShadowHasNone() throws Exception {
1624b6829f0d28990dd645e16386eb226d0f10c8731shiqian        assertTrue(new View(null).toString().startsWith("android.view.View@"));
163941b5ee8ebaad627df59eaa03509021b3cfa3bafshiqian    }
1644b6829f0d28990dd645e16386eb226d0f10c8731shiqian
1654b6829f0d28990dd645e16386eb226d0f10c8731shiqian    @Test
1664b6829f0d28990dd645e16386eb226d0f10c8731shiqian    public void shouldDelegateToObjectHashCodeIfShadowHasNone() throws Exception {
1674b6829f0d28990dd645e16386eb226d0f10c8731shiqian        assertFalse(new View(null).hashCode() == 0);
1684b6829f0d28990dd645e16386eb226d0f10c8731shiqian    }
1694b6829f0d28990dd645e16386eb226d0f10c8731shiqian
1704b6829f0d28990dd645e16386eb226d0f10c8731shiqian    @Test
1714b6829f0d28990dd645e16386eb226d0f10c8731shiqian    public void shouldDelegateToObjectEqualsIfShadowHasNone() throws Exception {
1724b6829f0d28990dd645e16386eb226d0f10c8731shiqian        View view = new View(null);
1734b6829f0d28990dd645e16386eb226d0f10c8731shiqian        assertEquals(view, view);
1744b6829f0d28990dd645e16386eb226d0f10c8731shiqian    }
1754b6829f0d28990dd645e16386eb226d0f10c8731shiqian
1764b6829f0d28990dd645e16386eb226d0f10c8731shiqian    @Implements(ItemizedOverlay.class)
1774b6829f0d28990dd645e16386eb226d0f10c8731shiqian    public static class ItemizedOverlayForTests extends ItemizedOverlay {
1784b6829f0d28990dd645e16386eb226d0f10c8731shiqian        public ItemizedOverlayForTests(Drawable drawable) {
1794b6829f0d28990dd645e16386eb226d0f10c8731shiqian            super(drawable);
1804b6829f0d28990dd645e16386eb226d0f10c8731shiqian        }
1814b6829f0d28990dd645e16386eb226d0f10c8731shiqian
1824b6829f0d28990dd645e16386eb226d0f10c8731shiqian        @Override
183e44602ec83c65102035ce5304ae8de0cb16e9e56shiqian        protected OverlayItem createItem(int i) {
184e44602ec83c65102035ce5304ae8de0cb16e9e56shiqian            return null;
185e44602ec83c65102035ce5304ae8de0cb16e9e56shiqian        }
186e44602ec83c65102035ce5304ae8de0cb16e9e56shiqian
1874b6829f0d28990dd645e16386eb226d0f10c8731shiqian        public void triggerProtectedCall() {
1884b6829f0d28990dd645e16386eb226d0f10c8731shiqian            populate();
1894b6829f0d28990dd645e16386eb226d0f10c8731shiqian        }
1904b6829f0d28990dd645e16386eb226d0f10c8731shiqian
1914b6829f0d28990dd645e16386eb226d0f10c8731shiqian        @Override
1924b6829f0d28990dd645e16386eb226d0f10c8731shiqian        public int size() {
1934b6829f0d28990dd645e16386eb226d0f10c8731shiqian            return 0;
1944b6829f0d28990dd645e16386eb226d0f10c8731shiqian        }
1954b6829f0d28990dd645e16386eb226d0f10c8731shiqian    }
1964b6829f0d28990dd645e16386eb226d0f10c8731shiqian
1974b6829f0d28990dd645e16386eb226d0f10c8731shiqian    @Implements(Paint.class)
1984b6829f0d28990dd645e16386eb226d0f10c8731shiqian    public static class ShadowPaintForTests {
1994b6829f0d28990dd645e16386eb226d0f10c8731shiqian        private int color;
200941b5ee8ebaad627df59eaa03509021b3cfa3bafshiqian
2014b6829f0d28990dd645e16386eb226d0f10c8731shiqian        @Implementation
202941b5ee8ebaad627df59eaa03509021b3cfa3bafshiqian        public void setColor(int color) {
203941b5ee8ebaad627df59eaa03509021b3cfa3bafshiqian            this.color = color;
204941b5ee8ebaad627df59eaa03509021b3cfa3bafshiqian        }
205941b5ee8ebaad627df59eaa03509021b3cfa3bafshiqian
206941b5ee8ebaad627df59eaa03509021b3cfa3bafshiqian        @Implementation
2074b6829f0d28990dd645e16386eb226d0f10c8731shiqian        public int getColor() {
2084b6829f0d28990dd645e16386eb226d0f10c8731shiqian            return color;
2094b6829f0d28990dd645e16386eb226d0f10c8731shiqian        }
2104b6829f0d28990dd645e16386eb226d0f10c8731shiqian    }
2114b6829f0d28990dd645e16386eb226d0f10c8731shiqian
2124b6829f0d28990dd645e16386eb226d0f10c8731shiqian    @Implements(AccountManager.class)
2134b6829f0d28990dd645e16386eb226d0f10c8731shiqian    public static class ShadowAccountManagerForTests {
2144b6829f0d28990dd645e16386eb226d0f10c8731shiqian        public static boolean wasCalled = false;
2154b6829f0d28990dd645e16386eb226d0f10c8731shiqian        public static Context context;
2164b6829f0d28990dd645e16386eb226d0f10c8731shiqian
2174b6829f0d28990dd645e16386eb226d0f10c8731shiqian        public static AccountManager get(Context context) {
2184b6829f0d28990dd645e16386eb226d0f10c8731shiqian            wasCalled = true;
2194b6829f0d28990dd645e16386eb226d0f10c8731shiqian            ShadowAccountManagerForTests.context = context;
2204b6829f0d28990dd645e16386eb226d0f10c8731shiqian            return mock(AccountManager.class);
2214b6829f0d28990dd645e16386eb226d0f10c8731shiqian        }
2224b6829f0d28990dd645e16386eb226d0f10c8731shiqian    }
2234b6829f0d28990dd645e16386eb226d0f10c8731shiqian
2244b6829f0d28990dd645e16386eb226d0f10c8731shiqian    @Instrument
2254b6829f0d28990dd645e16386eb226d0f10c8731shiqian    @SuppressWarnings({"UnusedDeclaration"})
2264b6829f0d28990dd645e16386eb226d0f10c8731shiqian    public static class ClassWithNoDefaultConstructor {
2274b6829f0d28990dd645e16386eb226d0f10c8731shiqian        ClassWithNoDefaultConstructor(String string) {
2284b6829f0d28990dd645e16386eb226d0f10c8731shiqian        }
2294b6829f0d28990dd645e16386eb226d0f10c8731shiqian    }
230941b5ee8ebaad627df59eaa03509021b3cfa3bafshiqian
231941b5ee8ebaad627df59eaa03509021b3cfa3bafshiqian    @Implements(ClassWithNoDefaultConstructor.class)
232941b5ee8ebaad627df59eaa03509021b3cfa3bafshiqian    public static class ShadowClassWithNoDefaultConstructor {
233941b5ee8ebaad627df59eaa03509021b3cfa3bafshiqian    }
2344b6829f0d28990dd645e16386eb226d0f10c8731shiqian}
2354b6829f0d28990dd645e16386eb226d0f10c8731shiqian