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