10d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden/*
20d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden * Copyright (C) 2006 The Android Open Source Project
30d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden *
40d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden * Licensed under the Apache License, Version 2.0 (the "License");
50d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden * you may not use this file except in compliance with the License.
60d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden * You may obtain a copy of the License at
70d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden *
80d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden *      http://www.apache.org/licenses/LICENSE-2.0
90d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden *
100d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden * Unless required by applicable law or agreed to in writing, software
110d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden * distributed under the License is distributed on an "AS IS" BASIS,
120d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
130d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden * See the License for the specific language governing permissions and
140d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden * limitations under the License.
150d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden */
160d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden
1706b3293d5af3454a39681cfd659271551354b8a0Michael Chanpackage com.android.calendarcommon2;
180d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden
1906b3293d5af3454a39681cfd659271551354b8a0Michael Chanimport com.android.calendarcommon2.EventRecurrence.InvalidFormatException;
200d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden
210d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFaddenimport android.test.suitebuilder.annotation.SmallTest;
220d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFaddenimport android.test.suitebuilder.annotation.Suppress;
230d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden
240d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFaddenimport junit.framework.TestCase;
250d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden
260d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFaddenimport java.util.Arrays;
270d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden
280d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden/**
290d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden * Test android.pim.EventRecurrence.
300d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden *
3106b3293d5af3454a39681cfd659271551354b8a0Michael Chan * adb shell am instrument -w -e class com.android.calendarcommon2.EventRecurrenceTest \
3206b3293d5af3454a39681cfd659271551354b8a0Michael Chan *   com.android.calendarcommon2.tests/android.test.InstrumentationTestRunner
330d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden */
340d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFaddenpublic class EventRecurrenceTest extends TestCase {
350d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden
360d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden    @SmallTest
370d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden    public void test0() throws Exception {
380d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden        verifyRecurType("FREQ=SECONDLY",
390d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden                /* int freq */         EventRecurrence.SECONDLY,
400d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden                /* String until */     null,
410d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden                /* int count */        0,
420d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden                /* int interval */     0,
430d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden                /* int[] bysecond */   null,
440d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden                /* int[] byminute */   null,
450d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden                /* int[] byhour */     null,
460d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden                /* int[] byday */      null,
470d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden                /* int[] bydayNum */   null,
480d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden                /* int[] bymonthday */ null,
490d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden                /* int[] byyearday */  null,
500d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden                /* int[] byweekno */   null,
510d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden                /* int[] bymonth */    null,
520d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden                /* int[] bysetpos */   null,
530d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden                /* int wkst */         EventRecurrence.MO
540d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden        );
550d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden    }
560d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden
570d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden    @SmallTest
580d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden    public void test1() throws Exception {
590d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden        verifyRecurType("FREQ=MINUTELY",
600d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden                /* int freq */         EventRecurrence.MINUTELY,
610d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden                /* String until */     null,
620d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden                /* int count */        0,
630d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden                /* int interval */     0,
640d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden                /* int[] bysecond */   null,
650d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden                /* int[] byminute */   null,
660d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden                /* int[] byhour */     null,
670d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden                /* int[] byday */      null,
680d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden                /* int[] bydayNum */   null,
690d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden                /* int[] bymonthday */ null,
700d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden                /* int[] byyearday */  null,
710d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden                /* int[] byweekno */   null,
720d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden                /* int[] bymonth */    null,
730d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden                /* int[] bysetpos */   null,
740d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden                /* int wkst */         EventRecurrence.MO
750d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden        );
760d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden    }
770d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden
780d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden    @SmallTest
790d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden    public void test2() throws Exception {
800d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden        verifyRecurType("FREQ=HOURLY",
810d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden                /* int freq */         EventRecurrence.HOURLY,
820d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden                /* String until */     null,
830d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden                /* int count */        0,
840d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden                /* int interval */     0,
850d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden                /* int[] bysecond */   null,
860d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden                /* int[] byminute */   null,
870d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden                /* int[] byhour */     null,
880d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden                /* int[] byday */      null,
890d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden                /* int[] bydayNum */   null,
900d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden                /* int[] bymonthday */ null,
910d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden                /* int[] byyearday */  null,
920d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden                /* int[] byweekno */   null,
930d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden                /* int[] bymonth */    null,
940d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden                /* int[] bysetpos */   null,
950d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden                /* int wkst */         EventRecurrence.MO
960d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden        );
970d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden    }
980d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden
990d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden    @SmallTest
1000d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden    public void test3() throws Exception {
1010d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden        verifyRecurType("FREQ=DAILY",
1020d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden                /* int freq */         EventRecurrence.DAILY,
1030d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden                /* String until */     null,
1040d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden                /* int count */        0,
1050d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden                /* int interval */     0,
1060d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden                /* int[] bysecond */   null,
1070d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden                /* int[] byminute */   null,
1080d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden                /* int[] byhour */     null,
1090d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden                /* int[] byday */      null,
1100d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden                /* int[] bydayNum */   null,
1110d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden                /* int[] bymonthday */ null,
1120d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden                /* int[] byyearday */  null,
1130d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden                /* int[] byweekno */   null,
1140d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden                /* int[] bymonth */    null,
1150d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden                /* int[] bysetpos */   null,
1160d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden                /* int wkst */         EventRecurrence.MO
1170d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden        );
1180d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden    }
1190d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden
1200d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden    @SmallTest
1210d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden    public void test4() throws Exception {
1220d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden        verifyRecurType("FREQ=WEEKLY",
1230d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden                /* int freq */         EventRecurrence.WEEKLY,
1240d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden                /* String until */     null,
1250d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden                /* int count */        0,
1260d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden                /* int interval */     0,
1270d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden                /* int[] bysecond */   null,
1280d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden                /* int[] byminute */   null,
1290d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden                /* int[] byhour */     null,
1300d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden                /* int[] byday */      null,
1310d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden                /* int[] bydayNum */   null,
1320d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden                /* int[] bymonthday */ null,
1330d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden                /* int[] byyearday */  null,
1340d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden                /* int[] byweekno */   null,
1350d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden                /* int[] bymonth */    null,
1360d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden                /* int[] bysetpos */   null,
1370d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden                /* int wkst */         EventRecurrence.MO
1380d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden        );
1390d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden    }
1400d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden
1410d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden    @SmallTest
1420d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden    public void test5() throws Exception {
1430d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden        verifyRecurType("FREQ=MONTHLY",
1440d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden                /* int freq */         EventRecurrence.MONTHLY,
1450d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden                /* String until */     null,
1460d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden                /* int count */        0,
1470d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden                /* int interval */     0,
1480d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden                /* int[] bysecond */   null,
1490d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden                /* int[] byminute */   null,
1500d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden                /* int[] byhour */     null,
1510d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden                /* int[] byday */      null,
1520d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden                /* int[] bydayNum */   null,
1530d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden                /* int[] bymonthday */ null,
1540d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden                /* int[] byyearday */  null,
1550d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden                /* int[] byweekno */   null,
1560d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden                /* int[] bymonth */    null,
1570d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden                /* int[] bysetpos */   null,
1580d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden                /* int wkst */         EventRecurrence.MO
1590d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden        );
1600d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden    }
1610d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden
1620d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden    @SmallTest
1630d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden    public void test6() throws Exception {
1640d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden        verifyRecurType("FREQ=YEARLY",
1650d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden                /* int freq */         EventRecurrence.YEARLY,
1660d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden                /* String until */     null,
1670d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden                /* int count */        0,
1680d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden                /* int interval */     0,
1690d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden                /* int[] bysecond */   null,
1700d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden                /* int[] byminute */   null,
1710d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden                /* int[] byhour */     null,
1720d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden                /* int[] byday */      null,
1730d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden                /* int[] bydayNum */   null,
1740d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden                /* int[] bymonthday */ null,
1750d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden                /* int[] byyearday */  null,
1760d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden                /* int[] byweekno */   null,
1770d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden                /* int[] bymonth */    null,
1780d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden                /* int[] bysetpos */   null,
1790d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden                /* int wkst */         EventRecurrence.MO
1800d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden        );
1810d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden    }
1820d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden
1830d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden    @SmallTest
1840d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden    public void test7() throws Exception {
1850d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden        // with an until
1860d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden        verifyRecurType("FREQ=DAILY;UNTIL=112233T223344Z",
1870d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden                /* int freq */         EventRecurrence.DAILY,
1880d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden                /* String until */     "112233T223344Z",
1890d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden                /* int count */        0,
1900d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden                /* int interval */     0,
1910d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden                /* int[] bysecond */   null,
1920d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden                /* int[] byminute */   null,
1930d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden                /* int[] byhour */     null,
1940d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden                /* int[] byday */      null,
1950d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden                /* int[] bydayNum */   null,
1960d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden                /* int[] bymonthday */ null,
1970d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden                /* int[] byyearday */  null,
1980d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden                /* int[] byweekno */   null,
1990d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden                /* int[] bymonth */    null,
2000d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden                /* int[] bysetpos */   null,
2010d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden                /* int wkst */         EventRecurrence.MO
2020d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden        );
2030d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden    }
2040d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden
2050d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden    @SmallTest
2060d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden    public void test8() throws Exception {
2070d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden        // with a count
2080d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden        verifyRecurType("FREQ=DAILY;COUNT=334",
2090d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden                /* int freq */         EventRecurrence.DAILY,
2100d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden                /* String until */     null,
2110d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden                /* int count */        334,
2120d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden                /* int interval */     0,
2130d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden                /* int[] bysecond */   null,
2140d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden                /* int[] byminute */   null,
2150d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden                /* int[] byhour */     null,
2160d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden                /* int[] byday */      null,
2170d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden                /* int[] bydayNum */   null,
2180d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden                /* int[] bymonthday */ null,
2190d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden                /* int[] byyearday */  null,
2200d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden                /* int[] byweekno */   null,
2210d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden                /* int[] bymonth */    null,
2220d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden                /* int[] bysetpos */   null,
2230d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden                /* int wkst */         EventRecurrence.MO
2240d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden        );
2250d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden    }
2260d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden
2270d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden    @SmallTest
2280d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden    public void test9() throws Exception {
2290d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden        // with a count
2300d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden        verifyRecurType("FREQ=DAILY;INTERVAL=5000",
2310d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden                /* int freq */         EventRecurrence.DAILY,
2320d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden                /* String until */     null,
2330d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden                /* int count */        0,
2340d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden                /* int interval */     5000,
2350d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden                /* int[] bysecond */   null,
2360d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden                /* int[] byminute */   null,
2370d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden                /* int[] byhour */     null,
2380d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden                /* int[] byday */      null,
2390d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden                /* int[] bydayNum */   null,
2400d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden                /* int[] bymonthday */ null,
2410d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden                /* int[] byyearday */  null,
2420d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden                /* int[] byweekno */   null,
2430d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden                /* int[] bymonth */    null,
2440d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden                /* int[] bysetpos */   null,
2450d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden                /* int wkst */         EventRecurrence.MO
2460d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden        );
2470d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden    }
2480d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden
2490d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden    @SmallTest
2500d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden    public void test10() throws Exception {
2510d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden        // verifyRecurType all of the BY* ones with one element
2520d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden        verifyRecurType("FREQ=DAILY"
2530d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden                + ";BYSECOND=0"
2540d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden                + ";BYMINUTE=1"
2550d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden                + ";BYHOUR=2"
2560d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden                + ";BYMONTHDAY=30"
2570d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden                + ";BYYEARDAY=300"
2580d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden                + ";BYWEEKNO=53"
2590d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden                + ";BYMONTH=12"
2600d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden                + ";BYSETPOS=-15"
2610d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden                + ";WKST=SU",
2620d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden                /* int freq */         EventRecurrence.DAILY,
2630d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden                /* String until */     null,
2640d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden                /* int count */        0,
2650d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden                /* int interval */     0,
2660d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden                /* int[] bysecond */   new int[]{0},
2670d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden                /* int[] byminute */   new int[]{1},
2680d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden                /* int[] byhour */     new int[]{2},
2690d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden                /* int[] byday */      null,
2700d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden                /* int[] bydayNum */   null,
2710d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden                /* int[] bymonthday */ new int[]{30},
2720d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden                /* int[] byyearday */  new int[]{300},
2730d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden                /* int[] byweekno */   new int[]{53},
2740d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden                /* int[] bymonth */    new int[]{12},
2750d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden                /* int[] bysetpos */   new int[]{-15},
2760d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden                /* int wkst */         EventRecurrence.SU
2770d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden        );
2780d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden    }
2790d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden
2800d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden    @SmallTest
2810d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden    public void test11() throws Exception {
2820d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden        // verifyRecurType all of the BY* ones with one element
2830d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden        verifyRecurType("FREQ=DAILY"
2840d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden                + ";BYSECOND=0,30,59"
2850d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden                + ";BYMINUTE=0,41,59"
2860d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden                + ";BYHOUR=0,4,23"
2870d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden                + ";BYMONTHDAY=-31,-1,1,31"
2880d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden                + ";BYYEARDAY=-366,-1,1,366"
2890d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden                + ";BYWEEKNO=-53,-1,1,53"
2900d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden                + ";BYMONTH=1,12"
2910d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden                + ";BYSETPOS=1,2,3,4,500,10000"
2920d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden                + ";WKST=SU",
2930d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden                /* int freq */         EventRecurrence.DAILY,
2940d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden                /* String until */     null,
2950d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden                /* int count */        0,
2960d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden                /* int interval */     0,
2970d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden                /* int[] bysecond */   new int[]{0, 30, 59},
2980d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden                /* int[] byminute */   new int[]{0, 41, 59},
2990d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden                /* int[] byhour */     new int[]{0, 4, 23},
3000d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden                /* int[] byday */      null,
3010d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden                /* int[] bydayNum */   null,
3020d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden                /* int[] bymonthday */ new int[]{-31, -1, 1, 31},
3030d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden                /* int[] byyearday */  new int[]{-366, -1, 1, 366},
3040d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden                /* int[] byweekno */   new int[]{-53, -1, 1, 53},
3050d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden                /* int[] bymonth */    new int[]{1, 12},
3060d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden                /* int[] bysetpos */   new int[]{1, 2, 3, 4, 500, 10000},
3070d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden                /* int wkst */         EventRecurrence.SU
3080d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden        );
3090d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden    }
3100d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden
3110d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden    private static class Check {
3120d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden        Check(String k, int... v) {
3130d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden            key = k;
3140d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden            values = v;
3150d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden        }
3160d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden
3170d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden        String key;
3180d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden        int[] values;
3190d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden    }
3200d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden
3210d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden    // this is a negative verifyRecurType case to verifyRecurType the range of the numbers accepted
3220d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden    @SmallTest
3230d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden    public void test12() throws Exception {
3240d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden        Check[] checks = new Check[]{
3250d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden                new Check("BYSECOND", -100, -1, 60, 100),
3260d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden                new Check("BYMINUTE", -100, -1, 60, 100),
3270d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden                new Check("BYHOUR", -100, -1, 24, 100),
3280d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden                new Check("BYMONTHDAY", -100, -32, 0, 32, 100),
3290d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden                new Check("BYYEARDAY", -400, -367, 0, 367, 400),
3300d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden                new Check("BYWEEKNO", -100, -54, 0, 54, 100),
3310d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden                new Check("BYMONTH", -100, -5, 0, 13, 100)
3320d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden        };
3330d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden
3340d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden        for (Check ck : checks) {
3350d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden            for (int n : ck.values) {
3360d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden                String recur = "FREQ=DAILY;" + ck.key + "=" + n;
3370d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden                try {
3380d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden                    EventRecurrence er = new EventRecurrence();
3390d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden                    er.parse(recur);
3400d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden                    fail("Negative verifyRecurType failed. "
3410d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden                            + " parse failed to throw an exception for '"
3420d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden                            + recur + "'");
3430d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden                } catch (EventRecurrence.InvalidFormatException e) {
3440d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden                    // expected
3450d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden                }
3460d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden            }
3470d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden        }
3480d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden    }
3490d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden
3500d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden    // verifyRecurType BYDAY
3510d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden    @SmallTest
3520d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden    public void test13() throws Exception {
3530d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden        verifyRecurType("FREQ=DAILY;BYDAY=1SU,-2MO,+33TU,WE,TH,FR,SA",
3540d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden                /* int freq */         EventRecurrence.DAILY,
3550d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden                /* String until */     null,
3560d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden                /* int count */        0,
3570d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden                /* int interval */     0,
3580d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden                /* int[] bysecond */   null,
3590d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden                /* int[] byminute */   null,
3600d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden                /* int[] byhour */     null,
3610d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden                /* int[] byday */      new int[] {
3620d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden                        EventRecurrence.SU,
3630d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden                        EventRecurrence.MO,
3640d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden                        EventRecurrence.TU,
3650d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden                        EventRecurrence.WE,
3660d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden                        EventRecurrence.TH,
3670d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden                        EventRecurrence.FR,
3680d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden                        EventRecurrence.SA
3690d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden                },
3700d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden                /* int[] bydayNum */   new int[]{1, -2, 33, 0, 0, 0, 0},
3710d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden                /* int[] bymonthday */ null,
3720d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden                /* int[] byyearday */  null,
3730d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden                /* int[] byweekno */   null,
3740d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden                /* int[] bymonth */    null,
3750d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden                /* int[] bysetpos */   null,
3760d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden                /* int wkst */         EventRecurrence.MO
3770d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden        );
3780d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden    }
3790d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden
3800d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden    @Suppress
3810d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden    // Repro bug #2331761 - this should fail because of the last comma into BYDAY
3820d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden    public void test14() throws Exception {
3830d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden        verifyRecurType("FREQ=WEEKLY;WKST=MO;UNTIL=20100129T130000Z;INTERVAL=1;BYDAY=MO,TU,WE,",
3840d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden                /* int freq */         EventRecurrence.WEEKLY,
3850d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden                /* String until */     "20100129T130000Z",
3860d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden                /* int count */        0,
3870d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden                /* int interval */     1,
3880d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden                /* int[] bysecond */   null,
3890d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden                /* int[] byminute */   null,
3900d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden                /* int[] byhour */     null,
3910d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden                /* int[] byday */      new int[] {
3920d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden                        EventRecurrence.MO,
3930d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden                        EventRecurrence.TU,
3940d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden                        EventRecurrence.WE,
3950d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden                },
3960d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden                /* int[] bydayNum */   new int[]{0, 0, 0},
3970d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden                /* int[] bymonthday */ null,
3980d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden                /* int[] byyearday */  null,
3990d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden                /* int[] byweekno */   null,
4000d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden                /* int[] bymonth */    null,
4010d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden                /* int[] bysetpos */   null,
4020d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden                /* int wkst */         EventRecurrence.MO
4030d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden        );
4040d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden    }
4050d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden
4060d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden    // This test should pass
4070d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden    public void test15() throws Exception {
4080d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden        verifyRecurType("FREQ=WEEKLY;WKST=MO;UNTIL=20100129T130000Z;INTERVAL=1;"
4090d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden                + "BYDAY=MO,TU,WE,TH,FR,SA,SU",
4100d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden                /* int freq */         EventRecurrence.WEEKLY,
4110d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden                /* String until */     "20100129T130000Z",
4120d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden                /* int count */        0,
4130d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden                /* int interval */     1,
4140d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden                /* int[] bysecond */   null,
4150d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden                /* int[] byminute */   null,
4160d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden                /* int[] byhour */     null,
4170d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden                /* int[] byday */      new int[] {
4180d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden                        EventRecurrence.MO,
4190d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden                        EventRecurrence.TU,
4200d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden                        EventRecurrence.WE,
4210d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden                        EventRecurrence.TH,
4220d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden                        EventRecurrence.FR,
4230d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden                        EventRecurrence.SA,
4240d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden                        EventRecurrence.SU
4250d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden                },
4260d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden                /* int[] bydayNum */   new int[]{0, 0, 0, 0, 0, 0, 0},
4270d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden                /* int[] bymonthday */ null,
4280d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden                /* int[] byyearday */  null,
4290d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden                /* int[] byweekno */   null,
4300d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden                /* int[] bymonth */    null,
4310d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden                /* int[] bysetpos */   null,
4320d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden                /* int wkst */         EventRecurrence.MO
4330d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden        );
4340d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden    }
4350d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden
4360d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden    // Sample coming from RFC2445
4370d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden    public void test16() throws Exception {
4380d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden        verifyRecurType("FREQ=MONTHLY;BYDAY=MO,TU,WE,TH,FR;BYSETPOS=-1",
4390d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden                /* int freq */         EventRecurrence.MONTHLY,
4400d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden                /* String until */     null,
4410d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden                /* int count */        0,
4420d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden                /* int interval */     0,
4430d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden                /* int[] bysecond */   null,
4440d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden                /* int[] byminute */   null,
4450d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden                /* int[] byhour */     null,
4460d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden                /* int[] byday */      new int[] {
4470d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden                        EventRecurrence.MO,
4480d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden                        EventRecurrence.TU,
4490d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden                        EventRecurrence.WE,
4500d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden                        EventRecurrence.TH,
4510d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden                        EventRecurrence.FR
4520d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden                },
4530d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden                /* int[] bydayNum */   new int[] {0, 0, 0, 0, 0},
4540d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden                /* int[] bymonthday */ null,
4550d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden                /* int[] byyearday */  null,
4560d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden                /* int[] byweekno */   null,
4570d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden                /* int[] bymonth */    null,
4580d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden                /* int[] bysetpos */   new int[] { -1 },
4590d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden                /* int wkst */         EventRecurrence.MO
4600d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden        );
4610d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden    }
4620d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden
4630d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden    // Sample coming from RFC2445
4640d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden    public void test17() throws Exception {
4650d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden        verifyRecurType("FREQ=DAILY;COUNT=10;INTERVAL=2",
4660d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden                /* int freq */         EventRecurrence.DAILY,
4670d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden                /* String until */     null,
4680d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden                /* int count */        10,
4690d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden                /* int interval */     2,
4700d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden                /* int[] bysecond */   null,
4710d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden                /* int[] byminute */   null,
4720d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden                /* int[] byhour */     null,
4730d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden                /* int[] byday */      null,
4740d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden                /* int[] bydayNum */   null,
4750d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden                /* int[] bymonthday */ null,
4760d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden                /* int[] byyearday */  null,
4770d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden                /* int[] byweekno */   null,
4780d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden                /* int[] bymonth */    null,
4790d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden                /* int[] bysetpos */   null,
4800d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden                /* int wkst */         EventRecurrence.MO
4810d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden        );
4820d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden    }
4830d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden
4840d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden    // Sample coming from RFC2445
4850d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden    public void test18() throws Exception {
4860d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden        verifyRecurType("FREQ=YEARLY;BYDAY=-1SU;BYMONTH=10",
4870d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden                /* int freq */         EventRecurrence.YEARLY,
4880d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden                /* String until */     null,
4890d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden                /* int count */        0,
4900d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden                /* int interval */     0,
4910d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden                /* int[] bysecond */   null,
4920d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden                /* int[] byminute */   null,
4930d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden                /* int[] byhour */     null,
4940d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden                /* int[] byday */      new int[] {
4950d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden                        EventRecurrence.SU
4960d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden                },
4970d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden                /* int[] bydayNum */   new int[] { -1 },
4980d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden                /* int[] bymonthday */ null,
4990d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden                /* int[] byyearday */  null,
5000d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden                /* int[] byweekno */   null,
5010d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden                /* int[] bymonth */    new int[] { 10 },
5020d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden                /* int[] bysetpos */   null,
5030d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden                /* int wkst */         EventRecurrence.MO
5040d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden        );
5050d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden    }
5060d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden
5070d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden    // Sample coming from bug #1640517
5080d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden    public void test19() throws Exception {
5090d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden        verifyRecurType("FREQ=YEARLY;BYMONTH=3;BYDAY=TH",
5100d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden                /* int freq */         EventRecurrence.YEARLY,
5110d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden                /* String until */     null,
5120d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden                /* int count */        0,
5130d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden                /* int interval */     0,
5140d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden                /* int[] bysecond */   null,
5150d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden                /* int[] byminute */   null,
5160d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden                /* int[] byhour */     null,
5170d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden                /* int[] byday */      new int[] {
5180d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden                        EventRecurrence.TH
5190d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden                },
5200d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden                /* int[] bydayNum */   new int[] { 0 },
5210d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden                /* int[] bymonthday */ null,
5220d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden                /* int[] byyearday */  null,
5230d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden                /* int[] byweekno */   null,
5240d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden                /* int[] bymonth */    new int[] { 3 },
5250d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden                /* int[] bysetpos */   null,
5260335d9f524da1da1f4d15bba37a1576a9480a36dMichael Chan                /* int wkst */         EventRecurrence.MO
5270335d9f524da1da1f4d15bba37a1576a9480a36dMichael Chan        );
5280335d9f524da1da1f4d15bba37a1576a9480a36dMichael Chan    }
5290335d9f524da1da1f4d15bba37a1576a9480a36dMichael Chan
5300335d9f524da1da1f4d15bba37a1576a9480a36dMichael Chan    // INTERVAL = 0 -> Interval = 1 bug #5676414
5310335d9f524da1da1f4d15bba37a1576a9480a36dMichael Chan    public void test20() throws Exception {
5320335d9f524da1da1f4d15bba37a1576a9480a36dMichael Chan        verifyRecurType("FREQ=YEARLY;BYMONTHDAY=18;BYMONTH=10;INTERVAL=0;",
5330335d9f524da1da1f4d15bba37a1576a9480a36dMichael Chan                /* int freq */         EventRecurrence.YEARLY,
5340335d9f524da1da1f4d15bba37a1576a9480a36dMichael Chan                /* String until */     null,
5350335d9f524da1da1f4d15bba37a1576a9480a36dMichael Chan                /* int count */        0,
5360335d9f524da1da1f4d15bba37a1576a9480a36dMichael Chan                /* int interval */     1,
5370335d9f524da1da1f4d15bba37a1576a9480a36dMichael Chan                /* int[] bysecond */   null,
5380335d9f524da1da1f4d15bba37a1576a9480a36dMichael Chan                /* int[] byminute */   null,
5390335d9f524da1da1f4d15bba37a1576a9480a36dMichael Chan                /* int[] byhour */     null,
5400335d9f524da1da1f4d15bba37a1576a9480a36dMichael Chan                /* int[] byday */      null,
5410335d9f524da1da1f4d15bba37a1576a9480a36dMichael Chan                /* int[] bydayNum */   null,
5420335d9f524da1da1f4d15bba37a1576a9480a36dMichael Chan                /* int[] bymonthday */ new int[]{18},
5430335d9f524da1da1f4d15bba37a1576a9480a36dMichael Chan                /* int[] byyearday */  null,
5440335d9f524da1da1f4d15bba37a1576a9480a36dMichael Chan                /* int[] byweekno */   null,
5450335d9f524da1da1f4d15bba37a1576a9480a36dMichael Chan                /* int[] bymonth */    new int[]{10},
5460335d9f524da1da1f4d15bba37a1576a9480a36dMichael Chan                /* int[] bysetpos */   null,
5470335d9f524da1da1f4d15bba37a1576a9480a36dMichael Chan                /* int wkst */         EventRecurrence.MO
5480335d9f524da1da1f4d15bba37a1576a9480a36dMichael Chan        );
5490335d9f524da1da1f4d15bba37a1576a9480a36dMichael Chan    }
5500335d9f524da1da1f4d15bba37a1576a9480a36dMichael Chan
5510335d9f524da1da1f4d15bba37a1576a9480a36dMichael Chan    // Working case: INTERVAL=1 -> Interval = 1 bug #5676414
5520335d9f524da1da1f4d15bba37a1576a9480a36dMichael Chan    public void test21() throws Exception {
5530335d9f524da1da1f4d15bba37a1576a9480a36dMichael Chan        verifyRecurType("FREQ=WEEKLY;WKST=SU;INTERVAL=1;BYDAY=MO,TU,WE,TH,FR",
5540335d9f524da1da1f4d15bba37a1576a9480a36dMichael Chan                /* int freq */         EventRecurrence.WEEKLY,
5550335d9f524da1da1f4d15bba37a1576a9480a36dMichael Chan                /* String until */     null,
5560335d9f524da1da1f4d15bba37a1576a9480a36dMichael Chan                /* int count */        0,
5570335d9f524da1da1f4d15bba37a1576a9480a36dMichael Chan                /* int interval */     1,
5580335d9f524da1da1f4d15bba37a1576a9480a36dMichael Chan                /* int[] bysecond */   null,
5590335d9f524da1da1f4d15bba37a1576a9480a36dMichael Chan                /* int[] byminute */   null,
5600335d9f524da1da1f4d15bba37a1576a9480a36dMichael Chan                /* int[] byhour */     null,
5610335d9f524da1da1f4d15bba37a1576a9480a36dMichael Chan                /* int[] byday */      new int[] {
5620335d9f524da1da1f4d15bba37a1576a9480a36dMichael Chan                        EventRecurrence.MO,
5630335d9f524da1da1f4d15bba37a1576a9480a36dMichael Chan                        EventRecurrence.TU,
5640335d9f524da1da1f4d15bba37a1576a9480a36dMichael Chan                        EventRecurrence.WE,
5650335d9f524da1da1f4d15bba37a1576a9480a36dMichael Chan                        EventRecurrence.TH,
5660335d9f524da1da1f4d15bba37a1576a9480a36dMichael Chan                        EventRecurrence.FR,
5670335d9f524da1da1f4d15bba37a1576a9480a36dMichael Chan                },
5680335d9f524da1da1f4d15bba37a1576a9480a36dMichael Chan                /* int[] bydayNum */   new int[]{0, 0, 0, 0, 0},
5690335d9f524da1da1f4d15bba37a1576a9480a36dMichael Chan                /* int[] bymonthday */ null,
5700335d9f524da1da1f4d15bba37a1576a9480a36dMichael Chan                /* int[] byyearday */  null,
5710335d9f524da1da1f4d15bba37a1576a9480a36dMichael Chan                /* int[] byweekno */   null,
5720335d9f524da1da1f4d15bba37a1576a9480a36dMichael Chan                /* int[] bymonth */    null,
5730335d9f524da1da1f4d15bba37a1576a9480a36dMichael Chan                /* int[] bysetpos */   null,
5740335d9f524da1da1f4d15bba37a1576a9480a36dMichael Chan                /* int wkst */         EventRecurrence.SU
5750335d9f524da1da1f4d15bba37a1576a9480a36dMichael Chan        );
5760335d9f524da1da1f4d15bba37a1576a9480a36dMichael Chan    }
5770335d9f524da1da1f4d15bba37a1576a9480a36dMichael Chan
5780335d9f524da1da1f4d15bba37a1576a9480a36dMichael Chan    // Working case: INTERVAL=2 -> Interval = 2 bug #5676414
5790335d9f524da1da1f4d15bba37a1576a9480a36dMichael Chan    public void test22() throws Exception {
5800335d9f524da1da1f4d15bba37a1576a9480a36dMichael Chan        verifyRecurType("FREQ=WEEKLY;WKST=SU;INTERVAL=2;BYDAY=MO,TU,WE,TH,FR",
5810335d9f524da1da1f4d15bba37a1576a9480a36dMichael Chan                /* int freq */         EventRecurrence.WEEKLY,
5820335d9f524da1da1f4d15bba37a1576a9480a36dMichael Chan                /* String until */     null,
5830335d9f524da1da1f4d15bba37a1576a9480a36dMichael Chan                /* int count */        0,
5840335d9f524da1da1f4d15bba37a1576a9480a36dMichael Chan                /* int interval */     2,
5850335d9f524da1da1f4d15bba37a1576a9480a36dMichael Chan                /* int[] bysecond */   null,
5860335d9f524da1da1f4d15bba37a1576a9480a36dMichael Chan                /* int[] byminute */   null,
5870335d9f524da1da1f4d15bba37a1576a9480a36dMichael Chan                /* int[] byhour */     null,
5880335d9f524da1da1f4d15bba37a1576a9480a36dMichael Chan                /* int[] byday */      new int[] {
5890335d9f524da1da1f4d15bba37a1576a9480a36dMichael Chan                        EventRecurrence.MO,
5900335d9f524da1da1f4d15bba37a1576a9480a36dMichael Chan                        EventRecurrence.TU,
5910335d9f524da1da1f4d15bba37a1576a9480a36dMichael Chan                        EventRecurrence.WE,
5920335d9f524da1da1f4d15bba37a1576a9480a36dMichael Chan                        EventRecurrence.TH,
5930335d9f524da1da1f4d15bba37a1576a9480a36dMichael Chan                        EventRecurrence.FR,
5940335d9f524da1da1f4d15bba37a1576a9480a36dMichael Chan                },
5950335d9f524da1da1f4d15bba37a1576a9480a36dMichael Chan                /* int[] bydayNum */   new int[]{0, 0, 0, 0, 0},
5960335d9f524da1da1f4d15bba37a1576a9480a36dMichael Chan                /* int[] bymonthday */ null,
5970335d9f524da1da1f4d15bba37a1576a9480a36dMichael Chan                /* int[] byyearday */  null,
5980335d9f524da1da1f4d15bba37a1576a9480a36dMichael Chan                /* int[] byweekno */   null,
5990335d9f524da1da1f4d15bba37a1576a9480a36dMichael Chan                /* int[] bymonth */    null,
6000335d9f524da1da1f4d15bba37a1576a9480a36dMichael Chan                /* int[] bysetpos */   null,
6010335d9f524da1da1f4d15bba37a1576a9480a36dMichael Chan                /* int wkst */         EventRecurrence.SU
6020335d9f524da1da1f4d15bba37a1576a9480a36dMichael Chan        );
6030335d9f524da1da1f4d15bba37a1576a9480a36dMichael Chan    }
6040335d9f524da1da1f4d15bba37a1576a9480a36dMichael Chan
6050335d9f524da1da1f4d15bba37a1576a9480a36dMichael Chan    // COUNT < 0 -> Count = 1 bug #5676414
6060335d9f524da1da1f4d15bba37a1576a9480a36dMichael Chan    public void test23() throws Exception {
6070335d9f524da1da1f4d15bba37a1576a9480a36dMichael Chan        verifyRecurType("FREQ=WEEKLY;COUNT=-20;BYDAY=MO,TU,WE,TH,FR;",
6080335d9f524da1da1f4d15bba37a1576a9480a36dMichael Chan                /* int freq */         EventRecurrence.WEEKLY,
6090335d9f524da1da1f4d15bba37a1576a9480a36dMichael Chan                /* String until */     null,
6100335d9f524da1da1f4d15bba37a1576a9480a36dMichael Chan                /* int count */        1,
6110335d9f524da1da1f4d15bba37a1576a9480a36dMichael Chan                /* int interval */     0,
6120335d9f524da1da1f4d15bba37a1576a9480a36dMichael Chan                /* int[] bysecond */   null,
6130335d9f524da1da1f4d15bba37a1576a9480a36dMichael Chan                /* int[] byminute */   null,
6140335d9f524da1da1f4d15bba37a1576a9480a36dMichael Chan                /* int[] byhour */     null,
6150335d9f524da1da1f4d15bba37a1576a9480a36dMichael Chan                /* int[] byday */      new int[] {
6160335d9f524da1da1f4d15bba37a1576a9480a36dMichael Chan                        EventRecurrence.MO,
6170335d9f524da1da1f4d15bba37a1576a9480a36dMichael Chan                        EventRecurrence.TU,
6180335d9f524da1da1f4d15bba37a1576a9480a36dMichael Chan                        EventRecurrence.WE,
6190335d9f524da1da1f4d15bba37a1576a9480a36dMichael Chan                        EventRecurrence.TH,
6200335d9f524da1da1f4d15bba37a1576a9480a36dMichael Chan                        EventRecurrence.FR,
6210335d9f524da1da1f4d15bba37a1576a9480a36dMichael Chan                },
6220335d9f524da1da1f4d15bba37a1576a9480a36dMichael Chan                /* int[] bydayNum */   new int[]{0, 0, 0, 0, 0},
6230335d9f524da1da1f4d15bba37a1576a9480a36dMichael Chan                /* int[] bymonthday */ null,
6240335d9f524da1da1f4d15bba37a1576a9480a36dMichael Chan                /* int[] byyearday */  null,
6250335d9f524da1da1f4d15bba37a1576a9480a36dMichael Chan                /* int[] byweekno */   null,
6260335d9f524da1da1f4d15bba37a1576a9480a36dMichael Chan                /* int[] bymonth */    null,
6270335d9f524da1da1f4d15bba37a1576a9480a36dMichael Chan                /* int[] bysetpos */   null,
6280335d9f524da1da1f4d15bba37a1576a9480a36dMichael Chan                /* int wkst */         EventRecurrence.MO
6290335d9f524da1da1f4d15bba37a1576a9480a36dMichael Chan        );
6300335d9f524da1da1f4d15bba37a1576a9480a36dMichael Chan    }
6310335d9f524da1da1f4d15bba37a1576a9480a36dMichael Chan
6320335d9f524da1da1f4d15bba37a1576a9480a36dMichael Chan    // Working case: COUNT=2 -> Count=2 bug #5676414
6330335d9f524da1da1f4d15bba37a1576a9480a36dMichael Chan    public void test24() throws Exception {
6340335d9f524da1da1f4d15bba37a1576a9480a36dMichael Chan        verifyRecurType("FREQ=WEEKLY;COUNT=2;BYDAY=MO,TU,WE,TH,FR;",
6350335d9f524da1da1f4d15bba37a1576a9480a36dMichael Chan                /* int freq */         EventRecurrence.WEEKLY,
6360335d9f524da1da1f4d15bba37a1576a9480a36dMichael Chan                /* String until */     null,
6370335d9f524da1da1f4d15bba37a1576a9480a36dMichael Chan                /* int count */        2,
6380335d9f524da1da1f4d15bba37a1576a9480a36dMichael Chan                /* int interval */     0,
6390335d9f524da1da1f4d15bba37a1576a9480a36dMichael Chan                /* int[] bysecond */   null,
6400335d9f524da1da1f4d15bba37a1576a9480a36dMichael Chan                /* int[] byminute */   null,
6410335d9f524da1da1f4d15bba37a1576a9480a36dMichael Chan                /* int[] byhour */     null,
6420335d9f524da1da1f4d15bba37a1576a9480a36dMichael Chan                /* int[] byday */      new int[] {
6430335d9f524da1da1f4d15bba37a1576a9480a36dMichael Chan                        EventRecurrence.MO,
6440335d9f524da1da1f4d15bba37a1576a9480a36dMichael Chan                        EventRecurrence.TU,
6450335d9f524da1da1f4d15bba37a1576a9480a36dMichael Chan                        EventRecurrence.WE,
6460335d9f524da1da1f4d15bba37a1576a9480a36dMichael Chan                        EventRecurrence.TH,
6470335d9f524da1da1f4d15bba37a1576a9480a36dMichael Chan                        EventRecurrence.FR,
6480335d9f524da1da1f4d15bba37a1576a9480a36dMichael Chan                },
6490335d9f524da1da1f4d15bba37a1576a9480a36dMichael Chan                /* int[] bydayNum */   new int[]{0, 0, 0, 0, 0},
6500335d9f524da1da1f4d15bba37a1576a9480a36dMichael Chan                /* int[] bymonthday */ null,
6510335d9f524da1da1f4d15bba37a1576a9480a36dMichael Chan                /* int[] byyearday */  null,
6520335d9f524da1da1f4d15bba37a1576a9480a36dMichael Chan                /* int[] byweekno */   null,
6530335d9f524da1da1f4d15bba37a1576a9480a36dMichael Chan                /* int[] bymonth */    null,
6540335d9f524da1da1f4d15bba37a1576a9480a36dMichael Chan                /* int[] bysetpos */   null,
6550d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden                /* int wkst */         EventRecurrence.MO
6560d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden        );
6570d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden    }
6580d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden
6590d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden    // for your copying pleasure
6600d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden    public void fakeTestXX() throws Exception {
6610d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden        verifyRecurType("FREQ=DAILY;",
6620d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden                /* int freq */         EventRecurrence.DAILY,
6630d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden                /* String until */     null,
6640d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden                /* int count */        0,
6650d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden                /* int interval */     0,
6660d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden                /* int[] bysecond */   null,
6670d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden                /* int[] byminute */   null,
6680d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden                /* int[] byhour */     null,
6690d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden                /* int[] byday */      null,
6700d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden                /* int[] bydayNum */   null,
6710d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden                /* int[] bymonthday */ null,
6720d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden                /* int[] byyearday */  null,
6730d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden                /* int[] byweekno */   null,
6740d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden                /* int[] bymonth */    null,
6750d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden                /* int[] bysetpos */   null,
6760d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden                /* int wkst */         EventRecurrence.MO
6770d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden        );
6780d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden    }
6790d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden
6800d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden    private static void cmp(int vlen, int[] v, int[] correct, String name) {
6810d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden        if ((correct == null && v != null)
6820d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden                || (correct != null && v == null)) {
6830d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden            throw new RuntimeException("One is null, one isn't for " + name
6840d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden                    + ": correct=" + Arrays.toString(correct)
6850d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden                    + " actual=" + Arrays.toString(v));
6860d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden        }
6870d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden        if ((correct == null && vlen != 0)
6880d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden                || (vlen != (correct == null ? 0 : correct.length))) {
6890d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden            throw new RuntimeException("Reported length mismatch for " + name
6900d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden                    + ": correct=" + ((correct == null) ? "null" : correct.length)
6910d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden                    + " actual=" + vlen);
6920d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden        }
6930d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden        if (correct == null) {
6940d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden            return;
6950d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden        }
6960d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden        if (v.length < correct.length) {
6970d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden            throw new RuntimeException("Array length mismatch for " + name
6980d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden                    + ": correct=" + Arrays.toString(correct)
6990d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden                    + " actual=" + Arrays.toString(v));
7000d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden        }
7010d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden        for (int i = 0; i < correct.length; i++) {
7020d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden            if (v[i] != correct[i]) {
7030d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden                throw new RuntimeException("Array value mismatch for " + name
7040d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden                        + ": correct=" + Arrays.toString(correct)
7050d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden                        + " actual=" + Arrays.toString(v));
7060d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden            }
7070d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden        }
7080d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden    }
7090d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden
7100d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden    private static boolean eq(String a, String b) {
7110d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden        if ((a == null && b != null) || (a != null && b == null)) {
7120d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden            return false;
7130d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden        } else {
7140d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden            return a == b || a.equals(b);
7150d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden        }
7160d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden    }
7170d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden
7180d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden    private static void verifyRecurType(String recur,
7190d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden            int freq, String until, int count, int interval,
7200d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden            int[] bysecond, int[] byminute, int[] byhour,
7210d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden            int[] byday, int[] bydayNum, int[] bymonthday,
7220d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden            int[] byyearday, int[] byweekno, int[] bymonth,
7230d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden            int[] bysetpos, int wkst) {
7240d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden        EventRecurrence eventRecurrence = new EventRecurrence();
7250d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden        eventRecurrence.parse(recur);
7260d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden        if (eventRecurrence.freq != freq
7270d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden                || !eq(eventRecurrence.until, until)
7280d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden                || eventRecurrence.count != count
7290d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden                || eventRecurrence.interval != interval
7300d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden                || eventRecurrence.wkst != wkst) {
7310d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden            System.out.println("Error... got:");
7320d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden            print(eventRecurrence);
7330d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden            System.out.println("expected:");
7340d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden            System.out.println("{");
7350d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden            System.out.println("    freq=" + freq);
7360d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden            System.out.println("    until=" + until);
7370d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden            System.out.println("    count=" + count);
7380d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden            System.out.println("    interval=" + interval);
7390d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden            System.out.println("    wkst=" + wkst);
7400d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden            System.out.println("    bysecond=" + Arrays.toString(bysecond));
7410d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden            System.out.println("    byminute=" + Arrays.toString(byminute));
7420d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden            System.out.println("    byhour=" + Arrays.toString(byhour));
7430d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden            System.out.println("    byday=" + Arrays.toString(byday));
7440d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden            System.out.println("    bydayNum=" + Arrays.toString(bydayNum));
7450d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden            System.out.println("    bymonthday=" + Arrays.toString(bymonthday));
7460d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden            System.out.println("    byyearday=" + Arrays.toString(byyearday));
7470d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden            System.out.println("    byweekno=" + Arrays.toString(byweekno));
7480d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden            System.out.println("    bymonth=" + Arrays.toString(bymonth));
7490d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden            System.out.println("    bysetpos=" + Arrays.toString(bysetpos));
7500d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden            System.out.println("}");
7510d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden            throw new RuntimeException("Mismatch in fields");
7520d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden        }
7530d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden        cmp(eventRecurrence.bysecondCount, eventRecurrence.bysecond, bysecond, "bysecond");
7540d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden        cmp(eventRecurrence.byminuteCount, eventRecurrence.byminute, byminute, "byminute");
7550d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden        cmp(eventRecurrence.byhourCount, eventRecurrence.byhour, byhour, "byhour");
7560d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden        cmp(eventRecurrence.bydayCount, eventRecurrence.byday, byday, "byday");
7570d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden        cmp(eventRecurrence.bydayCount, eventRecurrence.bydayNum, bydayNum, "bydayNum");
7580d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden        cmp(eventRecurrence.bymonthdayCount, eventRecurrence.bymonthday, bymonthday, "bymonthday");
7590d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden        cmp(eventRecurrence.byyeardayCount, eventRecurrence.byyearday, byyearday, "byyearday");
7600d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden        cmp(eventRecurrence.byweeknoCount, eventRecurrence.byweekno, byweekno, "byweekno");
7610d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden        cmp(eventRecurrence.bymonthCount, eventRecurrence.bymonth, bymonth, "bymonth");
7620d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden        cmp(eventRecurrence.bysetposCount, eventRecurrence.bysetpos, bysetpos, "bysetpos");
7630d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden    }
7640d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden
7650d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden    private static void print(EventRecurrence er) {
7660d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden        System.out.println("{");
7670d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden        System.out.println("    freq=" + er.freq);
7680d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden        System.out.println("    until=" + er.until);
7690d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden        System.out.println("    count=" + er.count);
7700d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden        System.out.println("    interval=" + er.interval);
7710d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden        System.out.println("    wkst=" + er.wkst);
7720d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden        System.out.println("    bysecond=" + Arrays.toString(er.bysecond));
7730d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden        System.out.println("    bysecondCount=" + er.bysecondCount);
7740d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden        System.out.println("    byminute=" + Arrays.toString(er.byminute));
7750d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden        System.out.println("    byminuteCount=" + er.byminuteCount);
7760d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden        System.out.println("    byhour=" + Arrays.toString(er.byhour));
7770d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden        System.out.println("    byhourCount=" + er.byhourCount);
7780d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden        System.out.println("    byday=" + Arrays.toString(er.byday));
7790d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden        System.out.println("    bydayNum=" + Arrays.toString(er.bydayNum));
7800d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden        System.out.println("    bydayCount=" + er.bydayCount);
7810d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden        System.out.println("    bymonthday=" + Arrays.toString(er.bymonthday));
7820d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden        System.out.println("    bymonthdayCount=" + er.bymonthdayCount);
7830d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden        System.out.println("    byyearday=" + Arrays.toString(er.byyearday));
7840d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden        System.out.println("    byyeardayCount=" + er.byyeardayCount);
7850d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden        System.out.println("    byweekno=" + Arrays.toString(er.byweekno));
7860d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden        System.out.println("    byweeknoCount=" + er.byweeknoCount);
7870d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden        System.out.println("    bymonth=" + Arrays.toString(er.bymonth));
7880d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden        System.out.println("    bymonthCount=" + er.bymonthCount);
7890d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden        System.out.println("    bysetpos=" + Arrays.toString(er.bysetpos));
7900d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden        System.out.println("    bysetposCount=" + er.bysetposCount);
7910d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden        System.out.println("}");
7920d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden    }
7930d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden
7940d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden
7950d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden    /** A list of valid rules.  The parser must accept these. */
7960d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden    private static final String[] GOOD_RRULES = {
7970d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden        /* extracted wholesale from from RFC 2445 section 4.8.5.4 */
7980d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden        "FREQ=DAILY;COUNT=10",
7990d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden        "FREQ=DAILY;UNTIL=19971224T000000Z",
8000d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden        "FREQ=DAILY;INTERVAL=2",
8010d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden        "FREQ=DAILY;INTERVAL=10;COUNT=5",
8020d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden        "FREQ=YEARLY;UNTIL=20000131T090000Z;BYMONTH=1;BYDAY=SU,MO,TU,WE,TH,FR,SA",
8030d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden        "FREQ=DAILY;UNTIL=20000131T090000Z;BYMONTH=1",
8040d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden        "FREQ=WEEKLY;COUNT=10",
8050d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden        "FREQ=WEEKLY;UNTIL=19971224T000000Z",
8060d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden        "FREQ=WEEKLY;INTERVAL=2;WKST=SU",
8070d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden        "FREQ=WEEKLY;UNTIL=19971007T000000Z;WKST=SU;BYDAY=TU,TH",
8080d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden        "FREQ=WEEKLY;COUNT=10;WKST=SU;BYDAY=TU,TH",
8090d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden        "FREQ=WEEKLY;INTERVAL=2;UNTIL=19971224T000000Z;WKST=SU;BYDAY=MO,WE,FR",
8100d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden        "FREQ=WEEKLY;INTERVAL=2;COUNT=8;WKST=SU;BYDAY=TU,TH",
8110d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden        "FREQ=MONTHLY;COUNT=10;BYDAY=1FR",
8120d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden        "FREQ=MONTHLY;UNTIL=19971224T000000Z;BYDAY=1FR",
8130d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden        "FREQ=MONTHLY;INTERVAL=2;COUNT=10;BYDAY=1SU,-1SU",
8140d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden        "FREQ=MONTHLY;COUNT=6;BYDAY=-2MO",
8150d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden        "FREQ=MONTHLY;BYMONTHDAY=-3",
8160d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden        "FREQ=MONTHLY;COUNT=10;BYMONTHDAY=2,15",
8170d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden        "FREQ=MONTHLY;COUNT=10;BYMONTHDAY=1,-1",
8180d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden        "FREQ=MONTHLY;INTERVAL=18;COUNT=10;BYMONTHDAY=10,11,12,13,14,15",
8190d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden        "FREQ=MONTHLY;INTERVAL=2;BYDAY=TU",
8200d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden        "FREQ=YEARLY;COUNT=10;BYMONTH=6,7",
8210d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden        "FREQ=YEARLY;INTERVAL=2;COUNT=10;BYMONTH=1,2,3",
8220d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden        "FREQ=YEARLY;INTERVAL=3;COUNT=10;BYYEARDAY=1,100,200",
8230d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden        "FREQ=YEARLY;BYDAY=20MO",
8240d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden        "FREQ=YEARLY;BYWEEKNO=20;BYDAY=MO",
8250d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden        "FREQ=YEARLY;BYMONTH=3;BYDAY=TH",
8260d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden        "FREQ=YEARLY;BYDAY=TH;BYMONTH=6,7,8",
8270d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden        "FREQ=MONTHLY;BYDAY=FR;BYMONTHDAY=13",
8280d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden        "FREQ=MONTHLY;BYDAY=SA;BYMONTHDAY=7,8,9,10,11,12,13",
8290d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden        "FREQ=YEARLY;INTERVAL=4;BYMONTH=11;BYDAY=TU;BYMONTHDAY=2,3,4,5,6,7,8",
8300d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden        "FREQ=MONTHLY;COUNT=3;BYDAY=TU,WE,TH;BYSETPOS=3",
8310d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden        "FREQ=MONTHLY;BYDAY=MO,TU,WE,TH,FR;BYSETPOS=-2",
8320d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden        "FREQ=HOURLY;INTERVAL=3;UNTIL=19970902T170000Z",
8330d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden        "FREQ=MINUTELY;INTERVAL=15;COUNT=6",
8340d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden        "FREQ=MINUTELY;INTERVAL=90;COUNT=4",
8350d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden        "FREQ=DAILY;BYHOUR=9,10,11,12,13,14,15,16;BYMINUTE=0,20,40",
8360d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden        "FREQ=MINUTELY;INTERVAL=20;BYHOUR=9,10,11,12,13,14,15,16",
8370d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden        "FREQ=WEEKLY;INTERVAL=2;COUNT=4;BYDAY=TU,SU;WKST=MO",
8380d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden        "FREQ=WEEKLY;INTERVAL=2;COUNT=4;BYDAY=TU,SU;WKST=SU",
8390d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden        /* a few more */
8400d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden        "FREQ=SECONDLY;BYSECOND=0,15,59",
8410d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden        "FREQ=MINUTELY;BYMINUTE=0,15,59",
8420d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden        "FREQ=HOURLY;BYHOUR=+0,+15,+23",
8436d5684cdf6886a46ee993c8ec986d306472cd5b0Andy McFadden        "INTERVAL=4;FREQ=YEARLY",
8446d5684cdf6886a46ee993c8ec986d306472cd5b0Andy McFadden        "FREQ=DAILY;X-WHATEVER=blah",
8456d5684cdf6886a46ee993c8ec986d306472cd5b0Andy McFadden        //"freq=daily;wkst=su",                               // mixed case currently not allowed
846a991358d94947cc0dbd6a8d75dd77b5fd377734bAlice Yang        "FREQ=WEEKLY;INTERVAL=2;BYDAY=Mo;;UNTIL=20120327T000000Z", // double simicolon should be allowed
847a991358d94947cc0dbd6a8d75dd77b5fd377734bAlice Yang        "FREQ=MONTHLY;BYDAY=1Mo",
848a991358d94947cc0dbd6a8d75dd77b5fd377734bAlice Yang        "FREQ=MONTHLY;BYDAY=2Mo,2We,4Mo,4We",
849a991358d94947cc0dbd6a8d75dd77b5fd377734bAlice Yang        "FREQ=MONTHLY;WKST=SU;BYMONTHDAY=25;UNTIL=20110524",
850a991358d94947cc0dbd6a8d75dd77b5fd377734bAlice Yang        "FREQ=WEEKLY;BYDAY=MO;WKST=SU;UNTIL=20111218T010000Z"
8510d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden    };
8520d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden
8530d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden    /** The parser must reject these. */
8540d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden    private static final String[] BAD_RRULES = {
8550d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden        "FREQ=MONTHLY;FREQ=MONTHLY",                        // can't specify twice
8560d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden        "FREQ=MONTHLY;COUNT=1;COUNT=1",                     // can't specify twice
8570d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden        "FREQ=SECONDLY;BYSECOND=60",                        // range
8580d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden        "FREQ=MINUTELY;BYMINUTE=-1",                        // range
8590d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden        "FREQ=HOURLY;BYHOUR=24",                            // range
8600d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden        "FREQ=YEARLY;BYMONTHDAY=0",                         // zero not valid
8616d5684cdf6886a46ee993c8ec986d306472cd5b0Andy McFadden        "BYMONTHDAY=1",                                     // must specify FREQ
8620d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden        //"FREQ=YEARLY;COUNT=1;UNTIL=12345",                  // can't have both COUNT and UNTIL
8630d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden        //"FREQ=DAILY;UNTIL=19970829T021400e",                // invalid date
8640d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden    };
8650d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden
8660d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden    /**
8670d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden     * Simple test of good/bad rules.
8680d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden     */
8690d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden    @SmallTest
8700d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden    public void testBasicParse() {
8710d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden        for (String rule : GOOD_RRULES) {
8720d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden            EventRecurrence recur = new EventRecurrence();
8730d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden            recur.parse(rule);
8740d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden        }
8750d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden
8760d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden        for (String rule : BAD_RRULES) {
8770d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden            EventRecurrence recur = new EventRecurrence();
8780d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden            boolean didThrow = false;
8790d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden
8800d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden            try {
8810d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden                recur.parse(rule);
8820d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden            } catch (InvalidFormatException ife) {
8830d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden                didThrow = true;
8840d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden            }
8850d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden
8860d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden            assertTrue("Expected throw on " + rule, didThrow);
8870d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden        }
8880d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden    }
8890d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden}
890