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.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();
}
};
// 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);
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);
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);
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);
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.roll(Calendar.DAY_OF_MONTH, false);
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.roll(Calendar.DAY_OF_MONTH, true);
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));
}
// 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();
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();
Assert.assertTrue(Arrays.asList(days).contains(limiter.setToNearestDate(day)));
}
}