Issue512Test.java

package com.cronutils;

import static org.junit.jupiter.api.Assertions.assertFalse;
import static org.junit.jupiter.api.Assertions.assertNotNull;

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

import org.junit.jupiter.api.Test;

import com.cronutils.builder.CronBuilder;
import com.cronutils.model.definition.CronDefinitionBuilder;
import com.cronutils.model.field.expression.FieldExpressionFactory;
import com.cronutils.model.time.ExecutionTime;

public class Issue512Test {
    
    @Test
    public void testPreviousMonthIsShorter() {
        LocalDateTime time = LocalDateTime.of(2022, 3, 30, 9, 55, 0);
        
        ExecutionTime execTime = ExecutionTime.forCron(CronBuilder
                .cron(CronDefinitionBuilder
                        .defineCron()
                        .withYear().and()
                        .withMonth().and()
                        .withDayOfMonth().and()
                        .withHours().and()
                        .withMinutes().and()
                        .withSeconds().and()
                        .instance())
                .withYear(FieldExpressionFactory.on(time.getYear()))
                .withMonth(FieldExpressionFactory.on(time.getMonthValue()))
                .withDoM(FieldExpressionFactory.on(time.getDayOfMonth()))
                .withHour(FieldExpressionFactory.on(time.getHour()))
                .withMinute(FieldExpressionFactory.on(time.getMinute()))
                .withSecond(FieldExpressionFactory.on(time.getSecond()))
                .instance());
        
        Optional<ZonedDateTime> result =
                execTime.lastExecution(ZonedDateTime.of(2022, 3, 30, 9, 54, 0, 0, ZoneId.systemDefault()));
        
        assertNotNull(result);
        assertFalse(result.isPresent());
    }
    
}