172 lines
7.6 KiB
Java
172 lines
7.6 KiB
Java
package de.danoeh.antennapod.storage.database;
|
|
|
|
import org.junit.Test;
|
|
|
|
import java.text.ParseException;
|
|
import java.text.SimpleDateFormat;
|
|
import java.util.ArrayList;
|
|
import java.util.Date;
|
|
import java.util.Locale;
|
|
|
|
import static de.danoeh.antennapod.storage.database.ReleaseScheduleGuesser.ONE_DAY;
|
|
import static de.danoeh.antennapod.storage.database.ReleaseScheduleGuesser.ONE_HOUR;
|
|
import static de.danoeh.antennapod.storage.database.ReleaseScheduleGuesser.ONE_MINUTE;
|
|
import static de.danoeh.antennapod.storage.database.ReleaseScheduleGuesser.performGuess;
|
|
import static org.junit.Assert.assertEquals;
|
|
import static org.junit.Assert.assertTrue;
|
|
|
|
public class ReleaseScheduleGuesserTest {
|
|
private static final SimpleDateFormat DATE_FORMAT = new SimpleDateFormat("yyyy-MM-dd HH:mm", Locale.ROOT);
|
|
|
|
private Date makeDate(String dateStr) {
|
|
try {
|
|
return DATE_FORMAT.parse(dateStr);
|
|
} catch (ParseException e) {
|
|
throw new RuntimeException(e);
|
|
}
|
|
}
|
|
|
|
private void assertClose(Date expected, Date actual, long tolerance) {
|
|
assertTrue("Date should differ at most " + tolerance / 60000 + " minutes from "
|
|
+ DATE_FORMAT.format(expected) + ", but is " + DATE_FORMAT.format(actual),
|
|
Math.abs(expected.getTime() - actual.getTime()) < tolerance);
|
|
}
|
|
|
|
@Test
|
|
public void testEdgeCases() {
|
|
ArrayList<Date> releaseDates = new ArrayList<>();
|
|
assertEquals(ReleaseScheduleGuesser.Schedule.UNKNOWN, performGuess(releaseDates).schedule);
|
|
releaseDates.add(makeDate("2024-01-01 16:30"));
|
|
assertEquals(ReleaseScheduleGuesser.Schedule.UNKNOWN, performGuess(releaseDates).schedule);
|
|
}
|
|
|
|
@Test
|
|
public void testDaily() {
|
|
ArrayList<Date> releaseDates = new ArrayList<>();
|
|
releaseDates.add(makeDate("2024-01-01 16:30")); // Monday
|
|
releaseDates.add(makeDate("2024-01-02 16:25"));
|
|
releaseDates.add(makeDate("2024-01-03 16:35"));
|
|
releaseDates.add(makeDate("2024-01-04 16:40"));
|
|
releaseDates.add(makeDate("2024-01-05 16:20"));
|
|
releaseDates.add(makeDate("2024-01-06 16:10"));
|
|
releaseDates.add(makeDate("2024-01-07 16:32")); // Sunday
|
|
|
|
// Next day
|
|
ReleaseScheduleGuesser.Guess guess = performGuess(releaseDates);
|
|
assertEquals(ReleaseScheduleGuesser.Schedule.DAILY, guess.schedule);
|
|
assertClose(makeDate("2024-01-08 16:30"), guess.nextExpectedDate, 10 * ONE_MINUTE);
|
|
|
|
// One-off early release
|
|
releaseDates.add(makeDate("2024-01-08 10:00"));
|
|
guess = performGuess(releaseDates);
|
|
assertEquals(ReleaseScheduleGuesser.Schedule.DAILY, guess.schedule);
|
|
assertClose(makeDate("2024-01-09 16:30"), guess.nextExpectedDate, 10 * ONE_MINUTE);
|
|
}
|
|
|
|
@Test
|
|
public void testWeekdays() {
|
|
ArrayList<Date> releaseDates = new ArrayList<>();
|
|
releaseDates.add(makeDate("2024-01-01 16:30")); // Monday
|
|
releaseDates.add(makeDate("2024-01-02 16:25"));
|
|
releaseDates.add(makeDate("2024-01-03 16:35"));
|
|
releaseDates.add(makeDate("2024-01-04 16:40"));
|
|
releaseDates.add(makeDate("2024-01-05 16:20")); // Friday
|
|
releaseDates.add(makeDate("2024-01-08 16:20")); // Monday
|
|
releaseDates.add(makeDate("2024-01-09 16:30"));
|
|
releaseDates.add(makeDate("2024-01-10 16:40"));
|
|
releaseDates.add(makeDate("2024-01-11 16:45")); // Thursday
|
|
|
|
// Next day
|
|
ReleaseScheduleGuesser.Guess guess = performGuess(releaseDates);
|
|
assertEquals(ReleaseScheduleGuesser.Schedule.WEEKDAYS, guess.schedule);
|
|
assertClose(makeDate("2024-01-12 16:30"), guess.nextExpectedDate, ONE_HOUR);
|
|
|
|
// After weekend
|
|
releaseDates.add(makeDate("2024-01-12 16:30")); // Friday
|
|
guess = performGuess(releaseDates);
|
|
assertClose(makeDate("2024-01-15 16:30"), guess.nextExpectedDate, ONE_HOUR);
|
|
}
|
|
|
|
@Test
|
|
public void testWeekly() {
|
|
ArrayList<Date> releaseDates = new ArrayList<>();
|
|
releaseDates.add(makeDate("2024-01-07 16:30")); // Sunday
|
|
releaseDates.add(makeDate("2024-01-14 16:25"));
|
|
releaseDates.add(makeDate("2024-01-21 14:25"));
|
|
releaseDates.add(makeDate("2024-01-28 16:15"));
|
|
|
|
// Next week
|
|
ReleaseScheduleGuesser.Guess guess = performGuess(releaseDates);
|
|
assertEquals(ReleaseScheduleGuesser.Schedule.WEEKLY, guess.schedule);
|
|
assertClose(makeDate("2024-02-04 16:30"), guess.nextExpectedDate, 2 * ONE_HOUR);
|
|
|
|
// One-off early release
|
|
releaseDates.add(makeDate("2024-02-02 16:35"));
|
|
guess = performGuess(releaseDates);
|
|
assertEquals(ReleaseScheduleGuesser.Schedule.WEEKLY, guess.schedule);
|
|
assertClose(makeDate("2024-02-11 16:30"), guess.nextExpectedDate, 2 * ONE_HOUR);
|
|
|
|
// One-off late release
|
|
releaseDates.add(makeDate("2024-02-13 16:35"));
|
|
guess = performGuess(releaseDates);
|
|
assertEquals(ReleaseScheduleGuesser.Schedule.WEEKLY, guess.schedule);
|
|
assertClose(makeDate("2024-02-18 16:30"), guess.nextExpectedDate, 2 * ONE_HOUR);
|
|
}
|
|
|
|
@Test
|
|
public void testMonthly() {
|
|
ArrayList<Date> releaseDates = new ArrayList<>();
|
|
releaseDates.add(makeDate("2024-01-01 16:30"));
|
|
releaseDates.add(makeDate("2024-02-01 16:30"));
|
|
releaseDates.add(makeDate("2024-03-01 16:30"));
|
|
releaseDates.add(makeDate("2024-04-01 16:30"));
|
|
|
|
// Next month
|
|
ReleaseScheduleGuesser.Guess guess = performGuess(releaseDates);
|
|
assertEquals(ReleaseScheduleGuesser.Schedule.MONTHLY, guess.schedule);
|
|
assertClose(makeDate("2024-05-01 16:30"), guess.nextExpectedDate, 10 * ONE_HOUR);
|
|
|
|
// One-off early release
|
|
releaseDates.add(makeDate("2024-04-30 16:30"));
|
|
guess = performGuess(releaseDates);
|
|
assertEquals(ReleaseScheduleGuesser.Schedule.MONTHLY, guess.schedule);
|
|
assertClose(makeDate("2024-06-01 16:30"), guess.nextExpectedDate, 10 * ONE_HOUR);
|
|
|
|
// One-off late release
|
|
releaseDates.remove(releaseDates.size() - 1);
|
|
releaseDates.add(makeDate("2024-05-13 16:30"));
|
|
guess = performGuess(releaseDates);
|
|
assertEquals(ReleaseScheduleGuesser.Schedule.MONTHLY, guess.schedule);
|
|
assertClose(makeDate("2024-06-01 16:30"), guess.nextExpectedDate, 10 * ONE_HOUR);
|
|
}
|
|
|
|
@Test
|
|
public void testFourweekly() {
|
|
ArrayList<Date> releaseDates = new ArrayList<>();
|
|
releaseDates.add(makeDate("2024-01-01 16:30"));
|
|
releaseDates.add(makeDate("2024-01-29 16:30"));
|
|
releaseDates.add(makeDate("2024-02-26 16:30"));
|
|
releaseDates.add(makeDate("2024-03-25 16:30"));
|
|
|
|
// 4 weeks later
|
|
ReleaseScheduleGuesser.Guess guess = performGuess(releaseDates);
|
|
assertEquals(ReleaseScheduleGuesser.Schedule.FOURWEEKLY, guess.schedule);
|
|
assertClose(makeDate("2024-04-22 16:30"), guess.nextExpectedDate, 10 * ONE_HOUR);
|
|
}
|
|
|
|
@Test
|
|
public void testUnknown() {
|
|
ArrayList<Date> releaseDates = new ArrayList<>();
|
|
releaseDates.add(makeDate("2024-01-01 16:30"));
|
|
releaseDates.add(makeDate("2024-01-03 16:30"));
|
|
releaseDates.add(makeDate("2024-01-03 16:31"));
|
|
releaseDates.add(makeDate("2024-01-04 16:30"));
|
|
releaseDates.add(makeDate("2024-01-04 16:31"));
|
|
releaseDates.add(makeDate("2024-01-07 16:30"));
|
|
releaseDates.add(makeDate("2024-01-07 16:31"));
|
|
releaseDates.add(makeDate("2024-01-10 16:30"));
|
|
ReleaseScheduleGuesser.Guess guess = performGuess(releaseDates);
|
|
assertEquals(ReleaseScheduleGuesser.Schedule.UNKNOWN, guess.schedule);
|
|
assertClose(makeDate("2024-01-12 16:30"), guess.nextExpectedDate, 2 * ONE_DAY);
|
|
}
|
|
} |