Issue293Test.java

package com.cronutils;

import com.cronutils.model.Cron;
import com.cronutils.model.CronType;
import com.cronutils.model.definition.CronDefinition;
import com.cronutils.model.definition.CronDefinitionBuilder;
import com.cronutils.model.time.ExecutionTime;
import com.cronutils.parser.CronParser;
import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.ValueSource;

import java.time.DayOfWeek;
import java.time.ZoneId;
import java.time.ZonedDateTime;
import java.util.Optional;

import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.fail;

// https://github.com/jmrozanec/cron-utils/issues/293
public class Issue293Test {
    private static final ZoneId ZONE = ZoneId.systemDefault();

    @ParameterizedTest
    @ValueSource(strings = {
        "15 18 * 1-11 *",       // DateTimeException - Invalid date - Nov 31
        "15 18 * 1-11 0-5",     // DateTimeException - Invalid date - Nov 31
        "15 18 * 1-11 4-5",     // Actual is 11/24
        "15 18 * 1-11 1-5"      // Actual is 11/29
    })
    public void test(String cronText) {
        CronDefinition def = CronDefinitionBuilder.instanceDefinitionFor(CronType.UNIX);
        CronParser parser = new CronParser(def);

        Cron cron = parser.parse(cronText);
        ExecutionTime et = ExecutionTime.forCron(cron);

        ZonedDateTime vs = ZonedDateTime.of(2017, 12, 1, 9, 30, 0, 0, ZONE);
        assertEquals(DayOfWeek.FRIDAY, vs.getDayOfWeek());

        // Last match prior to our reference time
        ZonedDateTime expected = ZonedDateTime.of(2017, 11, 30, 18, 15, 0, 0, ZONE);
        assertEquals(DayOfWeek.THURSDAY, expected.getDayOfWeek());

	Optional<ZonedDateTime> lastExecution = et.lastExecution(vs);
	if (lastExecution.isPresent()) {
	    ZonedDateTime actual = lastExecution.get();
	    assertEquals(expected, actual);
	} else {
	    fail("last execution was not present");
	}
    }
}