1b20795785ec86b19f236290dcaaa647ff7a46e04Sebastien Plissonpackage com.xtremelabs.robolectric.matchers; 2b20795785ec86b19f236290dcaaa647ff7a46e04Sebastien Plisson 3b20795785ec86b19f236290dcaaa647ff7a46e04Sebastien Plissonimport android.app.IntentService; 4b20795785ec86b19f236290dcaaa647ff7a46e04Sebastien Plissonimport android.content.Context; 5b20795785ec86b19f236290dcaaa647ff7a46e04Sebastien Plissonimport android.content.Intent; 6b20795785ec86b19f236290dcaaa647ff7a46e04Sebastien Plissonimport android.service.wallpaper.WallpaperService; 7b20795785ec86b19f236290dcaaa647ff7a46e04Sebastien Plissonimport com.xtremelabs.robolectric.Robolectric; 8b20795785ec86b19f236290dcaaa647ff7a46e04Sebastien Plissonimport com.xtremelabs.robolectric.WithTestDefaultsRunner; 9b20795785ec86b19f236290dcaaa647ff7a46e04Sebastien Plissonimport org.hamcrest.Description; 10b20795785ec86b19f236290dcaaa647ff7a46e04Sebastien Plissonimport org.hamcrest.Matcher; 11b20795785ec86b19f236290dcaaa647ff7a46e04Sebastien Plissonimport org.hamcrest.StringDescription; 12b20795785ec86b19f236290dcaaa647ff7a46e04Sebastien Plissonimport org.junit.Before; 13b20795785ec86b19f236290dcaaa647ff7a46e04Sebastien Plissonimport org.junit.Test; 14b20795785ec86b19f236290dcaaa647ff7a46e04Sebastien Plissonimport org.junit.internal.matchers.TypeSafeMatcher; 15b20795785ec86b19f236290dcaaa647ff7a46e04Sebastien Plissonimport org.junit.runner.RunWith; 16b20795785ec86b19f236290dcaaa647ff7a46e04Sebastien Plissonimport static com.xtremelabs.robolectric.matchers.StartedServiceMatcher.createIntent; 17b20795785ec86b19f236290dcaaa647ff7a46e04Sebastien Plissonimport static org.junit.Assert.assertThat; 18b20795785ec86b19f236290dcaaa647ff7a46e04Sebastien Plisson 19b20795785ec86b19f236290dcaaa647ff7a46e04Sebastien Plisson@RunWith(WithTestDefaultsRunner.class) 20b20795785ec86b19f236290dcaaa647ff7a46e04Sebastien Plissonpublic class StartedServiceMatcherTest { 21b20795785ec86b19f236290dcaaa647ff7a46e04Sebastien Plisson private WallpaperService service; 22b20795785ec86b19f236290dcaaa647ff7a46e04Sebastien Plisson private Intent intentWithExtra; 23b20795785ec86b19f236290dcaaa647ff7a46e04Sebastien Plisson 24b20795785ec86b19f236290dcaaa647ff7a46e04Sebastien Plisson @Before 25b20795785ec86b19f236290dcaaa647ff7a46e04Sebastien Plisson public void setUp() throws Exception { 26b20795785ec86b19f236290dcaaa647ff7a46e04Sebastien Plisson Robolectric.bindDefaultShadowClasses(); 27b20795785ec86b19f236290dcaaa647ff7a46e04Sebastien Plisson Robolectric.resetStaticState(); 28b20795785ec86b19f236290dcaaa647ff7a46e04Sebastien Plisson 29b20795785ec86b19f236290dcaaa647ff7a46e04Sebastien Plisson service = new WallpaperService() { 30b20795785ec86b19f236290dcaaa647ff7a46e04Sebastien Plisson @Override 31b20795785ec86b19f236290dcaaa647ff7a46e04Sebastien Plisson public Engine onCreateEngine() { 32b20795785ec86b19f236290dcaaa647ff7a46e04Sebastien Plisson return null; 33b20795785ec86b19f236290dcaaa647ff7a46e04Sebastien Plisson } 34b20795785ec86b19f236290dcaaa647ff7a46e04Sebastien Plisson }; 35b20795785ec86b19f236290dcaaa647ff7a46e04Sebastien Plisson intentWithExtra = createIntent(WallpaperService.class, "someExtra", "value"); 36b20795785ec86b19f236290dcaaa647ff7a46e04Sebastien Plisson } 37b20795785ec86b19f236290dcaaa647ff7a46e04Sebastien Plisson// 38b20795785ec86b19f236290dcaaa647ff7a46e04Sebastien Plisson @Test 39b20795785ec86b19f236290dcaaa647ff7a46e04Sebastien Plisson public void shouldSayDidntStartAnythingIfNothingWasStarted() throws Exception { 40b20795785ec86b19f236290dcaaa647ff7a46e04Sebastien Plisson assertThat(new StartedServiceMatcher(WallpaperService.class), 41b20795785ec86b19f236290dcaaa647ff7a46e04Sebastien Plisson givesFailureMessage((Context) service, "to start " + createIntent(WallpaperService.class) + ", but didn't start anything")); 42b20795785ec86b19f236290dcaaa647ff7a46e04Sebastien Plisson 43b20795785ec86b19f236290dcaaa647ff7a46e04Sebastien Plisson assertThat(new StartedServiceMatcher(WallpaperService.class, "view"), 44b20795785ec86b19f236290dcaaa647ff7a46e04Sebastien Plisson givesFailureMessage((Context) service, "to start " + createIntent(WallpaperService.class, "view") + ", but didn't start anything")); 45b20795785ec86b19f236290dcaaa647ff7a46e04Sebastien Plisson 46b20795785ec86b19f236290dcaaa647ff7a46e04Sebastien Plisson assertThat(new StartedServiceMatcher(intentWithExtra), 47b20795785ec86b19f236290dcaaa647ff7a46e04Sebastien Plisson givesFailureMessage((Context) service, "to start " + intentWithExtra + ", but didn't start anything")); 48b20795785ec86b19f236290dcaaa647ff7a46e04Sebastien Plisson } 49b20795785ec86b19f236290dcaaa647ff7a46e04Sebastien Plisson 50b20795785ec86b19f236290dcaaa647ff7a46e04Sebastien Plisson @Test 51b20795785ec86b19f236290dcaaa647ff7a46e04Sebastien Plisson public void shouldSayStartedSomethingIfWrongThingWasStarted() throws Exception { 52b20795785ec86b19f236290dcaaa647ff7a46e04Sebastien Plisson Intent actualIntent = createIntent(WallpaperService.class, "anotherExtra", "anotherValue"); 53b20795785ec86b19f236290dcaaa647ff7a46e04Sebastien Plisson 54b20795785ec86b19f236290dcaaa647ff7a46e04Sebastien Plisson service.startService(actualIntent); 55b20795785ec86b19f236290dcaaa647ff7a46e04Sebastien Plisson assertThat(new StartedServiceMatcher(IntentService.class), 56b20795785ec86b19f236290dcaaa647ff7a46e04Sebastien Plisson givesFailureMessage((Context) service, "to start " + createIntent(IntentService.class) + ", but started " + actualIntent)); 57b20795785ec86b19f236290dcaaa647ff7a46e04Sebastien Plisson 58b20795785ec86b19f236290dcaaa647ff7a46e04Sebastien Plisson service.startService(actualIntent); 59b20795785ec86b19f236290dcaaa647ff7a46e04Sebastien Plisson assertThat(new StartedServiceMatcher(IntentService.class, "view"), 60b20795785ec86b19f236290dcaaa647ff7a46e04Sebastien Plisson givesFailureMessage((Context) service, "to start " + createIntent(IntentService.class, "view") + ", but started " + actualIntent)); 61b20795785ec86b19f236290dcaaa647ff7a46e04Sebastien Plisson 62b20795785ec86b19f236290dcaaa647ff7a46e04Sebastien Plisson service.startService(actualIntent); 63b20795785ec86b19f236290dcaaa647ff7a46e04Sebastien Plisson assertThat(new StartedServiceMatcher(intentWithExtra), 64b20795785ec86b19f236290dcaaa647ff7a46e04Sebastien Plisson givesFailureMessage((Context) service, "to start " + intentWithExtra + ", but did not get the same extras keys")); 65b20795785ec86b19f236290dcaaa647ff7a46e04Sebastien Plisson } 66b20795785ec86b19f236290dcaaa647ff7a46e04Sebastien Plisson 67b20795785ec86b19f236290dcaaa647ff7a46e04Sebastien Plisson private <T> Matcher<Matcher<T>> givesFailureMessage(final T actual, final String expectedFailureMessage) { 68b20795785ec86b19f236290dcaaa647ff7a46e04Sebastien Plisson return new TypeSafeMatcher<Matcher<T>>() { 69b20795785ec86b19f236290dcaaa647ff7a46e04Sebastien Plisson public String message; 70b20795785ec86b19f236290dcaaa647ff7a46e04Sebastien Plisson 71b20795785ec86b19f236290dcaaa647ff7a46e04Sebastien Plisson @Override 72b20795785ec86b19f236290dcaaa647ff7a46e04Sebastien Plisson public boolean matchesSafely(Matcher<T> tMatcher) { 73b20795785ec86b19f236290dcaaa647ff7a46e04Sebastien Plisson if (tMatcher.matches(actual)) { 74b20795785ec86b19f236290dcaaa647ff7a46e04Sebastien Plisson message = "matcher to fail, but it passed"; 75b20795785ec86b19f236290dcaaa647ff7a46e04Sebastien Plisson return false; 76b20795785ec86b19f236290dcaaa647ff7a46e04Sebastien Plisson } 77b20795785ec86b19f236290dcaaa647ff7a46e04Sebastien Plisson StringDescription description = new StringDescription(); 78b20795785ec86b19f236290dcaaa647ff7a46e04Sebastien Plisson tMatcher.describeTo(description); 79b20795785ec86b19f236290dcaaa647ff7a46e04Sebastien Plisson String actualFailureMessage = description.toString(); 80b20795785ec86b19f236290dcaaa647ff7a46e04Sebastien Plisson if (expectedFailureMessage.equals(actualFailureMessage)) { 81b20795785ec86b19f236290dcaaa647ff7a46e04Sebastien Plisson return true; 82b20795785ec86b19f236290dcaaa647ff7a46e04Sebastien Plisson } else { 83b20795785ec86b19f236290dcaaa647ff7a46e04Sebastien Plisson message = "failure message to be [" + expectedFailureMessage + "] but got [" + actualFailureMessage + "]"; 84b20795785ec86b19f236290dcaaa647ff7a46e04Sebastien Plisson return false; 85b20795785ec86b19f236290dcaaa647ff7a46e04Sebastien Plisson } 86b20795785ec86b19f236290dcaaa647ff7a46e04Sebastien Plisson } 87b20795785ec86b19f236290dcaaa647ff7a46e04Sebastien Plisson 88b20795785ec86b19f236290dcaaa647ff7a46e04Sebastien Plisson @Override 89b20795785ec86b19f236290dcaaa647ff7a46e04Sebastien Plisson public void describeTo(Description description) { 90b20795785ec86b19f236290dcaaa647ff7a46e04Sebastien Plisson description.appendText(message); 91b20795785ec86b19f236290dcaaa647ff7a46e04Sebastien Plisson } 92b20795785ec86b19f236290dcaaa647ff7a46e04Sebastien Plisson }; 93b20795785ec86b19f236290dcaaa647ff7a46e04Sebastien Plisson } 94b20795785ec86b19f236290dcaaa647ff7a46e04Sebastien Plisson 95b20795785ec86b19f236290dcaaa647ff7a46e04Sebastien Plisson} 96