blob: ce1dfe1ff8bbed4a080c10ef0d419e031867d285 [file] [log] [blame]
package com.xtremelabs.robolectric.matchers;
import android.app.Service;
import android.content.Context;
import android.content.ContextWrapper;
import android.content.Intent;
import com.xtremelabs.robolectric.shadows.ShadowIntent;
import org.hamcrest.Description;
import org.junit.internal.matchers.TypeSafeMatcher;
import java.util.Set;
import static com.xtremelabs.robolectric.Robolectric.getShadowApplication;
import static com.xtremelabs.robolectric.Robolectric.shadowOf;
public class StartedServiceMatcher extends TypeSafeMatcher<Context> {
private final Intent expectedIntent;
private String message;
public StartedServiceMatcher(Intent expectedIntent) {
this.expectedIntent = expectedIntent;
}
public StartedServiceMatcher(String packageName, Class<? extends Service> expectedServiceClass) {
this(createIntent(packageName, expectedServiceClass));
}
public StartedServiceMatcher(Class<? extends Service> expectedServiceClass) {
this(createIntent(expectedServiceClass));
}
public StartedServiceMatcher(Class<? extends Service> expectedServiceClass, String expectedAction) {
this(createIntent(expectedServiceClass));
expectedIntent.setAction(expectedAction);
}
/**
* Check if the class of the intent and the keys of the intent's extras match
*
* @param actualContext
* @return
*/
@Override
public boolean matchesSafely(Context actualContext) {
if (expectedIntent == null) {
message = "null intent (did you mean to expect null?)";
return false;
}
String expected = expectedIntent.toString();
message = "to start " + expected + ", but ";
Intent actualStartedIntent = shadowOf((ContextWrapper) actualContext).getNextStartedService();
if (actualStartedIntent == null) {
message += "didn't start anything";
return false;
}
ShadowIntent shadowIntent = shadowOf(actualStartedIntent);
//boolean intentsMatch = shadowOf(expectedIntent).realIntentEquals(shadowIntent);
// Test only that we are sending intent to the right service class
boolean intentsMatch = shadowOf(expectedIntent).getIntentClass().equals(shadowIntent.getIntentClass());
if (!intentsMatch) {
message += "started " + actualStartedIntent;
} else {
// Test that both intent extras have the same keys
Set<String> keys = shadowIntent.getExtras().keySet();
Set<String> expectedKeys = shadowOf(expectedIntent).getExtras().keySet();
intentsMatch = keys.equals(expectedKeys);
if(!intentsMatch){
message += "did not get the same extras keys";
}
}
return intentsMatch;
}
@Override
public void describeTo(Description description) {
description.appendText(message);
}
public static Intent createIntent(Class<? extends Service> serviceClass, String extraKey, String extraValue) {
Intent intent = createIntent(serviceClass);
intent.putExtra(extraKey, extraValue);
return intent;
}
public static Intent createIntent(Class<? extends Service> serviceClass, String action) {
Intent intent = createIntent(serviceClass);
intent.setAction(action);
return intent;
}
public static Intent createIntent(Class<? extends Service> serviceClass) {
Package pack = serviceClass.getPackage();
String packageName = "android.service";
// getPackage is returning null when run from tests
if(pack != null) {
pack.getName();
}
return createIntent(packageName, serviceClass);
}
public static Intent createIntent(String packageName, Class<? extends Service> serviceClass) {
Intent intent = new Intent();
intent.setClassName(packageName, serviceClass.getName());
intent.setClass(getShadowApplication().getApplicationContext(), serviceClass);
return intent;
}
}