6.6.3 - Alpha2 - 本地化 Material Date Time Picker (版本 4.2.3)

This commit is contained in:
SuperMonster003
2025-05-07 23:47:22 +08:00
parent 6dc86a0668
commit 7a3891a14e
114 changed files with 14024 additions and 9 deletions

View File

@@ -0,0 +1,79 @@
package com.wdullaer.materialdatetimepicker.date;
import org.junit.Assert;
import org.junit.Test;
import java.util.Calendar;
import java.util.TimeZone;
public class DatePickerDialogTest {
// isHighlighted
@Test
public void isHighlightedShouldReturnFalseIfNoHighlightedDaysAreSet() {
DatePickerDialog dpd = DatePickerDialog.newInstance((view, year, monthOfYear, dayOfMonth) -> {
});
Assert.assertFalse(dpd.isHighlighted(1990, 1, 1));
}
@Test
public void isHighlightedShouldReturnFalseIfHighlightedDoesNotContainSelection() {
DatePickerDialog dpd = DatePickerDialog.newInstance((view, year, monthOfYear, dayOfMonth) -> {
});
Calendar highlighted = Calendar.getInstance();
highlighted.set(Calendar.YEAR, 1990);
highlighted.set(Calendar.MONTH, 1);
highlighted.set(Calendar.DAY_OF_MONTH, 1);
Calendar[] highlightedDays = {highlighted};
dpd.setHighlightedDays(highlightedDays);
Assert.assertFalse(dpd.isHighlighted(1990, 2, 1));
}
@Test
public void isHighlightedShouldReturnTrueIfHighlightedDoesContainSelection() {
DatePickerDialog dpd = DatePickerDialog.newInstance((view, year, monthOfYear, dayOfMonth) -> {
});
int year = 1990;
int month = 1;
int day = 1;
Calendar highlighted = Calendar.getInstance();
highlighted.set(Calendar.YEAR, year);
highlighted.set(Calendar.MONTH, month);
highlighted.set(Calendar.DAY_OF_MONTH, day);
Calendar[] highlightedDays = {highlighted};
dpd.setHighlightedDays(highlightedDays);
Assert.assertTrue(dpd.isHighlighted(year, month, day));
}
@Test
public void isHighlightedShouldBehaveCorrectlyInCustomTimezones() {
String timeZoneString = "Americas/Los_Angeles";
Calendar initial = Calendar.getInstance(TimeZone.getTimeZone(timeZoneString));
DatePickerDialog dpd = DatePickerDialog.newInstance((view, year, monthOfYear, dayOfMonth) -> {
}, initial);
int year = 1990;
int month = 1;
int day = 1;
Calendar highlighted = Calendar.getInstance(TimeZone.getTimeZone(timeZoneString));
highlighted.set(Calendar.YEAR, year);
highlighted.set(Calendar.MONTH, month);
highlighted.set(Calendar.DAY_OF_MONTH, day);
Calendar[] highlightedDays = {highlighted};
dpd.setHighlightedDays(highlightedDays);
Assert.assertTrue(dpd.isHighlighted(year, month, day));
}
}

View File

@@ -0,0 +1,206 @@
package com.wdullaer.materialdatetimepicker.date;
import com.pholser.junit.quickcheck.Property;
import com.pholser.junit.quickcheck.generator.InRange;
import com.pholser.junit.quickcheck.runner.JUnitQuickcheck;
import com.wdullaer.materialdatetimepicker.Utils;
import org.junit.Assert;
import org.junit.runner.RunWith;
import java.util.Arrays;
import java.util.Calendar;
import java.util.Date;
import java.util.Locale;
import java.util.TimeZone;
/**
* Property based tests for DefaultDateRangeLimiter (quickcheck FTW!)
* Created by wdullaer on 26/04/17.
*/
@RunWith(JUnitQuickcheck.class)
public class DefaultDateRangeLimiterPropertyTest {
final private DatePickerController controller = new DatePickerController() {
@Override
public void onYearSelected(int year) {}
@Override
public void onDayOfMonthSelected(int year, int month, int day) {}
@Override
public void registerOnDateChangedListener(DatePickerDialog.OnDateChangedListener listener) {}
@Override
public void unregisterOnDateChangedListener(DatePickerDialog.OnDateChangedListener listener) {}
@Override
public MonthAdapter.CalendarDay getSelectedDay() {
return new MonthAdapter.CalendarDay(Calendar.getInstance(), TimeZone.getDefault());
}
@Override
public boolean isThemeDark() {
return false;
}
@Override
public int getAccentColor() {
return 0;
}
@Override
public boolean isHighlighted(int year, int month, int day) {
return false;
}
@Override
public int getFirstDayOfWeek() {
return 0;
}
@Override
public int getMinYear() {
return 0;
}
@Override
public int getMaxYear() {
return 0;
}
@Override
public Calendar getStartDate() {
return Calendar.getInstance();
}
@Override
public Calendar getEndDate() {
return Calendar.getInstance();
}
@Override
public boolean isOutOfRange(int year, int month, int day) {
return false;
}
@Override
public void tryVibrate() {}
@Override
public TimeZone getTimeZone() {
return TimeZone.getDefault();
}
@Override
public Locale getLocale() {
return Locale.getDefault();
}
@Override
public DatePickerDialog.Version getVersion() {
return DatePickerDialog.Version.VERSION_2;
}
@Override
public DatePickerDialog.ScrollOrientation getScrollOrientation() {
return DatePickerDialog.ScrollOrientation.HORIZONTAL;
}
};
private static Calendar[] datesToCalendars(Date[] dates) {
Calendar[] output = new Calendar[dates.length];
Calendar day = Calendar.getInstance();
for (int i = 0; i < dates.length; i++) {
Calendar cal = (Calendar) day.clone();
cal.setTime(dates[i]);
output[i] = cal;
}
return output;
}
@Property
public void setToNearestShouldBeInSelectableDays(
@InRange(min = "01/01/1900", max = "12/31/2099", format = "MM/dd/yyyy") Date date,
@InRange(min = "01/01/1900", max = "12/31/2099", format = "MM/dd/yyyy") Date[] dates
) {
DefaultDateRangeLimiter limiter = new DefaultDateRangeLimiter();
Calendar day = Calendar.getInstance();
day.setTime(date);
Calendar[] selectables = datesToCalendars(dates);
limiter.setSelectableDays(selectables);
// selectableDays are manipulated a bit by the limiter
selectables = limiter.getSelectableDays();
// selectables == null when the input is empty
if (selectables == null) Assert.assertEquals(
day.getTimeInMillis(),
limiter.setToNearestDate(day).getTimeInMillis()
);
else Assert.assertTrue(Arrays.asList(selectables).contains(limiter.setToNearestDate(day)));
}
@Property
public void setToNearestShouldNeverBeInDisabledDays(
@InRange(min = "01/01/1900", max = "12/31/2099", format = "MM/dd/yyyy") Date date,
@InRange(min = "01/01/1900", max = "12/31/2099", format = "MM/dd/yyyy") Date[] dates
) {
DefaultDateRangeLimiter limiter = new DefaultDateRangeLimiter();
Calendar day = Calendar.getInstance();
day.setTime(date);
Calendar[] disableds = datesToCalendars(dates);
limiter.setDisabledDays(disableds);
Assert.assertFalse(Arrays.asList(disableds).contains(limiter.setToNearestDate(day)));
}
@Property
public void setToNearestShouldNeverBeBelowMinDate(
@InRange(min = "01/01/1900", max = "12/31/2099", format = "MM/dd/yyyy") Date date,
@InRange(min = "01/01/1900", max = "12/31/2099", format = "MM/dd/yyyy") Date minDate
) {
DefaultDateRangeLimiter limiter = new DefaultDateRangeLimiter();
Calendar day = Calendar.getInstance();
day.setTime(date);
Calendar minDay = Calendar.getInstance();
minDay.setTime(minDate);
limiter.setMinDate(minDay);
Assert.assertTrue(Utils.trimToMidnight(minDay).getTimeInMillis() <= limiter.setToNearestDate(day).getTimeInMillis());
}
@Property
public void setToNearestShouldNeverBeAboveMaxDate(
@InRange(min = "01/01/1800", max = "12/31/2099", format = "MM/dd/yyyy") Date date,
@InRange(min = "01/01/1800", max = "12/31/2099", format = "MM/dd/yyyy") Date maxDate
) {
DefaultDateRangeLimiter limiter = new DefaultDateRangeLimiter();
Calendar day = Calendar.getInstance();
day.setTime(date);
Calendar minDay = Calendar.getInstance();
minDay.set(Calendar.YEAR, 1800);
minDay.set(Calendar.MONTH, Calendar.JANUARY);
minDay.set(Calendar.DAY_OF_MONTH, 1);
Utils.trimToMidnight(minDay);
Calendar maxDay = Calendar.getInstance();
maxDay.setTime(maxDate);
limiter.setMinDate(minDay);
limiter.setMaxDate(maxDay);
Assert.assertTrue(Utils.trimToMidnight(maxDay).getTimeInMillis() >= limiter.setToNearestDate(day).getTimeInMillis());
}
// TODO write property based tests that enable all options as one
// TODO ensure generators cover more of the known edge cases in the inputs
}

