package com.xtremelabs.robolectric; import android.app.Activity; import android.content.Context; import android.os.Handler; import android.view.Display; import android.view.View; import com.xtremelabs.robolectric.internal.Implementation; import com.xtremelabs.robolectric.internal.Implements; import com.xtremelabs.robolectric.shadows.ShadowDisplay; import com.xtremelabs.robolectric.util.TestOnClickListener; import org.apache.http.HttpException; import org.apache.http.HttpResponse; import org.apache.http.client.methods.HttpGet; import org.apache.http.conn.ConnectionKeepAliveStrategy; import org.apache.http.impl.client.DefaultRequestDirector; import org.apache.http.protocol.HttpContext; import org.junit.After; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.PrintStream; import static com.xtremelabs.robolectric.Robolectric.shadowOf; import static org.hamcrest.CoreMatchers.equalTo; import static org.junit.Assert.*; @RunWith(WithTestDefaultsRunner.class) public class RobolectricTest { private PrintStream originalSystemOut; private ByteArrayOutputStream buff; private String defaultLineSeparator; @Before public void setUp() { originalSystemOut = System.out; defaultLineSeparator = System.getProperty("line.separator"); System.setProperty("line.separator", "\n"); buff = new ByteArrayOutputStream(); PrintStream testOut = new PrintStream(buff); System.setOut(testOut); } @After public void tearDown() throws Exception { System.setProperty("line.separator", defaultLineSeparator); System.setOut(originalSystemOut); } @Test public void shouldLogMissingInvokedShadowMethodsWhenRequested() throws Exception { Robolectric.bindShadowClass(TestShadowView.class); Robolectric.logMissingInvokedShadowMethods(); View aView = new View(null); // There's a shadow method for this aView.getContext(); String output = buff.toString(); assertEquals("No Shadow method found for View.(android.content.Context)\n", output); buff.reset(); aView.findViewById(27); // No shadow here... should be logged output = buff.toString(); assertEquals("No Shadow method found for View.findViewById(int)\n", output); } @Test // This is nasty because it depends on the test above having run first in order to fail public void shouldNotLogMissingInvokedShadowMethodsByDefault() throws Exception { View aView = new View(null); aView.findViewById(27); String output = buff.toString(); assertEquals("", output); } @Test(expected = RuntimeException.class) public void clickOn_shouldThrowIfViewIsDisabled() throws Exception { View view = new View(null); view.setEnabled(false); Robolectric.clickOn(view); } @Test public void shouldResetBackgroundSchedulerBeforeTests() throws Exception { assertThat(Robolectric.getBackgroundScheduler().isPaused(), equalTo(false)); Robolectric.getBackgroundScheduler().pause(); } @Test public void shouldResetBackgroundSchedulerAfterTests() throws Exception { assertThat(Robolectric.getBackgroundScheduler().isPaused(), equalTo(false)); Robolectric.getBackgroundScheduler().pause(); } @Test public void httpRequestWasSent_ReturnsTrueIfRequestWasSent() throws IOException, HttpException { makeRequest("http://example.com"); assertTrue(Robolectric.httpRequestWasMade()); } @Test public void httpRequestWasMade_ReturnsFalseIfNoRequestWasMade() { assertFalse(Robolectric.httpRequestWasMade()); } @Test public void httpRequestWasMade_returnsTrueIfRequestMatchingGivenRuleWasMade() throws IOException, HttpException { makeRequest("http://example.com"); assertTrue(Robolectric.httpRequestWasMade("http://example.com")); } @Test public void httpRequestWasMade_returnsFalseIfNoRequestMatchingGivenRuleWasMAde() throws IOException, HttpException { makeRequest("http://example.com"); assertFalse(Robolectric.httpRequestWasMade("http://example.org")); } @Test public void idleMainLooper_executesScheduledTasks() { final boolean[] wasRun = new boolean[]{false}; new Handler().postDelayed(new Runnable() { @Override public void run() { wasRun[0] = true; } }, 2000); assertFalse(wasRun[0]); Robolectric.idleMainLooper(1999); assertFalse(wasRun[0]); Robolectric.idleMainLooper(1); assertTrue(wasRun[0]); } @Test public void shouldUseSetDensityForContexts() throws Exception { assertThat(new Activity().getResources().getDisplayMetrics().density, equalTo(1.0f)); Robolectric.setDisplayMetricsDensity(1.5f); assertThat(new Activity().getResources().getDisplayMetrics().density, equalTo(1.5f)); } @Test public void shouldUseSetDisplayForContexts() throws Exception { assertThat(new Activity().getResources().getDisplayMetrics().widthPixels, equalTo(480)); assertThat(new Activity().getResources().getDisplayMetrics().heightPixels, equalTo(800)); Display display = Robolectric.newInstanceOf(Display.class); ShadowDisplay shadowDisplay = shadowOf(display); shadowDisplay.setWidth(100); shadowDisplay.setHeight(200); Robolectric.setDefaultDisplay(display); assertThat(new Activity().getResources().getDisplayMetrics().widthPixels, equalTo(100)); assertThat(new Activity().getResources().getDisplayMetrics().heightPixels, equalTo(200)); } public void clickOn_shouldCallClickListener() throws Exception { View view = new View(null); TestOnClickListener testOnClickListener = new TestOnClickListener(); view.setOnClickListener(testOnClickListener); Robolectric.clickOn(view); assertTrue(testOnClickListener.clicked); } @Implements(View.class) public static class TestShadowView { @SuppressWarnings({"UnusedDeclaration"}) @Implementation public Context getContext() { return null; } } private void makeRequest(String uri) throws HttpException, IOException { Robolectric.addPendingHttpResponse(200, "a happy response body"); ConnectionKeepAliveStrategy connectionKeepAliveStrategy = new ConnectionKeepAliveStrategy() { @Override public long getKeepAliveDuration(HttpResponse httpResponse, HttpContext httpContext) { return 0; } }; DefaultRequestDirector requestDirector = new DefaultRequestDirector(null, null, null, connectionKeepAliveStrategy, null, null, null, null, null, null, null, null); requestDirector.execute(null, new HttpGet(uri), null); } }