Home | History | Annotate | Download | only in robolectric
      1 package com.xtremelabs.robolectric;
      2 
      3 import android.app.Activity;
      4 import android.content.Context;
      5 import android.os.Handler;
      6 import android.view.Display;
      7 import android.view.View;
      8 import com.xtremelabs.robolectric.internal.Implementation;
      9 import com.xtremelabs.robolectric.internal.Implements;
     10 import com.xtremelabs.robolectric.shadows.ShadowDisplay;
     11 import com.xtremelabs.robolectric.util.TestOnClickListener;
     12 import org.apache.http.HttpException;
     13 import org.apache.http.HttpResponse;
     14 import org.apache.http.client.methods.HttpGet;
     15 import org.apache.http.conn.ConnectionKeepAliveStrategy;
     16 import org.apache.http.impl.client.DefaultRequestDirector;
     17 import org.apache.http.protocol.HttpContext;
     18 import org.junit.After;
     19 import org.junit.Before;
     20 import org.junit.Test;
     21 import org.junit.runner.RunWith;
     22 
     23 import java.io.ByteArrayOutputStream;
     24 import java.io.IOException;
     25 import java.io.PrintStream;
     26 
     27 import static com.xtremelabs.robolectric.Robolectric.shadowOf;
     28 import static org.hamcrest.CoreMatchers.equalTo;
     29 import static org.junit.Assert.*;
     30 
     31 @RunWith(WithTestDefaultsRunner.class)
     32 public class RobolectricTest {
     33 
     34     private PrintStream originalSystemOut;
     35     private ByteArrayOutputStream buff;
     36     private String defaultLineSeparator;
     37 
     38     @Before
     39     public void setUp() {
     40         originalSystemOut = System.out;
     41         defaultLineSeparator = System.getProperty("line.separator");
     42 
     43         System.setProperty("line.separator", "\n");
     44         buff = new ByteArrayOutputStream();
     45         PrintStream testOut = new PrintStream(buff);
     46         System.setOut(testOut);
     47     }
     48 
     49     @After
     50     public void tearDown() throws Exception {
     51         System.setProperty("line.separator", defaultLineSeparator);
     52         System.setOut(originalSystemOut);
     53     }
     54 
     55     @Test
     56     public void shouldLogMissingInvokedShadowMethodsWhenRequested() throws Exception {
     57         Robolectric.bindShadowClass(TestShadowView.class);
     58         Robolectric.logMissingInvokedShadowMethods();
     59 
     60 
     61         View aView = new View(null);
     62         // There's a shadow method for this
     63         aView.getContext();
     64         String output = buff.toString();
     65         assertEquals("No Shadow method found for View.<init>(android.content.Context)\n", output);
     66         buff.reset();
     67 
     68         aView.findViewById(27);
     69         // No shadow here... should be logged
     70         output = buff.toString();
     71         assertEquals("No Shadow method found for View.findViewById(int)\n", output);
     72     }
     73 
     74     @Test // This is nasty because it depends on the test above having run first in order to fail
     75     public void shouldNotLogMissingInvokedShadowMethodsByDefault() throws Exception {
     76         View aView = new View(null);
     77         aView.findViewById(27);
     78         String output = buff.toString();
     79 
     80         assertEquals("", output);
     81     }
     82 
     83     @Test(expected = RuntimeException.class)
     84     public void clickOn_shouldThrowIfViewIsDisabled() throws Exception {
     85         View view = new View(null);
     86         view.setEnabled(false);
     87         Robolectric.clickOn(view);
     88     }
     89 
     90     @Test
     91     public void shouldResetBackgroundSchedulerBeforeTests() throws Exception {
     92         assertThat(Robolectric.getBackgroundScheduler().isPaused(), equalTo(false));
     93         Robolectric.getBackgroundScheduler().pause();
     94     }
     95 
     96     @Test
     97     public void shouldResetBackgroundSchedulerAfterTests() throws Exception {
     98         assertThat(Robolectric.getBackgroundScheduler().isPaused(), equalTo(false));
     99         Robolectric.getBackgroundScheduler().pause();
    100     }
    101 
    102     @Test
    103     public void httpRequestWasSent_ReturnsTrueIfRequestWasSent() throws IOException, HttpException {
    104         makeRequest("http://example.com");
    105 
    106         assertTrue(Robolectric.httpRequestWasMade());
    107     }
    108 
    109     @Test
    110     public void httpRequestWasMade_ReturnsFalseIfNoRequestWasMade() {
    111         assertFalse(Robolectric.httpRequestWasMade());
    112     }
    113 
    114     @Test
    115     public void httpRequestWasMade_returnsTrueIfRequestMatchingGivenRuleWasMade() throws IOException, HttpException {
    116         makeRequest("http://example.com");
    117         assertTrue(Robolectric.httpRequestWasMade("http://example.com"));
    118     }
    119 
    120     @Test
    121     public void httpRequestWasMade_returnsFalseIfNoRequestMatchingGivenRuleWasMAde() throws IOException, HttpException {
    122         makeRequest("http://example.com");
    123         assertFalse(Robolectric.httpRequestWasMade("http://example.org"));
    124     }
    125 
    126     @Test
    127     public void idleMainLooper_executesScheduledTasks() {
    128         final boolean[] wasRun = new boolean[]{false};
    129         new Handler().postDelayed(new Runnable() {
    130             @Override
    131             public void run() {
    132                 wasRun[0] = true;
    133             }
    134         }, 2000);
    135 
    136         assertFalse(wasRun[0]);
    137         Robolectric.idleMainLooper(1999);
    138         assertFalse(wasRun[0]);
    139         Robolectric.idleMainLooper(1);
    140         assertTrue(wasRun[0]);
    141     }
    142 
    143     @Test
    144     public void shouldUseSetDensityForContexts() throws Exception {
    145         assertThat(new Activity().getResources().getDisplayMetrics().density, equalTo(1.0f));
    146         Robolectric.setDisplayMetricsDensity(1.5f);
    147         assertThat(new Activity().getResources().getDisplayMetrics().density, equalTo(1.5f));
    148     }
    149 
    150     @Test
    151     public void shouldUseSetDisplayForContexts() throws Exception {
    152         assertThat(new Activity().getResources().getDisplayMetrics().widthPixels, equalTo(480));
    153         assertThat(new Activity().getResources().getDisplayMetrics().heightPixels, equalTo(800));
    154 
    155         Display display = Robolectric.newInstanceOf(Display.class);
    156         ShadowDisplay shadowDisplay = shadowOf(display);
    157         shadowDisplay.setWidth(100);
    158         shadowDisplay.setHeight(200);
    159         Robolectric.setDefaultDisplay(display);
    160 
    161         assertThat(new Activity().getResources().getDisplayMetrics().widthPixels, equalTo(100));
    162         assertThat(new Activity().getResources().getDisplayMetrics().heightPixels, equalTo(200));
    163     }
    164 
    165     public void clickOn_shouldCallClickListener() throws Exception {
    166         View view = new View(null);
    167         TestOnClickListener testOnClickListener = new TestOnClickListener();
    168         view.setOnClickListener(testOnClickListener);
    169         Robolectric.clickOn(view);
    170         assertTrue(testOnClickListener.clicked);
    171     }
    172 
    173     @Implements(View.class)
    174     public static class TestShadowView {
    175         @SuppressWarnings({"UnusedDeclaration"})
    176         @Implementation
    177         public Context getContext() {
    178             return null;
    179         }
    180     }
    181 
    182     private void makeRequest(String uri) throws HttpException, IOException {
    183         Robolectric.addPendingHttpResponse(200, "a happy response body");
    184 
    185         ConnectionKeepAliveStrategy connectionKeepAliveStrategy = new ConnectionKeepAliveStrategy() {
    186             @Override
    187             public long getKeepAliveDuration(HttpResponse httpResponse, HttpContext httpContext) {
    188                 return 0;
    189             }
    190 
    191         };
    192         DefaultRequestDirector requestDirector = new DefaultRequestDirector(null, null, null, connectionKeepAliveStrategy, null, null, null, null, null, null, null, null);
    193 
    194         requestDirector.execute(null, new HttpGet(uri), null);
    195     }
    196 }
    197