CrossMinuteExecutionTest.java

package com.cronutils.model.time;

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.parser.CronParser;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.Arguments;
import org.junit.jupiter.params.provider.MethodSource;

import java.time.ZoneOffset;
import java.time.ZonedDateTime;
import java.util.Optional;
import java.util.stream.Stream;

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

public class CrossMinuteExecutionTest {

    @Test
    public void testCrossMinuteExecution() {
        CronDefinition definition = CronDefinitionBuilder.instanceDefinitionFor(CronType.QUARTZ);
        CronParser parser = new CronParser(definition);
        Cron cron = parser.parse("*/8 * * * * ?");
        ExecutionTime executionTime = ExecutionTime.forCron(cron);

        // Test case 1: When next execution should be in the same minute
        ZonedDateTime time1 = ZonedDateTime.of(2024, 9, 12, 10, 46, 40, 0, ZoneOffset.UTC);
        ZonedDateTime expected1 = ZonedDateTime.of(2024, 9, 12, 10, 46, 48, 0, ZoneOffset.UTC);
        assertEquals(expected1, executionTime.nextExecution(time1).get());

        // Test case 2: When next execution should be in the next minute
        ZonedDateTime time2 = ZonedDateTime.of(2024, 9, 12, 10, 46, 57, 0, ZoneOffset.UTC);
        ZonedDateTime expected2 = ZonedDateTime.of(2024, 9, 12, 10, 47, 0, 0, ZoneOffset.UTC);
        assertEquals(expected2, executionTime.nextExecution(time2).get());

        // Test case 3: When at exact execution time
        ZonedDateTime time3 = ZonedDateTime.of(2024, 9, 12, 10, 46, 48, 0, ZoneOffset.UTC);
        ZonedDateTime expected3 = ZonedDateTime.of(2024, 9, 12, 10, 46, 56, 0, ZoneOffset.UTC);
        assertEquals(expected3, executionTime.nextExecution(time3).get());
    }

    @Test
    public void testCrossMinuteExecutionWithDifferentIntervals() {
        CronDefinition definition = CronDefinitionBuilder.instanceDefinitionFor(CronType.QUARTZ);
        CronParser parser = new CronParser(definition);
        
        // Test with 15-second intervals
        Cron cron1 = parser.parse("0/15 * * * * ?");
        ExecutionTime executionTime1 = ExecutionTime.forCron(cron1);
        ZonedDateTime time1 = ZonedDateTime.of(2024, 9, 12, 10, 46, 55, 0, ZoneOffset.UTC);
        ZonedDateTime expected1 = ZonedDateTime.of(2024, 9, 12, 10, 47, 0, 0, ZoneOffset.UTC);
        assertEquals(expected1, executionTime1.nextExecution(time1).get());

        // Test with 30-second intervals
        Cron cron2 = parser.parse("0/30 * * * * ?");
        ExecutionTime executionTime2 = ExecutionTime.forCron(cron2);
        ZonedDateTime time2 = ZonedDateTime.of(2024, 9, 12, 10, 46, 35, 0, ZoneOffset.UTC);
        ZonedDateTime expected2 = ZonedDateTime.of(2024, 9, 12, 10, 47, 0, 0, ZoneOffset.UTC);
        assertEquals(expected2, executionTime2.nextExecution(time2).get());
    }
}