blob: 8d35ce65b3e2888dd0562ad7fc91ed249c801d99 [file] [log] [blame]
package com.xtremelabs.robolectric.bytecode;
import android.accounts.AccountManager;
import android.content.Context;
import android.graphics.Paint;
import android.graphics.drawable.Drawable;
import android.util.Log;
import android.view.View;
import android.widget.TextView;
import com.google.android.maps.ItemizedOverlay;
import com.google.android.maps.OverlayItem;
import com.xtremelabs.robolectric.Robolectric;
import com.xtremelabs.robolectric.WithTestDefaultsRunner;
import com.xtremelabs.robolectric.internal.Implementation;
import com.xtremelabs.robolectric.internal.Implements;
import com.xtremelabs.robolectric.internal.Instrument;
import com.xtremelabs.robolectric.shadows.ShadowItemizedOverlay;
import org.junit.Test;
import org.junit.runner.RunWith;
import java.lang.reflect.Constructor;
import static com.xtremelabs.robolectric.Robolectric.directlyOn;
import static com.xtremelabs.robolectric.RobolectricForMaps.shadowOf;
import static org.hamcrest.CoreMatchers.*;
import static org.hamcrest.core.StringContains.containsString;
import static org.hamcrest.core.StringStartsWith.startsWith;
import static org.junit.Assert.*;
import static org.mockito.Mockito.mock;
@RunWith(WithTestDefaultsRunner.class)
public class AndroidTranslatorTest {
@Test
public void testStaticMethodsAreDelegated() throws Exception {
Robolectric.bindShadowClass(ShadowAccountManagerForTests.class);
Context context = mock(Context.class);
AccountManager.get(context);
assertThat(ShadowAccountManagerForTests.wasCalled, is(true));
assertThat(ShadowAccountManagerForTests.context, sameInstance(context));
}
@Test
public void testProtectedMethodsAreDelegated() throws Exception {
Robolectric.bindShadowClass(ShadowItemizedOverlay.class);
ItemizedOverlayForTests overlay = new ItemizedOverlayForTests(null);
overlay.triggerProtectedCall();
assertThat(shadowOf(overlay).isPopulated(), is(true));
}
@Test
public void testNativeMethodsAreDelegated() throws Exception {
Robolectric.bindShadowClass(ShadowPaintForTests.class);
Paint paint = new Paint();
paint.setColor(1234);
assertThat(paint.getColor(), is(1234));
}
@Test
public void testPrintlnWorks() throws Exception {
Log.println(1, "tag", "msg");
}
@Test
public void testGeneratedDefaultConstructorIsWired() throws Exception {
Robolectric.bindShadowClass(ShadowClassWithNoDefaultConstructor.class);
Constructor<ClassWithNoDefaultConstructor> ctor = ClassWithNoDefaultConstructor.class.getDeclaredConstructor();
ctor.setAccessible(true);
ClassWithNoDefaultConstructor instance = ctor.newInstance();
assertThat(Robolectric.shadowOf_(instance), not(nullValue()));
assertThat(Robolectric.shadowOf_(instance), instanceOf(ShadowClassWithNoDefaultConstructor.class));
}
@Test
public void testDirectlyOn() throws Exception {
View view = new View(null);
view.bringToFront();
Exception e = null;
try {
directlyOn(view).bringToFront();
} catch (RuntimeException e1) {
e = e1;
}
assertNotNull(e);
assertEquals("Stub!", e.getMessage());
view.bringToFront();
}
@Test
public void testDirectlyOn_Statics() throws Exception {
View.resolveSize(0, 0);
Exception e = null;
try {
directlyOn(View.class);
View.resolveSize(0, 0);
} catch (RuntimeException e1) {
e = e1;
}
assertNotNull(e);
assertEquals("Stub!", e.getMessage());
View.resolveSize(0, 0);
}
@Test
public void testDirectlyOn_InstanceChecking() throws Exception {
View view1 = new View(null);
View view2 = new View(null);
Exception e = null;
try {
directlyOn(view1);
view2.bringToFront();
} catch (RuntimeException e1) {
e = e1;
}
assertNotNull(e);
assertThat(e.getMessage(), startsWith("expected to perform direct call on <android.view.View"));
assertThat(e.getMessage(), containsString("> but got <android.view.View"));
}
@Test
public void testDirectlyOn_Statics_InstanceChecking() throws Exception {
TextView.getTextColors(null, null);
Exception e = null;
try {
directlyOn(View.class);
TextView.getTextColors(null, null);
} catch (RuntimeException e1) {
e = e1;
}
assertNotNull(e);
assertThat(e.getMessage(), equalTo("expected to perform direct call on <class android.view.View> but got <class android.widget.TextView>"));
}
@Test
public void testDirectlyOn_CallTwiceChecking() throws Exception {
directlyOn(View.class);
Exception e = null;
try {
directlyOn(View.class);
} catch (RuntimeException e1) {
e = e1;
}
assertNotNull(e);
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>"));
}
@Test
public void shouldDelegateToObjectToStringIfShadowHasNone() throws Exception {
assertTrue(new View(null).toString().startsWith("android.view.View@"));
}
@Test
public void shouldDelegateToObjectHashCodeIfShadowHasNone() throws Exception {
assertFalse(new View(null).hashCode() == 0);
}
@Test
public void shouldDelegateToObjectEqualsIfShadowHasNone() throws Exception {
View view = new View(null);
assertEquals(view, view);
}
@Implements(ItemizedOverlay.class)
public static class ItemizedOverlayForTests extends ItemizedOverlay {
public ItemizedOverlayForTests(Drawable drawable) {
super(drawable);
}
@Override
protected OverlayItem createItem(int i) {
return null;
}
public void triggerProtectedCall() {
populate();
}
@Override
public int size() {
return 0;
}
}
@Implements(Paint.class)
public static class ShadowPaintForTests {
private int color;
@Implementation
public void setColor(int color) {
this.color = color;
}
@Implementation
public int getColor() {
return color;
}
}
@Implements(AccountManager.class)
public static class ShadowAccountManagerForTests {
public static boolean wasCalled = false;
public static Context context;
public static AccountManager get(Context context) {
wasCalled = true;
ShadowAccountManagerForTests.context = context;
return mock(AccountManager.class);
}
}
@Instrument
@SuppressWarnings({"UnusedDeclaration"})
public static class ClassWithNoDefaultConstructor {
ClassWithNoDefaultConstructor(String string) {
}
}
@Implements(ClassWithNoDefaultConstructor.class)
public static class ShadowClassWithNoDefaultConstructor {
}
}