View File

@@ -0,0 +1,700 @@
package com.wdullaer.materialdatetimepicker.date;
import com.wdullaer.materialdatetimepicker.Utils;
import org.junit.Test;
import org.junit.Assert;
import java.util.Arrays;
import java.util.Calendar;
import java.util.Locale;
import java.util.TimeZone;
/**
* Unit tests for the default DateRangeLimiter implementation
* Primarily used to assert that the rounding logic functions properly
*
* Created by wdullaer on 14/04/17.
*/
public class DefaultDateRangeLimiterTest {
final private DatePickerController controller = new DatePickerController() {
@Override
public void onYearSelected(int year) {}
@Override
public void onDayOfMonthSelected(int year, int month, int day) {}
@Override
public void registerOnDateChangedListener(DatePickerDialog.OnDateChangedListener listener) {}
@Override
public void unregisterOnDateChangedListener(DatePickerDialog.OnDateChangedListener listener) {}
@Override
public MonthAdapter.CalendarDay getSelectedDay() {
return new MonthAdapter.CalendarDay(Calendar.getInstance(), TimeZone.getDefault());
}
@Override
public boolean isThemeDark() {
return false;
}
@Override
public int getAccentColor() {
return 0;
}
@Override
public boolean isHighlighted(int year, int month, int day) {
return false;
}
@Override
public int getFirstDayOfWeek() {
return 0;
}
@Override
public int getMinYear() {
return 0;
}
@Override
public int getMaxYear() {
return 0;
}
@Override
public Calendar getStartDate() {
return Calendar.getInstance();
}
@Override
public Calendar getEndDate() {
return Calendar.getInstance();
}
@Override
public boolean isOutOfRange(int year, int month, int day) {
return false;
}
@Override
public void tryVibrate() {}
@Override
public TimeZone getTimeZone() {
return TimeZone.getDefault();
}
@Override
public Locale getLocale() {
return Locale.getDefault();
}
@Override
public DatePickerDialog.Version getVersion() {
return DatePickerDialog.Version.VERSION_2;
}
@Override
public DatePickerDialog.ScrollOrientation getScrollOrientation() {
return DatePickerDialog.ScrollOrientation.HORIZONTAL;
}
};
// getters
@Test
public void getSelectableDaysShouldHaveDatesTrimmedToMidnight() {
DefaultDateRangeLimiter limiter = new DefaultDateRangeLimiter();
Calendar[] days = new Calendar[3];
for (int i = 0;i < days.length; i++) {
Calendar day = Calendar.getInstance();
day.set(Calendar.YEAR, 1999 + i);
day.set(Calendar.HOUR_OF_DAY, 2);
day.set(Calendar.MINUTE, 10);
day.set(Calendar.SECOND, 30);
day.set(Calendar.MILLISECOND, 25);
days[i] = day;
}
limiter.setSelectableDays(days);
Calendar[] selectableDays = limiter.getSelectableDays();
Assert.assertNotNull(selectableDays);
Assert.assertEquals(days.length, selectableDays.length);
for (Calendar selectableDay : selectableDays) {
Assert.assertEquals(selectableDay.get(Calendar.HOUR_OF_DAY), 0);
Assert.assertEquals(selectableDay.get(Calendar.MINUTE), 0);
Assert.assertEquals(selectableDay.get(Calendar.SECOND), 0);
Assert.assertEquals(selectableDay.get(Calendar.MILLISECOND), 0);
}
}
@Test
public void getDisabledDaysShouldHaveDatesTrimmedToMidnight() {
DefaultDateRangeLimiter limiter = new DefaultDateRangeLimiter();
Calendar[] days = new Calendar[3];
for (int i = 0;i < days.length; i++) {
Calendar day = Calendar.getInstance();
day.set(Calendar.YEAR, 1999 + i);
day.set(Calendar.HOUR_OF_DAY, 2);
day.set(Calendar.MINUTE, 10);
day.set(Calendar.SECOND, 30);
day.set(Calendar.MILLISECOND, 25);
days[i] = day;
}
limiter.setDisabledDays(days);
Calendar[] disabledDays = limiter.getDisabledDays();
Assert.assertNotNull(disabledDays);
Assert.assertEquals(days.length, disabledDays.length);
for (Calendar selectableDay : disabledDays) {
Assert.assertEquals(selectableDay.get(Calendar.HOUR_OF_DAY), 0);
Assert.assertEquals(selectableDay.get(Calendar.MINUTE), 0);
Assert.assertEquals(selectableDay.get(Calendar.SECOND), 0);
Assert.assertEquals(selectableDay.get(Calendar.MILLISECOND), 0);
}
}
@Test
public void getMinDateShouldHaveDateTrimmedToMidnight() {
DefaultDateRangeLimiter limiter = new DefaultDateRangeLimiter();
Calendar day = Calendar.getInstance();
day.set(Calendar.YEAR, 1999);
day.set(Calendar.HOUR_OF_DAY, 2);
day.set(Calendar.MINUTE, 10);
day.set(Calendar.SECOND, 30);
day.set(Calendar.MILLISECOND, 25);
limiter.setMinDate(day);
Calendar minDate = limiter.getMinDate();
Assert.assertNotNull(minDate);
Assert.assertEquals(minDate.get(Calendar.HOUR_OF_DAY), 0);
Assert.assertEquals(minDate.get(Calendar.MINUTE), 0);
Assert.assertEquals(minDate.get(Calendar.SECOND), 0);
Assert.assertEquals(minDate.get(Calendar.MILLISECOND), 0);
}
@Test
public void getMaxDateShouldHaveDateTrimmedToMidnight() {
DefaultDateRangeLimiter limiter = new DefaultDateRangeLimiter();
Calendar day = Calendar.getInstance();
day.set(Calendar.YEAR, 1999);
day.set(Calendar.HOUR_OF_DAY, 2);
day.set(Calendar.MINUTE, 10);
day.set(Calendar.SECOND, 30);
day.set(Calendar.MILLISECOND, 25);
limiter.setMaxDate(day);
Calendar maxDate = limiter.getMaxDate();
Assert.assertNotNull(maxDate);
Assert.assertEquals(maxDate.get(Calendar.HOUR_OF_DAY), 0);
Assert.assertEquals(maxDate.get(Calendar.MINUTE), 0);
Assert.assertEquals(maxDate.get(Calendar.SECOND), 0);
Assert.assertEquals(maxDate.get(Calendar.MILLISECOND), 0);
}
// getStartDate()
@Test
public void getStartDateShouldReturnFirstSelectableDay() {
DefaultDateRangeLimiter limiter = new DefaultDateRangeLimiter();
Calendar[] days = new Calendar[3];
for (int i = 0; i < days.length; i++) {
days[i] = Calendar.getInstance();
days[i].set(Calendar.YEAR, 1999 + i);
}
limiter.setSelectableDays(days);
// selectableDays are manipulated a bit by the limiter
days = limiter.getSelectableDays();
Assert.assertNotNull(days);
Assert.assertEquals(limiter.getStartDate().getTimeInMillis(), days[0].getTimeInMillis());
}
@Test
public void getStartDateShouldReturnMinDate() {
DefaultDateRangeLimiter limiter = new DefaultDateRangeLimiter();
Calendar minDate = Calendar.getInstance();
limiter.setMinDate(minDate);
minDate = Utils.trimToMidnight(minDate);
Assert.assertEquals(limiter.getStartDate().getTimeInMillis(), minDate.getTimeInMillis());
}
@Test
public void getStartDateShouldReturnMinDateWhenAControllerIsSet() {
DefaultDateRangeLimiter limiter = new DefaultDateRangeLimiter();
limiter.setController(controller);
Calendar minDate = Calendar.getInstance();
limiter.setMinDate(minDate);
minDate = Utils.trimToMidnight(minDate);
Assert.assertEquals(limiter.getStartDate().getTimeInMillis(), minDate.getTimeInMillis());
}
@Test
public void getStartDateShouldPreferSelectableOverMinDate() {
DefaultDateRangeLimiter limiter = new DefaultDateRangeLimiter();
Calendar[] days = new Calendar[3];
for (int i = 0; i < days.length; i++) {
days[i] = Calendar.getInstance();
days[i].set(Calendar.YEAR, 1999 + i);
}
Calendar minDate = Calendar.getInstance();
limiter.setSelectableDays(days);
limiter.setMinDate(minDate);
// selectableDays are manipulated a bit by the limiter
days = limiter.getSelectableDays();
Assert.assertNotNull(days);
Assert.assertEquals(limiter.getStartDate().getTimeInMillis(), days[0].getTimeInMillis());
}
// getEndDate()
@Test
public void getEndDateShouldReturnLastSelectableDay() {
DefaultDateRangeLimiter limiter = new DefaultDateRangeLimiter();
Calendar[] days = new Calendar[3];
for (int i = 0; i < days.length; i++) {
days[i] = Calendar.getInstance();
days[i].set(Calendar.YEAR, 1999 + i);
}
limiter.setSelectableDays(days);
// selectableDays are manipulated a bit by the limiter
days = limiter.getSelectableDays();
Assert.assertNotNull(days);
Assert.assertEquals(limiter.getEndDate().getTimeInMillis(), days[days.length - 1].getTimeInMillis());
}
@Test
public void getEndDateShouldReturnMaxDate() {
DefaultDateRangeLimiter limiter = new DefaultDateRangeLimiter();
Calendar maxDate = Calendar.getInstance();
limiter.setMaxDate(maxDate);
maxDate = Utils.trimToMidnight(maxDate);
Assert.assertEquals(limiter.getEndDate().getTimeInMillis(), maxDate.getTimeInMillis());
}
@Test
public void getEndDateShouldReturnMaxDateWhenAControllerIsSet() {
DefaultDateRangeLimiter limiter = new DefaultDateRangeLimiter();
limiter.setController(controller);
Calendar maxDate = Calendar.getInstance();
limiter.setMaxDate(maxDate);
maxDate = Utils.trimToMidnight(maxDate);
Assert.assertEquals(limiter.getEndDate().getTimeInMillis(), maxDate.getTimeInMillis());
}
@Test
public void getEndDateShouldPreferSelectableOverMaxDate() {
DefaultDateRangeLimiter limiter = new DefaultDateRangeLimiter();
Calendar[] days = new Calendar[3];
for (int i = 0; i < days.length; i++) {
days[i] = Calendar.getInstance();
days[i].set(Calendar.YEAR, 1999 + i);
}
Calendar maxDate = Calendar.getInstance();
limiter.setSelectableDays(days);
limiter.setMinDate(maxDate);
// selectableDays are manipulated a bit by the limiter
days = limiter.getSelectableDays();
Assert.assertNotNull(days);
Assert.assertEquals(limiter.getEndDate().getTimeInMillis(), days[days.length - 1].getTimeInMillis());
}
// isOutOfRange()
@Test
public void isOutOfRangeShouldReturnTrueForDisabledDates() {
DefaultDateRangeLimiter limiter = new DefaultDateRangeLimiter();
Calendar[] days = new Calendar[1];
Calendar day = Calendar.getInstance();
day.set(Calendar.YEAR, 1999);
days[0] = day;
limiter.setDisabledDays(days);
int year = day.get(Calendar.YEAR);
int month = day.get(Calendar.MONTH);
int dayNumber = day.get(Calendar.DAY_OF_MONTH);
Assert.assertTrue(limiter.isOutOfRange(year, month, dayNumber));
}
@Test
public void isOutOfRangeShouldReturnFalseForEnabledDates() {
DefaultDateRangeLimiter limiter = new DefaultDateRangeLimiter();
Calendar[] days = new Calendar[1];
Calendar day = Calendar.getInstance();
day.set(Calendar.YEAR, 1999);
days[0] = day;
limiter.setSelectableDays(days);
int year = day.get(Calendar.YEAR);
int month = day.get(Calendar.MONTH);
int dayNumber = day.get(Calendar.DAY_OF_MONTH);
Assert.assertFalse(limiter.isOutOfRange(year, month, dayNumber));
}
@Test
public void isOutOfRangeShouldReturnTrueIfDateIsBeforeMin() {
DefaultDateRangeLimiter limiter = new DefaultDateRangeLimiter();
Calendar day = Calendar.getInstance();
day.set(Calendar.YEAR, 1999);
limiter.setMinDate(day);
day.add(Calendar.DAY_OF_MONTH, -1);
int year = day.get(Calendar.YEAR);
int month = day.get(Calendar.MONTH);
int dayNumber = day.get(Calendar.DAY_OF_MONTH);
Assert.assertTrue(limiter.isOutOfRange(year, month, dayNumber));
}
@Test
public void isOutOfRangeShouldReturnTrueIfDateIsBeforeMinYear() {
DefaultDateRangeLimiter limiter = new DefaultDateRangeLimiter();
int minYear = 1999;
limiter.setYearRange(minYear, minYear + 1);
Calendar day = Calendar.getInstance();
day.set(Calendar.YEAR, minYear - 1);
int year = day.get(Calendar.YEAR);
int month = day.get(Calendar.MONTH);
int dayNumber = day.get(Calendar.DAY_OF_MONTH);
Assert.assertTrue(limiter.isOutOfRange(year, month, dayNumber));
}
@Test
public void isOutOfRangeShouldReturnTrueIfDateIsAfterMax() {
DefaultDateRangeLimiter limiter = new DefaultDateRangeLimiter();
Calendar day = Calendar.getInstance();
day.set(Calendar.YEAR, 1999);
limiter.setMaxDate(day);
day.add(Calendar.DAY_OF_MONTH, 1);
int year = day.get(Calendar.YEAR);
int month = day.get(Calendar.MONTH);
int dayNumber = day.get(Calendar.DAY_OF_MONTH);
Assert.assertTrue(limiter.isOutOfRange(year, month, dayNumber));
}
@Test
public void isOutOfRangeShouldReturnTrueIfDateIsAfterMaxYear() {
DefaultDateRangeLimiter limiter = new DefaultDateRangeLimiter();
int maxYear = 1999;
limiter.setYearRange(maxYear - 1, maxYear);
Calendar day = Calendar.getInstance();
day.set(Calendar.YEAR, maxYear + 1);
int year = day.get(Calendar.YEAR);
int month = day.get(Calendar.MONTH);
int dayNumber = day.get(Calendar.DAY_OF_MONTH);
Assert.assertTrue(limiter.isOutOfRange(year, month, dayNumber));
}
@Test
public void isOutOfRangeShouldPreferDisabledOverEnabled() {
DefaultDateRangeLimiter limiter = new DefaultDateRangeLimiter();
Calendar[] days = new Calendar[1];
Calendar day = Calendar.getInstance();
day.set(Calendar.YEAR, 1999);
days[0] = day;
limiter.setSelectableDays(days);
limiter.setDisabledDays(days);
int year = day.get(Calendar.YEAR);
int month = day.get(Calendar.MONTH);
int dayNumber = day.get(Calendar.DAY_OF_MONTH);
Assert.assertTrue(limiter.isOutOfRange(year, month, dayNumber));
}
@Test
public void isOutOfRangeShouldWorkWithCustomTimeZones() {
final String timeZoneString = "America/Los_Angeles";
TimeZone timeZone = TimeZone.getTimeZone(timeZoneString);
DefaultDateRangeLimiter limiter = new DefaultDateRangeLimiter();
int year = 1985;
int month = 1;
int day = 1;
Calendar disabledDay = Calendar.getInstance(timeZone);
disabledDay.set(Calendar.YEAR, year);
disabledDay.set(Calendar.MONTH, month);
disabledDay.set(Calendar.DAY_OF_MONTH, day);
Calendar[] days = new Calendar[1];
days[0] = disabledDay;
DatePickerController controller = new DatePickerController() {
@Override
public void onYearSelected(int year) {}
@Override
public void onDayOfMonthSelected(int year, int month, int day) {}
@Override
public void registerOnDateChangedListener(DatePickerDialog.OnDateChangedListener listener) {}
@Override
public void unregisterOnDateChangedListener(DatePickerDialog.OnDateChangedListener listener) {}
@Override
public MonthAdapter.CalendarDay getSelectedDay() {
return null;
}
@Override
public boolean isThemeDark() {
return false;
}
@Override
public int getAccentColor() {
return 0;
}
@Override
public boolean isHighlighted(int year, int month, int day) {
return false;
}
@Override
public int getFirstDayOfWeek() {
return 0;
}
@Override
public int getMinYear() {
return 0;
}
@Override
public int getMaxYear() {
return 0;
}
@Override
public Calendar getStartDate() {
return null;
}
@Override
public Calendar getEndDate() {
return null;
}
@Override
public boolean isOutOfRange(int year, int month, int day) {
return false;
}
@Override
public void tryVibrate() {
}
@Override
public TimeZone getTimeZone() {
return TimeZone.getTimeZone(timeZoneString);
}
@Override
public Locale getLocale() {
return Locale.getDefault();
}
@Override
public DatePickerDialog.Version getVersion() {
return null;
}
@Override
public DatePickerDialog.ScrollOrientation getScrollOrientation() {
return null;
}
};
limiter.setDisabledDays(days);
limiter.setController(controller);
Assert.assertTrue(limiter.isOutOfRange(year, month, day));
}
// setToNearestDate()
@Test
public void setToNearestShouldReturnTheInputWhenValid() {
DefaultDateRangeLimiter limiter = new DefaultDateRangeLimiter();
Calendar day = Calendar.getInstance();
Calendar expected = (Calendar) day.clone();
Assert.assertEquals(limiter.setToNearestDate(day).getTimeInMillis(), expected.getTimeInMillis());
}
@Test
public void setToNearestShouldRoundDisabledDates() {
DefaultDateRangeLimiter limiter = new DefaultDateRangeLimiter();
Calendar[] days = new Calendar[3];
for (int i = 0;i < days.length; i++) {
Calendar day = Calendar.getInstance();
day.set(Calendar.YEAR, 1999 + i);
day.set(Calendar.HOUR_OF_DAY, 2);
day.set(Calendar.MINUTE, 10);
day.set(Calendar.SECOND, 30);
day.set(Calendar.MILLISECOND, 25);
days[i] = day;
}
limiter.setDisabledDays(days);
Calendar day = (Calendar) days[0].clone();
Assert.assertNotSame(limiter.setToNearestDate(day).getTimeInMillis(), days[0].getTimeInMillis());
}
@Test
public void setToNearestShouldRoundToMinDate() {
DefaultDateRangeLimiter limiter = new DefaultDateRangeLimiter();
Calendar minDate = Calendar.getInstance();
minDate.set(Calendar.YEAR, 1999);
limiter.setMinDate(minDate);
Calendar day = Calendar.getInstance();
day.set(Calendar.YEAR, 1998);
Assert.assertEquals(
limiter.setToNearestDate(day).getTimeInMillis(),
Utils.trimToMidnight(minDate).getTimeInMillis()
);
}
@Test
public void setToNearestShouldRoundToMaxDate() {
DefaultDateRangeLimiter limiter = new DefaultDateRangeLimiter();
Calendar maxDate = Calendar.getInstance();
maxDate.set(Calendar.YEAR, 1999);
limiter.setMaxDate(maxDate);
Calendar day = Calendar.getInstance();
day.set(Calendar.YEAR, 2000);
Assert.assertEquals(
limiter.setToNearestDate(day).getTimeInMillis(),
Utils.trimToMidnight(maxDate).getTimeInMillis()
);
}
@Test
public void setToNearestShouldRoundToASelectableDay() {
DefaultDateRangeLimiter limiter = new DefaultDateRangeLimiter();
Calendar[] days = new Calendar[3];
for (int i = 0;i < days.length; i++) {
Calendar day = Calendar.getInstance();
day.set(Calendar.YEAR, 1999 + i);
day.set(Calendar.HOUR_OF_DAY, 2);
day.set(Calendar.MINUTE, 10);
day.set(Calendar.SECOND, 30);
day.set(Calendar.MILLISECOND, 25);
days[i] = day;
}
limiter.setSelectableDays(days);
Calendar day = Calendar.getInstance();
// selectableDays are manipulated a bit by the limiter
days = limiter.getSelectableDays();
Assert.assertNotNull(days);
Assert.assertTrue(Arrays.asList(days).contains(limiter.setToNearestDate(day)));
}
@Test
public void setToNearestShouldRoundToASelectableDayWhenAControllerIsSet() {
DefaultDateRangeLimiter limiter = new DefaultDateRangeLimiter();
limiter.setController(controller);
Calendar[] days = new Calendar[3];
for (int i = 0;i < days.length; i++) {
Calendar day = Calendar.getInstance();
day.set(Calendar.YEAR, 1999 + i);
day.set(Calendar.HOUR_OF_DAY, 2);
day.set(Calendar.MINUTE, 10);
day.set(Calendar.SECOND, 30);
day.set(Calendar.MILLISECOND, 25);
days[i] = day;
}
limiter.setSelectableDays(days);
Calendar day = Calendar.getInstance();
// selectableDays are manipulated a bit by the limiter
days = limiter.getSelectableDays();
Assert.assertNotNull(days);
Assert.assertTrue(Arrays.asList(days).contains(limiter.setToNearestDate(day)));
}
@Test
public void setToNearestShouldRoundToFirstJanOfMinYearWhenBeforeMin() {
// Case with just year range and no other restrictions
DefaultDateRangeLimiter limiter = new DefaultDateRangeLimiter();
limiter.setYearRange(1980, 2100);
Calendar day = Calendar.getInstance();
day.set(Calendar.YEAR, 1970);
Calendar expectedDay = Calendar.getInstance();
expectedDay.set(Calendar.YEAR, 1980);
expectedDay.set(Calendar.MONTH, Calendar.JANUARY);
expectedDay.set(Calendar.DAY_OF_MONTH, 1);
Assert.assertEquals(
Utils.trimToMidnight(expectedDay).getTimeInMillis(),
limiter.setToNearestDate(day).getTimeInMillis()
);
}
@Test
public void setToNearestShouldReturn31stDecOfMaxYearWhenAfterMax() {
// Case with just year range and no other restrictions
DefaultDateRangeLimiter limiter = new DefaultDateRangeLimiter();
limiter.setYearRange(1900, 1950);
Calendar day = Calendar.getInstance();
day.set(Calendar.YEAR, 1970);
Calendar expectedDay = Calendar.getInstance();
expectedDay.set(Calendar.YEAR, 1950);
expectedDay.set(Calendar.MONTH, Calendar.DECEMBER);
expectedDay.set(Calendar.DAY_OF_MONTH, 31);
Assert.assertEquals(
Utils.trimToMidnight(expectedDay).getTimeInMillis(),
limiter.setToNearestDate(day).getTimeInMillis()
);
}
}

