package org.openintents.filemanager.test;
import android.support.test.espresso.ViewAssertion;
import android.support.test.espresso.matcher.BoundedMatcher;
import android.view.View;
import android.widget.Adapter;
import android.widget.AdapterView;
import org.hamcrest.Description;
import org.hamcrest.Matcher;
import org.hamcrest.TypeSafeMatcher;
import org.openintents.filemanager.bookmarks.BookmarkListAdapter;
import org.openintents.filemanager.files.FileHolder;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStreamWriter;
import static android.support.test.espresso.Espresso.onData;
import static android.support.test.espresso.action.ViewActions.click;
import static android.support.test.espresso.action.ViewActions.longClick;
import static android.support.test.espresso.action.ViewActions.pressBack;
import static org.hamcrest.Matchers.allOf;
import static org.hamcrest.Matchers.instanceOf;
import static org.hamcrest.Matchers.is;
public class BaseTestFileManager {
public static final String TEST_DIRECTORY = "oi-filemanager-tests";
protected static String sdcardPath;
protected static void cleanDirectory(File file) {
if (!file.exists()) return;
for (String name : file.list()) {
if (!name.startsWith("oi-") && !name.startsWith(".oi-")) {
throw new RuntimeException(file + " contains unexpected file");
}
File child = new File(file, name);
if (child.isDirectory())
cleanDirectory(child);
else
child.delete();
}
file.delete();
if (file.exists()) {
throw new RuntimeException("Deletion of " + file + " failed");
}
}
protected static void createFile(String path, String content) throws IOException {
File file = new File(path);
OutputStreamWriter wr = new OutputStreamWriter(new FileOutputStream(file), "UTF-8");
wr.write(content);
wr.close();
}
protected static void createDirectory(String path) throws IOException {
File file = new File(path);
file.mkdir();
if (!file.exists())
throw new IOException("Creation of " + path + " failed");
}
protected void deleteDirectory(String path) {
File file = new File(path);
if (file.exists())
if (file.isDirectory())
cleanDirectory(file);
file.delete();
}
protected void clickOnTestDirectory() {
clickOnFile(TEST_DIRECTORY);
}
protected void clickOnFile(String filename) {
onData(allOf(instanceOf(FileHolder.class), hasName(filename))).perform(click(pressBack()));
}
protected void longClickOnFile(String filename) {
onData(allOf(instanceOf(FileHolder.class), hasName(filename))).perform(longClick());
}
protected void longClickOnBookmark(String filename) {
onData(allOf(instanceOf(BookmarkListAdapter.Bookmark.class), hasBookmarkName(filename))).perform(longClick());
}
protected void checkFile(String filename, ViewAssertion viewAssertion) {
onData(hasName(filename)).check(viewAssertion);
}
protected BoundedMatcher<Object, FileHolder> hasName(final String filename) {
return new BoundedMatcher<Object, FileHolder>(FileHolder.class) {
@Override
public void describeTo(Description description) {
description.appendText("with name " + filename);
}
@Override
protected boolean matchesSafely(FileHolder item) {
return filename.equals(item.getName());
}
};
}
protected BoundedMatcher<Object, BookmarkListAdapter.Bookmark> hasBookmarkName(final String filename) {
return new BoundedMatcher<Object, BookmarkListAdapter.Bookmark>(BookmarkListAdapter.Bookmark.class) {
@Override
public void describeTo(Description description) {
description.appendText("with name " + filename);
}
@Override
protected boolean matchesSafely(BookmarkListAdapter.Bookmark item) {
return filename.equals(item.getName());
}
};
}
public static Matcher<View> withResourceName(String resourceName) {
return withResourceName(is(resourceName));
}
public static Matcher<View> withResourceName(final Matcher<String> resourceNameMatcher) {
return new TypeSafeMatcher<View>() {
@Override
public void describeTo(Description description) {
description.appendText("with resource name: ");
resourceNameMatcher.describeTo(description);
}
@Override
public boolean matchesSafely(View view) {
int id = view.getId();
return id != View.NO_ID && id != 0 && view.getResources() != null
&& resourceNameMatcher.matches(view.getResources().getResourceName(id));
}
};
}
public static Matcher<View> withAdaptedData(final Matcher<Object> dataMatcher) {
return new TypeSafeMatcher<View>() {
@Override
public void describeTo(Description description) {
description.appendText("with class name: ");
dataMatcher.describeTo(description);
}
@Override
public boolean matchesSafely(View view) {
if (!(view instanceof AdapterView)) {
return false;
}
@SuppressWarnings("rawtypes")
Adapter adapter = ((AdapterView) view).getAdapter();
for (int i = 0; i < adapter.getCount(); i++) {
if (dataMatcher.matches(adapter.getItem(i))) {
return true;
}
}
return false;
}
};
}
}