View Javadoc

1   package com.atlassian.scheduler.core.tests;
2   
3   import org.junit.Test;
4   
5   import static com.atlassian.scheduler.core.tests.CronExpressionAssertions.satisfiedBy;
6   import static com.atlassian.scheduler.core.tests.CronExpressionAssertions.unsatisfiedBy;
7   
8   /**
9    * Tests covering the functionality of the day-of-month cron field.
10   *
11   * @since v1.5
12   */
13  public abstract class CronExpressionDayOfMonthTest extends AbstractCronExpressionTest {
14      protected CronExpressionDayOfMonthTest(CronFactory cronFactory) {
15          super(cronFactory);
16      }
17  
18      @Test
19      public void testLastDayOfMonth() {
20          assertCron("L (normal)", "0 0 0 L * ?",
21                  unsatisfiedBy(0, 0, 0, 30, 1, 2014),
22                  satisfiedBy(0, 0, 0, 31, 1, 2014),
23                  unsatisfiedBy(0, 0, 0, 1, 2, 2014),
24                  unsatisfiedBy(0, 0, 0, 1, 3, 2014),
25                  satisfiedBy(0, 0, 0, 31, 3, 2014),
26                  satisfiedBy(0, 0, 0, 30, 4, 2014),
27                  satisfiedBy(0, 0, 0, 30, 9, 2014),
28                  satisfiedBy(0, 0, 0, 31, 12, 2014));
29  
30          assertCron("L (February)", "0 0 0 L * ?",
31                  unsatisfiedBy(0, 0, 0, 28, 2, 2000),
32                  satisfiedBy(0, 0, 0, 29, 2, 2000),
33                  unsatisfiedBy(0, 0, 0, 27, 2, 2014),
34                  satisfiedBy(0, 0, 0, 28, 2, 2014),
35                  unsatisfiedBy(0, 0, 0, 28, 2, 2016),
36                  satisfiedBy(0, 0, 0, 29, 2, 2016));
37      }
38  
39      @Test
40      public void testLastWeekdayOfMonth() {
41          assertCron("LW (normal)", "0 0 0 LW * ?",
42                  unsatisfiedBy(0, 0, 0, 30, 1, 2014),
43                  satisfiedBy(0, 0, 0, 31, 1, 2014),
44                  unsatisfiedBy(0, 0, 0, 30, 3, 2014),
45                  satisfiedBy(0, 0, 0, 31, 3, 2014),
46                  unsatisfiedBy(0, 0, 0, 1, 2, 2014),
47                  unsatisfiedBy(0, 0, 0, 30, 3, 2014),
48                  satisfiedBy(0, 0, 0, 31, 3, 2014),
49                  unsatisfiedBy(0, 0, 0, 28, 8, 2014),
50                  satisfiedBy(0, 0, 0, 29, 8, 2014),
51                  unsatisfiedBy(0, 0, 0, 30, 8, 2014),
52                  unsatisfiedBy(0, 0, 0, 31, 8, 2014),
53                  satisfiedBy(0, 0, 0, 28, 11, 2014));
54  
55          assertCron("LW (February)", "0 0 0 LW * ?",
56                  unsatisfiedBy(0, 0, 0, 28, 2, 2000),
57                  satisfiedBy(0, 0, 0, 29, 2, 2000),
58                  satisfiedBy(0, 0, 0, 27, 2, 2004),
59                  unsatisfiedBy(0, 0, 0, 28, 2, 2004),
60                  unsatisfiedBy(0, 0, 0, 26, 2, 2016),
61                  unsatisfiedBy(0, 0, 0, 27, 2, 2016),
62                  unsatisfiedBy(0, 0, 0, 28, 2, 2016),
63                  satisfiedBy(0, 0, 0, 29, 2, 2016));
64      }
65  
66      @Test
67      public void testClosestWeekdayToDayOfMonth() {
68          assertCron("7W", "0 0 0 7W * ?",
69                  unsatisfiedBy(0, 0, 0, 6, 1, 2014),  // January
70                  satisfiedBy(0, 0, 0, 7, 1, 2014),
71                  unsatisfiedBy(0, 0, 0, 8, 1, 2014),
72                  unsatisfiedBy(0, 0, 0, 6, 2, 2014),  // February
73                  satisfiedBy(0, 0, 0, 7, 2, 2014),
74                  unsatisfiedBy(0, 0, 0, 8, 2, 2014),
75                  unsatisfiedBy(0, 0, 0, 5, 6, 2014),  // June (7th on Saturday)
76                  satisfiedBy(0, 0, 0, 6, 6, 2014),
77                  unsatisfiedBy(0, 0, 0, 7, 6, 2014),
78                  unsatisfiedBy(0, 0, 0, 8, 6, 2014),
79                  unsatisfiedBy(0, 0, 0, 9, 6, 2014),
80                  unsatisfiedBy(0, 0, 0, 5, 9, 2014),  // September (7th on Sunday)
81                  unsatisfiedBy(0, 0, 0, 6, 9, 2014),
82                  unsatisfiedBy(0, 0, 0, 7, 9, 2014),
83                  satisfiedBy(0, 0, 0, 8, 9, 2014),
84                  unsatisfiedBy(0, 0, 0, 9, 9, 2014));
85  
86          assertCron("28W", "0 0 0 28W * ?",
87                  satisfiedBy(0, 0, 0, 27, 2, 2004),
88                  unsatisfiedBy(0, 0, 0, 28, 2, 2004),
89                  unsatisfiedBy(0, 0, 0, 29, 2, 2004),
90                  unsatisfiedBy(0, 0, 0, 26, 2, 2015),
91                  satisfiedBy(0, 0, 0, 27, 2, 2015),
92                  unsatisfiedBy(0, 0, 0, 28, 2, 2015),
93                  unsatisfiedBy(0, 0, 0, 26, 2, 2016),
94                  unsatisfiedBy(0, 0, 0, 27, 2, 2016),
95                  unsatisfiedBy(0, 0, 0, 28, 2, 2016),
96                  satisfiedBy(0, 0, 0, 29, 2, 2016));
97  
98          assertCron("29W", "0 0 0 29W * ?",
99                  satisfiedBy(0, 0, 0, 27, 2, 2004),
100                 unsatisfiedBy(0, 0, 0, 28, 2, 2004),
101                 unsatisfiedBy(0, 0, 0, 29, 2, 2004),
102                 unsatisfiedBy(0, 0, 0, 27, 2, 2014),
103                 // unsatisfiedBy(0, 0, 0, 28, 2, 2014),  // See testNearestWeekdayToLastDayOfMonthEdgeCase
104                 unsatisfiedBy(0, 0, 0, 1, 3, 2014),
105                 unsatisfiedBy(0, 0, 0, 26, 2, 2015),
106                 unsatisfiedBy(0, 0, 0, 27, 2, 2015),
107                 unsatisfiedBy(0, 0, 0, 28, 2, 2015),
108                 unsatisfiedBy(0, 0, 0, 26, 2, 2016),
109                 unsatisfiedBy(0, 0, 0, 27, 2, 2016),
110                 unsatisfiedBy(0, 0, 0, 28, 2, 2016),
111                 satisfiedBy(0, 0, 0, 29, 2, 2016));
112     }
113 
114     /**
115      * Quartz fails the test for this edge case.
116      * <p>
117      * Given:
118      * </p>
119      * <ul>
120      * <li>The day-of-month rule given is of the form {@code nW}, where {@code n} is {@code 29}, {@code 30}, or
121      * {@code 31}; and</li>
122      * <li>A day under consideration falls in a month with {@code n-1} days; and</li>
123      * <li>The last day of the month is a Friday.</li>
124      * </ul>
125      * The correct answer should be that it does not match.  For example, for the rule {@code "0 0 0 29W * ?"},
126      * {@code Fri 2014-02-28} should not match, because {@code 2014-02-29} does not exist.  Quartz, however,
127      * calls this a match.  It says the same thing about {@code Fri 2010/04/30} for the {@code 31W} case.
128      */
129     @Test
130     public void testNearestWeekdayToLastDayOfMonthEdgeCase() {
131         assertCron("Edge case - 2014/28/02 and 29W", "0 0 0 29W * ?", unsatisfiedBy(0, 0, 0, 28, 2, 2014));
132         assertCron("Edge case - 2010/04/30 and 31W", "0 0 0 31W * ?", unsatisfiedBy(0, 0, 0, 30, 4, 2010));
133     }
134 
135     @Test
136     public void testClosestWeekdayToOffsetFromLastDayOfMonth() {
137         assertCron("L-3W (normal)", "0 0 0 L-3W * ?",
138                 unsatisfiedBy(0, 0, 0, 27, 1, 2014),
139                 satisfiedBy(0, 0, 0, 28, 1, 2014),
140                 unsatisfiedBy(0, 0, 0, 29, 1, 2014),
141                 unsatisfiedBy(0, 0, 0, 30, 1, 2014),
142                 unsatisfiedBy(0, 0, 0, 31, 1, 2014),
143                 unsatisfiedBy(0, 0, 0, 1, 2, 2014),
144                 satisfiedBy(0, 0, 0, 28, 3, 2014),
145                 unsatisfiedBy(0, 0, 0, 27, 4, 2014),
146                 satisfiedBy(0, 0, 0, 28, 4, 2014),
147                 satisfiedBy(0, 0, 0, 26, 9, 2014),
148                 unsatisfiedBy(0, 0, 0, 27, 9, 2014),
149                 unsatisfiedBy(0, 0, 0, 28, 12, 2014),
150                 satisfiedBy(0, 0, 0, 29, 12, 2014));
151 
152         assertCron("L-3W (February)", "0 0 0 L-3W * ?",
153                 unsatisfiedBy(0, 0, 0, 24, 2, 2000),
154                 satisfiedBy(0, 0, 0, 25, 2, 2000),
155                 unsatisfiedBy(0, 0, 0, 26, 2, 2000),
156                 unsatisfiedBy(0, 0, 0, 26, 2, 2012),
157                 satisfiedBy(0, 0, 0, 27, 2, 2012),
158                 unsatisfiedBy(0, 0, 0, 28, 2, 2012),
159                 unsatisfiedBy(0, 0, 0, 24, 2, 2014),
160                 satisfiedBy(0, 0, 0, 25, 2, 2014),
161                 unsatisfiedBy(0, 0, 0, 26, 2, 2014),
162                 unsatisfiedBy(0, 0, 0, 27, 2, 2014),
163                 unsatisfiedBy(0, 0, 0, 25, 2, 2016),
164                 satisfiedBy(0, 0, 0, 26, 2, 2016),
165                 unsatisfiedBy(0, 0, 0, 27, 2, 2016));
166     }
167 
168     @Test
169     public void testOffsetFromLastDayOfMonth() {
170         assertCron("L-3 (normal)", "0 0 0 L-3 * ?",
171                 unsatisfiedBy(0, 0, 0, 27, 1, 2014),
172                 satisfiedBy(0, 0, 0, 28, 1, 2014),
173                 unsatisfiedBy(0, 0, 0, 29, 1, 2014),
174                 unsatisfiedBy(0, 0, 0, 30, 1, 2014),
175                 unsatisfiedBy(0, 0, 0, 31, 1, 2014),
176                 unsatisfiedBy(0, 0, 0, 1, 2, 2014),
177                 satisfiedBy(0, 0, 0, 28, 3, 2014),
178                 satisfiedBy(0, 0, 0, 27, 4, 2014),
179                 satisfiedBy(0, 0, 0, 27, 9, 2014),
180                 satisfiedBy(0, 0, 0, 28, 12, 2014));
181 
182         assertCron("L-3 (February)", "0 0 0 L-3 * ?",
183                 unsatisfiedBy(0, 0, 0, 25, 2, 2000),
184                 satisfiedBy(0, 0, 0, 26, 2, 2000),
185                 unsatisfiedBy(0, 0, 0, 27, 2, 2000),
186                 unsatisfiedBy(0, 0, 0, 28, 2, 2000),
187                 unsatisfiedBy(0, 0, 0, 29, 2, 2000),
188                 unsatisfiedBy(0, 0, 0, 24, 2, 2014),
189                 satisfiedBy(0, 0, 0, 25, 2, 2014),
190                 unsatisfiedBy(0, 0, 0, 26, 2, 2014),
191                 unsatisfiedBy(0, 0, 0, 25, 2, 2016),
192                 satisfiedBy(0, 0, 0, 26, 2, 2016),
193                 unsatisfiedBy(0, 0, 0, 27, 2, 2016));
194     }
195 }