View File

@@ -0,0 +1,853 @@
package com.wdullaer.materialdatetimepicker.time;
import static com.wdullaer.materialdatetimepicker.time.TimePickerDialog.HOUR_INDEX;
import static com.wdullaer.materialdatetimepicker.time.TimePickerDialog.MINUTE_INDEX;
import org.junit.Test;
import org.junit.Assert;
/**
* Unit tests for the default implementation of TimepointLimiter
* Mostly used to assert that the rounding logic works
*
* Created by wdullaer on 22/06/17.
*/
public class DefaultTimepointLimiterTest {
@Test
public void isAmDisabledShouldReturnTrueWhenMinTimeIsInTheAfternoon() {
Timepoint minTime = new Timepoint(13);
DefaultTimepointLimiter limiter = new DefaultTimepointLimiter();
limiter.setMinTime(minTime);
Assert.assertTrue(limiter.isAmDisabled());
}
@Test
public void isAmDisabledShouldReturnFalseWhenMinTimeIsInTheMorning() {
Timepoint minTime = new Timepoint(8);
DefaultTimepointLimiter limiter = new DefaultTimepointLimiter();
limiter.setMinTime(minTime);
Assert.assertFalse(limiter.isAmDisabled());
}
@Test
public void isAmDisabledShouldReturnTrueWhenMinTimeIsMidday() {
Timepoint minTime = new Timepoint(12);
DefaultTimepointLimiter limiter = new DefaultTimepointLimiter();
limiter.setMinTime(minTime);
Assert.assertTrue(limiter.isAmDisabled());
}
@Test
public void isAmDisabledShouldReturnFalseWhenMaxTimeIsInTheMorning() {
Timepoint maxTime = new Timepoint(8);
DefaultTimepointLimiter limiter = new DefaultTimepointLimiter();
limiter.setMaxTime(maxTime);
Assert.assertFalse(limiter.isAmDisabled());
}
@Test
public void isAmDisabledShouldReturnFalseWhenMaxTimeIsMidday() {
Timepoint maxTime = new Timepoint(12);
DefaultTimepointLimiter limiter = new DefaultTimepointLimiter();
limiter.setMaxTime(maxTime);
Assert.assertFalse(limiter.isAmDisabled());
}
@Test
public void isPmDisabledShouldReturnTrueWhenMaxTimeIsInTheMorning() {
Timepoint maxTime = new Timepoint(9);
DefaultTimepointLimiter limiter = new DefaultTimepointLimiter();
limiter.setMaxTime(maxTime);
Assert.assertTrue(limiter.isPmDisabled());
}
@Test
public void isPmDisabledShouldReturnFalseWhenMinTimeIsInTheAfternoon() {
Timepoint minTime = new Timepoint(13);
DefaultTimepointLimiter limiter = new DefaultTimepointLimiter();
limiter.setMinTime(minTime);
Assert.assertFalse(limiter.isPmDisabled());
}
@Test
public void isPmDisabledShouldReturnFalseWhenMaxTimeIsMidday() {
Timepoint maxTime = new Timepoint(12);
DefaultTimepointLimiter limiter = new DefaultTimepointLimiter();
limiter.setMaxTime(maxTime);
Assert.assertFalse(limiter.isPmDisabled());
}
@Test
public void isAmDisabledShouldReturnTrueIfSelectableDaysAreInTheAfternoon() {
Timepoint[] selectableDays = {
new Timepoint(13),
new Timepoint(22)
};
DefaultTimepointLimiter limiter = new DefaultTimepointLimiter();
limiter.setSelectableTimes(selectableDays);
Assert.assertTrue(limiter.isAmDisabled());
}
@Test
public void isAmDisabledShouldReturnFalseIfSelectableDaysHasOneTimeInTheMorning() {
Timepoint[] selectableDays = {
new Timepoint(4),
new Timepoint(13),
new Timepoint(22)
};
DefaultTimepointLimiter limiter = new DefaultTimepointLimiter();
limiter.setSelectableTimes(selectableDays);
Assert.assertFalse(limiter.isAmDisabled());
}
@Test
public void isPmDisabledShouldReturnTrueIfSelectableDaysAreInTheMorning() {
Timepoint[] selectableDays = {
new Timepoint(4),
new Timepoint(9),
new Timepoint(11)
};
DefaultTimepointLimiter limiter = new DefaultTimepointLimiter();
limiter.setSelectableTimes(selectableDays);
Assert.assertTrue(limiter.isPmDisabled());
}
@Test
public void isPmDisabledShouldReturnFalseIfSelectableDaysHasOneTimeInTheAfternoon() {
Timepoint[] selectableDays = {
new Timepoint(4),
new Timepoint(22)
};
DefaultTimepointLimiter limiter = new DefaultTimepointLimiter();
limiter.setSelectableTimes(selectableDays);
Assert.assertFalse(limiter.isPmDisabled());
}
@Test
public void isPmDisabledShouldReturnFalseIfSelectableDaysContainsMidday() {
Timepoint[] selectableDays = {
new Timepoint(4),
new Timepoint(9),
new Timepoint(12)
};
DefaultTimepointLimiter limiter = new DefaultTimepointLimiter();
limiter.setSelectableTimes(selectableDays);
Assert.assertFalse(limiter.isPmDisabled());
}
@Test
public void isPmDisabledShouldReturnFalseWithoutConstraints() {
DefaultTimepointLimiter limiter = new DefaultTimepointLimiter();
Assert.assertFalse(limiter.isPmDisabled());
}
@Test
public void isAmDisabledShouldReturnFalseWithoutConstraints() {
DefaultTimepointLimiter limiter = new DefaultTimepointLimiter();
Assert.assertFalse(limiter.isAmDisabled());
}
@Test
public void setMinTimeShouldThrowExceptionWhenBiggerThanMaxTime() {
Timepoint maxTime = new Timepoint(2);
Timepoint minTime = new Timepoint(3);
DefaultTimepointLimiter limiter = new DefaultTimepointLimiter();
limiter.setMaxTime(maxTime);
try {
limiter.setMinTime(minTime);
Assert.fail("setMinTime() should throw IllegalArgumentException");
} catch (IllegalArgumentException e) {
Assert.assertNotNull(e);
}
}
@Test
public void setMaxTimeShouldThrowExceptionWhenSmallerThanMinTime() {
Timepoint maxTime = new Timepoint(2);
Timepoint minTime = new Timepoint(3);
DefaultTimepointLimiter limiter = new DefaultTimepointLimiter();
limiter.setMinTime(minTime);
try {
limiter.setMaxTime(maxTime);
Assert.fail("setMaxTime() should throw IllegalArgumentException");
} catch (IllegalArgumentException e) {
Assert.assertNotNull(e);
}
}
@Test
public void isOutOfRangeShouldReturnTrueIfInputSmallerThanMinTime() {
Timepoint minTime = new Timepoint(10);
Timepoint input = new Timepoint(2);
DefaultTimepointLimiter limiter = new DefaultTimepointLimiter();
limiter.setMinTime(minTime);
Assert.assertTrue(limiter.isOutOfRange(input));
}
@Test
public void isOutOfRangeShouldReturnTrueIfInputLargerThanMaxTime() {
Timepoint maxTime = new Timepoint(2);
Timepoint input = new Timepoint(12);
DefaultTimepointLimiter limiter = new DefaultTimepointLimiter();
limiter.setMaxTime(maxTime);
Assert.assertTrue(limiter.isOutOfRange(input));
}
@Test
public void isOutOfRangeShouldReturnFalseIfInputIsBetweenMinAndMaxTime() {
Timepoint minTime = new Timepoint(1);
Timepoint maxTime = new Timepoint(13);
Timepoint input = new Timepoint(4);
DefaultTimepointLimiter limiter = new DefaultTimepointLimiter();
limiter.setMinTime(minTime);
limiter.setMaxTime(maxTime);
Assert.assertFalse(limiter.isOutOfRange(input));
}
@Test
public void isOutOfRangeShouldReturnFalseWithoutRestraints() {
Timepoint input = new Timepoint(14);
DefaultTimepointLimiter limiter = new DefaultTimepointLimiter();
Assert.assertFalse(limiter.isOutOfRange(input));
}
@Test
public void isOutOfRangeShouldReturnTrueIfInputNotSelectable() {
Timepoint input = new Timepoint(1);
Timepoint[] selectableDays = {
new Timepoint(13),
new Timepoint(14)
};
DefaultTimepointLimiter limiter = new DefaultTimepointLimiter();
limiter.setSelectableTimes(selectableDays);
Assert.assertTrue(limiter.isOutOfRange(input));
}
@Test
public void isOutOfRangeShouldReturnFalseIfInputSelectable() {
Timepoint input = new Timepoint(15);
Timepoint[] selectableDays = {
new Timepoint(4),
new Timepoint(10),
new Timepoint(15)
};
DefaultTimepointLimiter limiter = new DefaultTimepointLimiter();
limiter.setSelectableTimes(selectableDays);
Assert.assertFalse(limiter.isOutOfRange(input));
}
@Test
public void isOutOfRangeWithIndexShouldHandleNull() {
DefaultTimepointLimiter limiter = new DefaultTimepointLimiter();
Assert.assertFalse(limiter.isOutOfRange(null, HOUR_INDEX, Timepoint.TYPE.SECOND));
}
@Test
public void isOutOfRangeMinuteShouldReturnFalseWhenMinTimeEqualsToTheMinute() {
Timepoint minTime = new Timepoint(12, 13, 14);
Timepoint input = new Timepoint(12, 13);
DefaultTimepointLimiter limiter = new DefaultTimepointLimiter();
limiter.setMinTime(minTime);
Assert.assertFalse(limiter.isOutOfRange(input, MINUTE_INDEX, Timepoint.TYPE.SECOND));
}
@Test
public void isOutOfRangeMinuteShouldReturnFalseWhenMaxTimeEqualsToTheMinute() {
Timepoint maxTime = new Timepoint(12, 13, 14);
Timepoint input = new Timepoint(12, 13);
DefaultTimepointLimiter limiter = new DefaultTimepointLimiter();
limiter.setMaxTime(maxTime);
Assert.assertFalse(limiter.isOutOfRange(input, MINUTE_INDEX, Timepoint.TYPE.SECOND));
}
@Test
public void isOutOfRangeMinuteShouldReturnFalseWhenTimeEqualsSelectableTimeToTheMinute() {
Timepoint[] selectableTimes = {
new Timepoint(11, 12, 13),
new Timepoint(12, 13, 14),
new Timepoint(13, 14, 15)
};
Timepoint input = new Timepoint(12, 13);
DefaultTimepointLimiter limiter = new DefaultTimepointLimiter();
limiter.setSelectableTimes(selectableTimes);
Assert.assertFalse(limiter.isOutOfRange(input, MINUTE_INDEX, Timepoint.TYPE.SECOND));
}
@Test
public void isOutOfRangeMinuteShouldReturnFalseWhenTimeEqualsSelectableTimeToTheMinute2() {
Timepoint[] selectableTimes = {
new Timepoint(11, 12, 13),
new Timepoint(12, 13, 14),
new Timepoint(13, 14, 15)
};
Timepoint input = new Timepoint(13, 14, 59);
DefaultTimepointLimiter limiter = new DefaultTimepointLimiter();
limiter.setSelectableTimes(selectableTimes);
Assert.assertFalse(limiter.isOutOfRange(input, MINUTE_INDEX, Timepoint.TYPE.SECOND));
}
@Test
public void isOutOfRangeMinuteShouldReturnFalseWhenTimeEqualsSelectableTimeToTheMinute3() {
Timepoint[] selectableTimes = {
new Timepoint(11, 12, 13),
new Timepoint(12, 13, 14),
new Timepoint(13, 14, 15)
};
Timepoint input = new Timepoint(11, 12, 0);
DefaultTimepointLimiter limiter = new DefaultTimepointLimiter();
limiter.setSelectableTimes(selectableTimes);
Assert.assertFalse(limiter.isOutOfRange(input, MINUTE_INDEX, Timepoint.TYPE.SECOND));
}
@Test
public void isOutOfRangeMinuteShouldReturnTrueWhenTimeDoesNotEqualSelectableTimeToTheMinute() {
Timepoint[] selectableTimes = {
new Timepoint(11, 12, 13),
new Timepoint(12, 13, 14),
new Timepoint(13, 14, 15)
};
Timepoint input = new Timepoint(11, 11, 0);
DefaultTimepointLimiter limiter = new DefaultTimepointLimiter();
limiter.setSelectableTimes(selectableTimes);
Assert.assertTrue(limiter.isOutOfRange(input, MINUTE_INDEX, Timepoint.TYPE.SECOND));
}
@Test
public void isOutOfRangeHourShouldReturnFalseWhenMinTimeEqualsToTheHour() {
Timepoint minTime = new Timepoint(12, 13, 14);
Timepoint input = new Timepoint(12);
DefaultTimepointLimiter limiter = new DefaultTimepointLimiter();
limiter.setMinTime(minTime);
Assert.assertFalse(limiter.isOutOfRange(input, HOUR_INDEX, Timepoint.TYPE.SECOND));
}
@Test
public void isOutOfRangeHourShouldReturnFalseWhenMaxTimeEqualsToTheHour() {
Timepoint maxTime = new Timepoint(12, 13, 14);
Timepoint input = new Timepoint(12);
DefaultTimepointLimiter limiter = new DefaultTimepointLimiter();
limiter.setMaxTime(maxTime);
Assert.assertFalse(limiter.isOutOfRange(input, HOUR_INDEX, Timepoint.TYPE.SECOND));
}
@Test
public void isOutOfRangeHourShouldReturnFalseWhenTimeEqualsSelectableTimeToTheHour() {
Timepoint[] selectableTimes = {
new Timepoint(11, 12, 13),
new Timepoint(12, 13, 14),
new Timepoint(13, 14, 15)
};
Timepoint input = new Timepoint(12);
DefaultTimepointLimiter limiter = new DefaultTimepointLimiter();
limiter.setSelectableTimes(selectableTimes);
Assert.assertFalse(limiter.isOutOfRange(input, HOUR_INDEX, Timepoint.TYPE.SECOND));
}
@Test
public void isOutOfRangeHourShouldReturnFalseWhenTimeEqualsSelectableTimeToTheHour2() {
Timepoint[] selectableTimes = {
new Timepoint(11, 12, 13),
new Timepoint(12, 13, 14),
new Timepoint(13, 14, 15)
};
Timepoint input = new Timepoint(13, 15, 15);
DefaultTimepointLimiter limiter = new DefaultTimepointLimiter();
limiter.setSelectableTimes(selectableTimes);
Assert.assertFalse(limiter.isOutOfRange(input, HOUR_INDEX, Timepoint.TYPE.SECOND));
}
@Test
public void isOutOfRangeHourShouldReturnFalseWhenTimeEqualsSelectableTimeToTheHour3() {
Timepoint[] selectableTimes = {
new Timepoint(11, 12, 13),
new Timepoint(12, 13, 14),
new Timepoint(13, 14, 15)
};
Timepoint input = new Timepoint(11);
DefaultTimepointLimiter limiter = new DefaultTimepointLimiter();
limiter.setSelectableTimes(selectableTimes);
Assert.assertFalse(limiter.isOutOfRange(input, HOUR_INDEX, Timepoint.TYPE.SECOND));
}
@Test
public void isOutOfRangeShouldWorkWhenSelectableTimesContainsDuplicateEntries() {
Timepoint[] selectableTimes = {
new Timepoint(11),
new Timepoint(12),
new Timepoint(12),
new Timepoint(13)
};
Timepoint input = new Timepoint(11, 30);
DefaultTimepointLimiter limiter = new DefaultTimepointLimiter();
limiter.setSelectableTimes(selectableTimes);
Assert.assertTrue(limiter.isOutOfRange(input));
}
@Test
public void isOutOfRangeShouldReturnTrueWhenInputIsInDisabledTimes() {
Timepoint[] disabledTimes = {
new Timepoint(11),
new Timepoint(12),
new Timepoint(13)
};
Timepoint input = disabledTimes[0];
DefaultTimepointLimiter limiter = new DefaultTimepointLimiter();
limiter.setDisabledTimes(disabledTimes);
Assert.assertTrue(limiter.isOutOfRange(input));
}
@Test
public void isOutOfRangeShouldUseDisabledOverSelectable() {
Timepoint[] disabledTimes = {
new Timepoint(11),
new Timepoint(12),
new Timepoint(13)
};
Timepoint[] selectableTimes = {
new Timepoint(12),
new Timepoint(14)
};
Timepoint input = new Timepoint(12);
DefaultTimepointLimiter limiter = new DefaultTimepointLimiter();
limiter.setDisabledTimes(disabledTimes);
limiter.setSelectableTimes(selectableTimes);
Assert.assertTrue(limiter.isOutOfRange(input));
}
@Test
public void isOutOfRangeHourShouldReturnFalseWhenADisabledTimeIsTestedWithSecondResolution() {
// If there are only disabledTimes, there will still be other times that are valid
Timepoint[] disabledTimes = {
new Timepoint(12),
new Timepoint(13),
new Timepoint(14)
};
Timepoint input = disabledTimes[0];
DefaultTimepointLimiter limiter = new DefaultTimepointLimiter();
limiter.setDisabledTimes(disabledTimes);
Assert.assertFalse(limiter.isOutOfRange(input, HOUR_INDEX, Timepoint.TYPE.SECOND));
}
@Test
public void isOutOfRangeHourShouldReturnFalseWhenADisabledTimeIsTestedWithMinuteResolution() {
// If there are only disabledTimes, there will still be other times that are valid
Timepoint[] disabledTimes = {
new Timepoint(12),
new Timepoint(13),
new Timepoint(14)
};
Timepoint input = disabledTimes[0];
DefaultTimepointLimiter limiter = new DefaultTimepointLimiter();
limiter.setDisabledTimes(disabledTimes);
Assert.assertFalse(limiter.isOutOfRange(input, HOUR_INDEX, Timepoint.TYPE.MINUTE));
}
@Test
public void isOutOfRangeHourShouldReturnTrueWhenADisabledTimeIsTestedWithHourResolution() {
// If there are only disabledTimes, there will still be other times that are valid
Timepoint[] disabledTimes = {
new Timepoint(12),
new Timepoint(13),
new Timepoint(14)
};
Timepoint input = disabledTimes[0];
DefaultTimepointLimiter limiter = new DefaultTimepointLimiter();
limiter.setDisabledTimes(disabledTimes);
Assert.assertTrue(limiter.isOutOfRange(input, HOUR_INDEX, Timepoint.TYPE.HOUR));
}
@Test
public void isOutOfRangeMinuteShouldReturnFalseWhenADisabledTimeIsTestedWithSecondResolution() {
// If there are only disabledTimes, there will still be other times that are valid
Timepoint[] disabledTimes = {
new Timepoint(12, 15),
new Timepoint(13, 16),
new Timepoint(14, 17)
};
Timepoint input = disabledTimes[0];
DefaultTimepointLimiter limiter = new DefaultTimepointLimiter();
limiter.setDisabledTimes(disabledTimes);
Assert.assertFalse(limiter.isOutOfRange(input, MINUTE_INDEX, Timepoint.TYPE.SECOND));
}
@Test
public void isOutOfRangeMinuteShouldReturnFalseWhenADisabledTimeIsTestedWithMinuteResolution() {
// If there are only disabledTimes, there will still be other times that are valid
Timepoint[] disabledTimes = {
new Timepoint(12, 15),
new Timepoint(13, 16),
new Timepoint(14, 17)
};
Timepoint input = disabledTimes[0];
DefaultTimepointLimiter limiter = new DefaultTimepointLimiter();
limiter.setDisabledTimes(disabledTimes);
Assert.assertTrue(limiter.isOutOfRange(input, MINUTE_INDEX, Timepoint.TYPE.MINUTE));
}
@Test
public void isOutOfRangeHourShouldReturnTrueWhenADisabledTimeCancelsASelectableTime() {
Timepoint[] disabledTimes = {
new Timepoint(12),
new Timepoint(13)
};
Timepoint[] selectableTimes = {
new Timepoint(12),
new Timepoint(14),
new Timepoint(15)
};
Timepoint input = new Timepoint(12);
DefaultTimepointLimiter limiter = new DefaultTimepointLimiter();
limiter.setDisabledTimes(disabledTimes);
limiter.setSelectableTimes(selectableTimes);
Assert.assertTrue(limiter.isOutOfRange(input, HOUR_INDEX, Timepoint.TYPE.SECOND));
}
@Test
public void roundToNearestShouldWorkWhenSelectableTimesContainsDuplicateEntries() {
Timepoint[] selectableTimes = {
new Timepoint(11),
new Timepoint(12),
new Timepoint(12),
new Timepoint(13)
};
Timepoint input = new Timepoint(12, 29);
Timepoint expected = new Timepoint(12);
DefaultTimepointLimiter limiter = new DefaultTimepointLimiter();
limiter.setSelectableTimes(selectableTimes);
Assert.assertEquals(limiter.roundToNearest(input, null, Timepoint.TYPE.SECOND), expected);
}
@Test
public void roundToNearestShouldReturnMaxTimeIfBiggerThanMaxTime() {
Timepoint maxTime = new Timepoint(8);
Timepoint input = new Timepoint(12);
DefaultTimepointLimiter limiter = new DefaultTimepointLimiter();
limiter.setMaxTime(maxTime);
Assert.assertEquals(limiter.roundToNearest(input, null, Timepoint.TYPE.SECOND), maxTime);
}
@Test
public void roundToNearestShouldReturnMinTimeIfSmallerThanMinTime() {
Timepoint minTime = new Timepoint(8);
Timepoint input = new Timepoint(7);
DefaultTimepointLimiter limiter = new DefaultTimepointLimiter();
limiter.setMinTime(minTime);
Assert.assertEquals(limiter.roundToNearest(input, null, Timepoint.TYPE.SECOND), minTime);
}
@Test
public void roundToNearestShouldReturnInputIfNotOutOfRange() {
Timepoint input = new Timepoint(12, 13, 14);
DefaultTimepointLimiter limiter = new DefaultTimepointLimiter();
Assert.assertEquals(limiter.roundToNearest(input, null, Timepoint.TYPE.SECOND), input);
}
@Test
public void roundToNearestShouldReturnSelectableTime() {
Timepoint[] selectableTimes = {
new Timepoint(11, 12, 14),
new Timepoint(12, 13, 14),
new Timepoint(13, 14, 15)
};
Timepoint input = new Timepoint(11);
DefaultTimepointLimiter limiter = new DefaultTimepointLimiter();
limiter.setSelectableTimes(selectableTimes);
Assert.assertEquals(limiter.roundToNearest(input, null, Timepoint.TYPE.SECOND), selectableTimes[0]);
}
@Test
public void roundToNearestShouldNotChangeTheMinutesWhenOptionIsSet() {
Timepoint[] selectableTimes = {
new Timepoint(11, 12, 13),
new Timepoint(12),
new Timepoint(12, 13, 14),
new Timepoint(15, 16, 17)
};
Timepoint input = new Timepoint(11, 12, 59);
DefaultTimepointLimiter limiter = new DefaultTimepointLimiter();
limiter.setSelectableTimes(selectableTimes);
Assert.assertEquals(limiter.roundToNearest(input, Timepoint.TYPE.MINUTE, Timepoint.TYPE.SECOND).getHour(), input.getHour());
Assert.assertEquals(limiter.roundToNearest(input, Timepoint.TYPE.MINUTE, Timepoint.TYPE.SECOND).getMinute(), input.getMinute());
}
@Test
public void roundToNearestShouldNotChangeTheHourWhenOptionIsSet() {
Timepoint[] selectableTimes = {
new Timepoint(11, 12, 13),
new Timepoint(12),
new Timepoint(12, 13, 14),
new Timepoint(13),
new Timepoint(15, 16, 17)
};
Timepoint input = new Timepoint(12, 59, 59);
DefaultTimepointLimiter limiter = new DefaultTimepointLimiter();
limiter.setSelectableTimes(selectableTimes);
Assert.assertEquals(limiter.roundToNearest(input, Timepoint.TYPE.HOUR, Timepoint.TYPE.SECOND).getHour(), input.getHour());
}
@Test
public void roundToNearestShouldNotChangeTheHourWhenOptionIsSet2() {
Timepoint[] selectableTimes = {
new Timepoint(11, 12, 13),
new Timepoint(12),
new Timepoint(12, 13, 14),
new Timepoint(13),
new Timepoint(15, 16, 17)
};
Timepoint input = new Timepoint(15, 59, 59);
DefaultTimepointLimiter limiter = new DefaultTimepointLimiter();
limiter.setSelectableTimes(selectableTimes);
Assert.assertEquals(limiter.roundToNearest(input, Timepoint.TYPE.HOUR, Timepoint.TYPE.SECOND).getHour(), input.getHour());
}
@Test
public void roundToNearestShouldNotChangeAnythingWhenSecondOptionIsSet() {
Timepoint[] selectableTimes = {
new Timepoint(11, 12, 13),
new Timepoint(12),
new Timepoint(12, 13, 14),
new Timepoint(13),
new Timepoint(15, 16, 17)
};
Timepoint input = new Timepoint(12, 59, 59);
DefaultTimepointLimiter limiter = new DefaultTimepointLimiter();
limiter.setSelectableTimes(selectableTimes);
Assert.assertEquals(limiter.roundToNearest(input, Timepoint.TYPE.SECOND, Timepoint.TYPE.SECOND), input);
}
@Test
public void roundToNearestShouldRoundToNearest() {
Timepoint[] selectableTimes = {
new Timepoint(11, 12, 13),
new Timepoint(11, 12, 16),
new Timepoint(12)
};
Timepoint input = new Timepoint(11, 12, 14);
DefaultTimepointLimiter limiter = new DefaultTimepointLimiter();
limiter.setSelectableTimes(selectableTimes);
Assert.assertEquals(limiter.roundToNearest(input, null, Timepoint.TYPE.SECOND), selectableTimes[0]);
}
@Test
public void roundToNearestShouldRoundToNearestSelectableThatIsNotDisabled() {
Timepoint[] selectableTimes = {
new Timepoint(11, 12, 13),
new Timepoint(12, 13, 14),
new Timepoint(13)
};
Timepoint[] disabledTimes = {
new Timepoint(12, 13, 14)
};
Timepoint input = new Timepoint(12, 13, 15);
DefaultTimepointLimiter limiter = new DefaultTimepointLimiter();
limiter.setSelectableTimes(selectableTimes);
limiter.setDisabledTimes(disabledTimes);
Assert.assertEquals(limiter.roundToNearest(input, null, Timepoint.TYPE.SECOND), selectableTimes[2]);
}
@Test
public void roundToNearestShouldRoundWithSecondIncrementsIfInputIsDisabled() {
Timepoint[] disabledTimes = {
new Timepoint(11, 12, 13),
new Timepoint(12, 13, 14),
new Timepoint(13, 14, 15)
};
Timepoint input = disabledTimes[0];
DefaultTimepointLimiter limiter = new DefaultTimepointLimiter();
Timepoint expected = new Timepoint(11, 12, 14);
limiter.setDisabledTimes(disabledTimes);
Assert.assertEquals(limiter.roundToNearest(input, null, Timepoint.TYPE.SECOND), expected);
}
@Test
public void roundToNearestShouldRoundWithSecondIncrementsIfInputIsDisabled2() {
Timepoint[] disabledTimes = {
new Timepoint(11, 12, 13),
new Timepoint(11, 12, 14),
new Timepoint(12, 13, 14),
new Timepoint(13, 14, 15)
};
Timepoint input = disabledTimes[0];
DefaultTimepointLimiter limiter = new DefaultTimepointLimiter();
Timepoint expected = new Timepoint(11, 12, 12);
limiter.setDisabledTimes(disabledTimes);
Assert.assertEquals(limiter.roundToNearest(input, null, Timepoint.TYPE.SECOND), expected);
}
@Test
public void roundToNearestShouldRoundWithSecondIncrementsIfInputIsDisabled3() {
Timepoint[] disabledTimes = {
new Timepoint(11, 12, 13),
new Timepoint(11, 12, 12),
new Timepoint(11, 12, 14),
new Timepoint(12, 13, 14),
new Timepoint(13, 14, 15)
};
Timepoint input = disabledTimes[0];
DefaultTimepointLimiter limiter = new DefaultTimepointLimiter();
Timepoint expected = new Timepoint(11, 12, 15);
limiter.setDisabledTimes(disabledTimes);
Assert.assertEquals(limiter.roundToNearest(input, null, Timepoint.TYPE.SECOND), expected);
}
@Test
public void roundToNearestShouldRoundWithMinuteIncrementsIfInputIsDisabled() {
Timepoint[] disabledTimes = {
new Timepoint(11, 12, 13),
new Timepoint(12, 13, 14),
new Timepoint(13, 14, 15)
};
Timepoint input = disabledTimes[0];
DefaultTimepointLimiter limiter = new DefaultTimepointLimiter();
Timepoint expected = new Timepoint(11, 13, 13);
limiter.setDisabledTimes(disabledTimes);
Assert.assertEquals(limiter.roundToNearest(input, null, Timepoint.TYPE.MINUTE), expected);
}
@Test
public void roundToNearestShouldRoundWithHourIncrementsIfInputIsDisabled() {
Timepoint[] disabledTimes = {
new Timepoint(11, 12, 13),
new Timepoint(12, 13, 14),
new Timepoint(13, 14, 15)
};
Timepoint input = disabledTimes[0];
DefaultTimepointLimiter limiter = new DefaultTimepointLimiter();
Timepoint expected = new Timepoint(10, 12, 13);
limiter.setDisabledTimes(disabledTimes);
Assert.assertEquals(limiter.roundToNearest(input, null, Timepoint.TYPE.HOUR), expected);
}
@Test
public void roundToNearestIfInputDisablesAtLowerAndUpperTime() {
Timepoint[] disabledTimes = new Timepoint[180];
for(int l=0; l<=59; l++){ disabledTimes[l] = new Timepoint(0, l); }
for(int l=0; l<=59; l++){ disabledTimes[60+l] = new Timepoint(1, l); }
for(int l=0; l<=59; l++){ disabledTimes[120+l] = new Timepoint(23, l); }
Timepoint input = new Timepoint(0, 29, 0);
DefaultTimepointLimiter limiter = new DefaultTimepointLimiter();
Timepoint expected = new Timepoint(2, 0, 0);
Timepoint expected2 = new Timepoint(2, 29, 0);
limiter.setDisabledTimes(disabledTimes);
Assert.assertEquals(limiter.roundToNearest(input, null, Timepoint.TYPE.MINUTE), expected);
Assert.assertEquals(limiter.roundToNearest(input, null, Timepoint.TYPE.HOUR), expected2);
}
}

