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.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(); } }; 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/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[] dates ) { DefaultDateRangeLimiter limiter = new DefaultDateRangeLimiter(); Calendar day = Calendar.getInstance(); day.setTime(date); Calendar[] selectables = datesToCalendars(dates); limiter.setSelectableDays(selectables); if (selectables.length == 0) 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/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[] 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/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 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 maxDay = Calendar.getInstance(); maxDay.setTime(maxDate); 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 }