Issue
Im trying to create simple UI test using Espresso to set a date to newly created item.
Project is using https://github.com/wdullaer/MaterialDateTimePicker, but it shows dialog fragment with complex UI and nothing to hold on to.
I would like to create custom ViewAction to set the date or time similar to PickerActions from Espresso.
Any suggestions how to do it?
Solution
In the end I've created ViewAction that is able to set the time too, but its messy, as you have to know classname of view in the dialog, to have something to match with Matcher.
/**
* Returns a {@link ViewAction} that sets a date on a {@link DatePicker}.
*/
public static ViewAction setDate(final int year, final int monthOfYear, final int dayOfMonth) {
return new ViewAction() {
@Override
public void perform(UiController uiController, View view) {
final DayPickerView dayPickerView = (DayPickerView) view;
try {
Field f = null; //NoSuchFieldException
f = DayPickerView.class.getDeclaredField("mController");
f.setAccessible(true);
DatePickerController controller = (DatePickerController) f.get(dayPickerView); //IllegalAccessException
controller.onDayOfMonthSelected(year, monthOfYear, dayOfMonth);
} catch (NoSuchFieldException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
}
}
@Override
public String getDescription() {
return "set date";
}
@SuppressWarnings("unchecked")
@Override
public Matcher<View> getConstraints() {
return allOf(isAssignableFrom(DayPickerView.class), isDisplayed());
}
};
}
/**
* Returns a {@link ViewAction} that sets a time on a {@link TimePicker}.
*/
public static ViewAction setTime(final int hours, final int minutes) {
return new ViewAction() {
@Override
public void perform(UiController uiController, View view) {
final RadialPickerLayout timePicker = (RadialPickerLayout) view;
timePicker.setTime(new Timepoint(hours, minutes, 0));
}
@Override
public String getDescription() {
return "set time";
}
@SuppressWarnings("unchecked")
@Override
public Matcher<View> getConstraints() {
return allOf(isAssignableFrom(RadialPickerLayout.class), isDisplayed());
}
};
}
And usage:
onView(isAssignableFrom(DayPickerView.class)).perform(MaterialPickerActions.setDate(calendar.get(Calendar.YEAR), calendar.get(Calendar.MONTH), calendar.get(Calendar.DAY_OF_MONTH)));
onView(isAssignableFrom(RadialPickerLayout.class)).perform(MaterialPickerActions.setTime(calendar.get(Calendar.HOUR_OF_DAY), calendar.get(Calendar.MINUTE)));
Answered By - Lubos Horacek
0 comments:
Post a Comment
Note: Only a member of this blog may post a comment.