| /* |
| * 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); |
| } |
| } |
| } |