package org.robolectric.shadows;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.robolectric.Robolectric;
import org.robolectric.TestRunners;
import org.robolectric.annotation.Config;
import org.robolectric.util.ReflectionHelpers;
import org.robolectric.util.Scheduler;
import static android.os.Build.VERSION_CODES.KITKAT;
import static android.os.Build.VERSION_CODES.LOLLIPOP;
import static org.assertj.core.api.Assertions.assertThat;
import static org.robolectric.Shadows.shadowOf;
@RunWith(TestRunners.MultiApiSelfTest.class)
public class ShadowMessageTest {
@Test
public void testGetDataShouldLazilyCreateBundle() throws Exception {
assertThat(new Message().getData()).isNotNull();
assertThat(new Message().getData().isEmpty()).isTrue();
}
@Test
public void testGetData() throws Exception {
Message m = new Message();
Bundle b = new Bundle();
m.setData(b);
assertThat(m.getData()).isEqualTo(b);
}
@Test
public void testPeekData() throws Exception {
assertThat(new Message().peekData()).isNull();
Message m = new Message();
Bundle b = new Bundle();
m.setData(b);
assertThat(m.peekData()).isEqualTo(b);
}
@Test
public void testGetTarget() throws Exception {
Message m = new Message();
Handler h = new Handler();
m.setTarget(h);
assertThat(m.getTarget()).isEqualTo(h);
}
@Test
public void testCopyFrom() throws Exception {
Bundle b = new Bundle();
Message m = new Message();
m.arg1 = 10;
m.arg2 = 42;
m.obj = "obj";
m.what = 24;
m.setData(b);
m.setTarget(new Handler());
Message m2 = new Message();
m2.copyFrom(m);
assertThat(m2.arg1).isEqualTo(m.arg1);
assertThat(m2.arg2).isEqualTo(m.arg2);
assertThat(m2.obj).isEqualTo(m.obj);
assertThat(m2.what).isEqualTo(m.what);
assertThat(m2.getTarget()).isNull();
assertThat(m2.getData()).isNotNull();
assertThat(m2.getData().isEmpty()).isTrue();
}
@Test
public void testObtain() throws Exception {
Message m = Message.obtain();
assertThat(m).isNotNull();
}
@Test
public void testObtainWithHandler() throws Exception {
Handler h = new Handler();
Message m = Message.obtain(h);
assertThat(m.getTarget()).isEqualTo(h);
}
@Test
public void testObtainWithHandlerAndWhat() throws Exception {
Handler h = new Handler();
int what = 10;
Message m = Message.obtain(h, what);
assertThat(m.getTarget()).isEqualTo(h);
assertThat(m.what).isEqualTo(what);
assertThat(m.getTarget()).isEqualTo(h);
}
@Test
public void testObtainWithHandlerWhatAndObject() throws Exception {
Handler h = new Handler();
int what = 10;
Object obj = "test";
Message m = Message.obtain(h, what, obj);
assertThat(m.getTarget()).isEqualTo(h);
assertThat(m.what).isEqualTo(what);
assertThat(m.getTarget()).isEqualTo(h);
assertThat(m.obj).isEqualTo(obj);
}
@Test
public void testObtainWithHandlerWhatAndTwoArgs() throws Exception {
Handler h = new Handler();
int what = 2;
int arg1 = 3;
int arg2 = 5;
Message m = Message.obtain(h, what, arg1, arg2);
assertThat(m.getTarget()).isEqualTo(h);
assertThat(m.what).isEqualTo(what);
assertThat(m.arg1).isEqualTo(arg1);
assertThat(m.arg2).isEqualTo(arg2);
}
@Test
public void testObtainWithHandlerWhatTwoArgsAndObj() throws Exception {
Handler h = new Handler();
int what = 2;
int arg1 = 3;
int arg2 = 5;
Object obj = "test";
Message m = Message.obtain(h, what, arg1, arg2, obj);
assertThat(m.getTarget()).isEqualTo(h);
assertThat(m.what).isEqualTo(what);
assertThat(m.arg1).isEqualTo(arg1);
assertThat(m.arg2).isEqualTo(arg2);
assertThat(m.obj).isEqualTo(obj);
}
@Test
public void testObtainWithMessage() throws Exception {
Bundle b = new Bundle();
Message m = new Message();
m.arg1 = 10;
m.arg2 = 42;
m.obj = "obj";
m.what = 24;
m.setData(b);
m.setTarget(new Handler());
Message m2 = Message.obtain(m);
assertThat(m2.arg1).isEqualTo(m.arg1);
assertThat(m2.arg2).isEqualTo(m.arg2);
assertThat(m2.obj).isEqualTo(m.obj);
assertThat(m2.what).isEqualTo(m.what);
assertThat(m2.getTarget()).isEqualTo(m.getTarget());
assertThat(m2.getData()).isNotNull();
assertThat(m2.getData().isEmpty()).isTrue();
}
@Test
public void testSendToTarget() throws Exception {
ShadowLooper.pauseMainLooper();
Handler h = new Handler();
Message.obtain(h, 123).sendToTarget();
assertThat(h.hasMessages(123)).isTrue();
}
@Test
public void testSetGetNext() {
Message msg = Message.obtain();
Message msg2 = Message.obtain();
ShadowMessage sMsg = shadowOf(msg);
sMsg.setNext(msg2);
assertThat(sMsg.getNext()).isSameAs(msg2);
}
@Test
@Config(minSdk = LOLLIPOP)
public void testIsInUse() {
ShadowLooper.pauseMainLooper();
Handler h = new Handler();
Message msg = Message.obtain(h, 123);
ShadowMessage sMsg = shadowOf(msg);
assertThat(sMsg.isInUse()).isFalse();
msg.sendToTarget();
assertThat(sMsg.isInUse()).isTrue();
}
@Test
@Config(maxSdk = KITKAT)
public void recycle_shouldInvokeRealObject19() {
recycle_shouldInvokeRealObject("recycle");
}
@Test
@Config(minSdk = LOLLIPOP)
public void recycle_shouldInvokeRealObject21() {
recycle_shouldInvokeRealObject("recycleUnchecked");
}
private void recycle_shouldInvokeRealObject(String recycleMethod) {
Handler h = new Handler();
Message msg = Message.obtain(h, 234);
ReflectionHelpers.callInstanceMethod(msg, recycleMethod);
assertThat(msg.what).isZero();
}
@Test
@Config(maxSdk = KITKAT)
public void recycle_shouldRemoveMessageFromScheduler19() {
recycle_shouldRemoveMessageFromScheduler();
}
@Test
@Config(minSdk = LOLLIPOP)
public void recycle_shouldRemoveMessageFromScheduler21() {
recycle_shouldRemoveMessageFromScheduler();
}
private void recycle_shouldRemoveMessageFromScheduler() {
ShadowLooper.pauseMainLooper();
Handler h = new Handler();
Message msg = Message.obtain(h, 234);
msg.sendToTarget();
Scheduler scheduler = Robolectric.getForegroundThreadScheduler();
assertThat(scheduler.size()).as("before recycle").isEqualTo(1);
shadowOf(msg).recycleUnchecked();
assertThat(scheduler.size()).as("after recycle").isEqualTo(0);
}
@Test
public void reset_shouldEmptyMessagePool() {
Message dummy1 = Message.obtain();
shadowOf(dummy1).recycleUnchecked();
Message dummy2 = Message.obtain();
assertThat(dummy2).as("before resetting").isSameAs(dummy1);
shadowOf(dummy2).recycleUnchecked();
Robolectric.reset();
dummy1 = Message.obtain();
assertThat(dummy1).as("after resetting").isNotSameAs(dummy2);
}
}