Merge branch 'master' of github.com:pivotal/robolectric
diff --git a/src/main/java/com/xtremelabs/robolectric/Robolectric.java b/src/main/java/com/xtremelabs/robolectric/Robolectric.java
index b8bc079..e7c12a0 100644
--- a/src/main/java/com/xtremelabs/robolectric/Robolectric.java
+++ b/src/main/java/com/xtremelabs/robolectric/Robolectric.java
@@ -695,6 +695,10 @@
return (ShadowMenuInflater) shadowOf_(instance);
}
+ public static ShadowMessage shadowOf(Message instance) {
+ return (ShadowMessage) shadowOf_(instance);
+ }
+
public static ShadowMimeTypeMap shadowOf(MimeTypeMap instance) {
return (ShadowMimeTypeMap) shadowOf_(instance);
}
diff --git a/src/main/java/com/xtremelabs/robolectric/shadows/ShadowHandler.java b/src/main/java/com/xtremelabs/robolectric/shadows/ShadowHandler.java
index 74af258..20f8c8a 100644
--- a/src/main/java/com/xtremelabs/robolectric/shadows/ShadowHandler.java
+++ b/src/main/java/com/xtremelabs/robolectric/shadows/ShadowHandler.java
@@ -3,6 +3,8 @@
import android.os.Handler;
import android.os.Looper;
import android.os.Message;
+
+import com.xtremelabs.robolectric.Robolectric;
import com.xtremelabs.robolectric.internal.Implementation;
import com.xtremelabs.robolectric.internal.Implements;
import com.xtremelabs.robolectric.internal.RealObject;
@@ -95,6 +97,7 @@
@Implementation
public final boolean sendMessageDelayed(final Message msg, long delayMillis) {
+ Robolectric.shadowOf(msg).setWhen(Robolectric.shadowOf(looper).getScheduler().getCurrentTime()+delayMillis);
messages.add(msg);
postDelayed(new Runnable() {
@Override
@@ -108,20 +111,6 @@
return true;
}
- private final boolean sendMessageToFrontDelayed(final Message msg, long delayMillis) {
- messages.add(0, msg);
- postAtFrontOfQueue(new Runnable() {
- @Override
- public void run() {
- if (messages.contains(msg)) {
- routeMessage(msg);
- messages.remove(msg);
- }
- }
- });
- return true;
- }
-
private void routeMessage(Message msg) {
if(callback != null) {
callback.handleMessage(msg);
@@ -143,8 +132,19 @@
}
@Implementation
- public final boolean sendMessageAtFrontOfQueue(Message msg) {
- return sendMessageToFrontDelayed(msg, 0L);
+ public final boolean sendMessageAtFrontOfQueue(final Message msg) {
+ Robolectric.shadowOf(msg).setWhen(Robolectric.shadowOf(looper).getScheduler().getCurrentTime());
+ messages.add(0, msg);
+ postAtFrontOfQueue(new Runnable() {
+ @Override
+ public void run() {
+ if (messages.contains(msg)) {
+ routeMessage(msg);
+ messages.remove(msg);
+ }
+ }
+ });
+ return true;
}
@Implementation
diff --git a/src/main/java/com/xtremelabs/robolectric/shadows/ShadowMessage.java b/src/main/java/com/xtremelabs/robolectric/shadows/ShadowMessage.java
index 4c0b82d..d1588c0 100644
--- a/src/main/java/com/xtremelabs/robolectric/shadows/ShadowMessage.java
+++ b/src/main/java/com/xtremelabs/robolectric/shadows/ShadowMessage.java
@@ -1,6 +1,7 @@
package com.xtremelabs.robolectric.shadows;
+import com.xtremelabs.robolectric.Robolectric;
import com.xtremelabs.robolectric.internal.Implementation;
import com.xtremelabs.robolectric.internal.Implements;
import com.xtremelabs.robolectric.internal.RealObject;
@@ -13,6 +14,7 @@
public class ShadowMessage {
private Bundle data;
private Handler target;
+ private long when;
@RealObject
private Message message;
@@ -107,4 +109,13 @@
public void sendToTarget() {
target.sendMessage(message);
}
+
+ @Implementation
+ public long getWhen() {
+ return when;
+ }
+
+ public void setWhen(long when) {
+ this.when = when;
+ }
}
diff --git a/src/test/java/com/xtremelabs/robolectric/shadows/HandlerTest.java b/src/test/java/com/xtremelabs/robolectric/shadows/HandlerTest.java
index 0109af8..8212be7 100644
--- a/src/test/java/com/xtremelabs/robolectric/shadows/HandlerTest.java
+++ b/src/test/java/com/xtremelabs/robolectric/shadows/HandlerTest.java
@@ -19,6 +19,9 @@
import static org.junit.Assert.assertTrue;
import static org.junit.Assert.assertFalse;
+import java.util.ArrayList;
+import java.util.List;
+
@RunWith(WithTestDefaultsRunner.class)
public class HandlerTest {
private Transcript transcript;
@@ -340,6 +343,33 @@
assertThat(m4.obj, equalTo((Object)"foo"));
}
+ @Test
+ public void shouldSetWhenOnMessage() throws Exception {
+ final List<Message> msgs = new ArrayList<Message>();
+ Handler h = new Handler(new Handler.Callback() {
+ @Override
+ public boolean handleMessage(Message msg) {
+ msgs.add(msg);
+ return false;
+ }
+ });
+
+ h.sendEmptyMessage(0);
+ h.sendEmptyMessageDelayed(0, 4000l);
+ Robolectric.getUiThreadScheduler().advanceToLastPostedRunnable();
+ h.sendEmptyMessageDelayed(0, 12000l);
+ Robolectric.getUiThreadScheduler().advanceToLastPostedRunnable();
+ assertThat(msgs.size(), equalTo(3));
+
+ Message m0 = msgs.get(0);
+ Message m1 = msgs.get(1);
+ Message m2 = msgs.get(2);
+
+ assertThat(m0.getWhen(), equalTo(0l));
+ assertThat(m1.getWhen(), equalTo(4000l));
+ assertThat(m2.getWhen(), equalTo(16000l));
+ }
+
private class Say implements Runnable {
private String event;