diff --git a/src/main/java/com/cronutils/mapper/CronMapper.java b/src/main/java/com/cronutils/mapper/CronMapper.java index 8446fac4..99590b3b 100755 --- a/src/main/java/com/cronutils/mapper/CronMapper.java +++ b/src/main/java/com/cronutils/mapper/CronMapper.java @@ -29,7 +29,6 @@ import com.cronutils.model.field.definition.FieldDefinition; import com.cronutils.model.field.expression.*; import com.cronutils.model.field.expression.visitor.FieldExpressionVisitorAdaptor; -import com.cronutils.model.field.expression.visitor.ValueMappingFieldExpressionVisitor; import com.cronutils.model.field.value.FieldValue; import com.cronutils.model.field.value.IntegerFieldValue; import com.cronutils.model.field.value.SpecialChar; @@ -286,12 +285,14 @@ static Function dayOfWeekMapping(final DayOfWeekFieldDefin final FieldExpression expression = field.getExpression(); FieldExpression dest = null; dest = expression.accept(new FieldExpressionVisitorAdaptor() { + @Override public FieldExpression visit(Every every) { return new Every(every.getExpression().accept(this), every.getPeriod()); } + @Override public FieldExpression visit(On on) { - return new On(mapDayOfWeek(sourceDef, targetDef, on.getTime()), on.getSpecialChar()); + return new On(mapDayOfWeek(sourceDef, targetDef, on.getTime()), on.getSpecialChar(), on.getNth()); } @Override diff --git a/src/test/java/com/cronutils/Issue605Test.java b/src/test/java/com/cronutils/Issue605Test.java new file mode 100644 index 00000000..c156327c --- /dev/null +++ b/src/test/java/com/cronutils/Issue605Test.java @@ -0,0 +1,43 @@ +package com.cronutils; + +import com.cronutils.mapper.CronMapper; +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.params.ParameterizedTest; +import org.junit.jupiter.params.provider.Arguments; +import org.junit.jupiter.params.provider.MethodSource; + +import java.util.stream.Stream; + +import static com.cronutils.model.CronType.QUARTZ; +import static com.cronutils.model.CronType.SPRING; +import static org.junit.jupiter.api.Assertions.assertDoesNotThrow; + +class Issue605Test { + + static Stream cronExpressions() { + return Stream.of( + Arguments.of(QUARTZ, CronMapper.fromQuartzToCron4j()), + Arguments.of(QUARTZ, CronMapper.fromQuartzToSpring()), + Arguments.of(QUARTZ, CronMapper.fromQuartzToUnix()), + Arguments.of(SPRING, CronMapper.fromSpringToQuartz()) + ); + } + + @ParameterizedTest + @MethodSource("cronExpressions") + void testDayOfWeekMappingSpring(CronType cronType, CronMapper mapper) { + Cron cron = getCron(cronType, "0 0 0 ? * 5#1"); + assertDoesNotThrow(() -> mapper.map(cron)); + } + + private Cron getCron(CronType cronType, @SuppressWarnings("SameParameterValue") final String quartzExpression) { + final CronDefinition cronDefinition = CronDefinitionBuilder.instanceDefinitionFor(cronType); + final CronParser parser = new CronParser(cronDefinition); + return parser.parse(quartzExpression); + } + +} diff --git a/src/test/java/com/cronutils/utils/descriptor/TestDescriptor.java b/src/test/java/com/cronutils/utils/descriptor/TestDescriptor.java index 7e5e0909..5daaa9d7 100644 --- a/src/test/java/com/cronutils/utils/descriptor/TestDescriptor.java +++ b/src/test/java/com/cronutils/utils/descriptor/TestDescriptor.java @@ -5,6 +5,7 @@ import java.util.Locale; import java.util.ResourceBundle; +import com.cronutils.mapper.CronMapper; import org.junit.jupiter.api.Disabled; import org.junit.jupiter.api.Test; @@ -351,11 +352,12 @@ public void testAtTimeOnThirdLastDayOfMonth() { assertEquals("at 16:00:00pm, 3 days before the end of the month, every month", descriptor.describe(cron)); } - @Disabled @Test public void testAtTimeOnNthSpecificWeekdayOfMonth() { final Cron cron = getCron("0 0 16 ? * 5#2 *"); - assertEquals("at 16:00:00pm, on the 2nd Thursday of the month, every month", descriptor.describe(cron)); + CronMapper quartzToUnixMapper = CronMapper.fromQuartzToUnix(); + Cron mapped = quartzToUnixMapper.map(cron); + assertEquals("at 16:00 Thursday 2 of every month", descriptor.describe(mapped)); } @Disabled