1 package com.atlassian.core.cron.parser;
2
3 import com.atlassian.core.cron.CronEditorBean;
4 import com.atlassian.core.util.DateUtils;
5 import junit.framework.TestCase;
6
7
8
9
10 public class TestCronExpressionParser extends TestCase
11 {
12
13 public void testDailySpecOncePerDay()
14 {
15 String twoAmOncePerDay = "0 0 2 * * *";
16 CronExpressionParser cronExpressionParser = new CronExpressionParser(twoAmOncePerDay);
17 assertTrue(cronExpressionParser.isDailyMode());
18 assertFalse(cronExpressionParser.isDayPerWeekMode());
19 assertFalse(cronExpressionParser.isDaysPerMonthMode());
20 assertTrue((cronExpressionParser.isValidForEditor()));
21 assertEquals(2, cronExpressionParser.getHoursEntry().getRunOnce());
22 assertEquals(DateUtils.AM, cronExpressionParser.getHoursEntry().getRunOnceMeridian());
23 assertEquals(-1, cronExpressionParser.getHoursEntry().getFrom());
24 assertNull(cronExpressionParser.getHoursEntry().getFromMeridian());
25 assertEquals(-1, cronExpressionParser.getHoursEntry().getTo());
26 assertNull(cronExpressionParser.getHoursEntry().getToMeridian());
27 assertEquals(0, cronExpressionParser.getIncrementInMinutes());
28 }
29
30 public void testDailySpecEvery15MinutesForOneHourOnly()
31 {
32 String twoAmEvery15Minutes = "0 0/15 2 * * *";
33 CronExpressionParser cronExpressionParser = new CronExpressionParser(twoAmEvery15Minutes);
34 assertFalse(cronExpressionParser.isDailyMode());
35 assertFalse(cronExpressionParser.isDayPerWeekMode());
36 assertFalse(cronExpressionParser.isDaysPerMonthMode());
37 assertTrue(cronExpressionParser.isAdvancedMode());
38
39
40
41 assertFalse(cronExpressionParser.isValidForEditor());
42
43 final CronEditorBean cronEditorBean = cronExpressionParser.getCronEditorBean();
44 assertTrue(cronEditorBean.isAdvancedMode());
45 assertFalse(cronEditorBean.isDailyMode());
46 assertFalse(cronEditorBean.isDayOfWeekOfMonth());
47 assertFalse(cronEditorBean.isDayPerWeekMode());
48 assertFalse(cronEditorBean.isDaysPerMonthMode());
49 }
50
51 public void testDailySpecEvery15MinutesForOneHourOnlyUsingRange()
52 {
53 String twoAmEvery15Minutes = "0 0/15 8-8 * * *";
54 CronExpressionParser cronExpressionParser = new CronExpressionParser(twoAmEvery15Minutes);
55 assertTrue(cronExpressionParser.isDailyMode());
56 assertFalse(cronExpressionParser.isDayPerWeekMode());
57 assertFalse(cronExpressionParser.isDaysPerMonthMode());
58 assertFalse(cronExpressionParser.isAdvancedMode());
59 assertTrue(cronExpressionParser.isValidForEditor());
60
61 assertEquals(-1, cronExpressionParser.getHoursEntry().getRunOnce());
62 assertNull(cronExpressionParser.getHoursEntry().getRunOnceMeridian());
63 assertEquals(8, cronExpressionParser.getHoursEntry().getFrom());
64 assertEquals(DateUtils.AM, cronExpressionParser.getHoursEntry().getFromMeridian());
65 assertEquals(9, cronExpressionParser.getHoursEntry().getTo());
66 assertEquals(DateUtils.AM, cronExpressionParser.getHoursEntry().getToMeridian());
67 assertEquals(15, cronExpressionParser.getIncrementInMinutes());
68
69 final CronEditorBean cronEditorBean = cronExpressionParser.getCronEditorBean();
70 assertFalse(cronEditorBean.isAdvancedMode());
71 assertTrue(cronEditorBean.isDailyMode());
72 assertFalse(cronEditorBean.isDayOfWeekOfMonth());
73 assertFalse(cronEditorBean.isDayPerWeekMode());
74 assertFalse(cronEditorBean.isDaysPerMonthMode());
75 }
76
77 public void testDailySpecEveryTwoHoursInRange()
78 {
79 String oneToFourEveryTwoHours = "0 0 1-4/2 ? * *";
80 CronExpressionParser cronExpressionParser = new CronExpressionParser(oneToFourEveryTwoHours);
81 assertTrue(cronExpressionParser.isDailyMode());
82 assertFalse(cronExpressionParser.isDayPerWeekMode());
83 assertFalse(cronExpressionParser.isDaysPerMonthMode());
84 assertEquals(120, cronExpressionParser.getIncrementInMinutes());
85 assertEquals(-1, cronExpressionParser.getHoursEntry().getRunOnce());
86 assertNull(cronExpressionParser.getHoursEntry().getRunOnceMeridian());
87 assertEquals(1, cronExpressionParser.getHoursEntry().getFrom());
88 assertEquals(DateUtils.AM, cronExpressionParser.getHoursEntry().getFromMeridian());
89 assertEquals(5, cronExpressionParser.getHoursEntry().getTo());
90 assertEquals(DateUtils.AM, cronExpressionParser.getHoursEntry().getToMeridian());
91 assertTrue(cronExpressionParser.isValidForEditor());
92 assertFalse(cronExpressionParser.getCronEditorBean().is24HourRange());
93 }
94
95 public void testDailySpecEveryFifteenMinutesOfEverySecondHourAllDay()
96 {
97 String everyFiftenMinutesEverySecondHour = "0 0/15 */2 ? * *";
98 CronExpressionParser cronExpressionParser = new CronExpressionParser(everyFiftenMinutesEverySecondHour);
99 assertFalse(cronExpressionParser.isDailyMode());
100 assertFalse(cronExpressionParser.isDayPerWeekMode());
101 assertFalse(cronExpressionParser.isDaysPerMonthMode());
102 assertTrue(cronExpressionParser.isAdvancedMode());
103
104 assertEquals(0, cronExpressionParser.getIncrementInMinutes());
105
106
107
108 assertFalse(cronExpressionParser.isValidForEditor());
109
110 final CronEditorBean cronEditorBean = cronExpressionParser.getCronEditorBean();
111 assertTrue(cronEditorBean.isAdvancedMode());
112 assertFalse(cronEditorBean.isDailyMode());
113 assertFalse(cronEditorBean.isDayOfWeekOfMonth());
114 assertFalse(cronEditorBean.isDayPerWeekMode());
115 assertFalse(cronEditorBean.isDaysPerMonthMode());
116 }
117
118 public void testDailySpecEveryTwoHoursAllDay()
119 {
120 String oneToFourEveryTwoHours = "0 0 */2 ? * *";
121 CronExpressionParser cronExpressionParser = new CronExpressionParser(oneToFourEveryTwoHours);
122 assertTrue(cronExpressionParser.isDailyMode());
123 assertFalse(cronExpressionParser.isDayPerWeekMode());
124 assertFalse(cronExpressionParser.isDaysPerMonthMode());
125 assertEquals(120, cronExpressionParser.getIncrementInMinutes());
126 assertEquals(-1, cronExpressionParser.getHoursEntry().getRunOnce());
127 assertNull(cronExpressionParser.getHoursEntry().getRunOnceMeridian());
128 assertEquals(12, cronExpressionParser.getHoursEntry().getFrom());
129 assertEquals(DateUtils.AM, cronExpressionParser.getHoursEntry().getFromMeridian());
130 assertEquals(12, cronExpressionParser.getHoursEntry().getTo());
131 assertEquals(DateUtils.AM, cronExpressionParser.getHoursEntry().getToMeridian());
132 assertTrue(cronExpressionParser.isValidForEditor());
133 assertTrue(cronExpressionParser.getCronEditorBean().is24HourRange());
134 }
135
136 public void testDailySpecWithInvalidFrequency()
137 {
138 String oneToFourEveryFiveHours = "0 0 1-4/5 * * *";
139 CronExpressionParser cronExpressionParser = new CronExpressionParser(oneToFourEveryFiveHours);
140 assertFalse(cronExpressionParser.isValidForEditor());
141 }
142
143 public void testMonthEntryIsInvalid()
144 {
145 String everyTwoMonths = "0 10 6 * */2 ?";
146 CronExpressionParser cronExpressionParser = new CronExpressionParser(everyTwoMonths);
147 assertFalse(cronExpressionParser.isValidForEditor());
148 }
149
150 public void testDayOfWeekOfMonth()
151 {
152 String secondMondayOfMonth = "0 30 20 ? * 2#2";
153 CronExpressionParser cronExpressionParser = new CronExpressionParser(secondMondayOfMonth);
154 assertTrue(cronExpressionParser.isValidForEditor());
155 assertTrue(cronExpressionParser.isDaysPerMonthMode());
156 assertTrue(cronExpressionParser.isDayOfWeekOfMonth());
157 assertFalse(cronExpressionParser.isDayPerWeekMode());
158 }
159
160 public void testDaysOfWeekIsValid()
161 {
162 String everySecondMondayOfTheMonth = "0 0 1 ? * 2#2";
163 CronExpressionParser cronExpressionParser = new CronExpressionParser(everySecondMondayOfTheMonth);
164 assertTrue(cronExpressionParser.isValidForEditor());
165 assertTrue(cronExpressionParser.isDaysPerMonthMode());
166 assertTrue(cronExpressionParser.isDayOfWeekOfMonth());
167 assertFalse(cronExpressionParser.isDayPerWeekMode());
168 }
169
170 public void testInvalidCronStringPassesBackDefaultCronStrings()
171 {
172 String oneToFourEveryFiveHours = "0 0 1-4/5 * * *";
173 CronExpressionParser cronExpressionParser = new CronExpressionParser(oneToFourEveryFiveHours);
174 assertFalse(cronExpressionParser.isValidForEditor());
175 assertEquals(oneToFourEveryFiveHours, cronExpressionParser.getCronString());
176
177 assertTrue(cronExpressionParser.getDaysOfWeekEntry().isValid());
178 }
179
180 public void testInvalidCronStringGoesToAdvancedMode()
181 {
182 String oneToFourEveryFiveHours = "0 0 1-4/5 * * *";
183 CronExpressionParser cronExpressionParser = new CronExpressionParser(oneToFourEveryFiveHours);
184 assertFalse(cronExpressionParser.isValidForEditor());
185 assertTrue(cronExpressionParser.isAdvancedMode());
186 }
187
188 public void testInvalidCronStringHourContainsComma()
189 {
190 String atOneTwoAndThree = "0 0 1,2,3 * * *";
191 CronExpressionParser cronExpressionParser = new CronExpressionParser(atOneTwoAndThree);
192 assertFalse(cronExpressionParser.isValidForEditor());
193 assertTrue(cronExpressionParser.isAdvancedMode());
194 }
195
196 public void testDayOfMonthIsValid()
197 {
198 String thirtiethOfEachMonth = "0 0 1 30 * ?";
199 CronExpressionParser cronExpressionParser = new CronExpressionParser(thirtiethOfEachMonth);
200 assertTrue(cronExpressionParser.isValidForEditor());
201 assertTrue(cronExpressionParser.isDaysPerMonthMode());
202 assertFalse(cronExpressionParser.isDayOfWeekOfMonth());
203 assertFalse(cronExpressionParser.isDayPerWeekMode());
204 }
205
206 public void testSingleDayOfWeek()
207 {
208 String everySecondMondayOfTheMonth = "0 0 1 ? * 2";
209 CronExpressionParser cronExpressionParser = new CronExpressionParser(everySecondMondayOfTheMonth);
210 assertTrue(cronExpressionParser.isValidForEditor());
211 assertFalse(cronExpressionParser.isDaysPerMonthMode());
212 assertTrue(cronExpressionParser.isDayPerWeekMode());
213 assertEquals(1, cronExpressionParser.getHoursEntry().getRunOnce());
214 assertNull(cronExpressionParser.getDaysOfWeekEntry().getDayInMonthOrdinal());
215 assertEquals("2", cronExpressionParser.getDaysOfWeekEntry().getDaysAsNumbers());
216 }
217
218 public void testDefaultCronString()
219 {
220 CronExpressionParser cronExpressionParser = new CronExpressionParser();
221 CronEditorBean cronEditorBean = cronExpressionParser.getCronEditorBean();
222 assertTrue(cronEditorBean.isDailyMode());
223 }
224
225 public void testEvery3Days()
226 {
227 CronExpressionParser cronExpressionParser = new CronExpressionParser("0 0 10 1/3 * ?");
228 CronEditorBean cronEditorBean = cronExpressionParser.getCronEditorBean();
229 assertFalse(cronEditorBean.isDailyMode());
230 assertFalse(cronEditorBean.isDayPerWeekMode());
231 assertFalse(cronEditorBean.isDaysPerMonthMode());
232 assertTrue(cronEditorBean.isAdvancedMode());
233 }
234
235 public void testDaily10am()
236 {
237
238
239 CronExpressionParser cronExpressionParser = new CronExpressionParser("0 0 10 * * ?");
240 CronEditorBean cronEditorBean = cronExpressionParser.getCronEditorBean();
241 assertTrue(cronEditorBean.isDailyMode());
242 assertFalse(cronEditorBean.isDayPerWeekMode());
243 assertFalse(cronEditorBean.isDaysPerMonthMode());
244 assertFalse(cronEditorBean.isAdvancedMode());
245 }
246
247 public void testSecondsImpliesAdvanced()
248 {
249
250 String fourtyFourSecsAfterMidnight = "44 0 0 * * ?";
251 CronExpressionParser cronExpressionParser = new CronExpressionParser(fourtyFourSecsAfterMidnight);
252 CronEditorBean cronEditorBean = cronExpressionParser.getCronEditorBean();
253 assertFalse(cronEditorBean.isDailyMode());
254 assertFalse(cronEditorBean.isDayPerWeekMode());
255 assertFalse(cronEditorBean.isDaysPerMonthMode());
256 assertTrue(cronEditorBean.isAdvancedMode());
257 }
258
259 public void testYearIsAdvanced()
260 {
261 CronExpressionParser cronExpressionParser = new CronExpressionParser("0 0 1 * * ? 2007");
262 CronEditorBean cronEditorBean = cronExpressionParser.getCronEditorBean();
263 assertFalse(cronEditorBean.isDailyMode());
264 assertFalse(cronEditorBean.isDayPerWeekMode());
265 assertFalse(cronEditorBean.isDaysPerMonthMode());
266 assertTrue(cronEditorBean.isAdvancedMode());
267 }
268
269 }