View File

@@ -0,0 +1,28 @@
package com.wdullaer.materialdatetimepicker.time;
import org.junit.Assert;
import org.junit.Test;
public class TimePickerDialogTest {
@Test
public void getPickerResolutionShouldReturnSecondIfSecondsAreEnabled() {
TimePickerDialog tpd = TimePickerDialog.newInstance(null, false);
tpd.enableSeconds(true);
Assert.assertEquals(tpd.getPickerResolution(), Timepoint.TYPE.SECOND);
}
@Test
public void getPickerResolutionShouldReturnMinuteIfMinutesAreEnabled() {
TimePickerDialog tpd = TimePickerDialog.newInstance(null, false);
tpd.enableSeconds(false);
tpd.enableMinutes(true);
Assert.assertEquals(tpd.getPickerResolution(), Timepoint.TYPE.MINUTE);
}
@Test
public void getPickerResolutionShouldReturnHourIfMinutesAndSecondsAreDisabled() {
TimePickerDialog tpd = TimePickerDialog.newInstance(null, false);
tpd.enableMinutes(false);
Assert.assertEquals(tpd.getPickerResolution(), Timepoint.TYPE.HOUR);
}
}

View File

@@ -0,0 +1,233 @@
package com.wdullaer.materialdatetimepicker.time;
import org.junit.Test;
import org.junit.Assert;
import java.util.HashSet;
public class TimepointTest {
@Test
public void timepointsWithSameFieldsShouldHaveSameHashCode() {
Timepoint first = new Timepoint(12, 0, 0);
Timepoint second = new Timepoint(12, 0, 0);
Assert.assertEquals(first.hashCode(), second.hashCode());
}
@Test
public void timepointsWithSameFieldsShouldBeEquals() {
Timepoint first = new Timepoint(12, 0, 0);
Timepoint second = new Timepoint(12, 0, 0);
Assert.assertEquals(first, second);
}
@Test
public void timepointsWithSameFieldsShouldBeDistinctInHashSet() {
HashSet<Timepoint> timepoints = new HashSet<>(4);
timepoints.add(new Timepoint(12, 0, 0));
timepoints.add(new Timepoint(12, 0, 0));
timepoints.add(new Timepoint(12, 0, 0));
timepoints.add(new Timepoint(12, 0, 0));
Assert.assertEquals(timepoints.size(), 1);
}
@Test
public void timepointsWithDifferentFieldsShouldNotBeDistinctInHashSet() {
HashSet<Timepoint> timepoints = new HashSet<>(4);
timepoints.add(new Timepoint(12, 1, 0));
timepoints.add(new Timepoint(12, 2, 0));
timepoints.add(new Timepoint(12, 3, 0));
timepoints.add(new Timepoint(12, 4, 0));
Assert.assertEquals(timepoints.size(), 4);
}
@Test
public void compareToShouldReturnNegativeIfArgumentIsBigger() {
Timepoint orig = new Timepoint(12, 11, 10);
Timepoint arg = new Timepoint(13, 14, 15);
Assert.assertTrue(orig.compareTo(arg) < 0);
}
@Test
public void compareToShouldReturnPositiveIfArgumentIsSmaller() {
Timepoint orig = new Timepoint(12, 11, 10);
Timepoint arg = new Timepoint(10, 14, 15);
Assert.assertTrue(orig.compareTo(arg) > 0);
}
@Test
public void compareToShouldReturnZeroIfArgumentIsEqual() {
Timepoint orig = new Timepoint(12, 11, 10);
Timepoint arg = new Timepoint(12, 11, 10);
Assert.assertEquals(0, orig.compareTo(arg));
}
@Test
public void isAMShouldReturnTrueIfTimepointIsBeforeMidday() {
Timepoint timepoint = new Timepoint(11);
Assert.assertTrue(timepoint.isAM());
}
@Test
public void isAMShouldReturnFalseIfTimepointIsMidday() {
Timepoint timepoint = new Timepoint(12);
Assert.assertFalse(timepoint.isAM());
}
@Test
public void isAMShouldReturnFalseIfTimepointIsAfterMidday() {
Timepoint timepoint = new Timepoint(13);
Assert.assertFalse(timepoint.isAM());
}
@Test
public void isAMShouldReturnTrueIfTimepointIsMidnight() {
Timepoint timepoint = new Timepoint(0);
Assert.assertTrue(timepoint.isAM());
}
@Test
public void isPMShouldReturnFalseIfTimepointIsBeforeMidday() {
Timepoint timepoint = new Timepoint(11);
Assert.assertFalse(timepoint.isPM());
}
@Test
public void isPMShouldReturnTrueIfTimepointIsMidday() {
Timepoint timepoint = new Timepoint(12);
Assert.assertTrue(timepoint.isPM());
}
@Test
public void isPMShouldReturnTrueIfTimepointIsAfterMidday() {
Timepoint timepoint = new Timepoint(13);
Assert.assertTrue(timepoint.isPM());
}
@Test
public void isPMShouldReturnFalseIfTimepointIsMidnight() {
Timepoint timepoint = new Timepoint(0);
Assert.assertFalse(timepoint.isPM());
}
@Test
public void setAMShouldDoNothingIfTimepointIsBeforeMidday() {
Timepoint timepoint = new Timepoint(11);
timepoint.setAM();
Assert.assertEquals(timepoint.getHour(), 11);
}
@Test
public void setAMShouldSetToMidnightIfTimepointIsMidday() {
Timepoint timepoint = new Timepoint(12);
timepoint.setAM();
Assert.assertEquals(timepoint.getHour(), 0);
}
@Test
public void setAMShouldSetBeforeMiddayIfTimepointIsAfterMidday() {
Timepoint timepoint = new Timepoint(13);
timepoint.setAM();
Assert.assertEquals(timepoint.getHour(), 1);
}
@Test
public void setAMShouldDoNothingIfTimepointIsMidnight() {
Timepoint timepoint = new Timepoint(0);
timepoint.setAM();
Assert.assertEquals(timepoint.getHour(), 0);
}
@Test
public void setAMShouldNotChangeMinutesOrSeconds() {
Timepoint timepoint = new Timepoint(13, 14, 15);
timepoint.setAM();
Assert.assertEquals(timepoint.getMinute(), 14);
Assert.assertEquals(timepoint.getSecond(), 15);
}
@Test
public void setPMShouldDoNothingIfTimepointIsAfterMidday() {
Timepoint timepoint = new Timepoint(13);
timepoint.setPM();
Assert.assertEquals(timepoint.getHour(), 13);
}
@Test
public void setPMShouldSetToMiddayIfTimepointIsMidnight() {
Timepoint timepoint = new Timepoint(0);
timepoint.setPM();
Assert.assertEquals(timepoint.getHour(), 12);
}
@Test
public void setPMShouldSetAfterMiddayIfTimepointIsBeforeMidday() {
Timepoint timepoint = new Timepoint(5);
timepoint.setPM();
Assert.assertEquals(timepoint.getHour(), 17);
}
@Test
public void setPMShouldDoNothingIfTimepointIsMidday() {
Timepoint timepoint = new Timepoint(12);
timepoint.setPM();
Assert.assertEquals(timepoint.getHour(), 12);
}
@Test
public void setPMShouldNotChangeMinutesOrSeconds() {
Timepoint timepoint = new Timepoint(1, 14, 15);
timepoint.setPM();
Assert.assertEquals(timepoint.getMinute(), 14);
Assert.assertEquals(timepoint.getSecond(), 15);
}
@Test
public void equalsShouldReturnTrueWhenInputsAreEqualWithSecondsResolution() {
Timepoint timepoint1 = new Timepoint(1, 14, 15);
Timepoint timepoint2 = new Timepoint(1, 14, 15);
Assert.assertTrue(timepoint1.equals(timepoint2, Timepoint.TYPE.SECOND));
}
@Test
public void equalsShouldReturnFalseWhenInputsDifferWithSecondsResolution() {
Timepoint timepoint1 = new Timepoint(1, 14, 15);
Timepoint timepoint2 = new Timepoint(1, 14, 16);
Assert.assertFalse(timepoint1.equals(timepoint2, Timepoint.TYPE.SECOND));
}
@Test
public void equalsShouldIgnoreSecondsWithMinuteResolution() {
Timepoint timepoint1 = new Timepoint(1, 14, 15);
Timepoint timepoint2 = new Timepoint(1, 14, 16);
Assert.assertTrue(timepoint1.equals(timepoint2, Timepoint.TYPE.MINUTE));
}
@Test
public void equalsShouldReturnFalseWhenInputsDifferWithMinuteResolution() {
Timepoint timepoint1 = new Timepoint(1, 14, 15);
Timepoint timepoint2 = new Timepoint(1, 15, 15);
Assert.assertFalse(timepoint1.equals(timepoint2, Timepoint.TYPE.MINUTE));
}
@Test
public void equalsShouldIgnoreSecondsWithHourResolution() {
Timepoint timepoint1 = new Timepoint(1, 14, 15);
Timepoint timepoint2 = new Timepoint(1, 14, 16);
Assert.assertTrue(timepoint1.equals(timepoint2, Timepoint.TYPE.HOUR));
}
@Test
public void equalsShouldIgnoreMinutesWithHourResolution() {
Timepoint timepoint1 = new Timepoint(1, 14, 15);
Timepoint timepoint2 = new Timepoint(1, 15, 16);
Assert.assertTrue(timepoint1.equals(timepoint2, Timepoint.TYPE.HOUR));
}
@Test
public void equalsShouldReturnFalseWhenInputsDifferWithHourResolution() {
Timepoint timepoint1 = new Timepoint(1, 14, 15);
Timepoint timepoint2 = new Timepoint(2, 14, 15);
Assert.assertFalse(timepoint1.equals(timepoint2, Timepoint.TYPE.HOUR));
}
}