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-week cron field.
10   *
11   * @since v1.5
12   */
13  public class CronExpressionDayOfWeekTest extends AbstractCronExpressionTest {
14      public CronExpressionDayOfWeekTest(CronFactory cronFactory) {
15          super(cronFactory);
16      }
17  
18      @Test
19      public void testLastDayOfWeekIsSaturday() {
20          // This is dumb because it just means the same thing as 7 or SAT
21          assertCron("L (Saturday)", "0 0 0 ? * L",
22                  unsatisfiedBy(0, 0, 0, 10, 1, 2014),
23                  satisfiedBy(0, 0, 0, 11, 1, 2014),
24                  unsatisfiedBy(0, 0, 0, 12, 1, 2014),
25                  satisfiedBy(0, 0, 0, 18, 1, 2014),
26                  unsatisfiedBy(0, 0, 0, 24, 1, 2014),
27                  satisfiedBy(0, 0, 0, 25, 1, 2014),
28                  unsatisfiedBy(0, 0, 0, 26, 1, 2014),
29                  unsatisfiedBy(0, 0, 0, 31, 1, 2014),
30                  satisfiedBy(0, 0, 0, 1, 2, 2014));
31      }
32  
33      @Test
34      public void testLastDayOfWeekForMonth() {
35          // With a digit, the meaning changes to the last occurrence of that day-of-week for the month
36          // For example, 5L means the last Thursday of the month.
37          assertCron("5L", "0 0 0 ? * 5L",
38                  unsatisfiedBy(0, 0, 0, 9, 1, 2014),
39                  unsatisfiedBy(0, 0, 0, 23, 1, 2014),
40                  unsatisfiedBy(0, 0, 0, 23, 1, 2014),
41                  unsatisfiedBy(0, 0, 0, 29, 1, 2014),
42                  satisfiedBy(0, 0, 0, 30, 1, 2014),
43                  unsatisfiedBy(0, 0, 0, 31, 1, 2014),
44                  unsatisfiedBy(0, 0, 0, 6, 2, 2014),
45                  satisfiedBy(0, 0, 0, 27, 2, 2014),
46                  unsatisfiedBy(0, 0, 0, 28, 2, 2014),
47                  satisfiedBy(0, 0, 0, 29, 2, 2024));
48  
49          assertCron("7L", "0 0 0 ? * 7L",
50                  unsatisfiedBy(0, 0, 0, 11, 1, 2014),
51                  satisfiedBy(0, 0, 0, 25, 1, 2014),
52                  unsatisfiedBy(0, 0, 0, 1, 2, 2014));
53      }
54  
55      @Test
56      public void testEnglishDayOfWeek() {
57          assertCron("MON", "0 0 0 ? 2 MON",
58                  satisfiedBy(0, 0, 0, 3, 2, 2014),
59                  satisfiedBy(0, 0, 0, 10, 2, 2014),
60                  satisfiedBy(0, 0, 0, 17, 2, 2014),
61                  satisfiedBy(0, 0, 0, 24, 2, 2014),
62                  unsatisfiedBy(1, 0, 0, 3, 2, 2014),
63                  unsatisfiedBy(0, 1, 0, 3, 2, 2014),
64                  unsatisfiedBy(0, 0, 1, 3, 2, 2014),
65                  unsatisfiedBy(0, 0, 0, 4, 2, 2014),
66                  unsatisfiedBy(0, 0, 0, 3, 3, 2014),
67                  satisfiedBy(0, 0, 0, 2, 2, 2015));
68      }
69  
70      @Test
71      public void testEnglishDayOfWeekNormalRange() {
72          assertCron("MON-THU - Other field mismatches", "1 1 1 ? * MON-THU",
73                  unsatisfiedBy(0, 1, 1, 3, 2, 2014),
74                  unsatisfiedBy(2, 1, 1, 3, 2, 2014),
75                  unsatisfiedBy(1, 0, 1, 3, 2, 2014),
76                  unsatisfiedBy(1, 2, 1, 3, 2, 2014),
77                  unsatisfiedBy(1, 1, 0, 3, 2, 2014),
78                  unsatisfiedBy(1, 1, 2, 3, 2, 2014));
79  
80          assertCron("Checking MON-THU - Simple checks", "1 1 1 ? * MON-THU",
81                  unsatisfiedBy(1, 1, 1, 27, 4, 2014),  // SUN
82                  satisfiedBy(1, 1, 1, 28, 4, 2014),  // MON
83                  satisfiedBy(1, 1, 1, 29, 4, 2014),  // TUE
84                  satisfiedBy(1, 1, 1, 30, 4, 2014),  // WED
85                  satisfiedBy(1, 1, 1, 1, 5, 2014),  // THU
86                  unsatisfiedBy(1, 1, 1, 2, 5, 2014),  // FRI
87                  unsatisfiedBy(1, 1, 1, 3, 5, 2014),  // SAT
88                  unsatisfiedBy(1, 1, 1, 4, 5, 2014),  // SUN
89                  satisfiedBy(1, 1, 1, 5, 5, 2014),  // MON
90                  satisfiedBy(1, 1, 1, 6, 5, 2014));  // TUE
91      }
92  
93      @Test
94      public void testEnglishDayOfWeekWrappedRange() {
95          assertCron("Checking THU-MON - Other field mismatches", "1 1 1 ? * THU-MON",
96                  unsatisfiedBy(0, 1, 1, 3, 2, 2014),
97                  unsatisfiedBy(2, 1, 1, 3, 2, 2014),
98                  unsatisfiedBy(1, 0, 1, 3, 2, 2014),
99                  unsatisfiedBy(1, 2, 1, 3, 2, 2014),
100                 unsatisfiedBy(1, 1, 0, 3, 2, 2014),
101                 unsatisfiedBy(1, 1, 2, 3, 2, 2014));
102 
103         assertCron("Checking THU-MON - Simple checks", "1 1 1 ? * THU-MON",
104                 satisfiedBy(1, 1, 1, 27, 4, 2014),  // SUN
105                 satisfiedBy(1, 1, 1, 28, 4, 2014),  // MON
106                 unsatisfiedBy(1, 1, 1, 29, 4, 2014),  // TUE
107                 unsatisfiedBy(1, 1, 1, 30, 4, 2014),  // WED
108                 satisfiedBy(1, 1, 1, 1, 5, 2014),  // THU
109                 satisfiedBy(1, 1, 1, 2, 5, 2014),  // FRI
110                 satisfiedBy(1, 1, 1, 3, 5, 2014),  // SAT
111                 satisfiedBy(1, 1, 1, 4, 5, 2014),  // SUN
112                 satisfiedBy(1, 1, 1, 5, 5, 2014),  // MON
113                 unsatisfiedBy(1, 1, 1, 6, 5, 2014));  // TUE
114 
115     }
116 
117     @Test
118     public void testThirdMondayOfMonthUsingName() {
119         nthDay3rdMonday("5 6 7 ? 1 MON#3");
120     }
121 
122     @Test
123     public void testThirdMondayOfMonthUsingNumber() {
124         nthDay3rdMonday("5 6 7 ? 1 2#3");
125     }
126 
127     private void nthDay3rdMonday(final String cronExpression) {
128         assertCron("3rd Monday - Other field mismatches", cronExpression,
129                 unsatisfiedBy(4, 6, 7, 20, 1, 2014),
130                 unsatisfiedBy(5, 5, 7, 20, 1, 2014),
131                 unsatisfiedBy(5, 6, 6, 20, 1, 2014),
132                 unsatisfiedBy(5, 6, 7, 20, 2, 2014),
133                 unsatisfiedBy(5, 6, 7, 20, 1, 2015));
134 
135         assertCron("3rd Monday - simple checks", cronExpression,
136                 satisfiedBy(5, 6, 7, 21, 1, 2013),
137                 unsatisfiedBy(5, 6, 7, 13, 1, 2014),
138                 unsatisfiedBy(5, 6, 7, 19, 1, 2014),
139                 satisfiedBy(5, 6, 7, 20, 1, 2014),
140                 unsatisfiedBy(5, 6, 7, 21, 1, 2014),
141                 unsatisfiedBy(5, 6, 7, 27, 1, 2014),
142                 unsatisfiedBy(5, 6, 7, 17, 2, 2014),
143                 satisfiedBy(5, 6, 7, 20, 1, 2014),
144                 satisfiedBy(5, 6, 7, 18, 1, 2016),
145                 satisfiedBy(5, 6, 7, 16, 1, 2017));
146     }
147 
148     @Test
149     public void testNthDayOfMonth() {
150         assertCron("TUE#4 (4th Tuesday)", "9 9 9 ? * TUE#4",
151                 unsatisfiedBy(9, 9, 9, 21, 1, 2014),
152                 unsatisfiedBy(9, 9, 9, 27, 1, 2014),
153                 satisfiedBy(9, 9, 9, 28, 1, 2014),
154                 unsatisfiedBy(9, 9, 9, 29, 1, 2014),
155                 unsatisfiedBy(9, 9, 9, 4, 2, 2014),
156                 satisfiedBy(9, 9, 9, 25, 2, 2014),
157                 satisfiedBy(9, 9, 9, 22, 4, 2014),
158                 satisfiedBy(9, 9, 9, 24, 1, 2017),
159                 satisfiedBy(9, 9, 9, 28, 3, 2017));
160 
161         assertCron("4#5 (5th Wednesday)", "9 9 9 ? * 4#5",
162                 satisfiedBy(9, 9, 9, 29, 2, 2012),
163                 unsatisfiedBy(9, 9, 9, 28, 1, 2014),
164                 unsatisfiedBy(9, 9, 9, 4, 2, 2014),
165                 unsatisfiedBy(9, 9, 9, 31, 3, 2014),
166                 satisfiedBy(9, 9, 9, 30, 4, 2014),
167                 satisfiedBy(9, 9, 9, 31, 12, 2014),
168                 satisfiedBy(9, 9, 9, 29, 3, 2017));
169     }
170 }