Files
hutool/hutool-cron/src/test/java/cn/hutool/cron/pattern/CronPatternTest.java
2022-04-30 20:47:32 +08:00

180 lines
5.3 KiB
Java
Executable File
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

package cn.hutool.cron.pattern;
import cn.hutool.core.date.DateUtil;
import cn.hutool.cron.CronException;
import org.junit.Assert;
import org.junit.Test;
/**
* 定时任务单元测试类
*
* @author Looly
*/
public class CronPatternTest {
@Test
public void matchAllTest() {
final CronPattern pattern;
// 任何时间匹配
pattern = CronPattern.of("* * * * * *");
assertMatch(pattern, DateUtil.formatNow());
}
@Test
public void matchAllTest2() {
// 在5位表达式中秒部分并不是任意匹配而是一个固定值0
// 因此此处匹配就不能匹配秒
final CronPattern pattern;
// 任何时间匹配
// 分 时 天 月 周
pattern = CronPattern.of("* * * * *");
// 测试时,秒归零,则任意时间匹配
assertMatch(pattern, DateUtil.beginOfMinute(DateUtil.date()).toString());
}
@Test
public void cronPatternTest() {
CronPattern pattern;
// 12:11匹配
pattern = CronPattern.of("39 11 12 * * *");
assertMatch(pattern, "12:11:39");
// 每5分钟匹配匹配分钟为[0,5,10,15,20,25,30,35,40,45,50,55]
pattern = CronPattern.of("39 */5 * * * *");
assertMatch(pattern, "12:00:39");
assertMatch(pattern, "12:05:39");
assertMatch(pattern, "12:10:39");
assertMatch(pattern, "12:15:39");
assertMatch(pattern, "12:20:39");
assertMatch(pattern, "12:25:39");
assertMatch(pattern, "12:30:39");
assertMatch(pattern, "12:35:39");
assertMatch(pattern, "12:40:39");
assertMatch(pattern, "12:45:39");
assertMatch(pattern, "12:50:39");
assertMatch(pattern, "12:55:39");
// 2:01,3:01,4:01
pattern = CronPattern.of("39 1 2-4 * * *");
assertMatch(pattern, "02:01:39");
assertMatch(pattern, "03:01:39");
assertMatch(pattern, "04:01:39");
// 2:01,3:01,4:01
pattern = CronPattern.of("39 1 2,3,4 * * *");
assertMatch(pattern, "02:01:39");
assertMatch(pattern, "03:01:39");
assertMatch(pattern, "04:01:39");
// 08-07, 08-06
pattern = CronPattern.of("39 0 0 6,7 8 *");
assertMatch(pattern, "2016-08-07 00:00:39");
assertMatch(pattern, "2016-08-06 00:00:39");
// 别名忽略大小写
pattern = CronPattern.of("39 0 0 6,7 Aug *");
assertMatch(pattern, "2016-08-06 00:00:39");
assertMatch(pattern, "2016-08-07 00:00:39");
pattern = CronPattern.of("39 0 0 7 aug *");
assertMatch(pattern, "2016-08-07 00:00:39");
}
@Test
public void matchDayOfWeekTest() {
// 星期四
CronPattern pattern = CronPattern.of("39 0 0 * * Thu");
assertMatch(pattern, "2017-02-09 00:00:39");
// 星期日的三种形式
pattern = CronPattern.of("39 0 0 * * Sun");
assertMatch(pattern, "2022-03-27 00:00:39");
pattern = CronPattern.of("39 0 0 * * 0");
assertMatch(pattern, "2022-03-27 00:00:39");
pattern = CronPattern.of("39 0 0 * * 7");
assertMatch(pattern, "2022-03-27 00:00:39");
}
@SuppressWarnings("ConstantConditions")
@Test
public void CronPatternTest2() {
CronPattern pattern = CronPattern.of("0/30 * * * *");
Assert.assertTrue(pattern.match(DateUtil.parse("2018-10-09 12:00:00").getTime(), false));
Assert.assertTrue(pattern.match(DateUtil.parse("2018-10-09 12:30:00").getTime(), false));
pattern = CronPattern.of("32 * * * *");
Assert.assertTrue(pattern.match(DateUtil.parse("2018-10-09 12:32:00").getTime(), false));
}
@Test
public void patternTest() {
CronPattern pattern = CronPattern.of("* 0 4 * * ?");
assertMatch(pattern, "2017-02-09 04:00:00");
assertMatch(pattern, "2017-02-19 04:00:33");
// 6位Quartz风格表达式
pattern = CronPattern.of("* 0 4 * * ?");
assertMatch(pattern, "2017-02-09 04:00:00");
assertMatch(pattern, "2017-02-19 04:00:33");
}
@Test
public void patternNegativeTest() {
// -4表示倒数的数字此处在小时上-4表示 23 - 4为19
final CronPattern pattern = CronPattern.of("* 0 -4 * * ?");
assertMatch(pattern, "2017-02-09 19:00:00");
assertMatch(pattern, "2017-02-19 19:00:33");
}
@Test
public void rangePatternTest() {
CronPattern pattern = CronPattern.of("* 20/2 * * * ?");
assertMatch(pattern, "2017-02-09 04:20:00");
assertMatch(pattern, "2017-02-09 05:20:00");
assertMatch(pattern, "2017-02-19 04:22:33");
pattern = CronPattern.of("* 2-20/2 * * * ?");
assertMatch(pattern, "2017-02-09 04:02:00");
assertMatch(pattern, "2017-02-09 05:04:00");
assertMatch(pattern, "2017-02-19 04:20:33");
}
@Test
public void lastTest() {
// 每月最后一天的任意时间
CronPattern pattern = CronPattern.of("* * * L * ?");
assertMatch(pattern, "2017-07-31 04:20:00");
assertMatch(pattern, "2017-02-28 04:20:00");
// 最后一个月的任意时间
pattern = CronPattern.of("* * * * L ?");
assertMatch(pattern, "2017-12-02 04:20:00");
// 任意天的最后时间
pattern = CronPattern.of("L L L * * ?");
assertMatch(pattern, "2017-12-02 23:59:59");
}
@Test(expected = CronException.class)
public void rangeYearTest() {
// year的范围是1970~2099年超出报错
CronPattern.of("0/1 * * * 1/1 ? 2020-2120");
}
/**
* 表达式是否匹配日期
*
* @param pattern 表达式
* @param date 日期,标准日期时间字符串
*/
@SuppressWarnings("ConstantConditions")
private void assertMatch(final CronPattern pattern, final String date) {
Assert.assertTrue(pattern.match(DateUtil.parse(date).toCalendar(), false));
Assert.assertTrue(pattern.match(DateUtil.parse(date).toCalendar(), true));
}
}