package cucumber.runtime.android; import android.content.Context; import android.content.res.AssetManager; import com.google.common.collect.Lists; import cucumber.runtime.io.Resource; import java.io.IOException; import java.util.List; import org.hamcrest.Description; import org.hamcrest.Matcher; import org.hamcrest.TypeSafeMatcher; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.robolectric.RobolectricTestRunner; import org.robolectric.annotation.Config; import static org.hamcrest.CoreMatchers.hasItem; import static org.hamcrest.core.Is.is; import static org.junit.Assert.assertThat; import static org.mockito.Mockito.RETURNS_SMART_NULLS; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; @RunWith(RobolectricTestRunner.class) @Config(emulateSdk = 16, manifest = Config.NONE) public class AndroidResourceLoaderTest { private final Context context = mock(Context.class); private final AssetManager assetManager = mock(AssetManager.class, RETURNS_SMART_NULLS); private final AndroidResourceLoader androidResourceLoader = new AndroidResourceLoader(context); @Before public void beforeEachTest() { when(context.getAssets()).thenReturn(assetManager); } @Test public void retrieves_resource_by_given_path_and_suffix() { // given final String path = "some/path/some.feature"; final String suffix = "feature"; // when final List<Resource> resources = Lists.newArrayList(androidResourceLoader.resources(path, suffix)); // then assertThat(resources.size(), is(1)); assertThat(resources.get(0).getPath(), is(path)); } @Test public void retrieves_resources_recursively_from_given_path() throws IOException { // given final String dir = "dir"; final String dirFile = "dir.feature"; final String subDir = "subdir"; final String subDirFile = "subdir.feature"; final String suffix = "feature"; when(assetManager.list(dir)).thenReturn(new String[]{subDir, dirFile}); when(assetManager.list(dir + "/" + subDir)).thenReturn(new String[]{subDirFile}); // when final List<Resource> resources = Lists.newArrayList(androidResourceLoader.resources(dir, suffix)); // then assertThat(resources.size(), is(2)); assertThat(resources, hasItem(withPath(dir + "/" + dirFile))); assertThat(resources, hasItem(withPath(dir + "/" + subDir + "/" + subDirFile))); } @Test public void only_retrieves_those_resources_which_end_the_specified_suffix() throws IOException { // given final String dir = "dir"; final String expected = "expected.feature"; final String unexpected = "unexpected.thingy"; final String suffix = "feature"; when(assetManager.list(dir)).thenReturn(new String[]{expected, unexpected}); // when final List<Resource> resources = Lists.newArrayList(androidResourceLoader.resources(dir, suffix)); // then assertThat(resources.size(), is(1)); assertThat(resources, hasItem(withPath(dir + "/" + expected))); } private static Matcher<? super Resource> withPath(final String path) { return new TypeSafeMatcher<Resource>() { @Override protected boolean matchesSafely(final Resource item) { return item.getPath().equals(path); } @Override public void describeTo(final Description description) { description.appendText("resource with path: " + path); } }; } }