package net.rdrei.android.dirchooser;
import android.annotation.TargetApi;
import android.app.Activity;
import android.app.AlertDialog;
import android.app.Fragment;
import android.app.FragmentManager;
import android.app.FragmentTransaction;
import android.os.Build;
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.view.View;
import android.widget.EditText;
import android.widget.TextView;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.robolectric.Robolectric;
import org.robolectric.RobolectricGradleTestRunner;
import org.robolectric.Shadows;
import org.robolectric.shadows.ShadowAlertDialog;
import org.robolectric.shadows.ShadowDialog;
import static org.assertj.android.api.Assertions.assertThat;
import static org.assertj.core.api.Assertions.assertThat;
@RunWith(RobolectricGradleTestRunner.class)
public class DirectoryChooserFragmentTest {
@TargetApi(Build.VERSION_CODES.HONEYCOMB)
public static void startFragment(@NonNull Fragment fragment, @Nullable Class activityClass) {
if (activityClass == null) {
activityClass = Activity.class;
}
Activity activity = (Activity) Robolectric.buildActivity(activityClass)
.create()
.start()
.resume()
.get();
FragmentManager fragmentManager = activity.getFragmentManager();
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
fragmentTransaction.add(R.id.main, fragment);
fragmentTransaction.commit();
fragmentManager.executePendingTransactions();
}
@TargetApi(Build.VERSION_CODES.HONEYCOMB)
@Test
public void testWithDirectory() {
final DirectoryChooserFragment fragment = DirectoryChooserFragment.newInstance(
DirectoryChooserConfig.builder().newDirectoryName("mydir").build());
startFragment(fragment, DirectoryChooserActivityMock.class);
final View chooseBtn = fragment.getActivity().findViewById(R.id.btnConfirm);
assertThat(chooseBtn).isEnabled();
assertThat(chooseBtn.performClick()).isTrue();
assertThat(((DirectoryChooserActivityMock) fragment.getActivity()).selectedDirectory)
.isNotNull();
}
@Test
public void testCreateDirectoryDialogAllowFolderNameModification() {
final String directoryName = "mydir";
final DirectoryChooserFragment fragment = DirectoryChooserFragment.newInstance(
DirectoryChooserConfig.builder()
.newDirectoryName(directoryName)
.initialDirectory("")
.allowReadOnlyDirectory(false)
.allowNewDirectoryNameModification(true)
.build());
startFragment(fragment, DirectoryChooserActivityMock.class);
fragment.onOptionsItemSelected(new TestMenuItem() {
@Override
public int getItemId() {
return R.id.new_folder_item;
}
});
final AlertDialog dialog = (AlertDialog) ShadowDialog.getLatestDialog();
final ShadowAlertDialog shadowAlertDialog = Shadows.shadowOf(dialog);
assertThat(shadowAlertDialog.getTitle()).isEqualTo("Create folder");
assertThat(ShadowDialog.getShownDialogs()).contains(dialog);
final TextView msgView = (TextView) dialog.findViewById(R.id.msgText);
assertThat(msgView).hasText("Create new folder with name \"mydir\"?");
final EditText editText = (EditText) dialog.findViewById(R.id.editText);
assertThat(editText).isVisible();
assertThat(editText).hasTextString(directoryName);
}
@Test
public void testCreateDirectoryDialogDisallowFolderNameModification() {
final String directoryName = "mydir";
final DirectoryChooserFragment fragment = DirectoryChooserFragment.newInstance(
DirectoryChooserConfig.builder()
.newDirectoryName(directoryName)
.initialDirectory("")
.allowReadOnlyDirectory(false)
.allowNewDirectoryNameModification(false)
.build());
startFragment(fragment, DirectoryChooserActivityMock.class);
fragment.onOptionsItemSelected(new TestMenuItem() {
@Override
public int getItemId() {
return R.id.new_folder_item;
}
});
final AlertDialog dialog = (AlertDialog) ShadowDialog.getLatestDialog();
final ShadowAlertDialog shadowAlertDialog = Shadows.shadowOf(dialog);
assertThat(shadowAlertDialog.getTitle()).isEqualTo("Create folder");
assertThat(ShadowDialog.getShownDialogs()).contains(dialog);
final TextView msgView = (TextView) dialog.findViewById(R.id.msgText);
assertThat(msgView).hasText("Create new folder with name \"mydir\"?");
final EditText editText = (EditText) dialog.findViewById(R.id.editText);
assertThat(editText).isGone();
}
@TargetApi(Build.VERSION_CODES.HONEYCOMB)
@Test
public void testWithCustomListener() {
final DirectoryChooserFragment fragment = DirectoryChooserFragment.newInstance(
DirectoryChooserConfig.builder().newDirectoryName("mydir").build());
startFragment(fragment, CustomDirectoryChooserActivity.class);
final CustomDirectoryChooserListener listener = new CustomDirectoryChooserListener();
fragment.setDirectoryChooserListener(listener);
final View chooseBtn = fragment.getActivity().findViewById(R.id.btnConfirm);
assertThat(chooseBtn).isEnabled();
assertThat(chooseBtn.performClick()).isTrue();
assertThat(listener.selectedDirectory).isNotNull();
}
static final private class DirectoryChooserActivityMock extends Activity implements
DirectoryChooserFragment.OnFragmentInteractionListener {
public String selectedDirectory;
@Override
public void onCreate(@Nullable Bundle bundle) {
super.onCreate(bundle);
setContentView(R.layout.directory_chooser_activity);
}
@Override
public void onSelectDirectory(@NonNull String path) {
this.selectedDirectory = path;
}
@Override
public void onCancelChooser() {
}
}
private static class CustomDirectoryChooserActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.directory_chooser_activity);
}
}
private static class CustomDirectoryChooserListener implements
DirectoryChooserFragment.OnFragmentInteractionListener {
public String selectedDirectory;
@Override
public void onSelectDirectory(@NonNull String path) {
selectedDirectory = path;
}
@Override
public void onCancelChooser() {
selectedDirectory = null;
}
}
}