1   package com.atlassian.core.cron.generator;
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 TestCronExpressionGenerator extends TestCase
11  {
12      public void testDailyCronWithRunOnce()
13      {
14          CronEditorBean cronEditorBean = new CronEditorBean();
15          cronEditorBean.setMode(CronEditorBean.DAILY_SPEC_MODE);
16          cronEditorBean.setHoursRunOnce("9");
17          cronEditorBean.setHoursRunOnceMeridian(DateUtils.AM);
18          cronEditorBean.setMinutes("35");
19          CronExpressionGenerator cronExpressionGenerator = new CronExpressionGenerator();
20          assertEquals("0 35 9 ? * *", cronExpressionGenerator.getCronExpressionFromInput(cronEditorBean));
21      }
22  
23      public void testDailyCronWithFromAndTo()
24      {
25          CronEditorBean cronEditorBean = new CronEditorBean();
26          cronEditorBean.setMode(CronEditorBean.DAILY_SPEC_MODE);
27  
28          cronEditorBean.setHoursFrom("1");
29          cronEditorBean.setHoursFromMeridian(DateUtils.AM);
30          cronEditorBean.setHoursTo("1");
31          cronEditorBean.setHoursToMeridian(DateUtils.PM);
32  
33          cronEditorBean.setIncrementInMinutes("180");
34  
35          CronExpressionGenerator cronExpressionGenerator = new CronExpressionGenerator();
36          assertEquals("0 0 1-12/3 ? * *", cronExpressionGenerator.getCronExpressionFromInput(cronEditorBean));
37      }
38  
39      public void testDayOfWeekWithRunOnce()
40      {
41          CronEditorBean cronEditorBean = new CronEditorBean();
42          cronEditorBean.setMode(CronEditorBean.DAYS_OF_WEEK_SPEC_MODE);
43  
44          cronEditorBean.setHoursRunOnce("9");
45          cronEditorBean.setHoursRunOnceMeridian(DateUtils.AM);
46          cronEditorBean.setMinutes("35");
47  
48          cronEditorBean.setSpecifiedDaysOfWeek("2,3,4");
49  
50          CronExpressionGenerator cronExpressionGenerator = new CronExpressionGenerator();
51          assertEquals("0 35 9 ? * 2,3,4", cronExpressionGenerator.getCronExpressionFromInput(cronEditorBean));
52      }
53  
54      public void testDayOfWeekWithFromTo()
55      {
56          CronEditorBean cronEditorBean = new CronEditorBean();
57          cronEditorBean.setMode(CronEditorBean.DAYS_OF_WEEK_SPEC_MODE);
58  
59          cronEditorBean.setHoursFrom("1");
60          cronEditorBean.setHoursFromMeridian(DateUtils.AM);
61          cronEditorBean.setHoursTo("1");
62          cronEditorBean.setHoursToMeridian(DateUtils.PM);
63  
64          cronEditorBean.setIncrementInMinutes("180");
65  
66          cronEditorBean.setSpecifiedDaysOfWeek("2,3,4");
67  
68          CronExpressionGenerator cronExpressionGenerator = new CronExpressionGenerator();
69          assertEquals("0 0 1-12/3 ? * 2,3,4", cronExpressionGenerator.getCronExpressionFromInput(cronEditorBean));
70      }
71  
72      public void testDayOfMonth()
73      {
74          CronEditorBean cronEditorBean = new CronEditorBean();
75          cronEditorBean.setMode(CronEditorBean.DAYS_OF_MONTH_SPEC_MODE);
76  
77          cronEditorBean.setMinutes("59");
78          cronEditorBean.setHoursRunOnce("12");
79          cronEditorBean.setHoursRunOnceMeridian(DateUtils.PM);
80  
81          cronEditorBean.setDayOfMonth("13");
82          cronEditorBean.setDayOfWeekOfMonth(false);
83  
84          CronExpressionGenerator cronExpressionGenerator = new CronExpressionGenerator();
85          assertEquals("0 59 12 13 * ?", cronExpressionGenerator.getCronExpressionFromInput(cronEditorBean));
86      }
87  
88      public void testDayOfWeekOfMonth()
89      {
90          CronEditorBean cronEditorBean = new CronEditorBean();
91          cronEditorBean.setMode(CronEditorBean.DAYS_OF_MONTH_SPEC_MODE);
92  
93          cronEditorBean.setMinutes("59");
94          cronEditorBean.setHoursRunOnce("12");
95          cronEditorBean.setHoursRunOnceMeridian(DateUtils.AM);
96  
97          cronEditorBean.setSpecifiedDaysOfWeek("2");
98          cronEditorBean.setDayInMonthOrdinal("3");
99          cronEditorBean.setDayOfWeekOfMonth(true);
100 
101         CronExpressionGenerator cronExpressionGenerator = new CronExpressionGenerator();
102         assertEquals("0 59 0 ? * 2#3", cronExpressionGenerator.getCronExpressionFromInput(cronEditorBean));
103     }
104 
105     public void testGenerateDailySpecWithIntervalAndRunOnce()
106     {
107         CronEditorBean cronEditorBean = new CronEditorBean();
108         cronEditorBean.setMode(CronEditorBean.DAILY_SPEC_MODE);
109         cronEditorBean.setIncrementInMinutes("60");
110         cronEditorBean.setHoursRunOnce("9");
111         cronEditorBean.setHoursRunOnceMeridian(DateUtils.AM);
112         cronEditorBean.setMinutes("35");
113         CronExpressionGenerator cronExpressionGenerator = new CronExpressionGenerator();
114         try
115         {
116             cronExpressionGenerator.generateDailySpec(cronEditorBean);
117             fail();
118         }
119         catch (IllegalStateException expected)
120         {
121             // ayay
122         }
123     }
124 
125     public void testGenerateDailySpecWithNoIntervalAndNoRunOnce()
126     {
127         CronEditorBean cronEditorBean = new CronEditorBean();
128         cronEditorBean.setMode(CronEditorBean.DAILY_SPEC_MODE);
129         CronExpressionGenerator cronExpressionGenerator = new CronExpressionGenerator();
130         try
131         {
132             cronExpressionGenerator.generateDailySpec(cronEditorBean);
133             fail();
134         }
135         catch (IllegalStateException expected)
136         {
137             // ayay
138         }
139     }
140 
141     public void testGenerateDailySpecRunOnce()
142     {
143         CronEditorBean cronEditorBean = new CronEditorBean();
144         cronEditorBean.setMode(CronEditorBean.DAILY_SPEC_MODE);
145         cronEditorBean.setHoursRunOnce("4");
146         cronEditorBean.setMinutes("25");
147         cronEditorBean.setIncrementInMinutes("0");
148         cronEditorBean.setHoursRunOnceMeridian(DateUtils.PM);
149         CronExpressionGenerator cronExpressionGenerator = new CronExpressionGenerator();
150         String dailySpec = cronExpressionGenerator.generateDailySpec(cronEditorBean);
151         assertEquals("0 25 16", dailySpec);
152     }
153 
154     public void testGenerateDailySpecRunOnceInMonthMode()
155     {
156         CronEditorBean cronEditorBean = new CronEditorBean();
157         cronEditorBean.setMode(CronEditorBean.DAYS_OF_MONTH_SPEC_MODE);
158         cronEditorBean.setHoursRunOnce("4");
159         cronEditorBean.setMinutes("25");
160         // Set this to something other than one, this should be ignored because of the mode
161         // This is a special case.
162         cronEditorBean.setIncrementInMinutes("120");
163         cronEditorBean.setHoursRunOnceMeridian(DateUtils.PM);
164         CronExpressionGenerator cronExpressionGenerator = new CronExpressionGenerator();
165         String dailySpec = cronExpressionGenerator.generateDailySpec(cronEditorBean);
166         assertEquals("0 25 16", dailySpec);
167     }
168 
169     public void testGenerateDailySpecFromToWithHourInterval()
170     {
171         CronEditorBean cronEditorBean = new CronEditorBean();
172         cronEditorBean.setMode(CronEditorBean.DAILY_SPEC_MODE);
173         cronEditorBean.setHoursFrom("4");
174         cronEditorBean.setHoursFromMeridian(DateUtils.AM);
175         cronEditorBean.setHoursTo("4");
176         cronEditorBean.setHoursToMeridian(DateUtils.PM);
177         cronEditorBean.setIncrementInMinutes("120");
178         CronExpressionGenerator cronExpressionGenerator = new CronExpressionGenerator();
179         String dailySpec = cronExpressionGenerator.generateDailySpec(cronEditorBean);
180         assertEquals("0 0 4-15/2", dailySpec);
181     }
182 
183     public void testGenerateDailySpecFromToWithMinuteInterval()
184     {
185         CronEditorBean cronEditorBean = new CronEditorBean();
186         cronEditorBean.setMode(CronEditorBean.DAILY_SPEC_MODE);
187         cronEditorBean.setHoursFrom("4");
188         cronEditorBean.setHoursFromMeridian(DateUtils.AM);
189         cronEditorBean.setHoursTo("4");
190         cronEditorBean.setHoursToMeridian(DateUtils.PM);
191         cronEditorBean.setIncrementInMinutes("15");
192         CronExpressionGenerator cronExpressionGenerator = new CronExpressionGenerator();
193         String dailySpec = cronExpressionGenerator.generateDailySpec(cronEditorBean);
194         assertEquals("0 0/15 4-15", dailySpec);
195     }
196 
197     public void testGenerateDailySpecWithEqualFromToMinuteInterval()
198     {
199         CronEditorBean cronEditorBean = new CronEditorBean();
200         cronEditorBean.setMode(CronEditorBean.DAILY_SPEC_MODE);
201         cronEditorBean.setHoursFrom("4");
202         cronEditorBean.setHoursFromMeridian(DateUtils.AM);
203         cronEditorBean.setHoursTo("4");
204         cronEditorBean.setHoursToMeridian(DateUtils.AM);
205         cronEditorBean.setIncrementInMinutes("15");
206         CronExpressionGenerator cronExpressionGenerator = new CronExpressionGenerator();
207         String dailySpec = cronExpressionGenerator.generateDailySpec(cronEditorBean);
208         assertEquals("0 0/15 *", dailySpec);
209     }
210 
211     public void testGenerateDailySpecWithEqualFromToHourInterval()
212     {
213         CronEditorBean cronEditorBean = new CronEditorBean();
214         cronEditorBean.setMode(CronEditorBean.DAILY_SPEC_MODE);
215         cronEditorBean.setHoursFrom("4");
216         cronEditorBean.setHoursFromMeridian(DateUtils.AM);
217         cronEditorBean.setHoursTo("4");
218         cronEditorBean.setHoursToMeridian(DateUtils.AM);
219         cronEditorBean.setIncrementInMinutes("120");
220         CronExpressionGenerator cronExpressionGenerator = new CronExpressionGenerator();
221         String dailySpec = cronExpressionGenerator.generateDailySpec(cronEditorBean);
222         assertEquals("0 0 */2", dailySpec);
223     }
224 
225     public void testGenerateDaysOfWeekSpecWithDaysSet()
226     {
227         CronEditorBean cronEditorBean = new CronEditorBean();
228         String specifiedDaysOfWeek = "2,3,4";
229         cronEditorBean.setSpecifiedDaysOfWeek(specifiedDaysOfWeek);
230         CronExpressionGenerator cronExpressionGenerator = new CronExpressionGenerator();
231         assertEquals(specifiedDaysOfWeek, cronExpressionGenerator.generateDaysOfWeekSpec(cronEditorBean));
232     }
233 
234     public void testGenerateDaysOfWeekSpecWithDaysNotSet()
235     {
236         CronEditorBean cronEditorBean = new CronEditorBean();
237         CronExpressionGenerator cronExpressionGenerator = new CronExpressionGenerator();
238         try
239         {
240             cronExpressionGenerator.generateDaysOfWeekSpec(cronEditorBean);
241             fail();
242         }
243         catch (IllegalStateException e)
244         {
245             // Woo Hoo
246         }
247     }
248 
249     public void testGenerateDayOfMonthSpecWithDayOfMonthSet()
250     {
251         CronEditorBean cronEditorBean = new CronEditorBean();
252         String dayOfMonth = "20";
253         cronEditorBean.setDayOfMonth(dayOfMonth);
254         CronExpressionGenerator cronExpressionGenerator = new CronExpressionGenerator();
255         assertEquals(dayOfMonth + " * ?", cronExpressionGenerator.generateDayOfMonthSpec(cronEditorBean));
256     }
257 
258     public void testGenerateDayOfMonthSpecWithDayOfMonthNotSet()
259     {
260         CronEditorBean cronEditorBean = new CronEditorBean();
261         CronExpressionGenerator cronExpressionGenerator = new CronExpressionGenerator();
262         try
263         {
264             cronExpressionGenerator.generateDaysOfWeekSpec(cronEditorBean);
265             fail();
266         }
267         catch (IllegalStateException ise)
268         {
269             // WQooo hoo
270         }
271     }
272 
273     public void testGenerateDayOfWeekOfMonthSpecLastMonday()
274     {
275         CronEditorBean cronEditorBean = new CronEditorBean();
276         cronEditorBean.setDayInMonthOrdinal("L");
277         cronEditorBean.setSpecifiedDaysOfWeek("2");
278         CronExpressionGenerator cronExpressionGenerator = new CronExpressionGenerator();
279         assertEquals("? * 2L", cronExpressionGenerator.generateDayOfWeekOfMonthSpec(cronEditorBean));
280     }
281 
282     public void testGenerateDayOfWeekOfMonthSpecSecondTuesday()
283     {
284         CronEditorBean cronEditorBean = new CronEditorBean();
285         cronEditorBean.setDayInMonthOrdinal("2");
286         cronEditorBean.setSpecifiedDaysOfWeek("3");
287         CronExpressionGenerator cronExpressionGenerator = new CronExpressionGenerator();
288         assertEquals("? * 3#2", cronExpressionGenerator.generateDayOfWeekOfMonthSpec(cronEditorBean));
289     }
290 
291     public void testGenerateDayOfWeekOfMonthWithoutOrdinal()
292     {
293         CronEditorBean cronEditorBean = new CronEditorBean();
294         cronEditorBean.setSpecifiedDaysOfWeek("3");
295         CronExpressionGenerator cronExpressionGenerator = new CronExpressionGenerator();
296 
297         try
298         {
299             cronExpressionGenerator.generateDayOfWeekOfMonthSpec(cronEditorBean);
300             fail();
301         }
302         catch (IllegalStateException e)
303         {
304             // Wook hoo
305         }
306     }
307 
308     public void testGenerateDayOfWeekOfMonthWithoutSpecifiedDaysPerWeek()
309     {
310         CronEditorBean cronEditorBean = new CronEditorBean();
311         cronEditorBean.setDayInMonthOrdinal("2");
312         CronExpressionGenerator cronExpressionGenerator = new CronExpressionGenerator();
313 
314         try
315         {
316             cronExpressionGenerator.generateDayOfWeekOfMonthSpec(cronEditorBean);
317             fail();
318         }
319         catch (IllegalStateException e)
320         {
321             // Wook hoo
322         }
323     }
324 
325 
326 }