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