blob: 35777eb303ba6a4415544b320daf3d2f730016be [file] [log] [blame]
/*
* Copyright (C) 2006 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.android.calendarcommon;
import com.android.calendarcommon.EventRecurrence.InvalidFormatException;
import android.test.suitebuilder.annotation.SmallTest;
import android.test.suitebuilder.annotation.Suppress;
import junit.framework.TestCase;
import java.util.Arrays;
/**
* Test android.pim.EventRecurrence.
*
* adb shell am instrument -w -e class com.android.calendarcommon.EventRecurrenceTest \
* com.android.calendarcommon.tests/android.test.InstrumentationTestRunner
*/
public class EventRecurrenceTest extends TestCase {
@SmallTest
public void test0() throws Exception {
verifyRecurType("FREQ=SECONDLY",
/* int freq */ EventRecurrence.SECONDLY,
/* String until */ null,
/* int count */ 0,
/* int interval */ 0,
/* int[] bysecond */ null,
/* int[] byminute */ null,
/* int[] byhour */ null,
/* int[] byday */ null,
/* int[] bydayNum */ null,
/* int[] bymonthday */ null,
/* int[] byyearday */ null,
/* int[] byweekno */ null,
/* int[] bymonth */ null,
/* int[] bysetpos */ null,
/* int wkst */ EventRecurrence.MO
);
}
@SmallTest
public void test1() throws Exception {
verifyRecurType("FREQ=MINUTELY",
/* int freq */ EventRecurrence.MINUTELY,
/* String until */ null,
/* int count */ 0,
/* int interval */ 0,
/* int[] bysecond */ null,
/* int[] byminute */ null,
/* int[] byhour */ null,
/* int[] byday */ null,
/* int[] bydayNum */ null,
/* int[] bymonthday */ null,
/* int[] byyearday */ null,
/* int[] byweekno */ null,
/* int[] bymonth */ null,
/* int[] bysetpos */ null,
/* int wkst */ EventRecurrence.MO
);
}
@SmallTest
public void test2() throws Exception {
verifyRecurType("FREQ=HOURLY",
/* int freq */ EventRecurrence.HOURLY,
/* String until */ null,
/* int count */ 0,
/* int interval */ 0,
/* int[] bysecond */ null,
/* int[] byminute */ null,
/* int[] byhour */ null,
/* int[] byday */ null,
/* int[] bydayNum */ null,
/* int[] bymonthday */ null,
/* int[] byyearday */ null,
/* int[] byweekno */ null,
/* int[] bymonth */ null,
/* int[] bysetpos */ null,
/* int wkst */ EventRecurrence.MO
);
}
@SmallTest
public void test3() throws Exception {
verifyRecurType("FREQ=DAILY",
/* int freq */ EventRecurrence.DAILY,
/* String until */ null,
/* int count */ 0,
/* int interval */ 0,
/* int[] bysecond */ null,
/* int[] byminute */ null,
/* int[] byhour */ null,
/* int[] byday */ null,
/* int[] bydayNum */ null,
/* int[] bymonthday */ null,
/* int[] byyearday */ null,
/* int[] byweekno */ null,
/* int[] bymonth */ null,
/* int[] bysetpos */ null,
/* int wkst */ EventRecurrence.MO
);
}
@SmallTest
public void test4() throws Exception {
verifyRecurType("FREQ=WEEKLY",
/* int freq */ EventRecurrence.WEEKLY,
/* String until */ null,
/* int count */ 0,
/* int interval */ 0,
/* int[] bysecond */ null,
/* int[] byminute */ null,
/* int[] byhour */ null,
/* int[] byday */ null,
/* int[] bydayNum */ null,
/* int[] bymonthday */ null,
/* int[] byyearday */ null,
/* int[] byweekno */ null,
/* int[] bymonth */ null,
/* int[] bysetpos */ null,
/* int wkst */ EventRecurrence.MO
);
}
@SmallTest
public void test5() throws Exception {
verifyRecurType("FREQ=MONTHLY",
/* int freq */ EventRecurrence.MONTHLY,
/* String until */ null,
/* int count */ 0,
/* int interval */ 0,
/* int[] bysecond */ null,
/* int[] byminute */ null,
/* int[] byhour */ null,
/* int[] byday */ null,
/* int[] bydayNum */ null,
/* int[] bymonthday */ null,
/* int[] byyearday */ null,
/* int[] byweekno */ null,
/* int[] bymonth */ null,
/* int[] bysetpos */ null,
/* int wkst */ EventRecurrence.MO
);
}
@SmallTest
public void test6() throws Exception {
verifyRecurType("FREQ=YEARLY",
/* int freq */ EventRecurrence.YEARLY,
/* String until */ null,
/* int count */ 0,
/* int interval */ 0,
/* int[] bysecond */ null,
/* int[] byminute */ null,
/* int[] byhour */ null,
/* int[] byday */ null,
/* int[] bydayNum */ null,
/* int[] bymonthday */ null,
/* int[] byyearday */ null,
/* int[] byweekno */ null,
/* int[] bymonth */ null,
/* int[] bysetpos */ null,
/* int wkst */ EventRecurrence.MO
);
}
@SmallTest
public void test7() throws Exception {
// with an until
verifyRecurType("FREQ=DAILY;UNTIL=112233T223344Z",
/* int freq */ EventRecurrence.DAILY,
/* String until */ "112233T223344Z",
/* int count */ 0,
/* int interval */ 0,
/* int[] bysecond */ null,
/* int[] byminute */ null,
/* int[] byhour */ null,
/* int[] byday */ null,
/* int[] bydayNum */ null,
/* int[] bymonthday */ null,
/* int[] byyearday */ null,
/* int[] byweekno */ null,
/* int[] bymonth */ null,
/* int[] bysetpos */ null,
/* int wkst */ EventRecurrence.MO
);
}
@SmallTest
public void test8() throws Exception {
// with a count
verifyRecurType("FREQ=DAILY;COUNT=334",
/* int freq */ EventRecurrence.DAILY,
/* String until */ null,
/* int count */ 334,
/* int interval */ 0,
/* int[] bysecond */ null,
/* int[] byminute */ null,
/* int[] byhour */ null,
/* int[] byday */ null,
/* int[] bydayNum */ null,
/* int[] bymonthday */ null,
/* int[] byyearday */ null,
/* int[] byweekno */ null,
/* int[] bymonth */ null,
/* int[] bysetpos */ null,
/* int wkst */ EventRecurrence.MO
);
}
@SmallTest
public void test9() throws Exception {
// with a count
verifyRecurType("FREQ=DAILY;INTERVAL=5000",
/* int freq */ EventRecurrence.DAILY,
/* String until */ null,
/* int count */ 0,
/* int interval */ 5000,
/* int[] bysecond */ null,
/* int[] byminute */ null,
/* int[] byhour */ null,
/* int[] byday */ null,
/* int[] bydayNum */ null,
/* int[] bymonthday */ null,
/* int[] byyearday */ null,
/* int[] byweekno */ null,
/* int[] bymonth */ null,
/* int[] bysetpos */ null,
/* int wkst */ EventRecurrence.MO
);
}
@SmallTest
public void test10() throws Exception {
// verifyRecurType all of the BY* ones with one element
verifyRecurType("FREQ=DAILY"
+ ";BYSECOND=0"
+ ";BYMINUTE=1"
+ ";BYHOUR=2"
+ ";BYMONTHDAY=30"
+ ";BYYEARDAY=300"
+ ";BYWEEKNO=53"
+ ";BYMONTH=12"
+ ";BYSETPOS=-15"
+ ";WKST=SU",
/* int freq */ EventRecurrence.DAILY,
/* String until */ null,
/* int count */ 0,
/* int interval */ 0,
/* int[] bysecond */ new int[]{0},
/* int[] byminute */ new int[]{1},
/* int[] byhour */ new int[]{2},
/* int[] byday */ null,
/* int[] bydayNum */ null,
/* int[] bymonthday */ new int[]{30},
/* int[] byyearday */ new int[]{300},
/* int[] byweekno */ new int[]{53},
/* int[] bymonth */ new int[]{12},
/* int[] bysetpos */ new int[]{-15},
/* int wkst */ EventRecurrence.SU
);
}
@SmallTest
public void test11() throws Exception {
// verifyRecurType all of the BY* ones with one element
verifyRecurType("FREQ=DAILY"
+ ";BYSECOND=0,30,59"
+ ";BYMINUTE=0,41,59"
+ ";BYHOUR=0,4,23"
+ ";BYMONTHDAY=-31,-1,1,31"
+ ";BYYEARDAY=-366,-1,1,366"
+ ";BYWEEKNO=-53,-1,1,53"
+ ";BYMONTH=1,12"
+ ";BYSETPOS=1,2,3,4,500,10000"
+ ";WKST=SU",
/* int freq */ EventRecurrence.DAILY,
/* String until */ null,
/* int count */ 0,
/* int interval */ 0,
/* int[] bysecond */ new int[]{0, 30, 59},
/* int[] byminute */ new int[]{0, 41, 59},
/* int[] byhour */ new int[]{0, 4, 23},
/* int[] byday */ null,
/* int[] bydayNum */ null,
/* int[] bymonthday */ new int[]{-31, -1, 1, 31},
/* int[] byyearday */ new int[]{-366, -1, 1, 366},
/* int[] byweekno */ new int[]{-53, -1, 1, 53},
/* int[] bymonth */ new int[]{1, 12},
/* int[] bysetpos */ new int[]{1, 2, 3, 4, 500, 10000},
/* int wkst */ EventRecurrence.SU
);
}
private static class Check {
Check(String k, int... v) {
key = k;
values = v;
}
String key;
int[] values;
}
// this is a negative verifyRecurType case to verifyRecurType the range of the numbers accepted
@SmallTest
public void test12() throws Exception {
Check[] checks = new Check[]{
new Check("BYSECOND", -100, -1, 60, 100),
new Check("BYMINUTE", -100, -1, 60, 100),
new Check("BYHOUR", -100, -1, 24, 100),
new Check("BYMONTHDAY", -100, -32, 0, 32, 100),
new Check("BYYEARDAY", -400, -367, 0, 367, 400),
new Check("BYWEEKNO", -100, -54, 0, 54, 100),
new Check("BYMONTH", -100, -5, 0, 13, 100)
};
for (Check ck : checks) {
for (int n : ck.values) {
String recur = "FREQ=DAILY;" + ck.key + "=" + n;
try {
EventRecurrence er = new EventRecurrence();
er.parse(recur);
fail("Negative verifyRecurType failed. "
+ " parse failed to throw an exception for '"
+ recur + "'");
} catch (EventRecurrence.InvalidFormatException e) {
// expected
}
}
}
}
// verifyRecurType BYDAY
@SmallTest
public void test13() throws Exception {
verifyRecurType("FREQ=DAILY;BYDAY=1SU,-2MO,+33TU,WE,TH,FR,SA",
/* int freq */ EventRecurrence.DAILY,
/* String until */ null,
/* int count */ 0,
/* int interval */ 0,
/* int[] bysecond */ null,
/* int[] byminute */ null,
/* int[] byhour */ null,
/* int[] byday */ new int[] {
EventRecurrence.SU,
EventRecurrence.MO,
EventRecurrence.TU,
EventRecurrence.WE,
EventRecurrence.TH,
EventRecurrence.FR,
EventRecurrence.SA
},
/* int[] bydayNum */ new int[]{1, -2, 33, 0, 0, 0, 0},
/* int[] bymonthday */ null,
/* int[] byyearday */ null,
/* int[] byweekno */ null,
/* int[] bymonth */ null,
/* int[] bysetpos */ null,
/* int wkst */ EventRecurrence.MO
);
}
@Suppress
// Repro bug #2331761 - this should fail because of the last comma into BYDAY
public void test14() throws Exception {
verifyRecurType("FREQ=WEEKLY;WKST=MO;UNTIL=20100129T130000Z;INTERVAL=1;BYDAY=MO,TU,WE,",
/* int freq */ EventRecurrence.WEEKLY,
/* String until */ "20100129T130000Z",
/* int count */ 0,
/* int interval */ 1,
/* int[] bysecond */ null,
/* int[] byminute */ null,
/* int[] byhour */ null,
/* int[] byday */ new int[] {
EventRecurrence.MO,
EventRecurrence.TU,
EventRecurrence.WE,
},
/* int[] bydayNum */ new int[]{0, 0, 0},
/* int[] bymonthday */ null,
/* int[] byyearday */ null,
/* int[] byweekno */ null,
/* int[] bymonth */ null,
/* int[] bysetpos */ null,
/* int wkst */ EventRecurrence.MO
);
}
// This test should pass
public void test15() throws Exception {
verifyRecurType("FREQ=WEEKLY;WKST=MO;UNTIL=20100129T130000Z;INTERVAL=1;"
+ "BYDAY=MO,TU,WE,TH,FR,SA,SU",
/* int freq */ EventRecurrence.WEEKLY,
/* String until */ "20100129T130000Z",
/* int count */ 0,
/* int interval */ 1,
/* int[] bysecond */ null,
/* int[] byminute */ null,
/* int[] byhour */ null,
/* int[] byday */ new int[] {
EventRecurrence.MO,
EventRecurrence.TU,
EventRecurrence.WE,
EventRecurrence.TH,
EventRecurrence.FR,
EventRecurrence.SA,
EventRecurrence.SU
},
/* int[] bydayNum */ new int[]{0, 0, 0, 0, 0, 0, 0},
/* int[] bymonthday */ null,
/* int[] byyearday */ null,
/* int[] byweekno */ null,
/* int[] bymonth */ null,
/* int[] bysetpos */ null,
/* int wkst */ EventRecurrence.MO
);
}
// Sample coming from RFC2445
public void test16() throws Exception {
verifyRecurType("FREQ=MONTHLY;BYDAY=MO,TU,WE,TH,FR;BYSETPOS=-1",
/* int freq */ EventRecurrence.MONTHLY,
/* String until */ null,
/* int count */ 0,
/* int interval */ 0,
/* int[] bysecond */ null,
/* int[] byminute */ null,
/* int[] byhour */ null,
/* int[] byday */ new int[] {
EventRecurrence.MO,
EventRecurrence.TU,
EventRecurrence.WE,
EventRecurrence.TH,
EventRecurrence.FR
},
/* int[] bydayNum */ new int[] {0, 0, 0, 0, 0},
/* int[] bymonthday */ null,
/* int[] byyearday */ null,
/* int[] byweekno */ null,
/* int[] bymonth */ null,
/* int[] bysetpos */ new int[] { -1 },
/* int wkst */ EventRecurrence.MO
);
}
// Sample coming from RFC2445
public void test17() throws Exception {
verifyRecurType("FREQ=DAILY;COUNT=10;INTERVAL=2",
/* int freq */ EventRecurrence.DAILY,
/* String until */ null,
/* int count */ 10,
/* int interval */ 2,
/* int[] bysecond */ null,
/* int[] byminute */ null,
/* int[] byhour */ null,
/* int[] byday */ null,
/* int[] bydayNum */ null,
/* int[] bymonthday */ null,
/* int[] byyearday */ null,
/* int[] byweekno */ null,
/* int[] bymonth */ null,
/* int[] bysetpos */ null,
/* int wkst */ EventRecurrence.MO
);
}
// Sample coming from RFC2445
public void test18() throws Exception {
verifyRecurType("FREQ=YEARLY;BYDAY=-1SU;BYMONTH=10",
/* int freq */ EventRecurrence.YEARLY,
/* String until */ null,
/* int count */ 0,
/* int interval */ 0,
/* int[] bysecond */ null,
/* int[] byminute */ null,
/* int[] byhour */ null,
/* int[] byday */ new int[] {
EventRecurrence.SU
},
/* int[] bydayNum */ new int[] { -1 },
/* int[] bymonthday */ null,
/* int[] byyearday */ null,
/* int[] byweekno */ null,
/* int[] bymonth */ new int[] { 10 },
/* int[] bysetpos */ null,
/* int wkst */ EventRecurrence.MO
);
}
// Sample coming from bug #1640517
public void test19() throws Exception {
verifyRecurType("FREQ=YEARLY;BYMONTH=3;BYDAY=TH",
/* int freq */ EventRecurrence.YEARLY,
/* String until */ null,
/* int count */ 0,
/* int interval */ 0,
/* int[] bysecond */ null,
/* int[] byminute */ null,
/* int[] byhour */ null,
/* int[] byday */ new int[] {
EventRecurrence.TH
},
/* int[] bydayNum */ new int[] { 0 },
/* int[] bymonthday */ null,
/* int[] byyearday */ null,
/* int[] byweekno */ null,
/* int[] bymonth */ new int[] { 3 },
/* int[] bysetpos */ null,
/* int wkst */ EventRecurrence.MO
);
}
// for your copying pleasure
public void fakeTestXX() throws Exception {
verifyRecurType("FREQ=DAILY;",
/* int freq */ EventRecurrence.DAILY,
/* String until */ null,
/* int count */ 0,
/* int interval */ 0,
/* int[] bysecond */ null,
/* int[] byminute */ null,
/* int[] byhour */ null,
/* int[] byday */ null,
/* int[] bydayNum */ null,
/* int[] bymonthday */ null,
/* int[] byyearday */ null,
/* int[] byweekno */ null,
/* int[] bymonth */ null,
/* int[] bysetpos */ null,
/* int wkst */ EventRecurrence.MO
);
}
private static void cmp(int vlen, int[] v, int[] correct, String name) {
if ((correct == null && v != null)
|| (correct != null && v == null)) {
throw new RuntimeException("One is null, one isn't for " + name
+ ": correct=" + Arrays.toString(correct)
+ " actual=" + Arrays.toString(v));
}
if ((correct == null && vlen != 0)
|| (vlen != (correct == null ? 0 : correct.length))) {
throw new RuntimeException("Reported length mismatch for " + name
+ ": correct=" + ((correct == null) ? "null" : correct.length)
+ " actual=" + vlen);
}
if (correct == null) {
return;
}
if (v.length < correct.length) {
throw new RuntimeException("Array length mismatch for " + name
+ ": correct=" + Arrays.toString(correct)
+ " actual=" + Arrays.toString(v));
}
for (int i = 0; i < correct.length; i++) {
if (v[i] != correct[i]) {
throw new RuntimeException("Array value mismatch for " + name
+ ": correct=" + Arrays.toString(correct)
+ " actual=" + Arrays.toString(v));
}
}
}
private static boolean eq(String a, String b) {
if ((a == null && b != null) || (a != null && b == null)) {
return false;
} else {
return a == b || a.equals(b);
}
}
private static void verifyRecurType(String recur,
int freq, String until, int count, int interval,
int[] bysecond, int[] byminute, int[] byhour,
int[] byday, int[] bydayNum, int[] bymonthday,
int[] byyearday, int[] byweekno, int[] bymonth,
int[] bysetpos, int wkst) {
EventRecurrence eventRecurrence = new EventRecurrence();
eventRecurrence.parse(recur);
if (eventRecurrence.freq != freq
|| !eq(eventRecurrence.until, until)
|| eventRecurrence.count != count
|| eventRecurrence.interval != interval
|| eventRecurrence.wkst != wkst) {
System.out.println("Error... got:");
print(eventRecurrence);
System.out.println("expected:");
System.out.println("{");
System.out.println(" freq=" + freq);
System.out.println(" until=" + until);
System.out.println(" count=" + count);
System.out.println(" interval=" + interval);
System.out.println(" wkst=" + wkst);
System.out.println(" bysecond=" + Arrays.toString(bysecond));
System.out.println(" byminute=" + Arrays.toString(byminute));
System.out.println(" byhour=" + Arrays.toString(byhour));
System.out.println(" byday=" + Arrays.toString(byday));
System.out.println(" bydayNum=" + Arrays.toString(bydayNum));
System.out.println(" bymonthday=" + Arrays.toString(bymonthday));
System.out.println(" byyearday=" + Arrays.toString(byyearday));
System.out.println(" byweekno=" + Arrays.toString(byweekno));
System.out.println(" bymonth=" + Arrays.toString(bymonth));
System.out.println(" bysetpos=" + Arrays.toString(bysetpos));
System.out.println("}");
throw new RuntimeException("Mismatch in fields");
}
cmp(eventRecurrence.bysecondCount, eventRecurrence.bysecond, bysecond, "bysecond");
cmp(eventRecurrence.byminuteCount, eventRecurrence.byminute, byminute, "byminute");
cmp(eventRecurrence.byhourCount, eventRecurrence.byhour, byhour, "byhour");
cmp(eventRecurrence.bydayCount, eventRecurrence.byday, byday, "byday");
cmp(eventRecurrence.bydayCount, eventRecurrence.bydayNum, bydayNum, "bydayNum");
cmp(eventRecurrence.bymonthdayCount, eventRecurrence.bymonthday, bymonthday, "bymonthday");
cmp(eventRecurrence.byyeardayCount, eventRecurrence.byyearday, byyearday, "byyearday");
cmp(eventRecurrence.byweeknoCount, eventRecurrence.byweekno, byweekno, "byweekno");
cmp(eventRecurrence.bymonthCount, eventRecurrence.bymonth, bymonth, "bymonth");
cmp(eventRecurrence.bysetposCount, eventRecurrence.bysetpos, bysetpos, "bysetpos");
}
private static void print(EventRecurrence er) {
System.out.println("{");
System.out.println(" freq=" + er.freq);
System.out.println(" until=" + er.until);
System.out.println(" count=" + er.count);
System.out.println(" interval=" + er.interval);
System.out.println(" wkst=" + er.wkst);
System.out.println(" bysecond=" + Arrays.toString(er.bysecond));
System.out.println(" bysecondCount=" + er.bysecondCount);
System.out.println(" byminute=" + Arrays.toString(er.byminute));
System.out.println(" byminuteCount=" + er.byminuteCount);
System.out.println(" byhour=" + Arrays.toString(er.byhour));
System.out.println(" byhourCount=" + er.byhourCount);
System.out.println(" byday=" + Arrays.toString(er.byday));
System.out.println(" bydayNum=" + Arrays.toString(er.bydayNum));
System.out.println(" bydayCount=" + er.bydayCount);
System.out.println(" bymonthday=" + Arrays.toString(er.bymonthday));
System.out.println(" bymonthdayCount=" + er.bymonthdayCount);
System.out.println(" byyearday=" + Arrays.toString(er.byyearday));
System.out.println(" byyeardayCount=" + er.byyeardayCount);
System.out.println(" byweekno=" + Arrays.toString(er.byweekno));
System.out.println(" byweeknoCount=" + er.byweeknoCount);
System.out.println(" bymonth=" + Arrays.toString(er.bymonth));
System.out.println(" bymonthCount=" + er.bymonthCount);
System.out.println(" bysetpos=" + Arrays.toString(er.bysetpos));
System.out.println(" bysetposCount=" + er.bysetposCount);
System.out.println("}");
}
/** A list of valid rules. The parser must accept these. */
private static final String[] GOOD_RRULES = {
/* extracted wholesale from from RFC 2445 section 4.8.5.4 */
"FREQ=DAILY;COUNT=10",
"FREQ=DAILY;UNTIL=19971224T000000Z",
"FREQ=DAILY;INTERVAL=2",
"FREQ=DAILY;INTERVAL=10;COUNT=5",
"FREQ=YEARLY;UNTIL=20000131T090000Z;BYMONTH=1;BYDAY=SU,MO,TU,WE,TH,FR,SA",
"FREQ=DAILY;UNTIL=20000131T090000Z;BYMONTH=1",
"FREQ=WEEKLY;COUNT=10",
"FREQ=WEEKLY;UNTIL=19971224T000000Z",
"FREQ=WEEKLY;INTERVAL=2;WKST=SU",
"FREQ=WEEKLY;UNTIL=19971007T000000Z;WKST=SU;BYDAY=TU,TH",
"FREQ=WEEKLY;COUNT=10;WKST=SU;BYDAY=TU,TH",
"FREQ=WEEKLY;INTERVAL=2;UNTIL=19971224T000000Z;WKST=SU;BYDAY=MO,WE,FR",
"FREQ=WEEKLY;INTERVAL=2;COUNT=8;WKST=SU;BYDAY=TU,TH",
"FREQ=MONTHLY;COUNT=10;BYDAY=1FR",
"FREQ=MONTHLY;UNTIL=19971224T000000Z;BYDAY=1FR",
"FREQ=MONTHLY;INTERVAL=2;COUNT=10;BYDAY=1SU,-1SU",
"FREQ=MONTHLY;COUNT=6;BYDAY=-2MO",
"FREQ=MONTHLY;BYMONTHDAY=-3",
"FREQ=MONTHLY;COUNT=10;BYMONTHDAY=2,15",
"FREQ=MONTHLY;COUNT=10;BYMONTHDAY=1,-1",
"FREQ=MONTHLY;INTERVAL=18;COUNT=10;BYMONTHDAY=10,11,12,13,14,15",
"FREQ=MONTHLY;INTERVAL=2;BYDAY=TU",
"FREQ=YEARLY;COUNT=10;BYMONTH=6,7",
"FREQ=YEARLY;INTERVAL=2;COUNT=10;BYMONTH=1,2,3",
"FREQ=YEARLY;INTERVAL=3;COUNT=10;BYYEARDAY=1,100,200",
"FREQ=YEARLY;BYDAY=20MO",
"FREQ=YEARLY;BYWEEKNO=20;BYDAY=MO",
"FREQ=YEARLY;BYMONTH=3;BYDAY=TH",
"FREQ=YEARLY;BYDAY=TH;BYMONTH=6,7,8",
"FREQ=MONTHLY;BYDAY=FR;BYMONTHDAY=13",
"FREQ=MONTHLY;BYDAY=SA;BYMONTHDAY=7,8,9,10,11,12,13",
"FREQ=YEARLY;INTERVAL=4;BYMONTH=11;BYDAY=TU;BYMONTHDAY=2,3,4,5,6,7,8",
"FREQ=MONTHLY;COUNT=3;BYDAY=TU,WE,TH;BYSETPOS=3",
"FREQ=MONTHLY;BYDAY=MO,TU,WE,TH,FR;BYSETPOS=-2",
"FREQ=HOURLY;INTERVAL=3;UNTIL=19970902T170000Z",
"FREQ=MINUTELY;INTERVAL=15;COUNT=6",
"FREQ=MINUTELY;INTERVAL=90;COUNT=4",
"FREQ=DAILY;BYHOUR=9,10,11,12,13,14,15,16;BYMINUTE=0,20,40",
"FREQ=MINUTELY;INTERVAL=20;BYHOUR=9,10,11,12,13,14,15,16",
"FREQ=WEEKLY;INTERVAL=2;COUNT=4;BYDAY=TU,SU;WKST=MO",
"FREQ=WEEKLY;INTERVAL=2;COUNT=4;BYDAY=TU,SU;WKST=SU",
/* a few more */
"FREQ=SECONDLY;BYSECOND=0,15,59",
"FREQ=MINUTELY;BYMINUTE=0,15,59",
"FREQ=HOURLY;BYHOUR=+0,+15,+23",
"INTERVAL=4;FREQ=YEARLY",
"FREQ=DAILY;X-WHATEVER=blah",
//"freq=daily;wkst=su", // mixed case currently not allowed
};
/** The parser must reject these. */
private static final String[] BAD_RRULES = {
"FREQ=MONTHLY;FREQ=MONTHLY", // can't specify twice
"FREQ=MONTHLY;COUNT=1;COUNT=1", // can't specify twice
"FREQ=SECONDLY;BYSECOND=60", // range
"FREQ=MINUTELY;BYMINUTE=-1", // range
"FREQ=HOURLY;BYHOUR=24", // range
"FREQ=YEARLY;BYMONTHDAY=0", // zero not valid
"BYMONTHDAY=1", // must specify FREQ
//"FREQ=YEARLY;COUNT=1;UNTIL=12345", // can't have both COUNT and UNTIL
//"FREQ=DAILY;UNTIL=19970829T021400e", // invalid date
};
/**
* Simple test of good/bad rules.
*/
@SmallTest
public void testBasicParse() {
for (String rule : GOOD_RRULES) {
EventRecurrence recur = new EventRecurrence();
recur.parse(rule);
}
for (String rule : BAD_RRULES) {
EventRecurrence recur = new EventRecurrence();
boolean didThrow = false;
try {
recur.parse(rule);
} catch (InvalidFormatException ife) {
didThrow = true;
}
assertTrue("Expected throw on " + rule, didThrow);
}
}
}