Issue305Test.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.api.Test;

import java.time.ZoneId;
import java.time.ZonedDateTime;
import java.util.HashSet;
import java.util.LinkedHashSet;
import java.util.Optional;
import java.util.Set;
import java.util.stream.Collectors;

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

public class Issue305Test {

    @Test
    public void testIssue305(){
        CronDefinition cronDefinition = CronDefinitionBuilder.instanceDefinitionFor(CronType.QUARTZ);
        CronParser parser = new CronParser(cronDefinition);
        Cron cron = parser.parse("0 0 0 15 8 ? 2015-2099/2");

        ExecutionTime executionTime = ExecutionTime.forCron(cron);
        Optional<ZonedDateTime> nextExecution = executionTime.nextExecution(ZonedDateTime.of(2015, 1, 1, 0, 0, 0, 0, ZoneId.of("UTC")));
        Set<ZonedDateTime> dates = new LinkedHashSet<>();
        while (!nextExecution.get().isAfter(ZonedDateTime.of(2020, 12, 31, 0, 0, 0, 0, ZoneId.of("UTC")))) {
            dates.add(nextExecution.get());
            nextExecution = executionTime.nextExecution(nextExecution.get());
        }
        Set<Integer> years = dates.stream().map(d->d.getYear()).collect(Collectors.toSet());
        Set<Integer> expectedYears = new HashSet<>();
        expectedYears.add(2015);
        expectedYears.add(2017);
        expectedYears.add(2019);
        assertEquals(expectedYears, years);
    }
}