aboutsummaryrefslogtreecommitdiffstats
path: root/libical/src/test
diff options
context:
space:
mode:
authorHans Petter <hansp@src.gnome.org>2003-09-12 06:04:44 +0800
committerHans Petter <hansp@src.gnome.org>2003-09-12 06:04:44 +0800
commit697761cc337aa77a47140c8df50ed84bc25e23f6 (patch)
treeb785830f72e9938cceaa016a419c7b6d9892bada /libical/src/test
parent733d77e657516f9a59b5c1a7b62acb87b03ec86f (diff)
downloadgsoc2013-evolution-697761cc337aa77a47140c8df50ed84bc25e23f6.tar
gsoc2013-evolution-697761cc337aa77a47140c8df50ed84bc25e23f6.tar.gz
gsoc2013-evolution-697761cc337aa77a47140c8df50ed84bc25e23f6.tar.bz2
gsoc2013-evolution-697761cc337aa77a47140c8df50ed84bc25e23f6.tar.lz
gsoc2013-evolution-697761cc337aa77a47140c8df50ed84bc25e23f6.tar.xz
gsoc2013-evolution-697761cc337aa77a47140c8df50ed84bc25e23f6.tar.zst
gsoc2013-evolution-697761cc337aa77a47140c8df50ed84bc25e23f6.zip
Import new libical from mainline HEAD and make appropriate changes to
Evolution. svn path=/trunk/; revision=22538
Diffstat (limited to 'libical/src/test')
-rw-r--r--libical/src/test/.cvsignore25
-rw-r--r--libical/src/test/2445.ics326
-rw-r--r--libical/src/test/2446.ics0
-rw-r--r--libical/src/test/Makefile.am41
-rw-r--r--libical/src/test/copycluster.c27
-rw-r--r--libical/src/test/findobj.c7
-rw-r--r--libical/src/test/itip.ics14
-rw-r--r--libical/src/test/outgoing.ics544
-rw-r--r--libical/src/test/process.c115
-rw-r--r--libical/src/test/recur.c151
-rw-r--r--libical/src/test/regression-classify.c187
-rw-r--r--libical/src/test/regression-component.c580
-rw-r--r--libical/src/test/regression-cxx.cpp137
-rw-r--r--libical/src/test/regression-recur.c194
-rw-r--r--libical/src/test/regression-storage.c804
-rw-r--r--libical/src/test/regression-utils.c169
-rw-r--r--libical/src/test/regression.c3026
-rw-r--r--libical/src/test/regression.h53
-rw-r--r--libical/src/test/storage.c448
-rw-r--r--libical/src/test/stow.c114
-rw-r--r--libical/src/test/test_fileset.ics60
-rw-r--r--libical/src/test/testclassify.c170
-rw-r--r--libical/src/test/testmime.c5
23 files changed, 5382 insertions, 1815 deletions
diff --git a/libical/src/test/.cvsignore b/libical/src/test/.cvsignore
index ed72bfe59f..3e3f2ca509 100644
--- a/libical/src/test/.cvsignore
+++ b/libical/src/test/.cvsignore
@@ -1,18 +1,15 @@
-*.la
-*.lo
-.libs
Makefile
-Makefile.in
.deps
.libs
-copycluster
-regression
-parser
-findobj
-storage
-stow
-recur
-testmime
+*.lo
+*.la
+copycluster
+regression
+parser
+storage
+stow
+recur
+testmime
testvcal
-
-
+process
+testclassify
diff --git a/libical/src/test/2445.ics b/libical/src/test/2445.ics
new file mode 100644
index 0000000000..71cf45e750
--- /dev/null
+++ b/libical/src/test/2445.ics
@@ -0,0 +1,326 @@
+BEGIN:VCALENDAR
+VERSION:2.0
+PRODID:-//hacksw/handcal//NONSGML v1.0//EN
+BEGIN:VEVENT
+DTSTAMP:19970901T1300Z
+DTSTART:19970714T170000Z
+DTEND:19970715T035959Z
+SUMMARY:Bastille Day Party
+END:VEVENT
+END:VCALENDAR
+
+BEGIN:VEVENT
+UID:19970901T130000Z-123401@host.com
+DTSTAMP:19970901T1300Z
+DTSTART:19970903T163000Z
+DTEND:19970903T190000Z
+SUMMARY:Annual Employee Review
+CLASS:PRIVATE
+CATEGORIES:BUSINESS,HUMAN RESOURCES
+END:VEVENT
+
+BEGIN:VEVENT
+UID:19970901T130000Z-123402@host.com
+DTSTAMP:19970901T1300Z
+DTSTART:19970401T163000Z
+DTEND:19970402T010000Z
+SUMMARY:Laurel is in sensitivity awareness class.
+CLASS:PUBLIC
+CATEGORIES:BUSINESS,HUMAN RESOURCES
+TRANSP:TRANSPARENT
+END:VEVENT
+
+BEGIN:VEVENT
+UID:19970901T130000Z-123403@host.com
+DTSTAMP:19970901T1300Z
+DTSTART:19971102
+SUMMARY:Our Blissful Anniversary
+CLASS:CONFIDENTIAL
+CATEGORIES:ANNIVERSARY,PERSONAL,SPECIAL OCCASION
+RRULE:FREQ=YEARLY
+END:VEVENT
+
+BEGIN:VTODO
+UID:19970901T130000Z-123404@host.com
+DTSTAMP:19970901T1300Z
+DTSTART:19970415T133000Z
+DUE:19970416T045959Z
+SUMMARY:1996 Income Tax Preparation
+CLASS:CONFIDENTIAL
+CATEGORIES:FAMILY,FINANCE
+PRIORITY:1
+STATUS:NEEDS-ACTION
+END:VTODO
+BEGIN:VJOURNAL
+UID:19970901T130000Z-123405@host.com
+DTSTAMP:19970901T1300Z
+DTSTART;VALUE=DATE:19970317
+SUMMARY:Staff meeting minutes
+DESCRIPTION:1. Staff meeting: Participants include Joe\, Lisa
+ and Bob. Aurora project plans were reviewed. There is currently
+ no budget reserves for this project. Lisa will escalate to
+ management. Next meeting on Tuesday.\n
+ 2. Telephone Conference: ABC Corp. sales representative called
+ to discuss new printer. Promised to get us a demo by Friday.\n
+ 3. Henry Miller (Handsoff Insurance): Car was totaled by tree.
+ Is looking into a loaner car. 654-2323 (tel).
+END:VJOURNAL
+BEGIN:VFREEBUSY
+ORGANIZER:MAILTO:jane_doe@host1.com
+ATTENDEE:MAILTO:john_public@host2.com
+DTSTART:19971015T050000Z
+DTEND:19971016T050000Z
+DTSTAMP:19970901T083000Z
+END:VFREEBUSY
+BEGIN:VFREEBUSY
+ORGANIZER:MAILTO:jane_doe@host1.com
+ATTENDEE:MAILTO:john_public@host2.com
+DTSTAMP:19970901T100000Z
+FREEBUSY;VALUE=PERIOD:19971015T050000Z/PT8H30M,
+ 19971015T160000Z/PT5H30M,19971015T223000Z/PT6H30M
+URL:http://host2.com/pub/busy/jpublic-01.ifb
+COMMENT:This iCalendar file contains busy time information for
+ the next three months.
+END:VFREEBUSY
+BEGIN:VFREEBUSY
+ORGANIZER:jsmith@host.com
+DTSTART:19980313T141711Z
+DTEND:19980410T141711Z
+FREEBUSY:19980314T233000Z/19980315T003000Z
+FREEBUSY:19980316T153000Z/19980316T163000Z
+FREEBUSY:19980318T030000Z/19980318T040000Z
+URL:http://www.host.com/calendar/busytime/jsmith.ifb
+END:VFREEBUSY
+BEGIN:VTIMEZONE
+TZID:US-Eastern
+LAST-MODIFIED:19870101T000000Z
+BEGIN:STANDARD
+DTSTAMP:19970901T130000Z
+DTSTART:19971026T020000
+RDATE:19971026T020000
+TZOFFSETFROM:-0400
+TZOFFSETTO:-0500
+TZNAME:EST
+END:STANDARD
+BEGIN:DAYLIGHT
+DTSTART:19971026T020000
+RDATE:19970406T020000
+TZOFFSETFROM:-0500
+TZOFFSETTO:-0400
+TZNAME:EDT
+END:DAYLIGHT
+END:VTIMEZONE
+BEGIN:VTIMEZONE
+TZID:US-Eastern
+LAST-MODIFIED:19870101T000000Z
+TZURL:http://zones.stds_r_us.net/tz/US-Eastern
+BEGIN:STANDARD
+DTSTART:19671029T020000
+RRULE:FREQ=YEARLY;BYDAY=-1SU;BYMONTH=10
+TZOFFSETFROM:-0400
+TZOFFSETTO:-0500
+TZNAME:EST
+END:STANDARD
+BEGIN:DAYLIGHT
+DTSTART:19870405T020000
+RRULE:FREQ=YEARLY;BYDAY=1SU;BYMONTH=4
+TZOFFSETFROM:-0500
+TZOFFSETTO:-0400
+TZNAME:EDT
+END:DAYLIGHT
+END:VTIMEZONE
+BEGIN:VTIMEZONE
+TZID:US--Fictitious-Eastern
+LAST-MODIFIED:19870101T000000Z
+BEGIN:STANDARD
+DTSTART:19671029T020000
+RRULE:FREQ=YEARLY;BYDAY=-1SU;BYMONTH=10
+TZOFFSETFROM:-0400
+TZOFFSETTO:-0500
+TZNAME:EST
+END:STANDARD
+BEGIN:DAYLIGHT
+DTSTART:19870405T020000
+RRULE:FREQ=YEARLY;BYDAY=1SU;BYMONTH=4;UNTIL=19980404T070000Z
+TZOFFSETFROM:-0500
+TZOFFSETTO:-0400
+TZNAME:EDT
+END:DAYLIGHT
+END:VTIMEZONE
+BEGIN:VTIMEZONE
+TZID:US--Fictitious-Eastern
+LAST-MODIFIED:19870101T000000Z
+BEGIN:STANDARD
+DTSTART:19671029T020000
+RRULE:FREQ=YEARLY;BYDAY=-1SU;BYMONTH=10
+TZOFFSETFROM:-0400
+TZOFFSETTO:-0500
+TZNAME:EST
+END:STANDARD
+BEGIN:DAYLIGHT
+DTSTART:19870405T020000
+RRULE:FREQ=YEARLY;BYDAY=1SU;BYMONTH=4;UNTIL=19980404T070000Z
+TZOFFSETFROM:-0500
+TZOFFSETTO:-0400
+TZNAME:EDT
+END:DAYLIGHT
+BEGIN:DAYLIGHT
+DTSTART:19990424T020000
+RRULE:FREQ=YEARLY;BYDAY=-1SU;BYMONTH=4
+TZOFFSETFROM:-0500
+TZOFFSETTO:-0400
+TZNAME:EDT
+END:DAYLIGHT
+END:VTIMEZONE
+BEGIN:VALARM
+TRIGGER;VALUE=DATE-TIME:19970317T133000Z
+REPEAT:4
+DURATION:PT15M
+ACTION:AUDIO
+ATTACH;FMTTYPE=audio/basic:ftp://host.com/pub/sounds/bell-01.aud
+END:VALARM
+BEGIN:VALARM
+TRIGGER:-PT30M
+REPEAT:2
+DURATION:PT15M
+ACTION:DISPLAY
+DESCRIPTION:Breakfast meeting with executive\n
+ team at 8:30 AM EST.
+END:VALARM
+BEGIN:VALARM
+TRIGGER:-P2D
+ACTION:EMAIL
+ATTENDEE:MAILTO:john_doe@host.com
+SUMMARY:*** REMINDER: SEND AGENDA FOR WEEKLY STAFF MEETING ***
+DESCRIPTION:A draft agenda needs to be sent out to the attendees
+ to the weekly managers meeting (MGR-LIST). Attached is a
+ pointer the document template for the agenda file.
+ATTACH;FMTTYPE=application/binary:http://host.com/templates/agen
+ da.doc
+END:VALARM
+BEGIN:VALARM
+TRIGGER;VALUE=DATE-TIME:19980101T050000Z
+REPEAT:23
+DURATION:PT1H
+ACTION:PROCEDURE
+ATTACH;FMTTYPE=application/binary:ftp://host.com/novo-
+ procs/felizano.exe
+END:VALARM
+BEGIN:VCALENDAR
+PRODID:-//RDU Software//NONSGML HandCal//EN
+VERSION:2.0
+BEGIN:VTIMEZONE
+TZID:US-Eastern
+BEGIN:STANDARD
+DTSTART:19981025T020000
+RDATE:19981025T020000
+TZOFFSETFROM:-0400
+TZOFFSETTO:-0500
+TZNAME:EST
+END:STANDARD
+BEGIN:DAYLIGHT
+DTSTART:19990404T020000
+RDATE:19990404T020000
+TZOFFSETFROM:-0500
+TZOFFSETTO:-0400
+TZNAME:EDT
+END:DAYLIGHT
+END:VTIMEZONE
+BEGIN:VEVENT
+DTSTAMP:19980309T231000Z
+UID:guid-1.host1.com
+ORGANIZER;ROLE=CHAIR:MAILTO:mrbig@host.com
+ATTENDEE;RSVP=TRUE;ROLE=REQ-PARTICIPANT;CUTYPE=GROUP:
+ MAILTO:employee-A@host.com
+DESCRIPTION:Project XYZ Review Meeting
+CATEGORIES:MEETING
+CLASS:PUBLIC
+CREATED:19980309T130000Z
+SUMMARY:XYZ Project Review
+DTSTART;TZID=US-Eastern:19980312T083000
+DTEND;TZID=US-Eastern:19980312T093000
+LOCATION:1CP Conference Room 4350
+END:VEVENT
+END:VCALENDAR
+
+BEGIN:VCALENDAR
+METHOD:PUBLISH
+VERSION:2.0
+PRODID:-//ABC Corporation//NONSGML My Product//EN
+BEGIN:VEVENT
+DTSTAMP:19970324T1200Z
+SEQUENCE:0
+UID:uid3@host1.com
+ORGANIZER:MAILTO:jdoe@host1.com
+DTSTART:19970324T123000Z
+DTEND:19970324T210000Z
+CATEGORIES:MEETING,PROJECT
+CLASS:PUBLIC
+SUMMARY:Calendaring Interoperability Planning Meeting
+DESCRIPTION:Discuss how we can test c&s interoperability\n
+ using iCalendar and other IETF standards.
+LOCATION:LDB Lobby
+ATTACH;FMTTYPE=application/postscript:ftp://xyzCorp.com/pub/
+ conf/bkgrnd.ps
+END:VEVENT
+END:VCALENDAR
+
+BEGIN:VCALENDAR
+VERSION:2.0
+PRODID:-//ABC Corporation//NONSGML My Product//EN
+BEGIN:VTODO
+DTSTAMP:19980130T134500Z
+SEQUENCE:2
+UID:uid4@host1.com
+ORGANIZER:MAILTO:unclesam@us.gov
+ATTENDEE;PARTSTAT=ACCEPTED:MAILTO:jqpublic@host.com
+DUE:19980415T235959
+STATUS:NEEDS-ACTION
+SUMMARY:Submit Income Taxes
+BEGIN:VALARM
+ACTION:AUDIO
+TRIGGER:19980403T120000
+ATTACH;FMTTYPE=audio/basic:http://host.com/pub/audio-
+ files/ssbanner.aud
+REPEAT:4
+DURATION:PT1H
+END:VALARM
+END:VTODO
+END:VCALENDAR
+
+BEGIN:VCALENDAR
+VERSION:2.0
+PRODID:-//ABC Corporation//NONSGML My Product//EN
+BEGIN:VJOURNAL
+DTSTAMP:19970324T120000Z
+UID:uid5@host1.com
+ORGANIZER:MAILTO:jsmith@host.com
+STATUS:DRAFT
+CLASS:PUBLIC
+CATEGORIES:Project Report, XYZ, Weekly Meeting
+DESCRIPTION:Project xyz Review Meeting Minutes\n
+ Agenda\n1. Review of project version 1.0 requirements.\n2.
+ Definition
+ of project processes.\n3. Review of project schedule.\n
+ Participants: John Smith\, Jane Doe\, Jim Dandy\n-It was
+ decided that the requirements need to be signed off by
+ product marketing.\n-Project processes were accepted.\n
+ -Project schedule needs to account for scheduled holidays
+ and employee vacation time. Check with HR for specific
+ dates.\n-New schedule will be distributed by Friday.\n-
+ Next weeks meeting is cancelled. No meeting until 3/23.
+END:VJOURNAL
+END:VCALENDAR
+BEGIN:VCALENDAR
+VERSION:2.0
+PRODID:-//RDU Software//NONSGML HandCal//EN
+BEGIN:VFREEBUSY
+ORGANIZER:MAILTO:jsmith@host.com
+DTSTART:19980313T141711Z
+DTEND:19980410T141711Z
+FREEBUSY:19980314T233000Z/19980315T003000Z
+FREEBUSY:19980316T153000Z/19980316T163000Z
+FREEBUSY:19980318T030000Z/19980318T040000Z
+URL:http://www.host.com/calendar/busytime/jsmith.ifb
+END:VFREEBUSY
+END:VCALENDAR
diff --git a/libical/src/test/2446.ics b/libical/src/test/2446.ics
new file mode 100644
index 0000000000..e69de29bb2
--- /dev/null
+++ b/libical/src/test/2446.ics
diff --git a/libical/src/test/Makefile.am b/libical/src/test/Makefile.am
index d4fa33c040..4892507869 100644
--- a/libical/src/test/Makefile.am
+++ b/libical/src/test/Makefile.am
@@ -1,7 +1,27 @@
+if WITH_CXX
+cxx_inc=-DWITH_CXX
+cxx_libs=../libical/libical_cxx.la
+regression_cxx = regression-cxx.cpp
+else
+cxx_inc=
+cxx_libs=
+regression_cxx =
+CXX=@CC@
+endif
-noinst_PROGRAMS = copycluster regression parser storage stow recur testmime testvcal process testclassify
+if WITH_BDB4
+bdb4_inc=-DWITH_BDB -I@BDB_DIR@/include
+bdb4_libs=@BDB_DIR_LIB@/@BDB_LIB@
+else
+bdb4_inc=
+bdb4_libs=
+endif
-LDADD = ../libicalss/.libs/libicalss.a ../libicalvcal/.libs/libicalvcal.a ../libical/.libs/libical.a
+noinst_PROGRAMS = copycluster regression parser stow recur testmime testvcal process
+
+LDADD = ../libicalss/libicalss.la ../libicalvcal/libicalvcal.la $(cxx_libs) ../libical/libical.la $(bdb4_libs)
+
+LIBS = @PTHREAD_LIBS@
INCLUDES = \
-I. \
@@ -11,15 +31,24 @@ INCLUDES = \
-I../libical \
-I$(srcdir)/../libical \
-I../libicalss \
- -I$(srcdir)/../libicalss
+ -I$(srcdir)/../libicalss \
+ $(cxx_inc) $(bdb4_inc)
+TESTS=regression
copycluster_SOURCES = copycluster.c
-regression_SOURCES = regression.c
+regression_SOURCES = \
+ regression.c \
+ regression.h \
+ regression-component.c \
+ regression-classify.c \
+ regression-utils.c \
+ regression-recur.c \
+ regression-storage.c \
+ $(regression_cxx)
+
parser_SOURCES = icaltestparser.c
-storage_SOURCES = storage.c
stow_SOURCES = stow.c
testvcal_SOURCES = testvcal.c
recur_SOURCES = recur.c
testmime_SOURCES = testmime.c
process_SOURCES = process.c
-testclassify_SOURCES = testclassify.c
diff --git a/libical/src/test/copycluster.c b/libical/src/test/copycluster.c
index 4eefc37758..6c57177290 100644
--- a/libical/src/test/copycluster.c
+++ b/libical/src/test/copycluster.c
@@ -26,14 +26,14 @@
======================================================================*/
#include <stdio.h> /* for printf */
-#include "ical.h"
-#include "icalss.h"
-#include "icalfileset.h"
#include <errno.h>
#include <string.h> /* For strerror */
#include <signal.h> /* for signal */
#include <unistd.h> /* for alarm */
-#include "icalrestriction.h"
+#include <stdlib.h> /* for exit */
+
+#include "ical.h"
+#include "icalss.h"
static void sig_alrm(int i){
fprintf(stderr,"Could not get lock on file\n");
@@ -48,7 +48,7 @@ void usage(char* arg0) {
int main(int c, char *argv[]){
- icalfileset *clusterin, *clusterout;
+ icalset *clusterin, *clusterout;
icalcomponent *itr;
int count=0;
int tostdout = 0;
@@ -63,23 +63,26 @@ int main(int c, char *argv[]){
}
- icalerror_set_error_state(ICAL_PARSE_ERROR, ICAL_ERROR_NONFATAL);
-
+ /*icalerror_set_error_state(ICAL_PARSE_ERROR, ICAL_ERROR_NONFATAL);*/
signal(SIGALRM,sig_alrm);
- alarm(0);
+ alarm(10);
clusterin = icalfileset_new(argv[1]);
alarm(0);
if (clusterin == 0){
- printf("Could not open input cluster \"%s\"",argv[1]);
-
+ printf("Could not open input cluster \"%s\"\n",argv[1]);
+ if(icalerrno!= ICAL_NO_ERROR){
+ printf("Error: %s\n",icalerror_strerror(icalerrno));
+ }
exit(1);
}
if (!tostdout){
+ alarm(10);
clusterout = icalfileset_new(argv[2]);
+ alarm(0);
if (clusterout == 0){
printf("Could not open output cluster \"%s\"\n",argv[2]);
exit(1);
@@ -117,11 +120,11 @@ int main(int c, char *argv[]){
printf("Transfered %d components\n",count);
- icalfileset_free(clusterin);
+ icalset_free(clusterin);
if (!tostdout){
icalfileset_mark(clusterout);
- icalfileset_free(clusterout);
+ icalset_free(clusterout);
}
return 0;
diff --git a/libical/src/test/findobj.c b/libical/src/test/findobj.c
index c31101c33d..3c1eac85e3 100644
--- a/libical/src/test/findobj.c
+++ b/libical/src/test/findobj.c
@@ -26,12 +26,11 @@
======================================================================*/
#include <stdio.h> /* for printf */
-#include "ical.h"
-#include "icalcalendar.h"
-#include "icaldirset.h"
#include <errno.h>
#include <string.h> /* For strerror */
-#include "icalrestriction.h"
+
+#include "ical.h"
+#include "icalss.h"
/* This program finds an object stored in a calendar */
diff --git a/libical/src/test/itip.ics b/libical/src/test/itip.ics
new file mode 100644
index 0000000000..9a71660a75
--- /dev/null
+++ b/libical/src/test/itip.ics
@@ -0,0 +1,14 @@
+
+BEGIN:VCALENDAR
+METHOD:REPLY
+PRODID:-//ACME/DesktopCalendar//EN
+VERSION:2.0
+BEGIN:VEVENT
+ORGANIZER:mailto:a@example.com
+ATTENDEE:mailto:eric@agony.busboom.org
+DTSTART:19970701T200000Z
+DTSTAMP:19970611T190000Z
+SUMMARY:ST. PAUL SAINTS -VS- DULUTH-SUPERIOR DUKES
+UID:0981234-1234234-23@example.com
+END:VEVENT
+END:VCALENDAR
diff --git a/libical/src/test/outgoing.ics b/libical/src/test/outgoing.ics
new file mode 100644
index 0000000000..9f9fd3fd69
--- /dev/null
+++ b/libical/src/test/outgoing.ics
@@ -0,0 +1,544 @@
+BEGIN:VCALENDAR
+METHOD
+ :REPLY
+VERSION
+ :2.0
+PRODID
+ :-//SoftwareStudio//NONSGML libical 0.21 //EN
+BEGIN:VEVENT
+DTSTAMP
+ :20001121T170735Z
+UID
+ :calsrv.example.com-873970198738703@example.com
+ORGANIZER
+ :Mailto:bob@cal.softwarestudio.org
+SUMMARY
+ : Overlap 1
+SEQUENCE
+ :0
+COMMENT
+ :I can make it to this meeting
+ATTENDEE
+ ;ROLE=CHAIR
+ ;CUTYPE=INDIVIDUAL
+ ;CN=Alice
+ ;PARTSTAT=ACCEPTED
+ :Mailto:alice@cal.softwarestudio.org
+END:VEVENT
+END:VCALENDAR
+BEGIN:VCALENDAR
+METHOD
+ :REPLY
+VERSION
+ :2.0
+PRODID
+ :-//SoftwareStudio//NONSGML libical 0.21 //EN
+BEGIN:VEVENT
+DTSTAMP
+ :20001121T170735Z
+UID
+ :calsrv.example.com-873970198738704@example.com
+ORGANIZER
+ :Mailto:bob@cal.softwarestudio.org
+SUMMARY
+ :Overlap 2
+SEQUENCE
+ :0
+COMMENT
+ :I can make it to this meeting
+ATTENDEE
+ ;ROLE=CHAIR
+ ;CUTYPE=INDIVIDUAL
+ ;CN=Alice
+ ;PARTSTAT=ACCEPTED
+ :Mailto:alice@cal.softwarestudio.org
+END:VEVENT
+END:VCALENDAR
+BEGIN:VCALENDAR
+METHOD
+ :REPLY
+VERSION
+ :2.0
+PRODID
+ :-//SoftwareStudio//NONSGML libical 0.21 //EN
+BEGIN:VEVENT
+DTSTAMP
+ :20001121T170735Z
+UID
+ :calsrv.example.com-873970198738705@example.com
+ORGANIZER
+ :Mailto:bob@cal.softwarestudio.org
+SUMMARY
+ :Overlap 3
+SEQUENCE
+ :0
+COMMENT
+ :I can make it to this meeting
+ATTENDEE
+ ;ROLE=CHAIR
+ ;CUTYPE=INDIVIDUAL
+ ;CN=Alice
+ ;PARTSTAT=ACCEPTED
+ :Mailto:alice@cal.softwarestudio.org
+END:VEVENT
+END:VCALENDAR
+BEGIN:VCALENDAR
+METHOD
+ :REPLY
+VERSION
+ :2.0
+PRODID
+ :-//SoftwareStudio//NONSGML libical 0.21 //EN
+BEGIN:VEVENT
+DTSTAMP
+ :20001121T170953Z
+UID
+ :calsrv.example.com-873970198738703@example.com
+ORGANIZER
+ :Mailto:bob@cal.softwarestudio.org
+SUMMARY
+ : Overlap 1
+SEQUENCE
+ :0
+COMMENT
+ :I can make it to this meeting
+ATTENDEE
+ ;ROLE=CHAIR
+ ;CUTYPE=INDIVIDUAL
+ ;CN=Alice
+ ;PARTSTAT=ACCEPTED
+ :Mailto:alice@cal.softwarestudio.org
+END:VEVENT
+END:VCALENDAR
+BEGIN:VCALENDAR
+METHOD
+ :REPLY
+VERSION
+ :2.0
+PRODID
+ :-//SoftwareStudio//NONSGML libical 0.21 //EN
+BEGIN:VEVENT
+DTSTAMP
+ :20001121T170953Z
+UID
+ :calsrv.example.com-873970198738704@example.com
+ORGANIZER
+ :Mailto:bob@cal.softwarestudio.org
+SUMMARY
+ :Overlap 2
+SEQUENCE
+ :0
+COMMENT
+ :I can make it to this meeting
+ATTENDEE
+ ;ROLE=CHAIR
+ ;CUTYPE=INDIVIDUAL
+ ;CN=Alice
+ ;PARTSTAT=ACCEPTED
+ :Mailto:alice@cal.softwarestudio.org
+END:VEVENT
+END:VCALENDAR
+BEGIN:VCALENDAR
+METHOD
+ :REPLY
+VERSION
+ :2.0
+PRODID
+ :-//SoftwareStudio//NONSGML libical 0.21 //EN
+BEGIN:VEVENT
+DTSTAMP
+ :20001121T170953Z
+UID
+ :calsrv.example.com-873970198738705@example.com
+ORGANIZER
+ :Mailto:bob@cal.softwarestudio.org
+SUMMARY
+ :Overlap 3
+SEQUENCE
+ :0
+COMMENT
+ :I can make it to this meeting
+ATTENDEE
+ ;ROLE=CHAIR
+ ;CUTYPE=INDIVIDUAL
+ ;CN=Alice
+ ;PARTSTAT=ACCEPTED
+ :Mailto:alice@cal.softwarestudio.org
+END:VEVENT
+END:VCALENDAR
+BEGIN:VCALENDAR
+METHOD
+ :REPLY
+VERSION
+ :2.0
+PRODID
+ :-//SoftwareStudio//NONSGML libical 0.21 //EN
+BEGIN:VEVENT
+DTSTAMP
+ :20001121T171147Z
+UID
+ :calsrv.example.com-873970198738703@example.com
+ORGANIZER
+ :Mailto:bob@cal.softwarestudio.org
+SUMMARY
+ : Overlap 1
+SEQUENCE
+ :0
+COMMENT
+ :Unfortunately\, I have another commitment that conflicts with this
+ meeting. I am delegating my attendance to Bob.
+ATTENDEE
+ ;ROLE=CHAIR
+ ;CUTYPE=INDIVIDUAL
+ ;CN=Alice
+ ;PARTSTAT=DELEGATED
+ ;DELEGATED-TO=bob@cal.softwarestudio.org
+ :Mailto:alice@cal.softwarestudio.org
+END:VEVENT
+END:VCALENDAR
+BEGIN:VCALENDAR
+X-LIC-NOTE
+ : Overlap with Slot 2\, 1300 to 1400\, should be counterproposed
+METHOD
+ :REQUEST
+VERSION
+ :2.0
+BEGIN:VEVENT
+ORGANIZER
+ :Mailto:bob@cal.softwarestudio.org
+ATTENDEE
+ ;ROLE=CHAIR
+ ;CUTYPE=INDIVIDUAL
+ ;CN=Alice
+ :Mailto:alice@cal.softwarestudio.org
+ATTENDEE
+ ;RSVP=TRUE
+ ;CUTYPE=INDIVIDUAL
+ ;CN=B
+ :Mailto:B@example.com
+DTSTAMP
+ :19970611T040000Z
+DTSTART
+ :19970701T070000
+DTEND
+ :19970701T080000
+SUMMARY
+ :Overlap 2
+UID
+ :calsrv.example.com-873970198738704@example.com
+SEQUENCE
+ :0
+STATUS
+ :CONFIRMED
+END:VEVENT
+END:VCALENDAR
+BEGIN:VCALENDAR
+METHOD
+ :REPLY
+VERSION
+ :2.0
+PRODID
+ :-//SoftwareStudio//NONSGML libical 0.21 //EN
+BEGIN:VEVENT
+DTSTAMP
+ :20001121T171147Z
+UID
+ :calsrv.example.com-873970198738705@example.com
+ORGANIZER
+ :Mailto:bob@cal.softwarestudio.org
+SUMMARY
+ :Overlap 3
+SEQUENCE
+ :0
+COMMENT
+ :I can't make it to this meeting
+ATTENDEE
+ ;ROLE=CHAIR
+ ;CUTYPE=INDIVIDUAL
+ ;CN=Alice
+ ;PARTSTAT=DECLINED
+ :Mailto:alice@cal.softwarestudio.org
+END:VEVENT
+END:VCALENDAR
+BEGIN:VCALENDAR
+METHOD
+ :REPLY
+VERSION
+ :2.0
+PRODID
+ :-//SoftwareStudio//NONSGML libical 0.21 //EN
+BEGIN:VEVENT
+DTSTAMP
+ :20001121T171154Z
+UID
+ :calsrv.example.com-873970198738703@example.com
+ORGANIZER
+ :Mailto:bob@cal.softwarestudio.org
+SUMMARY
+ : Overlap 1
+SEQUENCE
+ :0
+COMMENT
+ :Unfortunately\, I have another commitment that conflicts with this
+ meeting. I am delegating my attendance to Bob.
+ATTENDEE
+ ;ROLE=CHAIR
+ ;CUTYPE=INDIVIDUAL
+ ;CN=Alice
+ ;PARTSTAT=DELEGATED
+ ;DELEGATED-TO=bob@cal.softwarestudio.org
+ :Mailto:alice@cal.softwarestudio.org
+END:VEVENT
+END:VCALENDAR
+BEGIN:VCALENDAR
+X-LIC-NOTE
+ : Overlap with Slot 2\, 1300 to 1400\, should be counterproposed
+METHOD
+ :REQUEST
+VERSION
+ :2.0
+BEGIN:VEVENT
+ORGANIZER
+ :Mailto:bob@cal.softwarestudio.org
+ATTENDEE
+ ;ROLE=CHAIR
+ ;CUTYPE=INDIVIDUAL
+ ;CN=Alice
+ :Mailto:alice@cal.softwarestudio.org
+ATTENDEE
+ ;RSVP=TRUE
+ ;CUTYPE=INDIVIDUAL
+ ;CN=B
+ :Mailto:B@example.com
+DTSTAMP
+ :19970611T040000Z
+DTSTART
+ :19970701T070000
+DTEND
+ :19970701T080000
+SUMMARY
+ :Overlap 2
+UID
+ :calsrv.example.com-873970198738704@example.com
+SEQUENCE
+ :0
+STATUS
+ :CONFIRMED
+END:VEVENT
+END:VCALENDAR
+BEGIN:VCALENDAR
+METHOD
+ :REPLY
+VERSION
+ :2.0
+PRODID
+ :-//SoftwareStudio//NONSGML libical 0.21 //EN
+BEGIN:VEVENT
+DTSTAMP
+ :20001121T171154Z
+UID
+ :calsrv.example.com-873970198738705@example.com
+ORGANIZER
+ :Mailto:bob@cal.softwarestudio.org
+SUMMARY
+ :Overlap 3
+SEQUENCE
+ :0
+COMMENT
+ :I can't make it to this meeting
+ATTENDEE
+ ;ROLE=CHAIR
+ ;CUTYPE=INDIVIDUAL
+ ;CN=Alice
+ ;PARTSTAT=DECLINED
+ :Mailto:alice@cal.softwarestudio.org
+END:VEVENT
+END:VCALENDAR
+BEGIN:VCALENDAR
+METHOD
+ :REPLY
+VERSION
+ :2.0
+PRODID
+ :-//SoftwareStudio//NONSGML libical 0.21 //EN
+BEGIN:VEVENT
+DTSTAMP
+ :20001121T144324Z
+UID
+ :calsrv.example.com-873970198738703@example.com
+ORGANIZER
+ :Mailto:bob@cal.softwarestudio.org
+SUMMARY
+ : Overlap 1
+SEQUENCE
+ :0
+COMMENT
+ :Unfortunately\, I have another commitment that conflicts with this
+ meeting. I am delegating my attendance to Bob.
+ATTENDEE
+ ;ROLE=CHAIR
+ ;CUTYPE=INDIVIDUAL
+ ;CN=Alice
+ ;PARTSTAT=DELEGATED
+ ;DELEGATED-TO=bob@cal.softwarestudio.org
+ :Mailto:alice@cal.softwarestudio.org
+END:VEVENT
+END:VCALENDAR
+BEGIN:VCALENDAR
+X-LIC-NOTE
+ : Overlap with Slot 2\, 1300 to 1400\, should be counterproposed
+METHOD
+ :REQUEST
+VERSION
+ :2.0
+BEGIN:VEVENT
+ORGANIZER
+ :Mailto:bob@cal.softwarestudio.org
+ATTENDEE
+ ;ROLE=CHAIR
+ ;CUTYPE=INDIVIDUAL
+ ;CN=Alice
+ :Mailto:alice@cal.softwarestudio.org
+ATTENDEE
+ ;RSVP=TRUE
+ ;CUTYPE=INDIVIDUAL
+ ;CN=B
+ :Mailto:B@example.com
+DTSTAMP
+ :19970611T040000Z
+DTSTART
+ :19970701T230000
+DTEND
+ :19970702T000000
+SUMMARY
+ :Overlap 2
+UID
+ :calsrv.example.com-873970198738704@example.com
+SEQUENCE
+ :0
+STATUS
+ :CONFIRMED
+END:VEVENT
+END:VCALENDAR
+BEGIN:VCALENDAR
+METHOD
+ :REPLY
+VERSION
+ :2.0
+PRODID
+ :-//SoftwareStudio//NONSGML libical 0.21 //EN
+BEGIN:VEVENT
+DTSTAMP
+ :20001121T144324Z
+UID
+ :calsrv.example.com-873970198738705@example.com
+ORGANIZER
+ :Mailto:bob@cal.softwarestudio.org
+SUMMARY
+ :Overlap 3
+SEQUENCE
+ :0
+COMMENT
+ :I can't make it to this meeting
+ATTENDEE
+ ;ROLE=CHAIR
+ ;CUTYPE=INDIVIDUAL
+ ;CN=Alice
+ ;PARTSTAT=DECLINED
+ :Mailto:alice@cal.softwarestudio.org
+END:VEVENT
+END:VCALENDAR
+BEGIN:VCALENDAR
+METHOD
+ :REPLY
+VERSION
+ :2.0
+PRODID
+ :-//SoftwareStudio//NONSGML libical 0.21 //EN
+BEGIN:VEVENT
+DTSTAMP
+ :20001121T144412Z
+UID
+ :calsrv.example.com-873970198738703@example.com
+ORGANIZER
+ :Mailto:bob@cal.softwarestudio.org
+SUMMARY
+ : Overlap 1
+SEQUENCE
+ :0
+COMMENT
+ :Unfortunately\, I have another commitment that conflicts with this
+ meeting. I am delegating my attendance to Bob.
+ATTENDEE
+ ;ROLE=CHAIR
+ ;CUTYPE=INDIVIDUAL
+ ;CN=Alice
+ ;PARTSTAT=DELEGATED
+ ;DELEGATED-TO=bob@cal.softwarestudio.org
+ :Mailto:alice@cal.softwarestudio.org
+END:VEVENT
+END:VCALENDAR
+BEGIN:VCALENDAR
+X-LIC-NOTE
+ : Overlap with Slot 2\, 1300 to 1400\, should be counterproposed
+METHOD
+ :REQUEST
+VERSION
+ :2.0
+BEGIN:VEVENT
+ORGANIZER
+ :Mailto:bob@cal.softwarestudio.org
+ATTENDEE
+ ;ROLE=CHAIR
+ ;CUTYPE=INDIVIDUAL
+ ;CN=Alice
+ :Mailto:alice@cal.softwarestudio.org
+ATTENDEE
+ ;RSVP=TRUE
+ ;CUTYPE=INDIVIDUAL
+ ;CN=B
+ :Mailto:B@example.com
+DTSTAMP
+ :19970611T040000Z
+DTSTART
+ :19970701T230000
+DTEND
+ :19970702T000000
+SUMMARY
+ :Overlap 2
+UID
+ :calsrv.example.com-873970198738704@example.com
+SEQUENCE
+ :0
+STATUS
+ :CONFIRMED
+END:VEVENT
+END:VCALENDAR
+BEGIN:VCALENDAR
+METHOD
+ :REPLY
+VERSION
+ :2.0
+PRODID
+ :-//SoftwareStudio//NONSGML libical 0.21 //EN
+BEGIN:VEVENT
+DTSTAMP
+ :20001121T144412Z
+UID
+ :calsrv.example.com-873970198738705@example.com
+ORGANIZER
+ :Mailto:bob@cal.softwarestudio.org
+SUMMARY
+ :Overlap 3
+SEQUENCE
+ :0
+COMMENT
+ :I can't make it to this meeting
+ATTENDEE
+ ;ROLE=CHAIR
+ ;CUTYPE=INDIVIDUAL
+ ;CN=Alice
+ ;PARTSTAT=DECLINED
+ :Mailto:alice@cal.softwarestudio.org
+END:VEVENT
+END:VCALENDAR
diff --git a/libical/src/test/process.c b/libical/src/test/process.c
index 56f1c65fb1..466cf38101 100644
--- a/libical/src/test/process.c
+++ b/libical/src/test/process.c
@@ -22,55 +22,12 @@
======================================================================*/
#include <stdio.h> /* for printf */
-#include "ical.h"
-#include "icalss.h"
#include <errno.h>
#include <string.h> /* For strerror */
#include <stdlib.h> /* for free */
-struct class_map {
- ical_class class;
- char *str;
-} class_map[] = {
- {ICAL_NO_CLASS,"No class"},
- {ICAL_PUBLISH_NEW_CLASS,"New Publish"},
- {ICAL_PUBLISH_UPDATE_CLASS,"New Publish"},
- {ICAL_REQUEST_NEW_CLASS,"New request"},
- {ICAL_REQUEST_UPDATE_CLASS,"Update"},
- {ICAL_REQUEST_RESCHEDULE_CLASS,"Reschedule"},
- {ICAL_REQUEST_DELEGATE_CLASS,"Delegate"},
- {ICAL_REQUEST_NEW_ORGANIZER_CLASS,"New Organizer"},
- {ICAL_REQUEST_FORWARD_CLASS,"Forward"},
- {ICAL_REQUEST_STATUS_CLASS,"Status request"},
- {ICAL_REPLY_ACCEPT_CLASS,"Accept reply"},
- {ICAL_REPLY_DECLINE_CLASS,"Decline reply"},
- {ICAL_REPLY_CRASHER_ACCEPT_CLASS,"Crasher's accept reply"},
- {ICAL_REPLY_CRASHER_DECLINE_CLASS,"Crasher's decline reply"},
- {ICAL_ADD_INSTANCE_CLASS,"Add instance"},
- {ICAL_CANCEL_EVENT_CLASS,"Cancel event"},
- {ICAL_CANCEL_INSTANCE_CLASS,"Cancel instance"},
- {ICAL_CANCEL_ALL_CLASS,"Cancel all instances"},
- {ICAL_REFRESH_CLASS,"Refresh"},
- {ICAL_COUNTER_CLASS,"Counter"},
- {ICAL_DECLINECOUNTER_CLASS,"Decline counter"},
- {ICAL_MALFORMED_CLASS,"Malformed"},
- {ICAL_OBSOLETE_CLASS,"Obsolete"},
- {ICAL_MISSEQUENCED_CLASS,"Missequenced"},
- {ICAL_UNKNOWN_CLASS,"Unknown"}
-};
-
-char* find_class_string(ical_class class)
-{
- int i;
-
- for (i = 0;class_map[i].class != ICAL_UNKNOWN_CLASS;i++){
- if (class_map[i].class == class){
- return class_map[i].str;
- }
- }
-
- return "Unknown";
-}
+#include "ical.h"
+#include "icalss.h"
void send_message(icalcomponent *reply,const char* this_user)
{
@@ -84,7 +41,7 @@ int main(int argc, char* argv[])
{
icalcomponent *c, *next_c;
int i=0;
- char *class_string;
+ const char *class_string;
int dont_remove;
icalset* f = icalset_new_file("../../test-data/process-incoming.ics");
@@ -103,7 +60,7 @@ int main(int argc, char* argv[])
/* Foreach incoming message */
for(c=icalset_get_first_component(f);c!=0;c = next_c){
- ical_class class;
+ icalproperty_xlicclass class;
icalcomponent *match;
icalcomponent *inner;
icalcomponent *reply = 0;
@@ -130,7 +87,7 @@ int main(int argc, char* argv[])
class = icalclassify(c,match,this_user);
- class_string = find_class_string(class);
+ class_string = icalproperty_enum_to_string(class);
/* Print out the notes associated with the incoming component
and the matched component in the */
@@ -171,7 +128,7 @@ int main(int argc, char* argv[])
/* Main processing structure */
switch (class){
- case ICAL_NO_CLASS: {
+ case ICAL_XLICCLASS_NONE: {
char temp[1024];
/* Huh? Return an error to sender */
icalrestriction_check(c);
@@ -191,15 +148,15 @@ int main(int argc, char* argv[])
break;
}
- case ICAL_PUBLISH_NEW_CLASS: {
+ case ICAL_XLICCLASS_PUBLISHNEW: {
/* Don't accept published events from anyone but
- self. If self, fall through to ICAL_REQUEST_NEW_CLASS */
+ self. If self, fall through to ICAL_XLICCLASS_REQUESTNEW */
}
- case ICAL_REQUEST_NEW_CLASS: {
+ case ICAL_XLICCLASS_REQUESTNEW: {
/* Book the new component if it does not overlap
anything. If the time is busy and the start time is
@@ -283,110 +240,114 @@ conflicts with this meeting. I am proposing a time that works better for me.");
}
break;
}
- case ICAL_PUBLISH_FREEBUSY_CLASS: {
+ case ICAL_XLICCLASS_PUBLISHFREEBUSY: {
/* Store the busy time information in a file named after
the sender */
break;
}
- case ICAL_PUBLISH_UPDATE_CLASS: {
+ case ICAL_XLICCLASS_PUBLISHUPDATE: {
/* Only accept publish updates from self. If self, fall
- throught to ICAL_REQUEST_UPDATE_CLASS */
+ throught to ICAL_XLICCLASS_REQUESTUPDATE */
}
- case ICAL_REQUEST_UPDATE_CLASS: {
+ case ICAL_XLICCLASS_REQUESTUPDATE: {
/* always accept the changes */
break;
}
- case ICAL_REQUEST_RESCHEDULE_CLASS: {
+ case ICAL_XLICCLASS_REQUESTRESCHEDULE: {
/* Use same rules as REQUEST_NEW */
icalcomponent *overlaps;
overlaps = icalclassify_find_overlaps(cal,c);
break;
}
- case ICAL_REQUEST_DELEGATE_CLASS: {
+ case ICAL_XLICCLASS_REQUESTDELEGATE: {
break;
}
- case ICAL_REQUEST_NEW_ORGANIZER_CLASS: {
+ case ICAL_XLICCLASS_REQUESTNEWORGANIZER: {
break;
}
- case ICAL_REQUEST_FORWARD_CLASS: {
+ case ICAL_XLICCLASS_REQUESTFORWARD: {
break;
}
- case ICAL_REQUEST_STATUS_CLASS: {
+ case ICAL_XLICCLASS_REQUESTSTATUS: {
break;
}
- case ICAL_REQUEST_FREEBUSY_CLASS: {
+ case ICAL_XLICCLASS_REQUESTFREEBUSY: {
break;
}
- case ICAL_REPLY_ACCEPT_CLASS: {
+ case ICAL_XLICCLASS_REPLYACCEPT: {
/* Change the PARTSTAT of the sender */
break;
}
- case ICAL_REPLY_DECLINE_CLASS: {
+ case ICAL_XLICCLASS_REPLYDECLINE: {
/* Change the PARTSTAT of the sender */
break;
}
- case ICAL_REPLY_CRASHER_ACCEPT_CLASS: {
+ case ICAL_XLICCLASS_REPLYCRASHERACCEPT: {
/* Add the crasher to the ATTENDEE list with the
appropriate PARTSTAT */
break;
}
- case ICAL_REPLY_CRASHER_DECLINE_CLASS: {
+ case ICAL_XLICCLASS_REPLYCRASHERDECLINE: {
/* Add the crasher to the ATTENDEE list with the
appropriate PARTSTAT */
break;
}
- case ICAL_ADD_INSTANCE_CLASS: {
+ case ICAL_XLICCLASS_ADDINSTANCE: {
break;
}
- case ICAL_CANCEL_EVENT_CLASS: {
+ case ICAL_XLICCLASS_CANCELEVENT: {
/* Remove the component */
break;
}
- case ICAL_CANCEL_INSTANCE_CLASS: {
+ case ICAL_XLICCLASS_CANCELINSTANCE: {
break;
}
- case ICAL_CANCEL_ALL_CLASS: {
+ case ICAL_XLICCLASS_CANCELALL: {
/* Remove the component */
break;
}
- case ICAL_REFRESH_CLASS: {
+ case ICAL_XLICCLASS_REFRESH: {
/* Resend the latest copy of the request */
break;
}
- case ICAL_COUNTER_CLASS: {
+ case ICAL_XLICCLASS_COUNTER: {
break;
}
- case ICAL_DECLINECOUNTER_CLASS: {
+ case ICAL_XLICCLASS_DECLINECOUNTER: {
break;
}
- case ICAL_MALFORMED_CLASS: {
+ case ICAL_XLICCLASS_MALFORMED: {
/* Send back an error */
break;
}
- case ICAL_OBSOLETE_CLASS: {
+ case ICAL_XLICCLASS_OBSOLETE: {
printf(" ** Got an obsolete component:\n%s",
icalcomponent_as_ical_string(c));
/* Send back an error */
break;
}
- case ICAL_MISSEQUENCED_CLASS: {
+ case ICAL_XLICCLASS_MISSEQUENCED: {
printf(" ** Got a missequenced component:\n%s",
icalcomponent_as_ical_string(c));
/* Send back an error */
break;
}
- case ICAL_UNKNOWN_CLASS: {
+ case ICAL_XLICCLASS_UNKNOWN: {
printf(" ** Don't know what to do with this component:\n%s",
icalcomponent_as_ical_string(c));
/* Send back an error */
break;
}
+ case ICAL_XLICCLASS_X:
+ case ICAL_XLICCLASS_REPLYDELEGATE:
+ default: {
+ }
}
#if(0)
diff --git a/libical/src/test/recur.c b/libical/src/test/recur.c
index f4d9a38647..bb23337adb 100644
--- a/libical/src/test/recur.c
+++ b/libical/src/test/recur.c
@@ -25,96 +25,137 @@
======================================================================*/
-#include "ical.h"
#include <assert.h>
#include <string.h> /* for strdup */
#include <stdlib.h> /* for malloc */
#include <stdio.h> /* for printf */
#include <time.h> /* for time() */
#include <signal.h> /* for signal */
+#ifndef WIN32
#include <unistd.h> /* for alarm */
-#include "icalmemory.h"
-#include "icaldirset.h"
-#include "icalfileset.h"
+#endif
+
+#include "ical.h"
+#include "icalss.h"
+
+#ifdef WIN32
+#define snprintf _snprintf
+#define strcasecmp stricmp
+#endif
static void sig_alrm(int i){
fprintf(stderr,"Could not get lock on file\n");
exit(1);
}
+static void recur_callback(icalcomponent *comp,
+ struct icaltime_span *span,
+ void *data)
+{
+ printf("cb: %s", ctime(&span->start));
+ printf(" %s\n", ctime(&span->end));
+
+}
+
int main(int argc, char *argv[])
{
- icalfileset *cin;
- struct icaltimetype start, next;
+ icalset *cin;
+ struct icaltimetype next;
icalcomponent *itr;
icalproperty *desc, *dtstart, *rrule;
struct icalrecurrencetype recur;
icalrecur_iterator* ritr;
time_t tt;
char* file;
-
+
icalerror_set_error_state(ICAL_PARSE_ERROR, ICAL_ERROR_NONFATAL);
-
+
+#ifndef WIN32
signal(SIGALRM,sig_alrm);
-
-
+#endif
+
if (argc <= 1){
- file = "../../test-data/recur.txt";
+ file = "../../test-data/recur.txt";
} else if (argc == 2){
- file = argv[1];
+ file = argv[1];
} else {
- fprintf(stderr,"usage: recur [input file]\n");
- exit(1);
+ fprintf(stderr,"usage: recur [input file]\n");
+ exit(1);
}
-
+
+#ifndef WIN32
alarm(300); /* to get file lock */
+#endif
cin = icalfileset_new(file);
+#ifndef WIN32
alarm(0);
-
+#endif
+
if(cin == 0){
- fprintf(stderr,"recur: can't open file %s\n",file);
- exit(1);
+ fprintf(stderr,"recur: can't open file %s\n",file);
+ exit(1);
}
-
-
- for (itr = icalfileset_get_first_component(cin);
- itr != 0;
- itr = icalfileset_get_next_component(cin)){
-
- desc = icalcomponent_get_first_property(itr,ICAL_DESCRIPTION_PROPERTY);
- dtstart = icalcomponent_get_first_property(itr,ICAL_DTSTART_PROPERTY);
- rrule = icalcomponent_get_first_property(itr,ICAL_RRULE_PROPERTY);
-
- if (desc == 0 || dtstart == 0 || rrule == 0){
- printf("\n******** Error in input component ********\n");
- printf("The following component is malformed:\n %s\n",
- icalcomponent_as_ical_string(itr));
- continue;
- }
-
- printf("\n\n#### %s\n",icalproperty_get_description(desc));
- printf("#### %s\n",icalvalue_as_ical_string(icalproperty_get_value(rrule)));
- recur = icalproperty_get_rrule(rrule);
- start = icalproperty_get_dtstart(dtstart);
- ritr = icalrecur_iterator_new(recur,start);
- tt = icaltime_as_timet(start);
-
- printf("#### %s\n",ctime(&tt ));
-
- for(ritr = icalrecur_iterator_new(recur,start),
- next = icalrecur_iterator_next(ritr);
- !icaltime_is_null_time(next);
- next = icalrecur_iterator_next(ritr)){
-
- tt = icaltime_as_timet(next);
-
- printf(" %s",ctime(&tt ));
-
- }
-
+ for (itr = icalfileset_get_first_component(cin);
+ itr != 0;
+ itr = icalfileset_get_next_component(cin)){
+
+ struct icaltimetype start = icaltime_from_timet(1,0);
+ struct icaltimetype end = icaltime_today();
+
+
+
+ desc = icalcomponent_get_first_property(itr,ICAL_DESCRIPTION_PROPERTY);
+ dtstart = icalcomponent_get_first_property(itr,ICAL_DTSTART_PROPERTY);
+ rrule = icalcomponent_get_first_property(itr,ICAL_RRULE_PROPERTY);
+
+ if (desc == 0 || dtstart == 0 || rrule == 0){
+ printf("\n******** Error in input component ********\n");
+ printf("The following component is malformed:\n %s\n",
+ icalcomponent_as_ical_string(itr));
+ continue;
+ }
+
+ printf("\n\n#### %s\n",icalproperty_get_description(desc));
+ printf("#### %s\n",icalvalue_as_ical_string(icalproperty_get_value(rrule)));
+ recur = icalproperty_get_rrule(rrule);
+ start = icalproperty_get_dtstart(dtstart);
+
+ ritr = icalrecur_iterator_new(recur,start);
+
+ tt = icaltime_as_timet(start);
+
+ printf("#### %s\n",ctime(&tt ));
+
+ icalrecur_iterator_free(ritr);
+
+ for(ritr = icalrecur_iterator_new(recur,start),
+ next = icalrecur_iterator_next(ritr);
+ !icaltime_is_null_time(next);
+ next = icalrecur_iterator_next(ritr)){
+
+ tt = icaltime_as_timet(next);
+
+ printf(" %s",ctime(&tt ));
+
+ }
+ icalrecur_iterator_free(ritr);
+
+ icalcomponent_foreach_recurrence(itr, start, end,
+ recur_callback, NULL);
+
+
+
}
+ icalset_free(cin);
+
+ icaltimezone_free_builtin_timezones();
+
+ icalmemory_free_ring();
+
+ free_zone_directory();
+
return 0;
}
diff --git a/libical/src/test/regression-classify.c b/libical/src/test/regression-classify.c
new file mode 100644
index 0000000000..c805047c24
--- /dev/null
+++ b/libical/src/test/regression-classify.c
@@ -0,0 +1,187 @@
+/* -*- Mode: C -*-
+ ======================================================================
+ FILE: regression-classify.c
+ CREATOR: eric 11 February 2000
+
+ $Id$
+ $Locker$
+
+ (C) COPYRIGHT 2000 Eric Busboom
+ http://www.softwarestudio.org
+
+ The contents of this file are subject to the Mozilla Public License
+ Version 1.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.mozilla.org/MPL/
+
+ Software distributed under the License is distributed on an "AS IS"
+ basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
+ the License for the specific language governing rights and
+ limitations under the License.
+
+ The Original Code is eric. The Initial Developer of the Original
+ Code is Eric Busboom
+
+
+ ======================================================================*/
+#include <stdio.h> /* for printf */
+#include <errno.h>
+#include <string.h> /* For strerror */
+
+#include "ical.h"
+#include "icalss.h"
+#include "regression.h"
+
+extern int VERBOSE;
+
+/* Get a note about the purpose of the property*/
+static const char* get_note(icalcomponent *c)
+{
+ icalproperty *p;
+ const char* note = 0;
+
+ if(c != 0){
+ for(p = icalcomponent_get_first_property(c,ICAL_X_PROPERTY);
+ p!= 0;
+ p = icalcomponent_get_next_property(c,ICAL_X_PROPERTY)){
+ if(strcmp(icalproperty_get_x_name(p),"X-LIC-NOTE")==0){
+ note = icalproperty_get_x(p);
+ }
+ }
+ }
+
+ if(note == 0){
+ note = "None";
+ }
+
+ return note;
+}
+
+/* Get the expected result about the purpose of the property*/
+
+static const char* get_expect(icalcomponent *c)
+{
+ icalproperty *p;
+ const char* note = 0;
+
+ if(c != 0){
+ for(p = icalcomponent_get_first_property(c,ICAL_X_PROPERTY);
+ p!= 0;
+ p = icalcomponent_get_next_property(c,ICAL_X_PROPERTY)){
+ if(strcmp(icalproperty_get_x_name(p),"X-LIC-EXPECT")==0){
+ note = icalproperty_get_x(p);
+ }
+ }
+ }
+
+ if(note == 0){
+ note = "None";
+ }
+
+ return note;
+}
+
+void test_classify(void)
+{
+ icalcomponent *c,*match;
+ int i=0;
+ int error_count = 0;
+ /* Open up the two storage files, one for the incomming components,
+ one for the calendar */
+ icalset* incoming = icalset_new_file("../../test-data/incoming.ics");
+ icalset* cal = icalset_new_file("../../test-data/calendar.ics");
+ icalset* f = icalset_new_file("../../test-data/classify.ics");
+
+ ok("opening file classify.ics", (f!=0));
+ ok("opening file calendar.ics", (cal!=0));
+ ok("opening file incoming.ics", (incoming!=0));
+
+ /* some basic tests.. */
+ if (f) {
+ c = icalset_get_first_component(f);
+ match = icalset_get_next_component(f);
+
+ ok("test two vcalendars for SEQUENCE with icalclassify()",
+ (icalclassify(c,match,"A@example.com") == ICAL_XLICCLASS_REQUESTRESCHEDULE));
+
+ icalset_free(f);
+ }
+
+ assert(incoming!= 0);
+ assert(cal!=0);
+
+ /* Iterate through all of the incoming components */
+ for(c=icalset_get_first_component(incoming);c!=0;
+ c=icalset_get_next_component(incoming)){
+
+ icalproperty_xlicclass class;
+ icalcomponent *match = 0;
+ const char* this_uid;
+ const char* this_note = get_note(c);
+ const char* expected_result = get_expect(c);
+ const char* actual_result;
+ const char* match_note;
+ char msg[128];
+
+ i++;
+
+ /* Check this component against the restrictions imposed by
+ iTIP. An errors will be inserted as X-LIC-ERROR properties
+ in the component. The Parser will also insert errors if it
+ cannot parse the component */
+ icalcomponent_check_restrictions(c);
+
+ /* If there are any errors, print out the component */
+
+ error_count = icalcomponent_count_errors(c);
+ sprintf(msg, "%s - parsing", this_note);
+ int_is(msg, error_count, 0);
+
+ if (error_count !=0) {
+ if (VERBOSE) printf("----- Component has errors ------- \n%s-----------------\n",
+ icalcomponent_as_ical_string(c));
+ }
+
+ /* Use one of the icalcomponent convenience routines to get
+ the UID. This routine will save you from having to use
+ icalcomponent_get_inner(),
+ icalcomponent_get_first_property(), checking the return
+ value, and then calling icalproperty_get_uid. There are
+ several other convenience routines for DTSTART, DTEND,
+ DURATION, SUMMARY, METHOD, and COMMENT */
+ this_uid = icalcomponent_get_uid(c);
+
+ if(this_uid != 0){
+ /* Look in the calendar for a component with the same UID
+ as the incomming component. We should reall also be
+ checking the RECURRENCE-ID. Another way to do this
+ operation is to us icalset_find_match(), which does use
+ the RECURRENCE-ID. */
+ match = icalset_fetch(cal,this_uid);
+ }
+
+
+ /* Classify the incoming component. The third argument is the
+ calid of the user who owns the calendar. In a real program,
+ you would probably switch() on the class.*/
+ class = icalclassify(c,match,"A@example.com");
+ /** eventually test this too.. **/
+ match_note = get_note(match);
+ actual_result = icalproperty_enum_to_string(class);
+ sprintf(msg, "expecting %s", expected_result);
+ is(msg, expected_result, actual_result);
+
+ if (VERBOSE) printf("Test %d\n\
+Incoming: %s\n\
+Matched: %s\n\
+Classification: %s\n\n",
+ i,this_note,get_note(match),
+ icalproperty_enum_to_string(class));
+ }
+
+ icalset_free(incoming);
+ icalset_free(cal);
+
+}
+
+
diff --git a/libical/src/test/regression-component.c b/libical/src/test/regression-component.c
new file mode 100644
index 0000000000..0babb579ba
--- /dev/null
+++ b/libical/src/test/regression-component.c
@@ -0,0 +1,580 @@
+#include "ical.h"
+#include "regression.h"
+
+#include <string.h>
+extern int VERBOSE;
+
+void create_simple_component(void)
+{
+
+ icalcomponent* calendar;
+ icalproperty *version, *bogus;
+
+ /* Create calendar and add properties */
+ calendar = icalcomponent_new(ICAL_VCALENDAR_COMPONENT);
+
+ ok("create vcalendar component", (calendar!=NULL));
+
+ icalcomponent_add_property(
+ calendar,
+ icalproperty_new_version("2.0")
+ );
+
+ version = icalcomponent_get_first_property(calendar,ICAL_VERSION_PROPERTY);
+ ok("version property added", (version!=NULL));
+
+ bogus = icalcomponent_get_first_property(calendar,ICAL_DTSTART_PROPERTY);
+ ok("bogus dtstart not found", (bogus == NULL));
+
+ if (VERBOSE && calendar)
+ printf("%s\n",icalcomponent_as_ical_string(calendar));
+
+ icalcomponent_free(calendar);
+}
+
+
+static char* create_new_component_str =
+"BEGIN:VCALENDAR\n"
+"VERSION:2.0\n"
+"PRODID:-//RDU Software//NONSGML HandCal//EN\n"
+"BEGIN:VTIMEZONE\n"
+"TZID:America/New_York\n"
+"BEGIN:DAYLIGHT\n"
+"DTSTART:20020606T212449\n"
+"RDATE;VALUE=PERIOD:20020606T212449/20020607T012809\n"
+"TZOFFSETFROM:-0500\n"
+"TZOFFSETTO:-0400\n"
+"TZNAME:EST\n"
+"END:DAYLIGHT\n"
+"BEGIN:STANDARD\n"
+"DTSTART:20020606T212449\n"
+"RDATE;VALUE=PERIOD:20020606T212449/20020607T012809\n"
+"TZOFFSETFROM:-0400\n"
+"TZOFFSETTO:-0500\n"
+"TZNAME:EST\n"
+"END:STANDARD\n"
+"END:VTIMEZONE\n"
+"BEGIN:VEVENT\n"
+"DTSTAMP:20020606T212449\n"
+"UID:guid-1.host1.com\n"
+"ORGANIZER;ROLE=CHAIR:mrbig@host.com\n"
+"ATTENDEE;ROLE=REQ-PARTICIPANT;RSVP=TRUE;CUTYPE=GROUP:employee-A@host.com\n"
+"DESCRIPTION:Project XYZ Review Meeting\n"
+"CATEGORIES:MEETING\n"
+"CLASS:PRIVATE\n"
+"CREATED:20020606T212449\n"
+"SUMMARY:XYZ Project Review\n"
+"DTSTART;TZID=America/New_York:20020606T212449\n"
+"DTEND;TZID=America/New_York:20020606T212449\n"
+"LOCATION:1CP Conference Room 4350\n"
+"END:VEVENT\n"
+"END:VCALENDAR\n";
+
+
+/* Create a new component */
+void create_new_component()
+{
+ icalcomponent* calendar;
+ icalcomponent* timezone;
+ icalcomponent* tzc;
+ icalcomponent* event;
+ struct icaltimetype atime = icaltime_from_timet( 1023398689, 0);
+ struct icaldatetimeperiodtype rtime;
+ icalproperty* property;
+ char *calendar_as_string;
+
+ rtime.period.start = icaltime_from_timet( 1023398689,0);
+ rtime.period.end = icaltime_from_timet( 1023409689,0);
+ rtime.period.end.hour++;
+ rtime.time = icaltime_null_time();
+
+ /* Create calendar and add properties */
+ calendar = icalcomponent_new(ICAL_VCALENDAR_COMPONENT);
+
+
+ icalcomponent_add_property(
+ calendar,
+ icalproperty_new_version("2.0")
+ );
+
+ icalcomponent_add_property(
+ calendar,
+ icalproperty_new_prodid("-//RDU Software//NONSGML HandCal//EN")
+ );
+
+ /* Create a timezone object and add it to the calendar */
+
+ timezone = icalcomponent_new(ICAL_VTIMEZONE_COMPONENT);
+
+ icalcomponent_add_property(
+ timezone,
+ icalproperty_new_tzid("America/New_York")
+ );
+
+ /* Add a sub-component of the timezone */
+ tzc = icalcomponent_new(ICAL_XDAYLIGHT_COMPONENT);
+
+ icalcomponent_add_property(
+ tzc,
+ icalproperty_new_dtstart(atime)
+ );
+
+ icalcomponent_add_property(
+ tzc,
+ icalproperty_new_rdate(rtime)
+ );
+
+ icalcomponent_add_property(
+ tzc,
+ icalproperty_new_tzoffsetfrom(-5*3600)
+ );
+
+ icalcomponent_add_property(
+ tzc,
+ icalproperty_new_tzoffsetto(-4*3600)
+ );
+
+ icalcomponent_add_property(
+ tzc,
+ icalproperty_new_tzname("EST")
+ );
+
+ icalcomponent_add_component(timezone,tzc);
+
+ icalcomponent_add_component(calendar,timezone);
+
+ /* Add a second subcomponent */
+ tzc = icalcomponent_new(ICAL_XSTANDARD_COMPONENT);
+
+ icalcomponent_add_property(
+ tzc,
+ icalproperty_new_dtstart(atime)
+ );
+
+ icalcomponent_add_property(
+ tzc,
+ icalproperty_new_rdate(rtime)
+ );
+
+ icalcomponent_add_property(
+ tzc,
+ icalproperty_new_tzoffsetfrom(-4*3600)
+ );
+
+ icalcomponent_add_property(
+ tzc,
+ icalproperty_new_tzoffsetto(-5*3600)
+ );
+
+ icalcomponent_add_property(
+ tzc,
+ icalproperty_new_tzname("EST")
+ );
+
+ icalcomponent_add_component(timezone,tzc);
+
+ /* Add an event */
+
+ event = icalcomponent_new(ICAL_VEVENT_COMPONENT);
+
+ icalcomponent_add_property(
+ event,
+ icalproperty_new_dtstamp(atime)
+ );
+
+ icalcomponent_add_property(
+ event,
+ icalproperty_new_uid("guid-1.host1.com")
+ );
+
+ /* add a property that has parameters */
+ property = icalproperty_new_organizer("mrbig@host.com");
+
+ icalproperty_add_parameter(
+ property,
+ icalparameter_new_role(ICAL_ROLE_CHAIR)
+ );
+
+ icalcomponent_add_property(event,property);
+
+ /* add another property that has parameters */
+ property = icalproperty_new_attendee("employee-A@host.com");
+
+ icalproperty_add_parameter(
+ property,
+ icalparameter_new_role(ICAL_ROLE_REQPARTICIPANT)
+ );
+
+ icalproperty_add_parameter(
+ property,
+ icalparameter_new_rsvp(ICAL_RSVP_TRUE)
+ );
+
+ icalproperty_add_parameter(
+ property,
+ icalparameter_new_cutype(ICAL_CUTYPE_GROUP)
+ );
+
+ icalcomponent_add_property(event,property);
+
+
+ /* more properties */
+
+ icalcomponent_add_property(
+ event,
+ icalproperty_new_description("Project XYZ Review Meeting")
+ );
+
+ icalcomponent_add_property(
+ event,
+ icalproperty_new_categories("MEETING")
+ );
+
+ icalcomponent_add_property(
+ event,
+ icalproperty_new_class(ICAL_CLASS_PRIVATE)
+ );
+
+ icalcomponent_add_property(
+ event,
+ icalproperty_new_created(atime)
+ );
+
+ icalcomponent_add_property(
+ event,
+ icalproperty_new_summary("XYZ Project Review")
+ );
+
+
+ property = icalproperty_new_dtstart(atime);
+
+ icalproperty_add_parameter(
+ property,
+ icalparameter_new_tzid("America/New_York")
+ );
+
+ icalcomponent_add_property(event,property);
+
+
+ property = icalproperty_new_dtend(atime);
+
+ icalproperty_add_parameter(
+ property,
+ icalparameter_new_tzid("America/New_York")
+ );
+
+ icalcomponent_add_property(event,property);
+
+ icalcomponent_add_property(
+ event,
+ icalproperty_new_location("1CP Conference Room 4350")
+ );
+
+ icalcomponent_add_component(calendar,event);
+
+ calendar_as_string = icalcomponent_as_ical_string(calendar);
+
+ is("build large, complex component",
+ calendar_as_string,
+ create_new_component_str);
+
+ if (VERBOSE && calendar)
+ printf("%s\n",icalcomponent_as_ical_string(calendar));
+
+
+ if (calendar)
+ icalcomponent_free(calendar);
+
+}
+
+/* Create a new component, using the va_args list */
+
+void create_new_component_with_va_args()
+{
+
+ icalcomponent* calendar;
+ struct icaltimetype atime = icaltime_from_timet( time(0),0);
+ struct icaldatetimeperiodtype rtime;
+
+ rtime.period.start = icaltime_from_timet( time(0),0);
+ rtime.period.end = icaltime_from_timet( time(0),0);
+ rtime.period.end.hour++;
+ rtime.time = icaltime_null_time();
+
+ calendar =
+ icalcomponent_vanew(
+ ICAL_VCALENDAR_COMPONENT,
+ icalproperty_new_version("2.0"),
+ icalproperty_new_prodid("-//RDU Software//NONSGML HandCal//EN"),
+ icalcomponent_vanew(
+ ICAL_VTIMEZONE_COMPONENT,
+ icalproperty_new_tzid("America/New_York"),
+ icalcomponent_vanew(
+ ICAL_XDAYLIGHT_COMPONENT,
+ icalproperty_new_dtstart(atime),
+ icalproperty_new_rdate(rtime),
+ icalproperty_new_tzoffsetfrom(-4.0),
+ icalproperty_new_tzoffsetto(-5.0),
+ icalproperty_new_tzname("EST"),
+ 0
+ ),
+ icalcomponent_vanew(
+ ICAL_XSTANDARD_COMPONENT,
+ icalproperty_new_dtstart(atime),
+ icalproperty_new_rdate(rtime),
+ icalproperty_new_tzoffsetfrom(-5.0),
+ icalproperty_new_tzoffsetto(-4.0),
+ icalproperty_new_tzname("EST"),
+ 0
+ ),
+ 0
+ ),
+ icalcomponent_vanew(
+ ICAL_VEVENT_COMPONENT,
+ icalproperty_new_dtstamp(atime),
+ icalproperty_new_uid("guid-1.host1.com"),
+ icalproperty_vanew_organizer(
+ "mrbig@host.com",
+ icalparameter_new_role(ICAL_ROLE_CHAIR),
+ 0
+ ),
+ icalproperty_vanew_attendee(
+ "employee-A@host.com",
+ icalparameter_new_role(ICAL_ROLE_REQPARTICIPANT),
+ icalparameter_new_rsvp(ICAL_RSVP_TRUE),
+ icalparameter_new_cutype(ICAL_CUTYPE_GROUP),
+ 0
+ ),
+ icalproperty_new_description("Project XYZ Review Meeting"),
+ icalproperty_new_categories("MEETING"),
+ icalproperty_new_class(ICAL_CLASS_PUBLIC),
+ icalproperty_new_created(atime),
+ icalproperty_new_summary("XYZ Project Review"),
+ icalproperty_vanew_dtstart(
+ atime,
+ icalparameter_new_tzid("America/New_York"),
+ 0
+ ),
+ icalproperty_vanew_dtend(
+ atime,
+ icalparameter_new_tzid("America/New_York"),
+ 0
+ ),
+ icalproperty_new_location("1CP Conference Room 4350"),
+ 0
+ ),
+ 0
+ );
+
+ ok("creating a complex vcalendar", (calendar != NULL));
+ if (VERBOSE && calendar)
+ printf("%s\n",icalcomponent_as_ical_string(calendar));
+
+ icalcomponent_free(calendar);
+
+}
+
+static void print_span(int c, struct icaltime_span span ){
+ printf("span-->%d, %d\n", (int)span.start, (int)span.end);
+ if (span.start == 0)
+ printf("#%02d start: (empty)\n",c);
+ else
+ printf("#%02d start: %s\n",c,ical_timet_string(span.start));
+
+ if (span.end == 0)
+ printf(" end : (empty)\n");
+ else
+ printf(" end : %s\n",ical_timet_string(span.end));
+
+}
+
+/** Test icalcomponent_get_span()
+ *
+ */
+void test_icalcomponent_get_span()
+{
+ time_t tm1 = 973378800; /*Sat Nov 4 23:00:00 UTC 2000,
+ Sat Nov 4 15:00:00 PST 2000 */
+ time_t tm2 = 973382400; /*Sat Nov 5 00:00:00 UTC 2000
+ Sat Nov 4 16:00:00 PST 2000 */
+ struct icaldurationtype dur;
+ struct icaltime_span span;
+ icalcomponent *c;
+ icaltimezone *azone, *bzone;
+ int tnum = 0;
+
+ /** test 0
+ * Direct assigning time_t means they will be interpreted as UTC
+ */
+ span.start = tm1;
+ span.end = tm2;
+ if (VERBOSE) print_span(tnum++,span);
+
+ /** test 1
+ * We specify times in a timezone, the returned span is in UTC
+ */
+ azone = icaltimezone_get_builtin_timezone("America/Los_Angeles");
+ c = icalcomponent_vanew(
+ ICAL_VEVENT_COMPONENT,
+ icalproperty_vanew_dtstart(
+ icaltime_from_timet_with_zone(tm1,0,azone),
+ icalparameter_new_tzid("America/Los_Angeles"),0),
+ icalproperty_vanew_dtend(
+ icaltime_from_timet_with_zone(tm2,0,azone),
+ icalparameter_new_tzid("America/Los_Angeles"),0),
+ 0
+ );
+
+ span = icalcomponent_get_span(c);
+ if (VERBOSE) print_span(tnum++,span);
+ int_is("America/Los_Angeles", span.start, 973407600);
+ icalcomponent_free(c);
+
+ /** test 2
+ * We specify times as floating, the returned span is in UTC
+ * with no conversion applied - so result should be as test 0
+ */
+ c = icalcomponent_vanew(
+ ICAL_VEVENT_COMPONENT,
+ icalproperty_vanew_dtstart(icaltime_from_timet(tm1,0),0),
+ icalproperty_vanew_dtend(icaltime_from_timet(tm2,0),0),
+ 0
+ );
+
+ span = icalcomponent_get_span(c);
+ if (VERBOSE) print_span(tnum++,span);
+ int_is("floating time", span.start, tm1);
+
+ icalcomponent_free(c);
+
+ /** test 3
+ * We specify times in a timezone, the returned span is in UTC
+ */
+ azone = icaltimezone_get_builtin_timezone("America/New_York");
+ c = icalcomponent_vanew(
+ ICAL_VEVENT_COMPONENT,
+ icalproperty_vanew_dtstart(
+ icaltime_from_timet_with_zone(tm1,0,azone),
+ icalparameter_new_tzid("America/New_York"),0),
+ icalproperty_vanew_dtend(
+ icaltime_from_timet_with_zone(tm2,0,azone),
+ icalparameter_new_tzid("America/New_York"),0),
+ 0
+ );
+
+ span = icalcomponent_get_span(c);
+ if (VERBOSE) print_span(tnum++,span);
+ int_is("America/New_York", span.start, 973396800);
+
+ icalcomponent_free(c);
+
+ /** test 4
+ * We specify times in two different timezones, the returned span
+ * is in UTC
+ */
+ azone = icaltimezone_get_builtin_timezone("America/New_York");
+ bzone = icaltimezone_get_builtin_timezone("America/Los_Angeles");
+ c = icalcomponent_vanew(
+ ICAL_VEVENT_COMPONENT,
+ icalproperty_vanew_dtstart(
+ icaltime_from_timet_with_zone(tm1,0,azone),
+ icalparameter_new_tzid("America/New_York"),0),
+ icalproperty_vanew_dtend(
+ icaltime_from_timet_with_zone(tm2,0,bzone),
+ icalparameter_new_tzid("America/Los_Angeles"),0),
+ 0
+ );
+
+ span = icalcomponent_get_span(c);
+ if (VERBOSE) print_span(tnum++,span);
+ int_is("America/New_York", span.start, 973396800);
+
+ icalcomponent_free(c);
+
+ /** test 5
+ * We specify start time in a timezone and a duration, the returned span
+ * is in UTC
+ */
+ azone = icaltimezone_get_builtin_timezone("America/Los_Angeles");
+ memset(&dur,0,sizeof(dur));
+ dur.minutes = 30;
+ c = icalcomponent_vanew(
+ ICAL_VEVENT_COMPONENT,
+ icalproperty_vanew_dtstart(
+ icaltime_from_timet_with_zone(tm1,0,azone),
+ icalparameter_new_tzid("America/Los_Angeles"),0),
+ icalproperty_new_duration(dur),
+
+ 0
+ );
+
+ span = icalcomponent_get_span(c);
+ if (VERBOSE) print_span(tnum++,span);
+ int_is("America/Los_Angeles w/ duration", span.end, 973409400);
+
+ icalcomponent_free(c);
+
+ icalerror_errors_are_fatal = 0;
+ /** test 6
+ * We specify only start time, should return a null span with no error
+ */
+ c = icalcomponent_vanew(
+ ICAL_VEVENT_COMPONENT,
+ icalproperty_new_dtstart(icaltime_from_timet(tm1,0)),
+ 0
+ );
+
+ span = icalcomponent_get_span(c);
+ if (VERBOSE) print_span(tnum++,span);
+ int_is("null span", span.start, 0);
+ icalcomponent_free(c);
+
+ /** test 7
+ * We specify start and end date
+ */
+ c = icalcomponent_vanew(
+ ICAL_VEVENT_COMPONENT,
+ icalproperty_new_dtstart(icaltime_from_timet(tm1,1)),
+ icalproperty_new_dtend(icaltime_from_timet(tm1,1)),
+ 0
+ );
+
+ span = icalcomponent_get_span(c);
+ if (VERBOSE) print_span(tnum++,span);
+ int_is("UTC", span.start, 973296000);
+ icalcomponent_free(c);
+
+ /** test 8
+ * We specify start and end date
+ */
+ c = icalcomponent_vanew(
+ ICAL_VEVENT_COMPONENT,
+ icalproperty_new_dtstart(icaltime_from_timet(tm1,1)),
+ icalproperty_new_dtend(icaltime_from_timet(tm2,1)),
+ 0
+ );
+
+ span = icalcomponent_get_span(c);
+ int_is("UTC #2", span.start, 973296000);
+ if (VERBOSE) print_span(tnum++,span);
+
+ icalcomponent_free(c);
+
+ /** test 9
+ * We specify start date
+ */
+ c = icalcomponent_vanew(
+ ICAL_VEVENT_COMPONENT,
+ icalproperty_new_dtstart(icaltime_from_timet(tm1,1)),
+ 0
+ );
+
+ span = icalcomponent_get_span(c);
+ if (VERBOSE) print_span(tnum++,span);
+ int_is("start date only", span.end, 973382399);
+
+ icalcomponent_free(c);
+
+ /* assert(icalerrno == ICAL_MALFORMEDDATA_ERROR); */
+ icalerror_errors_are_fatal = 1;
+}
diff --git a/libical/src/test/regression-cxx.cpp b/libical/src/test/regression-cxx.cpp
new file mode 100644
index 0000000000..e7605b8531
--- /dev/null
+++ b/libical/src/test/regression-cxx.cpp
@@ -0,0 +1,137 @@
+#include <stdio.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include "icalparameter_cxx.h"
+#include "icalproperty_cxx.h"
+#include "vcomponent.h"
+#include "regression.h"
+
+char content[] = "BEGIN:VCALENDAR\n\
+VERSION:2.1\n\
+BEGIN:VEVENT\n\
+UID:abcd12345\n\
+DTSTART:20020307T180000Z\n\
+DTEND:20020307T190000Z\n\
+SUMMARY:Important Meeting\n\
+END:VEVENT\n\
+END:VCALENDAR";
+
+void test_cxx(void)
+{
+ ICalProperty *summProp = new ICalProperty(ICAL_SUMMARY_PROPERTY);
+ ICalProperty *startProp = new ICalProperty(ICAL_DTSTART_PROPERTY);
+ ICalProperty *endProp = new ICalProperty(ICAL_DTEND_PROPERTY);
+ ICalProperty *locationProp = new ICalProperty(ICAL_LOCATION_PROPERTY);
+ ICalProperty *descProp = new ICalProperty(ICAL_DESCRIPTION_PROPERTY);
+
+ ok("Valid SUMMARY Property", (summProp != 0));
+ ok("Valid DTSTART Property", (startProp != 0));
+ ok("Valid DTEND Property", (endProp != 0));
+ ok("Valid LOCATION Property", (locationProp != 0));
+ ok("Valid DESCRIPTION Property", (descProp != 0));
+
+ struct icaltimetype starttime = icaltime_from_string("20011221T180000Z"); // UTC time ends in Z
+ struct icaltimetype endtime = icaltime_from_string("20020101T080000Z"); // UTC time ends in Z
+
+ summProp->set_summary("jon said: change dir to c:\\rest\\test\\nest to get the file called <foo.dat>\nthis should be in the next line.");
+ startProp->set_dtstart(starttime);
+ endProp->set_dtend(endtime);
+ locationProp->set_location("SF, California; Seattle, Washington");
+ descProp->set_description("The best cities on the west coast, hit 'NO' if you don't agree!\n");
+
+ VEvent *vEvent = new VEvent();
+
+ ok("Create a new VEvent", (vEvent!=0));
+
+ vEvent->add_property(summProp);
+ vEvent->add_property(startProp);
+ vEvent->add_property(endProp);
+ vEvent->add_property(locationProp);
+ vEvent->add_property(descProp);
+
+ //
+ is ("vEvent->get_summary()",
+ vEvent->get_summary(),
+ "jon said: change dir to c:\\rest\\test\\nest to get the file called <foo.dat>\nthis should be in the next line.");
+
+ is ("vEvent->get_dtstart()",
+ icaltime_as_ical_string(vEvent->get_dtstart()),
+ "20011221T180000Z");
+
+ is ("vEvent->get_dtend()",
+ icaltime_as_ical_string(vEvent->get_dtend()),
+ "20020101T080000Z");
+
+ ok ("vEvent->as_ical_string()",
+ (vEvent->as_ical_string() != 0));
+
+ if (VERBOSE) {
+ printf("Summary: %s\n", vEvent->get_summary());
+ printf("DTSTART: %s\n", icaltime_as_ical_string(vEvent->get_dtstart()));
+ printf("DTEND: %s\n", icaltime_as_ical_string(vEvent->get_dtend()));
+ printf("LOCATION: %s\n", vEvent->get_location());
+ printf("DESCRIPTION: %s\n", vEvent->get_description());
+
+ printf("vcomponent: %s", vEvent->as_ical_string());
+ }
+
+ VComponent ic(icalparser_parse_string((const char*)content));
+ ok("Parsing component", (ic.is_valid()));
+
+ if (VERBOSE)
+ printf("%s\n", ic.as_ical_string());
+
+ // component is wrapped within BEGIN:VCALENDAR END:VCALENDAR
+ // we need to unwrap it.
+
+ VEvent* sub_ic = dynamic_cast<VEvent*>(ic.get_first_component(ICAL_VEVENT_COMPONENT));
+
+ int_is("Getting VEvent subcomponent",
+ sub_ic->isa(),
+ ICAL_VEVENT_COMPONENT);
+
+ while (sub_ic != NULL) {
+ if (VERBOSE)
+ printf("subcomponent: %s\n", sub_ic->as_ical_string());
+
+ sub_ic = dynamic_cast<VEvent*>(ic.get_next_component(ICAL_VEVENT_COMPONENT));
+ }
+
+ VCalendar* cal = new VCalendar();
+ VAgenda* vAgenda = new VAgenda();
+
+ ok("Create a new VCalendar object", (cal != 0));
+ ok("Create a new VAgenda object", (vAgenda != 0));
+
+ ICalProperty* prop = new ICalProperty(ICAL_OWNER_PROPERTY);
+ prop->set_owner("fred@flintstone.net");
+ vAgenda->add_property(prop);
+
+ prop = new ICalProperty(ICAL_SUMMARY_PROPERTY);
+ prop->set_summary("CPMain");
+ vAgenda->add_property(prop);
+
+ prop = new ICalProperty(ICAL_TZID_PROPERTY);
+ prop->set_tzid("America/Los_Angeles");
+ vAgenda->add_property(prop);
+
+ cal->add_component(vAgenda);
+
+ ok("Complex VCALENDAR/VAGENDA", (cal->as_ical_string() != 0));
+
+ if (VERBOSE)
+ printf("vAgenda: %s\n", cal->as_ical_string());
+
+ int caughtException = 0;
+ try {
+ string foo = "HFHFHFHF";
+ VComponent v = VComponent(foo);
+ } catch (icalerrorenum err) {
+ if (err == ICAL_BADARG_ERROR) {
+ caughtException = 1;
+ }
+ }
+ int_is("Testing exception handling", caughtException, 1);
+
+}
+
diff --git a/libical/src/test/regression-recur.c b/libical/src/test/regression-recur.c
new file mode 100644
index 0000000000..85f643e964
--- /dev/null
+++ b/libical/src/test/regression-recur.c
@@ -0,0 +1,194 @@
+/* -*- Mode: C -*-
+ ======================================================================
+ FILE: regression-recur.c
+ CREATOR: ebusboom 8jun00
+
+ DESCRIPTION:
+
+ (C) COPYRIGHT 1999 Eric Busboom
+ http://www.softwarestudio.org
+
+ The contents of this file are subject to the Mozilla Public License
+ Version 1.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.mozilla.org/MPL/
+
+ Software distributed under the License is distributed on an "AS IS"
+ basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
+ the License for the specific language governing rights and
+ limitations under the License.
+
+ ======================================================================*/
+
+#include <assert.h>
+#include <string.h> /* for strdup */
+#include <stdlib.h> /* for malloc */
+#include <stdio.h> /* for printf */
+#include <time.h> /* for time() */
+#include <signal.h> /* for signal */
+#ifndef WIN32
+#include <unistd.h> /* for alarm */
+#endif
+
+#include "ical.h"
+#include "icalss.h"
+#include "regression.h"
+
+extern int VERBOSE;
+
+#ifdef WIN32
+#define snprintf _snprintf
+#define strcasecmp stricmp
+#endif
+
+
+static void sig_alrm(int i){
+ fprintf(stderr,"Could not get lock on file\n");
+ exit(1);
+}
+
+/* Get the expected result about the purpose of the property*/
+
+static int get_expected_numevents(icalcomponent *c)
+{
+ icalproperty *p;
+ const char* note = 0;
+ int num_events = 0;
+
+ if(c != 0){
+ for(p = icalcomponent_get_first_property(c,ICAL_X_PROPERTY);
+ p!= 0;
+ p = icalcomponent_get_next_property(c,ICAL_X_PROPERTY)){
+ if(strcmp(icalproperty_get_x_name(p),"X-EXPECT-NUMEVENTS")==0){
+ note = icalproperty_get_x(p);
+ }
+ }
+ }
+
+ if(note != 0){
+ num_events = atoi(note);
+ }
+
+
+ return num_events;
+}
+
+
+
+static void recur_callback(icalcomponent *comp,
+ struct icaltime_span *span,
+ void *data)
+{
+ int *num_recurs = data;
+
+ if (VERBOSE) {
+ printf("recur: %s", ctime(&span->start));
+ printf(" %s", ctime(&span->end));
+ }
+ *num_recurs = *num_recurs + 1;
+}
+
+void test_recur_file()
+{
+ icalset *cin = 0;
+ struct icaltimetype next;
+ icalcomponent *itr;
+ icalproperty *desc, *dtstart, *rrule;
+ struct icalrecurrencetype recur;
+ icalrecur_iterator* ritr;
+ time_t tt;
+ char* file;
+ int num_recurs_found = 0;
+
+ icalerror_set_error_state(ICAL_PARSE_ERROR, ICAL_ERROR_NONFATAL);
+
+#ifndef WIN32
+ signal(SIGALRM,sig_alrm);
+#endif
+ file = getenv("ICAL_RECUR_FILE");
+ if (!file)
+ file = "../../test-data/recur.txt";
+
+#ifndef WIN32
+ alarm(15); /* to get file lock */
+#endif
+ cin = icalfileset_new(file);
+#ifndef WIN32
+ alarm(0);
+#endif
+
+ ok("opening file with recurring events", (cin!=NULL));
+ assert(cin!=NULL);
+
+ for (itr = icalfileset_get_first_component(cin);
+ itr != 0;
+ itr = icalfileset_get_next_component(cin)){
+ int badcomp = 0;
+ int expected_events = 0;
+ char msg[128];
+
+
+ struct icaltimetype start = icaltime_null_time();
+ struct icaltimetype startmin = icaltime_from_timet(1,0);
+ struct icaltimetype endmax = icaltime_null_time();
+ const char *desc_str = "malformed component";
+
+ desc = icalcomponent_get_first_property(itr,ICAL_DESCRIPTION_PROPERTY);
+ dtstart = icalcomponent_get_first_property(itr,ICAL_DTSTART_PROPERTY);
+ rrule = icalcomponent_get_first_property(itr,ICAL_RRULE_PROPERTY);
+ if (desc) {
+ desc_str = icalproperty_get_description(desc);
+ }
+
+ ok((char*)desc_str, !(desc == 0 || dtstart == 0 || rrule == 0));
+
+ if (desc == 0 || dtstart == 0 || rrule == 0) {
+ badcomp = 1;
+ if (VERBOSE) {
+ printf("\n******** Error in input component ********\n");
+ printf("The following component is malformed:\n %s\n", desc_str);
+ }
+ continue;
+ }
+ if (VERBOSE) {
+ printf("\n\n#### %s\n",desc_str);
+ printf("#### %s\n",icalvalue_as_ical_string(icalproperty_get_value(rrule)));
+ }
+
+ recur = icalproperty_get_rrule(rrule);
+ start = icalproperty_get_dtstart(dtstart);
+
+ ritr = icalrecur_iterator_new(recur,start);
+
+ tt = icaltime_as_timet(start);
+
+ if (VERBOSE)
+ printf("#### %s\n",ctime(&tt ));
+
+ icalrecur_iterator_free(ritr);
+
+ for(ritr = icalrecur_iterator_new(recur,start),
+ next = icalrecur_iterator_next(ritr);
+ !icaltime_is_null_time(next);
+ next = icalrecur_iterator_next(ritr)){
+
+ tt = icaltime_as_timet(next);
+
+ if (VERBOSE)
+ printf(" %s",ctime(&tt ));
+
+ }
+
+ icalrecur_iterator_free(ritr);
+ num_recurs_found = 0;
+ expected_events = get_expected_numevents(itr);
+
+ icalcomponent_foreach_recurrence(itr, startmin, endmax,
+ recur_callback, &num_recurs_found);
+
+ sprintf(msg," expecting total of %d events", expected_events);
+ int_is(msg, num_recurs_found, expected_events);
+ }
+
+ icalset_free(cin);
+}
diff --git a/libical/src/test/regression-storage.c b/libical/src/test/regression-storage.c
new file mode 100644
index 0000000000..6f67c6c030
--- /dev/null
+++ b/libical/src/test/regression-storage.c
@@ -0,0 +1,804 @@
+/* -*- Mode: C -*-
+ ======================================================================
+ FILE: regression-storage.c
+ CREATOR: eric 03 April 1999
+
+ DESCRIPTION:
+
+ $Id$
+ $Locker$
+
+ (C) COPYRIGHT 1999 Eric Busboom
+ http://www.softwarestudio.org
+
+ The contents of this file are subject to the Mozilla Public License
+ Version 1.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.mozilla.org/MPL/
+
+ Software distributed under the License is distributed on an "AS IS"
+ basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
+ the License for the specific language governing rights and
+ limitations under the License.
+
+ The original author is Eric Busboom
+ The original code is usecases.c
+
+
+ ======================================================================*/
+
+#include <assert.h>
+#include <string.h> /* for strdup */
+#include <stdlib.h> /* for malloc */
+#include <stdio.h> /* for printf */
+#include <time.h> /* for time() */
+
+#include "ical.h"
+#include "icalss.h"
+#include "regression.h"
+
+#define OUTPUT_FILE "filesetout.ics"
+
+/* define sample calendar struct */
+struct calendar {
+ int ID;
+ int total_size;
+
+ /* offsets */
+ int total_size_offset;
+ int vcalendar_size_offset;
+ int vcalendar_offset;
+ int title_size_offset;
+ int title_offset;
+
+ /* data */
+ int vcalendar_size;
+ char *vcalendar;
+
+ int title_size;
+ char *title;
+
+};
+
+int vcalendar_init(struct calendar **cal, char *vcalendar, char *title);
+
+#ifdef WITH_BDB
+#include <db.h>
+
+int get_title(DB *dbp, const DBT *pkey, const DBT *pdata, DBT *skey);
+char * parse_vcalendar(const DBT *dbt) ;
+char * pack_calendar(struct calendar *cal, int size);
+struct calendar * unpack_calendar(char *str, int size);
+#endif
+
+static char str[] = "BEGIN:VCALENDAR\n\
+PRODID:\"-//RDU Software//NONSGML HandCal//EN\"\n\
+VERSION:2.0\n\
+BEGIN:VTIMEZONE\n\
+TZID:US-Eastern\n\
+BEGIN:STANDARD\n\
+DTSTART:19981025T020000\n\
+RDATE:19981025T020000\n\
+TZOFFSETFROM:-0400\n\
+TZOFFSETTO:-0500\n\
+TZNAME:EST\n\
+END:STANDARD\n\
+BEGIN:DAYLIGHT\n\
+DTSTART:19990404T020000\n\
+RDATE:19990404T020000\n\
+TZOFFSETFROM:-0500\n\
+TZOFFSETTO:-0400\n\
+TZNAME:EDT\n\
+END:DAYLIGHT\n\
+END:VTIMEZONE\n\
+BEGIN:VEVENT\n\
+DTSTAMP:19980309T231000Z\n\
+UID:guid-1.host1.com\n\
+ORGANIZER;ROLE=CHAIR:MAILTO:mrbig@host.com\n\
+ATTENDEE;RSVP=TRUE;ROLE=REQ-PARTICIPANT;CUTYPE=GROUP:MAILTO:employee-A@host.com\n\
+DESCRIPTION:Project XYZ Review Meeting\n\
+CATEGORIES:MEETING\n\
+CLASS:PUBLIC\n\
+CREATED:19980309T130000Z\n\
+SUMMARY:XYZ Project Review\n\
+DTSTART;TZID=US-Eastern:19980312T083000\n\
+DTEND;TZID=US-Eastern:19980312T093000\n\
+LOCATION:1CP Conference Room 4350\n\
+END:VEVENT\n\
+BEGIN:BOOGA\n\
+DTSTAMP:19980309T231000Z\n\
+X-LIC-FOO:Booga\n\
+DTSTOMP:19980309T231000Z\n\
+UID:guid-1.host1.com\n\
+END:BOOGA\n\
+END:VCALENDAR";
+
+char str2[] = "BEGIN:VCALENDAR\n\
+PRODID:\"-//RDU Software//NONSGML HandCal//EN\"\n\
+VERSION:2.0\n\
+BEGIN:VEVENT\n\
+DTSTAMP:19980309T231000Z\n\
+UID:guid-1.host1.com\n\
+ORGANIZER;ROLE=CHAIR:MAILTO:mrbig@host.com\n\
+ATTENDEE;RSVP=TRUE;ROLE=REQ-PARTICIPANT;CUTYPE=GROUP:MAILTO:employee-A@host.com\n\
+DESCRIPTION:Project XYZ Review Meeting\n\
+CATEGORIES:MEETING\n\
+CLASS:PUBLIC\n\
+CREATED:19980309T130000Z\n\
+SUMMARY:XYZ Project Review\n\
+DTSTART;TZID=US-Eastern:19980312T083000\n\
+DTEND;TZID=US-Eastern:19980312T093000\n\
+LOCATION:1CP Conference Room 4350\n\
+END:VEVENT\n\
+END:VCALENDAR\n\
+";
+
+
+void test_fileset_extended(void)
+{
+ icalset *cout;
+ int month = 0;
+ int count=0;
+ struct icaltimetype start, end;
+ icalcomponent *c,*clone, *itr;
+ icalsetiter iter;
+
+ start = icaltime_from_timet( time(0),0);
+ end = start;
+ end.hour++;
+
+ cout = icalfileset_new(OUTPUT_FILE);
+ ok("Opening output file", (cout != 0));
+ assert(cout!=0);
+
+ c = icalparser_parse_string(str2);
+ ok("Parsing str2", (c!=0));
+ assert(c != 0);
+
+ icalset_free(cout);
+
+ /* Add data to the file */
+
+ for(month = 1; month < 10; month++){
+ icalcomponent *event;
+ icalproperty *dtstart, *dtend;
+
+ cout = icalfileset_new(OUTPUT_FILE);
+ ok("Opening output file", (cout != 0));
+ assert(cout != 0);
+
+ start.month = month;
+ end.month = month;
+
+ clone = icalcomponent_new_clone(c);
+ ok("Making clone of output file", (clone!=0));
+ assert(clone !=0);
+
+ event = icalcomponent_get_first_component(clone,ICAL_VEVENT_COMPONENT);
+ ok("Getting first event from clone", (event!=0));
+ assert(event != 0);
+
+ dtstart = icalcomponent_get_first_property(event,ICAL_DTSTART_PROPERTY);
+ ok("find DTSTART", (dtstart !=0));
+ assert(dtstart!=0);
+
+ icalproperty_set_dtstart(dtstart,start);
+
+ dtend = icalcomponent_get_first_property(event,ICAL_DTEND_PROPERTY);
+ ok("find DTEND", (dtend !=0));
+
+ assert(dtend!=0);
+
+ icalproperty_set_dtend(dtend,end);
+
+ icalfileset_add_component(cout,clone);
+ icalfileset_commit(cout);
+
+ icalset_free(cout);
+ }
+
+ /* Print them out */
+
+ cout = icalfileset_new(OUTPUT_FILE);
+
+ ok("Opening output file", (cout != 0));
+ assert(cout != 0);
+
+ for (iter = icalfileset_begin_component(cout, ICAL_ANY_COMPONENT, 0);
+ icalsetiter_deref(&iter) != 0; icalsetiter_next(&iter)) {
+ icalcomponent *event;
+ icalproperty *dtstart, *dtend;
+
+ itr = icalsetiter_deref(&iter);
+ count++;
+
+ event = icalcomponent_get_first_component(itr,ICAL_VEVENT_COMPONENT);
+
+ dtstart = icalcomponent_get_first_property(event,ICAL_DTSTART_PROPERTY);
+ dtend = icalcomponent_get_first_property(event,ICAL_DTEND_PROPERTY);
+
+ if (VERBOSE)
+ printf("%d %s %s\n",count, icalproperty_as_ical_string(dtstart),
+ icalproperty_as_ical_string(dtend));
+
+ }
+
+ /* Remove all of them */
+
+ icalset_free(cout);
+
+ cout = icalfileset_new(OUTPUT_FILE);
+ ok("Opening output file", (cout!=0));
+ assert(cout != 0);
+
+ /* need to advance the iterator first before calling remove_componenet() */
+ /* otherwise, iter will contain a "removed" component and icalsetiter_next(&iter) */
+ /* will fail. */
+
+ iter = icalfileset_begin_component(cout, ICAL_ANY_COMPONENT, 0);
+ itr = icalsetiter_deref(&iter);
+ while (itr != 0) {
+ icalsetiter_next(&iter);
+ icalfileset_remove_component(cout, itr);
+ icalcomponent_free(itr);
+ itr = icalsetiter_deref(&iter);
+ }
+
+ icalset_free(cout);
+
+ /* Print them out again */
+
+ cout = icalfileset_new(OUTPUT_FILE);
+ ok("Opening output file", (cout != 0));
+ assert(cout != 0);
+ count =0;
+
+ for (itr = icalfileset_get_first_component(cout);
+ itr != 0;
+ itr = icalfileset_get_next_component(cout)){
+
+ icalcomponent *event;
+ icalproperty *dtstart, *dtend;
+
+ count++;
+
+ event = icalcomponent_get_first_component(itr,ICAL_VEVENT_COMPONENT);
+
+ dtstart = icalcomponent_get_first_property(event,ICAL_DTSTART_PROPERTY);
+ dtend = icalcomponent_get_first_property(event,ICAL_DTEND_PROPERTY);
+
+ printf("%d %s %s\n",count, icalproperty_as_ical_string(dtstart),
+ icalproperty_as_ical_string(dtend));
+
+ }
+
+ icalset_free(cout);
+ icalcomponent_free(c);
+}
+
+
+#ifdef WITH_BDB
+
+/*
+ In this example, we're storing a calendar with several components
+ under the reference id "calendar_7286" and retrieving records based
+ on title, "month_1" through "month_10". We use a number of the
+ "optional" arguments to specify secondary indices, sub-databases
+ (i.e. having multiple databases residing within a single Berkeley
+ DB file), and keys for storage and retrieval.
+*/
+
+void test_bdbset()
+{
+ icalset *cout;
+ int month = 0;
+ int count=0;
+ int num_components=0;
+ int szdata_len=0;
+ int ret=0;
+ char *subdb, *szdata, *szpacked_data;
+ char uid[255];
+ struct icaltimetype start, end;
+ icalcomponent *c,*clone, *itr;
+ DBT key, data;
+ DBC *dbcp;
+
+ struct calendar *cal;
+ int cal_size;
+
+ return; // for now... TODO fix these broken tests..
+
+
+
+ start = icaltime_from_timet( time(0),0);
+ end = start;
+ end.hour++;
+
+ /* Note: as per the Berkeley DB ref pages:
+ *
+ * The database argument is optional, and allows applications to
+ * have multiple databases in a single file. Although no database
+ * argument needs to be specified, it is an error to attempt to
+ * open a second database in a file that was not initially created
+ * using a database name.
+ *
+ */
+
+ subdb = "calendar_id";
+
+ /* open database, using subdb */
+ cout = icalbdbset_new("calendar.db", ICALBDB_EVENTS, DB_HASH, 0);
+ /*
+ sdbp = icalbdbset_secondary_open(dbp,
+ DATABASE,
+ "title",
+ get_title,
+ DB_HASH);
+ */
+
+ c = icalparser_parse_string(str2);
+
+ assert(c != 0);
+
+ /* Add data to the file */
+
+ for(month = 1; month < 10; month++){
+ icalcomponent *event;
+ icalproperty *dtstart, *dtend, *location;
+
+ /* retrieve data */
+ // cout = icalbdbset_new(dbp, sdbp, NULL);
+ // assert(cout != 0);
+
+ start.month = month;
+ end.month = month;
+
+ clone = icalcomponent_new_clone(c);
+ assert(clone !=0);
+ event = icalcomponent_get_first_component(clone,
+ ICAL_VEVENT_COMPONENT);
+ assert(event != 0);
+
+ dtstart = icalcomponent_get_first_property(event,
+ ICAL_DTSTART_PROPERTY);
+ assert(dtstart!=0);
+ icalproperty_set_dtstart(dtstart,start);
+
+ dtend = icalcomponent_get_first_property(event,ICAL_DTEND_PROPERTY);
+ assert(dtend!=0);
+ icalproperty_set_dtend(dtend,end);
+
+ location = icalcomponent_get_first_property(event, ICAL_LOCATION_PROPERTY);
+ assert(location!=0);
+
+#if 0
+ /* change the uid to include the month */
+ sprintf(uid, "%s_%d", icalcomponent_get_uid(clone), month);
+ icalcomponent_set_uid(clone, uid);
+#endif
+
+ icalbdbset_add_component(cout,clone);
+
+ /* commit changes */
+ icalbdbset_commit(cout);
+
+ num_components = icalcomponent_count_components(clone, ICAL_ANY_COMPONENT);
+
+ icalset_free(cout);
+
+ }
+
+ /* try out the cursor operations */
+ memset(&key, 0, sizeof(DBT));
+ memset(&data, 0, sizeof(DBT));
+
+#if 0
+ ret = icalbdbset_acquire_cursor(dbp, &dbcp);
+ ret = icalbdbset_get_first(dbcp, &key, &data);
+ ret = icalbdbset_get_next(dbcp, &key, &data);
+ ret = icalbdbset_get_last(dbcp, &key, &data);
+#endif
+ /* Print them out */
+
+ for(month = 1, count=0; month < 10; month++){
+ char *title;
+
+ icalcomponent *event;
+ icalproperty *dtstart, *dtend;
+
+ for (itr = icalbdbset_get_first_component(cout);
+ itr != 0;
+ itr = icalbdbset_get_next_component(cout)){
+
+ icalcomponent *event;
+ icalproperty *dtstart, *dtend;
+
+ count++;
+
+ event = icalcomponent_get_first_component(itr,ICAL_VEVENT_COMPONENT);
+
+ dtstart = icalcomponent_get_first_property(event,ICAL_DTSTART_PROPERTY);
+ dtend = icalcomponent_get_first_property(event,ICAL_DTEND_PROPERTY);
+
+ printf("%d %s %s\n",count, icalproperty_as_ical_string(dtstart),
+ icalproperty_as_ical_string(dtend));
+
+ }
+ icalset_free(cout);
+ }
+
+ /* open database */
+ // cout = icalbdbset_bdb_open("calendar.db", "title", DB_HASH, 0644);
+ /* sdbp = icalbdbset_secondary_open(dbp,
+ DATABASE,
+ "title",
+ get_title,
+ DB_HASH);
+ */
+ /* Remove all of them */
+ for(month = 1; month < 10; month++){
+ for (itr = icalbdbset_get_first_component(cout);
+ itr != 0;
+ itr = icalbdbset_get_next_component(cout)){
+
+ icalbdbset_remove_component(cout, itr);
+ }
+
+ icalbdbset_commit(cout);
+ icalset_free(cout);
+
+ }
+
+ /* Print them out again */
+
+ for(month = 1, count=0; month < 10; month++){
+ char *title;
+
+ icalcomponent *event;
+ icalproperty *dtstart, *dtend;
+
+ for (itr = icalbdbset_get_first_component(cout);
+ itr != 0;
+ itr = icalbdbset_get_next_component(cout)){
+
+ icalcomponent *event;
+ icalproperty *dtstart, *dtend;
+
+ count++;
+
+ event = icalcomponent_get_first_component(itr,ICAL_VEVENT_COMPONENT);
+
+ dtstart = icalcomponent_get_first_property(event,ICAL_DTSTART_PROPERTY);
+ dtend = icalcomponent_get_first_property(event,ICAL_DTEND_PROPERTY);
+
+ printf("%d %s %s\n",count, icalproperty_as_ical_string(dtstart),
+ icalproperty_as_ical_string(dtend));
+
+ }
+ icalset_free(cout);
+ }
+}
+#endif
+
+int vcalendar_init(struct calendar **rcal, char *vcalendar, char *title)
+{
+ int vcalendar_size, title_size, total_size;
+ struct calendar *cal;
+
+ if(vcalendar)
+ vcalendar_size = strlen(vcalendar);
+ else {
+ vcalendar = "";
+ vcalendar_size = strlen(vcalendar);
+ }
+
+ if(title)
+ title_size = strlen(title);
+ else {
+ title = "";
+ title_size = strlen(title);
+ }
+
+ total_size = sizeof(struct calendar) + vcalendar_size + title_size;
+
+ if((cal = (struct calendar *)malloc(total_size))==NULL)
+ return 0;
+ memset(cal, 0, total_size);
+
+ /* offsets */
+ cal->total_size_offset = sizeof(int);
+ cal->vcalendar_size_offset = (sizeof(int) * 7);
+ cal->vcalendar_offset = cal->vcalendar_size_offset + sizeof(int);
+ cal->title_size_offset = cal->vcalendar_offset + vcalendar_size;
+ cal->title_offset = cal->title_size_offset + sizeof(int);
+
+ /* sizes */
+ cal->total_size = total_size;
+ cal->vcalendar_size = vcalendar_size;
+ cal->title_size = title_size;
+
+ if (vcalendar && *vcalendar)
+ cal->vcalendar = strdup(vcalendar);
+
+ if (title && *title)
+ cal->title = strdup(title);
+
+ *rcal = cal;
+
+ return 0;
+}
+
+/* get_title -- extracts a secondary key (the vcalendar)
+ * from a primary key/data pair */
+
+/* just create a random title for now */
+#ifdef WITH_BDB
+
+int get_title(DB *dbp, const DBT *pkey, const DBT *pdata, DBT *skey)
+{
+ icalcomponent *cl;
+ char title[255];
+
+ memset(skey, 0, sizeof(DBT));
+
+ cl = icalparser_parse_string((char *)pdata->data);
+ sprintf(title, "title_%s", icalcomponent_get_uid(cl));
+
+ skey->data = strdup(title);
+ skey->size = strlen(skey->data);
+ return (0);
+}
+
+char * pack_calendar(struct calendar *cal, int size)
+{
+ char *str;
+
+ if((str = (char *)malloc(sizeof(char) * size))==NULL)
+ return 0;
+
+ /* ID */
+ memcpy(str, &cal->ID, sizeof(cal->ID));
+
+ /* total_size */
+ memcpy(str + cal->total_size_offset,
+ &cal->total_size,
+ sizeof(cal->total_size));
+
+ /* vcalendar_size */
+ memcpy(str + cal->vcalendar_size_offset,
+ &cal->vcalendar_size,
+ sizeof(cal->vcalendar_size));
+
+ /* vcalendar */
+ memcpy(str + cal->vcalendar_offset,
+ cal->vcalendar,
+ cal->vcalendar_size);
+
+ /* title_size */
+ memcpy(str + cal->title_size_offset,
+ &cal->title_size,
+ sizeof(cal->title_size));
+
+ /* title */
+ memcpy(str + cal->title_offset,
+ cal->title,
+ cal->title_size);
+
+ return str;
+}
+
+struct calendar * unpack_calendar(char *str, int size)
+{
+ struct calendar *cal;
+ if((cal = (struct calendar *) malloc(size))==NULL)
+ return 0;
+ memset(cal, 0, size);
+
+ /* offsets */
+ cal->total_size_offset = sizeof(int);
+ cal->vcalendar_size_offset = (sizeof(int) * 7);
+ cal->vcalendar_offset = cal->vcalendar_size_offset + sizeof(int);
+
+ /* ID */
+ memcpy(&cal->ID, str, sizeof(cal->ID));
+
+ /* total_size */
+ memcpy(&cal->total_size,
+ str + cal->total_size_offset,
+ sizeof(cal->total_size));
+
+ /* vcalendar_size */
+ memcpy(&cal->vcalendar_size,
+ str + cal->vcalendar_size_offset,
+ sizeof(cal->vcalendar_size));
+
+ if((cal->vcalendar = (char *)malloc(sizeof(char) *
+ cal->vcalendar_size))==NULL)
+ return 0;
+
+ /* vcalendar */
+ memcpy(cal->vcalendar,
+ (char *)(str + cal->vcalendar_offset),
+ cal->vcalendar_size);
+
+ cal->title_size_offset = cal->vcalendar_offset + cal->vcalendar_size;
+ cal->title_offset = cal->title_size_offset + sizeof(int);
+
+ /* title_size */
+ memcpy(&cal->title_size,
+ str + cal->title_size_offset,
+ sizeof(cal->title_size));
+
+ if((cal->title = (char *)malloc(sizeof(char) *
+ cal->title_size))==NULL)
+ return 0;
+
+ /* title*/
+ memcpy(cal->title,
+ (char *)(str + cal->title_offset),
+ cal->title_size);
+
+ return cal;
+}
+
+char * parse_vcalendar(const DBT *dbt)
+{
+ char *str;
+ struct calendar *cal;
+
+ str = (char *)dbt->data;
+ cal = unpack_calendar(str, dbt->size);
+
+ return cal->vcalendar;
+}
+#endif
+
+void test_dirset_extended(void)
+{
+
+ icalcomponent *c;
+ icalgauge *gauge;
+ icalerrorenum error;
+ icalcomponent *itr;
+ icalset* cluster;
+ struct icalperiodtype rtime;
+ icalset *s = icaldirset_new("store");
+ icalset *s2 = icaldirset_new("store-new");
+ int i, count = 0;
+
+ ok("Open dirset 'store'", (s!=0));
+ assert(s != 0);
+
+ rtime.start = icaltime_from_timet( time(0),0);
+
+ cluster = icalfileset_new(OUTPUT_FILE);
+
+ ok("Open fileset to duplicate 4 times", (cluster != 0));
+ assert(cluster != 0);
+
+#define NUMCOMP 4
+
+ /* Duplicate every component in the cluster NUMCOMP times */
+
+ icalerror_clear_errno();
+
+ for (i = 1; i<NUMCOMP+1; i++){
+
+ /*rtime.start.month = i%12;*/
+ rtime.start.month = i;
+ rtime.end = rtime.start;
+ rtime.end.hour++;
+
+ for (itr = icalfileset_get_first_component(cluster);
+ itr != 0;
+ itr = icalfileset_get_next_component(cluster)){
+ icalcomponent *clone, *inner;
+ icalproperty *p;
+
+ inner = icalcomponent_get_first_component(itr,ICAL_VEVENT_COMPONENT);
+ if (inner == 0){
+ continue;
+ }
+
+ /* Change the dtstart and dtend times in the component
+ pointed to by Itr*/
+
+ clone = icalcomponent_new_clone(itr);
+ inner = icalcomponent_get_first_component(itr,ICAL_VEVENT_COMPONENT);
+
+ ok("Duplicating component...",
+ (icalerrno == ICAL_NO_ERROR)&&(inner!=0));
+
+ assert(icalerrno == ICAL_NO_ERROR);
+ assert(inner !=0);
+
+ /* DTSTART*/
+ p = icalcomponent_get_first_property(inner,ICAL_DTSTART_PROPERTY);
+ ok("Fetching DTSTART", (icalerrno == ICAL_NO_ERROR));
+ assert(icalerrno == ICAL_NO_ERROR);
+
+ if (p == 0){
+ p = icalproperty_new_dtstart(rtime.start);
+ icalcomponent_add_property(inner,p);
+ } else {
+ icalproperty_set_dtstart(p,rtime.start);
+ }
+
+ ok("Adding DTSTART property", (icalerrno == ICAL_NO_ERROR));
+ assert(icalerrno == ICAL_NO_ERROR);
+
+ /* DTEND*/
+ p = icalcomponent_get_first_property(inner,ICAL_DTEND_PROPERTY);
+ ok("Fetching DTEND property", (icalerrno == ICAL_NO_ERROR));
+ assert(icalerrno == ICAL_NO_ERROR);
+
+ if (p == 0){
+ p = icalproperty_new_dtstart(rtime.end);
+ icalcomponent_add_property(inner,p);
+ } else {
+ icalproperty_set_dtstart(p,rtime.end);
+ }
+ ok("Setting DTEND property", (icalerrno == ICAL_NO_ERROR));
+ assert(icalerrno == ICAL_NO_ERROR);
+
+ if (VERBOSE)
+ printf("\n----------\n%s\n---------\n",icalcomponent_as_ical_string(inner));
+
+ error = icaldirset_add_component(s,
+ icalcomponent_new_clone(itr));
+
+ ok("Adding component to dirset", (icalerrno == ICAL_NO_ERROR));
+ assert(icalerrno == ICAL_NO_ERROR);
+ }
+
+ }
+
+ gauge = icalgauge_new_from_sql("SELECT * FROM VEVENT WHERE VEVENT.SUMMARY = 'Submit Income Taxes' OR VEVENT.SUMMARY = 'Bastille Day Party'", 0);
+
+ ok("Creating complex Gauge", (gauge!=0));
+
+ icaldirset_select(s,gauge);
+
+ for(c = icaldirset_get_first_component(s); c != 0;
+ c = icaldirset_get_next_component(s)){
+
+ printf("Got one! (%d)\n", count++);
+
+ if (c != 0){
+ printf("%s", icalcomponent_as_ical_string(c));;
+ if (icaldirset_add_component(s2,c) == 0){
+ printf("Failed to write!\n");
+ }
+ icalcomponent_free(c);
+ } else {
+ printf("Failed to get component\n");
+ }
+ }
+
+ icalset_free(s2);
+
+ for(c = icaldirset_get_first_component(s);
+ c != 0;
+ c = icaldirset_get_next_component(s)){
+
+ if (c != 0){
+ printf("%s", icalcomponent_as_ical_string(c));;
+ } else {
+ printf("Failed to get component\n");
+ }
+
+ }
+
+ /* Remove all of the components */
+ i=0;
+ while((c=icaldirset_get_current_component(s)) != 0 ){
+ i++;
+
+ icaldirset_remove_component(s,c);
+ }
+
+
+ icalset_free(s);
+ icalset_free(cluster);
+}
+
diff --git a/libical/src/test/regression-utils.c b/libical/src/test/regression-utils.c
new file mode 100644
index 0000000000..edc1eddba3
--- /dev/null
+++ b/libical/src/test/regression-utils.c
@@ -0,0 +1,169 @@
+#include "ical.h"
+
+#include <stdlib.h> /* abort() */
+#include <string.h> /* strcmp() */
+
+static char ictt_str[1024];
+int VERBOSE = 0;
+int QUIET = 0;
+
+const char* ical_timet_string(const time_t t)
+{
+ struct tm stm = *(gmtime(&t));
+
+ sprintf(ictt_str,"%02d-%02d-%02d %02d:%02d:%02d Z",stm.tm_year+1900,
+ stm.tm_mon+1,stm.tm_mday,stm.tm_hour,stm.tm_min,stm.tm_sec);
+
+ return ictt_str;
+
+}
+
+const char* ictt_as_string(struct icaltimetype t)
+{
+ const char *zone = icaltimezone_get_tzid((icaltimezone *)t.zone);
+
+ if (icaltime_is_utc(t))
+ sprintf(ictt_str,"%02d-%02d-%02d %02d:%02d:%02d Z UTC",
+ t.year,t.month,t.day, t.hour,t.minute,t.second);
+ else
+ sprintf(ictt_str,"%02d-%02d-%02d %02d:%02d:%02d %s",
+ t.year,t.month,t.day, t.hour,t.minute,t.second,
+ zone == NULL? "(floating)": zone);
+
+ return ictt_str;
+}
+
+char* icaltime_as_ctime(struct icaltimetype t)
+{
+ time_t tt;
+
+ tt = icaltime_as_timet(t);
+ sprintf(ictt_str,"%s",ctime(&tt));
+
+ return ictt_str;
+}
+
+
+/** This variable is used to control whether we core dump on errors **/
+static int die_on_errors = 0;
+static int testnumber = 0;
+static int failed = 0;
+static int current_set = 0;
+
+static struct {int set; int test;} failed_tests[1024];
+
+void die_on_errors_set(int val) {
+ die_on_errors = 1;
+}
+
+void _ok(char* test_name, int success, char *file, int linenum, char *test) {
+ testnumber++;
+
+ if (!QUIET || (QUIET && !success))
+ printf("%sok %d - %s\n", (success)?"" : "not ", testnumber, test_name);
+ if (!success) {
+ failed_tests[failed].set = current_set;
+ failed_tests[failed].test = testnumber;
+ failed++;
+
+ printf("# test failed: \"%s\"\n", test);
+ printf("# at: %s:%-d\n", file, linenum);
+ }
+
+ if (die_on_errors == 1 && !success) {
+ abort();
+ }
+}
+
+void _is(char* test_name, const char* str1, const char* str2, char *file, int linenum) {
+ int diff;
+
+ if (str1 == NULL || str2 == NULL) {
+ diff = 1;
+ } else {
+ diff = strcmp(str1, str2);
+ }
+
+ if (!test_name) test_name = "()";
+
+ _ok(test_name, (diff==0), file, linenum, "");
+
+ if (diff) {
+ printf("# got: %s\n", str1 ? str1 : "(null)");
+ printf("# expected: %s\n", str2 ? str2 : "(null)");
+ }
+}
+
+void _int_is(char* test_name, int i1, int i2, char *file, int linenum) {
+ _ok(test_name, (i1==i2), file, linenum, "");
+
+ if (i1!=i2) {
+ printf("# got: %d\n", i1);
+ printf("# expected: %d\n", i2);
+ }
+}
+
+
+void verbose(int newval) {
+ VERBOSE = newval;
+}
+
+void test_start(int numtests) {
+ if (numtests) {
+ if (!QUIET)
+ printf("1..%-d\n", numtests);
+ } else {
+ if (!QUIET)
+ printf("1..\n");
+ }
+}
+
+void test_header(char *header, int set) {
+ if (!QUIET)
+ printf("########## %-40s (%d) ##########\n", header, set);
+ current_set = set;
+}
+
+void test_end(void) {
+ int pct;
+
+ if (failed) {
+ int i, oldset = 0;
+
+ pct = ((testnumber - failed)*100)/testnumber;
+ printf("\n Failed %d/%d tests, %2d%% okay\n", failed, testnumber, pct);
+ printf("\n Failed tests:\n ");
+ for (i = 0; i < failed; i++) {
+ int this_set = failed_tests[i].set;
+ char *prefix = "";
+ if (this_set != oldset) {
+ prefix = "\n ";
+ oldset = this_set;
+ }
+
+ printf("%s%d/%d ", prefix, this_set, failed_tests[i].test);
+ }
+ printf("\n");
+
+ } else {
+ printf("\n All Tests Successful.\n");
+ }
+}
+
+
+void test_run(char *test_name,
+ void (*test_fcn)(void),
+ int do_test, int headeronly)
+{
+ static int test_set = 1;
+
+ if (headeronly || do_test == 0 || do_test == test_set)
+ test_header(test_name, test_set);
+
+ if (!headeronly && (do_test==0 || do_test == test_set)) {
+ (*test_fcn)();
+ if (!QUIET)
+ printf("\n");
+ }
+ test_set++;
+}
diff --git a/libical/src/test/regression.c b/libical/src/test/regression.c
index 08696207f2..1e9fc8e2c5 100644
--- a/libical/src/test/regression.c
+++ b/libical/src/test/regression.c
@@ -29,16 +29,27 @@
#include "ical.h"
#include "icalss.h"
+#include "icalvcal.h"
+
+#include "regression.h"
#include <assert.h>
#include <string.h> /* for strdup */
#include <stdlib.h> /* for malloc */
#include <stdio.h> /* for printf */
#include <time.h> /* for time() */
+#ifndef WIN32
#include <unistd.h> /* for unlink, fork */
#include <sys/wait.h> /* For waitpid */
-#include <sys/types.h> /* For wait pid */
#include <sys/time.h> /* for select */
+#else
+#include <Windows.h>
+#endif
+#include <sys/types.h> /* For wait pid */
+
+#ifdef WIN32
+typedef int pid_t;
+#endif
/* For GNU libc, strcmp appears to be a macro, so using strcmp in
@@ -52,11 +63,11 @@ int regrstrcmp(const char* a, const char* b){
/* This example creates and minipulates the ical object that appears
* in rfc 2445, page 137 */
-char str[] = "BEGIN:VCALENDAR\
+static char str[] = "BEGIN:VCALENDAR\
PRODID:\"-//RDU Software//NONSGML HandCal//EN\"\
VERSION:2.0\
BEGIN:VTIMEZONE\
-TZID:US-Eastern\
+TZID:America/New_York\
BEGIN:STANDARD\
DTSTART:19981025T020000\
RDATE:19981025T020000\
@@ -82,8 +93,8 @@ CATEGORIES:MEETING\
CLASS:PUBLIC\
CREATED:19980309T130000Z\
SUMMARY:XYZ Project Review\
-DTSTART;TZID=US-Eastern:19980312T083000\
-DTEND;TZID=US-Eastern:19980312T093000\
+DTSTART;TZID=America/New_York:19980312T083000\
+DTEND;TZID=America/New_York:19980312T093000\
LOCATION:1CP Conference Room 4350\
END:VEVENT\
BEGIN:BOOGA\
@@ -95,336 +106,10 @@ END:BOOGA\
END:VCALENDAR";
-icalcomponent* create_simple_component()
-{
-
- icalcomponent* calendar;
- struct icalperiodtype rtime;
-
- rtime.start = icaltime_from_timet( time(0),0);
- rtime.end = icaltime_from_timet( time(0),0);
-
- rtime.end.hour++;
-
-
-
- /* Create calendar and add properties */
- calendar = icalcomponent_new(ICAL_VCALENDAR_COMPONENT);
-
-
- icalcomponent_add_property(
- calendar,
- icalproperty_new_version("2.0")
- );
-
- printf("%s\n",icalcomponent_as_ical_string(calendar));
-
- return calendar;
-
-}
-
-/* Create a new component */
-icalcomponent* create_new_component()
-{
-
- icalcomponent* calendar;
- icalcomponent* timezone;
- icalcomponent* tzc;
- icalcomponent* event;
- struct icaltimetype atime = icaltime_from_timet( time(0),0);
- struct icaldatetimeperiodtype rtime;
- icalproperty* property;
-
- rtime.period.start = icaltime_from_timet( time(0),0);
- rtime.period.end = icaltime_from_timet( time(0),0);
- rtime.period.end.hour++;
- rtime.time = icaltime_null_time();
-
-
-
- /* Create calendar and add properties */
- calendar = icalcomponent_new(ICAL_VCALENDAR_COMPONENT);
-
-
- icalcomponent_add_property(
- calendar,
- icalproperty_new_version("2.0")
- );
-
- icalcomponent_add_property(
- calendar,
- icalproperty_new_prodid("-//RDU Software//NONSGML HandCal//EN")
- );
-
- /* Create a timezone object and add it to the calendar */
-
- timezone = icalcomponent_new(ICAL_VTIMEZONE_COMPONENT);
-
- icalcomponent_add_property(
- timezone,
- icalproperty_new_tzid("US_Eastern")
- );
-
- /* Add a sub-component of the timezone */
- tzc = icalcomponent_new(ICAL_XDAYLIGHT_COMPONENT);
-
- icalcomponent_add_property(
- tzc,
- icalproperty_new_dtstart(atime)
- );
-
- icalcomponent_add_property(
- tzc,
- icalproperty_new_rdate(rtime)
- );
-
- icalcomponent_add_property(
- tzc,
- icalproperty_new_tzoffsetfrom(-4.0)
- );
-
- icalcomponent_add_property(
- tzc,
- icalproperty_new_tzoffsetto(-5.0)
- );
-
- icalcomponent_add_property(
- tzc,
- icalproperty_new_tzname("EST")
- );
-
- icalcomponent_add_component(timezone,tzc);
-
- icalcomponent_add_component(calendar,timezone);
-
- /* Add a second subcomponent */
- tzc = icalcomponent_new(ICAL_XSTANDARD_COMPONENT);
-
- icalcomponent_add_property(
- tzc,
- icalproperty_new_dtstart(atime)
- );
-
- icalcomponent_add_property(
- tzc,
- icalproperty_new_rdate(rtime)
- );
-
- icalcomponent_add_property(
- tzc,
- icalproperty_new_tzoffsetfrom(-4.0)
- );
-
- icalcomponent_add_property(
- tzc,
- icalproperty_new_tzoffsetto(-5.0)
- );
-
- icalcomponent_add_property(
- tzc,
- icalproperty_new_tzname("EST")
- );
-
- icalcomponent_add_component(timezone,tzc);
-
- /* Add an event */
-
- event = icalcomponent_new(ICAL_VEVENT_COMPONENT);
-
- icalcomponent_add_property(
- event,
- icalproperty_new_dtstamp(atime)
- );
-
- icalcomponent_add_property(
- event,
- icalproperty_new_uid("guid-1.host1.com")
- );
-
- /* add a property that has parameters */
- property = icalproperty_new_organizer("mrbig@host.com");
-
- icalproperty_add_parameter(
- property,
- icalparameter_new_role(ICAL_ROLE_CHAIR)
- );
-
- icalcomponent_add_property(event,property);
-
- /* add another property that has parameters */
- property = icalproperty_new_attendee("employee-A@host.com");
-
- icalproperty_add_parameter(
- property,
- icalparameter_new_role(ICAL_ROLE_REQPARTICIPANT)
- );
-
- icalproperty_add_parameter(
- property,
- icalparameter_new_rsvp(ICAL_RSVP_TRUE)
- );
-
- icalproperty_add_parameter(
- property,
- icalparameter_new_cutype(ICAL_CUTYPE_GROUP)
- );
-
- icalcomponent_add_property(event,property);
-
-
- /* more properties */
-
- icalcomponent_add_property(
- event,
- icalproperty_new_description("Project XYZ Review Meeting")
- );
-
- icalcomponent_add_property(
- event,
- icalproperty_new_categories("MEETING")
- );
-
- icalcomponent_add_property(
- event,
- icalproperty_new_class("PUBLIC")
- );
-
- icalcomponent_add_property(
- event,
- icalproperty_new_created(atime)
- );
-
- icalcomponent_add_property(
- event,
- icalproperty_new_summary("XYZ Project Review")
- );
-
-
- property = icalproperty_new_dtstart(atime);
-
- icalproperty_add_parameter(
- property,
- icalparameter_new_tzid("US-Eastern")
- );
-
- icalcomponent_add_property(event,property);
-
-
- property = icalproperty_new_dtend(atime);
-
- icalproperty_add_parameter(
- property,
- icalparameter_new_tzid("US-Eastern")
- );
-
- icalcomponent_add_property(event,property);
-
- icalcomponent_add_property(
- event,
- icalproperty_new_location("1CP Conference Room 4350")
- );
-
- icalcomponent_add_component(calendar,event);
-
- printf("%s\n",icalcomponent_as_ical_string(calendar));
-
- icalcomponent_free(calendar);
-
- return 0;
-}
-
-
-/* Create a new component, using the va_args list */
-
-icalcomponent* create_new_component_with_va_args()
-{
-
- icalcomponent* calendar;
- struct icaltimetype atime = icaltime_from_timet( time(0),0);
- struct icaldatetimeperiodtype rtime;
-
- rtime.period.start = icaltime_from_timet( time(0),0);
- rtime.period.end = icaltime_from_timet( time(0),0);
- rtime.period.end.hour++;
- rtime.time = icaltime_null_time();
-
- calendar =
- icalcomponent_vanew(
- ICAL_VCALENDAR_COMPONENT,
- icalproperty_new_version("2.0"),
- icalproperty_new_prodid("-//RDU Software//NONSGML HandCal//EN"),
- icalcomponent_vanew(
- ICAL_VTIMEZONE_COMPONENT,
- icalproperty_new_tzid("US_Eastern"),
- icalcomponent_vanew(
- ICAL_XDAYLIGHT_COMPONENT,
- icalproperty_new_dtstart(atime),
- icalproperty_new_rdate(rtime),
- icalproperty_new_tzoffsetfrom(-4.0),
- icalproperty_new_tzoffsetto(-5.0),
- icalproperty_new_tzname("EST"),
- 0
- ),
- icalcomponent_vanew(
- ICAL_XSTANDARD_COMPONENT,
- icalproperty_new_dtstart(atime),
- icalproperty_new_rdate(rtime),
- icalproperty_new_tzoffsetfrom(-5.0),
- icalproperty_new_tzoffsetto(-4.0),
- icalproperty_new_tzname("EST"),
- 0
- ),
- 0
- ),
- icalcomponent_vanew(
- ICAL_VEVENT_COMPONENT,
- icalproperty_new_dtstamp(atime),
- icalproperty_new_uid("guid-1.host1.com"),
- icalproperty_vanew_organizer(
- "mrbig@host.com",
- icalparameter_new_role(ICAL_ROLE_CHAIR),
- 0
- ),
- icalproperty_vanew_attendee(
- "employee-A@host.com",
- icalparameter_new_role(ICAL_ROLE_REQPARTICIPANT),
- icalparameter_new_rsvp(ICAL_RSVP_TRUE),
- icalparameter_new_cutype(ICAL_CUTYPE_GROUP),
- 0
- ),
- icalproperty_new_description("Project XYZ Review Meeting"),
- icalproperty_new_categories("MEETING"),
- icalproperty_new_class("PUBLIC"),
- icalproperty_new_created(atime),
- icalproperty_new_summary("XYZ Project Review"),
- icalproperty_vanew_dtstart(
- atime,
- icalparameter_new_tzid("US-Eastern"),
- 0
- ),
- icalproperty_vanew_dtend(
- atime,
- icalparameter_new_tzid("US-Eastern"),
- 0
- ),
- icalproperty_new_location("1CP Conference Room 4350"),
- 0
- ),
- 0
- );
-
- printf("%s\n",icalcomponent_as_ical_string(calendar));
-
-
- icalcomponent_free(calendar);
-
- return 0;
-}
-
/* Return a list of all attendees who are required. */
-char** get_required_attendees(icalproperty* event)
+static char** get_required_attendees(icalcomponent* event)
{
icalproperty* p;
icalparameter* parameter;
@@ -435,8 +120,8 @@ char** get_required_attendees(icalproperty* event)
attendees = malloc(max * (sizeof (char *)));
- assert(event != 0);
- assert(icalcomponent_isa(event) == ICAL_VEVENT_COMPONENT);
+ ok("event is non null", (event != 0));
+ int_is("event is a VEVENT", icalcomponent_isa(event), ICAL_VEVENT_COMPONENT);
for(
p = icalcomponent_get_first_property(event,ICAL_ATTENDEE_PROPERTY);
@@ -464,7 +149,7 @@ char** get_required_attendees(icalproperty* event)
/* If an attendee has a PARTSTAT of NEEDSACTION or has no PARTSTAT
parameter, change it to TENTATIVE. */
-void update_attendees(icalproperty* event)
+static void update_attendees(icalcomponent* event)
{
icalproperty* p;
icalparameter* parameter;
@@ -490,7 +175,7 @@ void update_attendees(icalproperty* event)
} else if (icalparameter_get_partstat(parameter) == ICAL_PARTSTAT_NEEDSACTION) {
- icalproperty_remove_parameter(p,ICAL_PARTSTAT_PARAMETER);
+ icalproperty_remove_parameter_by_ref(p,parameter);
icalparameter_free(parameter);
@@ -510,75 +195,99 @@ void test_values()
icalvalue *copy;
v = icalvalue_new_caladdress("cap://value/1");
- printf("caladdress 1: %s\n",icalvalue_get_caladdress(v));
+
+ is("icalvalue_new_caladdress()",
+ icalvalue_get_caladdress(v), "cap://value/1");
+
icalvalue_set_caladdress(v,"cap://value/2");
- printf("caladdress 2: %s\n",icalvalue_get_caladdress(v));
- printf("String: %s\n",icalvalue_as_ical_string(v));
-
+
+ is("icalvalue_set_caladdress()",
+ icalvalue_get_caladdress(v), "cap://value/2");
+
+ is("icalvalue_as_ical_string()",
+ icalvalue_as_ical_string(v), "cap://value/2");
+
copy = icalvalue_new_clone(v);
- printf("Clone: %s\n",icalvalue_as_ical_string(v));
+
+ is("icalvalue_new_clone()",
+ icalvalue_as_ical_string(copy), "cap://value/2");
icalvalue_free(v);
icalvalue_free(copy);
v = icalvalue_new_boolean(1);
- printf("caladdress 1: %d\n",icalvalue_get_boolean(v));
+ int_is("icalvalue_new_boolean(1)", icalvalue_get_boolean(v), 1);
icalvalue_set_boolean(v,2);
- printf("caladdress 2: %d\n",icalvalue_get_boolean(v));
- printf("String: %s\n",icalvalue_as_ical_string(v));
+ ok("icalvalue_set_boolean(2)", (2 == icalvalue_get_boolean(v)));
+ is("icalvalue_as_ical_string()", icalvalue_as_ical_string(v), "2");
copy = icalvalue_new_clone(v);
- printf("Clone: %s\n",icalvalue_as_ical_string(v));
+ is("icalvalue_new_clone()", icalvalue_as_ical_string(copy), "2");
+
icalvalue_free(v);
icalvalue_free(copy);
- v = icalvalue_new_date(icaltime_from_timet( time(0),0));
- printf("date 1: %s\n",icalvalue_as_ical_string(v));
- icalvalue_set_date(v,icaltime_from_timet( time(0)+3600,0));
- printf("date 2: %s\n",icalvalue_as_ical_string(v));
+ v = icalvalue_new_x("test");
+ is("icalvalue_new_x(test)", icalvalue_get_x(v), "test");
+ icalvalue_set_x(v, "test2");
+ is("icalvalue_set_x(test2)", icalvalue_get_x(v), "test2");
+ is("icalvalue_as_ical_string()", icalvalue_as_ical_string(v), "test2");
copy = icalvalue_new_clone(v);
- printf("Clone: %s\n",icalvalue_as_ical_string(v));
+ is("icalvalue_new_clone()", icalvalue_as_ical_string(copy), "test2");
+
+ icalvalue_free(v);
+ icalvalue_free(copy);
+
+
+ v = icalvalue_new_date(icaltime_from_timet( 1023404802,0));
+ is("icalvalue_new_date()", icalvalue_as_ical_string(v), "20020606T230642");
+ icalvalue_set_date(v,icaltime_from_timet( 1023404802-3600,0));
+ is("icalvalue_set_date()",icalvalue_as_ical_string(v), "20020606T220642");
+
+ copy = icalvalue_new_clone(v);
+ is("icalvalue_new_clone()",icalvalue_as_ical_string(v), "20020606T220642");
+
icalvalue_free(v);
icalvalue_free(copy);
v = icalvalue_new(-1);
- printf("Invalid type: %p\n",v);
+ ok("icalvalue_new(-1), Invalid type", (v == NULL));
if (v!=0) icalvalue_free(v);
- assert(ICAL_BOOLEAN_VALUE ==
- icalparameter_value_to_value_kind(ICAL_VALUE_BOOLEAN));
- assert(ICAL_UTCOFFSET_VALUE ==
- icalparameter_value_to_value_kind(ICAL_VALUE_UTCOFFSET));
- assert(ICAL_RECUR_VALUE ==
- icalparameter_value_to_value_kind(ICAL_VALUE_RECUR));
- assert(ICAL_CALADDRESS_VALUE ==
- icalparameter_value_to_value_kind(ICAL_VALUE_CALADDRESS));
- assert(ICAL_PERIOD_VALUE ==
- icalparameter_value_to_value_kind(ICAL_VALUE_PERIOD));
- assert(ICAL_BINARY_VALUE ==
- icalparameter_value_to_value_kind(ICAL_VALUE_BINARY));
- assert(ICAL_TEXT_VALUE ==
- icalparameter_value_to_value_kind(ICAL_VALUE_TEXT));
- assert(ICAL_DURATION_VALUE ==
- icalparameter_value_to_value_kind(ICAL_VALUE_DURATION));
- assert(ICAL_INTEGER_VALUE == icalparameter_value_to_value_kind(ICAL_VALUE_INTEGER));
- assert(ICAL_TIME_VALUE ==
- icalparameter_value_to_value_kind(ICAL_VALUE_TIME));
- assert(ICAL_URI_VALUE ==
- icalparameter_value_to_value_kind(ICAL_VALUE_URI));
- assert(ICAL_FLOAT_VALUE ==
- icalparameter_value_to_value_kind(ICAL_VALUE_FLOAT));
- assert(ICAL_X_VALUE ==
- icalparameter_value_to_value_kind(ICAL_VALUE_X));
- assert(ICAL_DATETIME_VALUE ==
- icalparameter_value_to_value_kind(ICAL_VALUE_DATETIME));
- assert(ICAL_DATE_VALUE ==
- icalparameter_value_to_value_kind(ICAL_VALUE_DATE));
+ ok("ICAL_BOOLEAN_VALUE",(ICAL_BOOLEAN_VALUE ==
+ icalparameter_value_to_value_kind(ICAL_VALUE_BOOLEAN)));
+ ok("ICAL_UTCOFFSET_VALUE",(ICAL_UTCOFFSET_VALUE ==
+ icalparameter_value_to_value_kind(ICAL_VALUE_UTCOFFSET)));
+ ok("ICAL_RECUR_VALUE", (ICAL_RECUR_VALUE ==
+ icalparameter_value_to_value_kind(ICAL_VALUE_RECUR)));
+ ok("ICAL_CALADDRESS_VALUE",(ICAL_CALADDRESS_VALUE ==
+ icalparameter_value_to_value_kind(ICAL_VALUE_CALADDRESS)));
+ ok("ICAL_PERIOD_VALUE", (ICAL_PERIOD_VALUE ==
+ icalparameter_value_to_value_kind(ICAL_VALUE_PERIOD)));
+ ok("ICAL_BINARY_VALUE",(ICAL_BINARY_VALUE ==
+ icalparameter_value_to_value_kind(ICAL_VALUE_BINARY)));
+ ok("ICAL_TEXT_VALUE",(ICAL_TEXT_VALUE ==
+ icalparameter_value_to_value_kind(ICAL_VALUE_TEXT)));
+ ok("ICAL_DURATION_VALUE",(ICAL_DURATION_VALUE ==
+ icalparameter_value_to_value_kind(ICAL_VALUE_DURATION)));
+ ok("ICAL_INTEGER_VALUE",
+ (ICAL_INTEGER_VALUE == icalparameter_value_to_value_kind(ICAL_VALUE_INTEGER)));
+
+ ok("ICAL_URI_VALUE",
+ (ICAL_URI_VALUE == icalparameter_value_to_value_kind(ICAL_VALUE_URI)));
+ ok("ICAL_FLOAT_VALUE",(ICAL_FLOAT_VALUE ==
+ icalparameter_value_to_value_kind(ICAL_VALUE_FLOAT)));
+ ok("ICAL_X_VALUE",(ICAL_X_VALUE ==
+ icalparameter_value_to_value_kind(ICAL_VALUE_X)));
+ ok("ICAL_DATETIME_VALUE",(ICAL_DATETIME_VALUE ==
+ icalparameter_value_to_value_kind(ICAL_VALUE_DATETIME)));
+ ok("ICAL_DATE_TIME",(ICAL_DATE_VALUE ==
+ icalparameter_value_to_value_kind(ICAL_VALUE_DATE)));
/* v = icalvalue_new_caladdress(0);
@@ -586,14 +295,29 @@ void test_values()
if (v!=0) icalvalue_free(v); */
+ icalerror_set_error_state(ICAL_MALFORMEDDATA_ERROR, ICAL_ERROR_NONFATAL);
+ v = icalvalue_new_from_string(ICAL_RECUR_VALUE,"D2 #0");
+ ok("illegal recur value", (v == 0));
+
+ v = icalvalue_new_from_string(ICAL_TRIGGER_VALUE,"Gonk");
+ ok("illegal trigger value", (v == 0));
+
+ v = icalvalue_new_from_string(ICAL_REQUESTSTATUS_VALUE,"Gonk");
+ ok("illegal requeststatus value", (v == 0));
+
+ icalerror_set_error_state(ICAL_MALFORMEDDATA_ERROR, ICAL_ERROR_DEFAULT);
}
+
void test_properties()
{
icalproperty *prop;
icalparameter *param;
icalproperty *clone;
+ char test_cn_str[128] = "";
+ char *test_cn_str_good = "A Common Name 1A Common Name 2A Common Name 3A Common Name 4";
+ char *test_ical_str_good = "COMMENT;CN=A Common Name 1;CN=A Common Name 2;CN=A Common Name 3;CN=A \n Common Name 4:Another Comment\n";
prop = icalproperty_vanew_comment(
"Another Comment",
@@ -606,38 +330,56 @@ void test_properties()
for(param = icalproperty_get_first_parameter(prop,ICAL_ANY_PARAMETER);
param != 0;
param = icalproperty_get_next_parameter(prop,ICAL_ANY_PARAMETER)) {
-
- printf("Prop parameter: %s\n",icalparameter_get_cn(param));
+ const char *str = icalparameter_get_cn(param);
+ if (VERBOSE) printf("Prop parameter: %s\n",icalparameter_get_cn(param));
+ strcat(test_cn_str, str);
}
+ is("fetching parameters", test_cn_str, test_cn_str_good);
- printf("Prop value: %s\n",icalproperty_get_comment(prop));
-
+ if (VERBOSE) printf("Prop value: %s\n",icalproperty_get_comment(prop));
+ is("icalproperty_get_comment()",
+ icalproperty_get_comment(prop), "Another Comment");
- printf("As iCAL string:\n %s\n",icalproperty_as_ical_string(prop));
+ if (VERBOSE) printf("As iCAL string:\n %s\n",icalproperty_as_ical_string(prop));
+
+ is("icalproperty_as_ical_string()",
+ icalproperty_as_ical_string(prop), test_ical_str_good);
clone = icalproperty_new_clone(prop);
- printf("Clone:\n %s\n",icalproperty_as_ical_string(prop));
+ if (VERBOSE) printf("Clone:\n %s\n",icalproperty_as_ical_string(prop));
+ is("icalproperty_new_clone()",
+ icalproperty_as_ical_string(prop), test_ical_str_good);
icalproperty_free(clone);
icalproperty_free(prop);
prop = icalproperty_new(-1);
- printf("Invalid type: %p\n",prop);
+ ok("test icalproperty_new() with invalid type (-1)",
+ (prop == NULL));
if (prop!=0) icalproperty_free(prop);
+}
- /*
- prop = icalproperty_new_method(0);
+void test_utf8()
+{
+ icalproperty *prop;
+ char *utf8text = "aáóaáóaáóaáóaáóaáóaáóaáóaáóaáóaáóaáóaáóaáóaáóaáóaáóaáóaáóaáóaáóaáóaáóaáóaáóaáóaáóaáóaáóaáóaáóaáóaáóaáóaáóaáóaáóaáóaá";
+ char *test_ical_str_good = "DESCRIPTION:\n"
+" aáóaáóaáóaáóaáóaáóaáóaáóaáóaáóaáóaáóaáóaáóaá\n"
+" óaáóaáóaáóaáóaáóaáóaáóaáóaáóaáóaáóaáóaáóaáóa\n"
+" áóaáóaáóaáóaáóaáóaáóaáóaáóaá\n";
- printf("Bad string: %p\n",prop);
-
+ prop = icalproperty_new_description(utf8text);
- if (prop!=0) icalproperty_free(prop);
- */
+ is("icalproperty_as_ical_string()",
+ icalproperty_as_ical_string(prop), test_ical_str_good);
+ icalproperty_free(prop);
}
+
+
void test_parameters()
{
icalparameter *p;
@@ -648,47 +390,55 @@ void test_parameters()
p = icalparameter_new_cn(str1);
- printf("Common Name: %s\n",icalparameter_get_cn(p));
-
- assert(regrstrcmp(str1,icalparameter_get_cn(p)) == 0);
-
- printf("As String: %s\n",icalparameter_as_ical_string(p));
-
- assert(regrstrcmp(icalparameter_as_ical_string(p),"CN=A Common Name")==0);
-
+ is("icalparameter_new_cn()", icalparameter_get_cn(p), str1);
+ is("icalparameter_as_ical_string()" ,icalparameter_as_ical_string(p),"CN=A Common Name");
+
icalparameter_free(p);
-
p = icalparameter_new_from_string("PARTSTAT=ACCEPTED");
- assert(icalparameter_isa(p) == ICAL_PARTSTAT_PARAMETER);
- assert(icalparameter_get_partstat(p) == ICAL_PARTSTAT_ACCEPTED);
+ ok("PARTSTAT_PARAMETER", (icalparameter_isa(p) == ICAL_PARTSTAT_PARAMETER));
+ ok("PARTSTAT_ACCEPTED", (icalparameter_get_partstat(p) == ICAL_PARTSTAT_ACCEPTED));
+
+ icalparameter_free(p);
p = icalparameter_new_from_string("ROLE=CHAIR");
- assert(icalparameter_isa(p) == ICAL_ROLE_PARAMETER);
- assert(icalparameter_get_partstat(p) == ICAL_ROLE_CHAIR);
+
+ ok("ROLE_PARAMETER", (icalparameter_isa(p) == ICAL_ROLE_PARAMETER));
+ ok("ROLE_CHAIR", (icalparameter_get_partstat(p) == ICAL_ROLE_CHAIR));
+
+ icalparameter_free(p);
p = icalparameter_new_from_string("PARTSTAT=X-FOO");
- assert(icalparameter_isa(p) == ICAL_PARTSTAT_PARAMETER);
- assert(icalparameter_get_partstat(p) == ICAL_PARTSTAT_X);
+ ok("PARTSTAT_PARAMETER", (icalparameter_isa(p) == ICAL_PARTSTAT_PARAMETER));
+ ok("PARTSTAT_X", (icalparameter_get_partstat(p) == ICAL_PARTSTAT_X));
+
+ icalparameter_free(p);
p = icalparameter_new_from_string("X-PARAM=X-FOO");
- assert(icalparameter_isa(p) == ICAL_X_PARAMETER);
+ ok("X_PARAMETER", (icalparameter_isa(p) == ICAL_X_PARAMETER));
+
+ icalparameter_free(p);
for (i=0;enums[i] != -1; i++){
-
- printf("%s\n",icalparameter_enum_to_string(enums[i]));
- assert(icalparameter_string_to_enum(
- icalparameter_enum_to_string(enums[i]))==enums[i]);
+ if (VERBOSE) printf("%s\n",icalparameter_enum_to_string(enums[i]));
+ ok("test paramter enums",
+ (icalparameter_string_to_enum(icalparameter_enum_to_string(enums[i]))==enums[i]));
}
-
-
}
+char *good_child =
+"BEGIN:VEVENT\n"
+"VERSION:2.0\n"
+"DESCRIPTION:This is an event\n"
+"COMMENT;CN=A Common Name 1;CN=A Common Name 2;CN=A Common Name 3;CN=A \n"
+" Common Name 4:Another Comment\n"
+"X-LIC-ERROR;X-LIC-ERRORTYPE=COMPONENT-PARSE-ERROR:This is only a test\n"
+"END:VEVENT\n";
+
void test_components()
{
-
icalcomponent* c;
icalcomponent* child;
@@ -721,16 +471,24 @@ void test_components()
0
);
- printf("Original Component:\n%s\n\n",icalcomponent_as_ical_string(c));
+ if (VERBOSE)
+ printf("Original Component:\n%s\n\n",icalcomponent_as_ical_string(c));
child = icalcomponent_get_first_component(c,ICAL_VEVENT_COMPONENT);
-
- printf("Child Component:\n%s\n\n",icalcomponent_as_ical_string(child));
- icalcomponent_free(c);
+ ok("test icalcomponent_get_first_component()",
+ (child != NULL));
+
+ if (VERBOSE)
+ printf("Child Component:\n%s\n\n",icalcomponent_as_ical_string(child));
+ is("test results of child component",
+ icalcomponent_as_ical_string(child), good_child);
+
+ icalcomponent_free(c);
}
+
void test_memory()
{
size_t bufsize = 256;
@@ -792,19 +550,23 @@ void test_memory()
icalmemory_append_string(&f, &p, &bufsize, b8);
- printf("1: %p %s \n",b1,b1);
- printf("2: %p %s\n",b2,b2);
- printf("3: %p %s\n",b3,b3);
- printf("4: %p %s\n",b4,b4);
- printf("5: %p %s\n",b5,b5);
- printf("6: %p %s\n",b6,b6);
- printf("7: %p %s\n",b7,b7);
- printf("8: %p %s\n",b8,b8);
-
-
- printf("Final: %s\n", f);
+ if (VERBOSE) {
+ printf("1: %p %s \n",b1,b1);
+ printf("2: %p %s\n",b2,b2);
+ printf("3: %p %s\n",b3,b3);
+ printf("4: %p %s\n",b4,b4);
+ printf("5: %p %s\n",b5,b5);
+ printf("6: %p %s\n",b6,b6);
+ printf("7: %p %s\n",b7,b7);
+ printf("8: %p %s\n",b8,b8);
+
+
+ printf("Final: %s\n", f);
+
+ printf("Final buffer size: %d\n",bufsize);
+ }
- printf("Final buffer size: %d\n",bufsize);
+ ok("final buffer size == 806", (bufsize == 806));
free(f);
@@ -816,46 +578,49 @@ void test_memory()
p = f;
icalmemory_append_char(&f, &p, &bufsize, 'a');
- printf("Char-by-Char buffer: %s\n", f);
+ if (VERBOSE) printf("Char-by-Char buffer: %s\n", f);
+
icalmemory_append_char(&f, &p, &bufsize, 'b');
- printf("Char-by-Char buffer: %s\n", f);
+ if (VERBOSE) printf("Char-by-Char buffer: %s\n", f);
icalmemory_append_char(&f, &p, &bufsize, 'c');
- printf("Char-by-Char buffer: %s\n", f);
+ if (VERBOSE) printf("Char-by-Char buffer: %s\n", f);
icalmemory_append_char(&f, &p, &bufsize, 'd');
- printf("Char-by-Char buffer: %s\n", f);
+ if (VERBOSE) printf("Char-by-Char buffer: %s\n", f);
icalmemory_append_char(&f, &p, &bufsize, 'e');
- printf("Char-by-Char buffer: %s\n", f);
+ if (VERBOSE) printf("Char-by-Char buffer: %s\n", f);
icalmemory_append_char(&f, &p, &bufsize, 'f');
- printf("Char-by-Char buffer: %s\n", f);
+ if (VERBOSE) printf("Char-by-Char buffer: %s\n", f);
icalmemory_append_char(&f, &p, &bufsize, 'g');
- printf("Char-by-Char buffer: %s\n", f);
+ if (VERBOSE) printf("Char-by-Char buffer: %s\n", f);
icalmemory_append_char(&f, &p, &bufsize, 'h');
- printf("Char-by-Char buffer: %s\n", f);
+ if (VERBOSE) printf("Char-by-Char buffer: %s\n", f);
icalmemory_append_char(&f, &p, &bufsize, 'i');
- printf("Char-by-Char buffer: %s\n", f);
+ if (VERBOSE) printf("Char-by-Char buffer: %s\n", f);
icalmemory_append_char(&f, &p, &bufsize, 'j');
- printf("Char-by-Char buffer: %s\n", f);
+ if (VERBOSE) printf("Char-by-Char buffer: %s\n", f);
icalmemory_append_char(&f, &p, &bufsize, 'a');
- printf("Char-by-Char buffer: %s\n", f);
+ if (VERBOSE) printf("Char-by-Char buffer: %s\n", f);
icalmemory_append_char(&f, &p, &bufsize, 'b');
- printf("Char-by-Char buffer: %s\n", f);
+ if (VERBOSE) printf("Char-by-Char buffer: %s\n", f);
icalmemory_append_char(&f, &p, &bufsize, 'c');
- printf("Char-by-Char buffer: %s\n", f);
+ if (VERBOSE) printf("Char-by-Char buffer: %s\n", f);
icalmemory_append_char(&f, &p, &bufsize, 'd');
- printf("Char-by-Char buffer: %s\n", f);
+ if (VERBOSE) printf("Char-by-Char buffer: %s\n", f);
icalmemory_append_char(&f, &p, &bufsize, 'e');
- printf("Char-by-Char buffer: %s\n", f);
+ if (VERBOSE) printf("Char-by-Char buffer: %s\n", f);
icalmemory_append_char(&f, &p, &bufsize, 'f');
- printf("Char-by-Char buffer: %s\n", f);
+ if (VERBOSE) printf("Char-by-Char buffer: %s\n", f);
icalmemory_append_char(&f, &p, &bufsize, 'g');
- printf("Char-by-Char buffer: %s\n", f);
+ if (VERBOSE) printf("Char-by-Char buffer: %s\n", f);
icalmemory_append_char(&f, &p, &bufsize, 'h');
- printf("Char-by-Char buffer: %s\n", f);
+ if (VERBOSE) printf("Char-by-Char buffer: %s\n", f);
icalmemory_append_char(&f, &p, &bufsize, 'i');
- printf("Char-by-Char buffer: %s\n", f);
+ if (VERBOSE) printf("Char-by-Char buffer: %s\n", f);
icalmemory_append_char(&f, &p, &bufsize, 'j');
- printf("Char-by-Char buffer: %s\n", f);
-
+ if (VERBOSE) printf("Char-by-Char buffer: %s\n", f);
+
+ free(f);
+
for(i=0; i<100; i++){
f = icalmemory_tmp_buffer(bufsize);
@@ -867,16 +632,26 @@ void test_memory()
}
-int test_store()
+void test_dirset()
{
-
- icalcomponent *c, *gauge;
+ icalcomponent *c;
+ icalgauge *gauge;
icalerrorenum error;
icalcomponent *next, *itr;
- icalfileset* cluster;
+ icalset* cluster;
+ icalset *s, *s2;
struct icalperiodtype rtime;
- icaldirset *s = icaldirset_new("store");
int i;
+ int count = 0;
+
+ mkdir("store", 0755);
+ mkdir("store-new", 0755);
+
+ s = icaldirset_new("store");
+ s2 = icaldirset_new("store-new");
+
+ ok("opening 'store' dirset", s!=NULL);
+ ok("opening 'store-new' dirset", s2!=NULL);
rtime.start = icaltime_from_timet( time(0),0);
@@ -884,7 +659,6 @@ int test_store()
if (cluster == 0){
printf("Failed to create cluster: %s\n",icalerror_strerror(icalerrno));
- return 0;
}
#define NUMCOMP 4
@@ -911,7 +685,6 @@ int test_store()
continue;
}
- assert(itr != 0);
/* Change the dtstart and dtend times in the component
pointed to by Itr*/
@@ -949,42 +722,19 @@ int test_store()
error = icaldirset_add_component(s,clone);
assert(icalerrno == ICAL_NO_ERROR);
-
}
-
}
- gauge =
- icalcomponent_vanew(
- ICAL_VCALENDAR_COMPONENT,
- icalcomponent_vanew(
- ICAL_VEVENT_COMPONENT,
- icalproperty_vanew_summary(
- "Submit Income Taxes",
- icalparameter_new_xliccomparetype(ICAL_XLICCOMPARETYPE_EQUAL),
- 0),
- 0),
- icalcomponent_vanew(
- ICAL_VEVENT_COMPONENT,
- icalproperty_vanew_summary(
- "Bastille Day Party",
- icalparameter_new_xliccomparetype(ICAL_XLICCOMPARETYPE_EQUAL),
- 0),
- 0),
- 0);
-
-#if 0
-
+ gauge = icalgauge_new_from_sql("SELECT * FROM VEVENT WHERE VEVENT.SUMMARY = 'Submit Income Taxes' OR VEVENT.SUMMARY = 'Bastille Day Party'", 0);
icaldirset_select(s,gauge);
- for(c = icaldirset_first(s); c != 0; c = icaldirset_next(s)){
-
+ for(c = icaldirset_get_first_component(s); c != 0; c = icaldirset_get_next_component(s)){
printf("Got one! (%d)\n", count++);
if (c != 0){
printf("%s", icalcomponent_as_ical_string(c));;
- if (icaldirset_store(s2,c) == 0){
+ if (icaldirset_add_component(s2,c) == 0){
printf("Failed to write!\n");
}
icalcomponent_free(c);
@@ -994,9 +744,7 @@ int test_store()
}
- icaldirset_free(s2);
-#endif
-
+ icalset_free(s2);
for(c = icaldirset_get_first_component(s);
c != 0;
@@ -1010,51 +758,70 @@ int test_store()
} else {
printf("Failed to get component\n");
}
-
-
}
- icaldirset_free(s);
- return 0;
+ icalset_free(s);
+ icalset_free(cluster);
}
-int test_compare()
+
+void test_compare()
{
icalvalue *v1, *v2;
v1 = icalvalue_new_caladdress("cap://value/1");
v2 = icalvalue_new_clone(v1);
- printf("%d\n",icalvalue_compare(v1,v2));
+ ok("compare value and clone",
+ (icalvalue_compare(v1,v2) == ICAL_XLICCOMPARETYPE_EQUAL));
+
+ icalvalue_free(v1);
+ icalvalue_free(v2);
v1 = icalvalue_new_caladdress("A");
v2 = icalvalue_new_caladdress("B");
- printf("%d\n",icalvalue_compare(v1,v2));
+ ok("test compare of A and B results in LESS",
+ (icalvalue_compare(v1,v2) == ICAL_XLICCOMPARETYPE_LESS));
+
+ ok("test compare of B and A results in GREATER",
+ (icalvalue_compare(v2,v1) == ICAL_XLICCOMPARETYPE_GREATER));
+
+ icalvalue_free(v1);
+ icalvalue_free(v2);
v1 = icalvalue_new_caladdress("B");
v2 = icalvalue_new_caladdress("A");
- printf("%d\n",icalvalue_compare(v1,v2));
+ ok("test compare of caladdress A and B results in GREATER",
+ (icalvalue_compare(v1,v2) == ICAL_XLICCOMPARETYPE_GREATER));
+
+ icalvalue_free(v1);
+ icalvalue_free(v2);
v1 = icalvalue_new_integer(5);
v2 = icalvalue_new_integer(5);
- printf("%d\n",icalvalue_compare(v1,v2));
+ ok("test compare of 5 and 5 results in EQUAL",
+ (icalvalue_compare(v1,v2) == ICAL_XLICCOMPARETYPE_EQUAL));
+
+ icalvalue_free(v1);
+ icalvalue_free(v2);
v1 = icalvalue_new_integer(5);
v2 = icalvalue_new_integer(10);
- printf("%d\n",icalvalue_compare(v1,v2));
-
- v1 = icalvalue_new_integer(10);
- v2 = icalvalue_new_integer(5);
-
- printf("%d\n",icalvalue_compare(v1,v2));
+ ok("test compare of 5 and 10 results in LESS",
+ (icalvalue_compare(v1,v2) == ICAL_XLICCOMPARETYPE_LESS));
+
+ ok("test compare of 10 and 5 results in GREATER",
+ (icalvalue_compare(v2,v1) == ICAL_XLICCOMPARETYPE_GREATER));
- return 0;
+ icalvalue_free(v1);
+ icalvalue_free(v2);
}
+
void test_restriction()
{
icalcomponent *comp;
@@ -1063,6 +830,8 @@ void test_restriction()
struct icaldatetimeperiodtype rtime;
+ char *str;
+
rtime.period.start = icaltime_from_timet( time(0),0);
rtime.period.end = icaltime_from_timet( time(0),0);
rtime.period.end.hour++;
@@ -1076,7 +845,7 @@ void test_restriction()
icalproperty_new_method(ICAL_METHOD_REQUEST),
icalcomponent_vanew(
ICAL_VTIMEZONE_COMPONENT,
- icalproperty_new_tzid("US_Eastern"),
+ icalproperty_new_tzid("America/New_York"),
icalcomponent_vanew(
ICAL_XDAYLIGHT_COMPONENT,
icalproperty_new_dtstart(atime),
@@ -1115,17 +884,17 @@ void test_restriction()
),
icalproperty_new_description("Project XYZ Review Meeting"),
icalproperty_new_categories("MEETING"),
- icalproperty_new_class("PUBLIC"),
+ icalproperty_new_class(ICAL_CLASS_PUBLIC),
icalproperty_new_created(atime),
icalproperty_new_summary("XYZ Project Review"),
/* icalproperty_new_dtstart(
atime,
- icalparameter_new_tzid("US-Eastern"),
+ icalparameter_new_tzid("America/New_York"),
0
),*/
icalproperty_vanew_dtend(
atime,
- icalparameter_new_tzid("US-Eastern"),
+ icalparameter_new_tzid("America/New_York"),
0
),
icalproperty_new_location("1CP Conference Room 4350"),
@@ -1135,22 +904,31 @@ void test_restriction()
);
valid = icalrestriction_check(comp);
+
+ ok("icalrestriction_check() == 0", (valid==0));
+
+ str = icalcomponent_as_ical_string(comp);
- printf("#### %d ####\n%s\n",valid, icalcomponent_as_ical_string(comp));
+ icalcomponent_free(comp);
}
-#if 0
void test_calendar()
{
icalcomponent *comp;
- icalfileset *c;
- icaldirset *s;
- icalcalendar* calendar = icalcalendar_new("calendar");
+ icalset *c;
+ icalset *s;
+ icalcalendar* calendar;
icalerrorenum error;
struct icaltimetype atime = icaltime_from_timet( time(0),0);
- comp = icalcomponent_vanew(
+ mkdir("calendar", 0755);
+ mkdir("calendar/booked", 0755);
+
+ calendar = icalcalendar_new("calendar");
+
+ comp = icalcomponent_vanew(ICAL_VCALENDAR_COMPONENT,
+ icalcomponent_vanew(
ICAL_VEVENT_COMPONENT,
icalproperty_new_version("2.0"),
icalproperty_new_description("This is an event"),
@@ -1167,25 +945,25 @@ void test_calendar()
icalparameter_new_xlicerrortype(ICAL_XLICERRORTYPE_COMPONENTPARSEERROR),
0),
- 0);
-
-
+ 0),0);
+
s = icalcalendar_get_booked(calendar);
error = icaldirset_add_component(s,comp);
- assert(error == ICAL_NO_ERROR);
+ ok("Adding Component to dirset", (error == ICAL_NO_ERROR));
c = icalcalendar_get_properties(calendar);
error = icalfileset_add_component(c,icalcomponent_new_clone(comp));
- assert(error == ICAL_NO_ERROR);
+ ok("Adding Clone Component to dirset", (error == ICAL_NO_ERROR));
icalcalendar_free(calendar);
+ ok("icalcalendar test", (1));
}
-#endif
+
void test_increment(void);
@@ -1223,9 +1001,9 @@ void test_recur()
rt = icalrecurrencetype_from_string("FREQ=MONTHLY;UNTIL=19971224T000000Z;INTERVAL=1;BYDAY=TU,2FR,3SA");
start = icaltime_from_string("19970905T090000Z");
- print_occur(rt,start);
+ if (VERBOSE) print_occur(rt,start);
- printf("\n Using icalrecur_expand_recurrence\n");
+ if (VERBOSE) printf("\n Using icalrecur_expand_recurrence\n");
icalrecur_expand_recurrence("FREQ=MONTHLY;UNTIL=19971224T000000Z;INTERVAL=1;BYDAY=TU,2FR,3SA",
icaltime_as_timet(start),
@@ -1233,8 +1011,7 @@ void test_recur()
array);
for(i =0; array[i] != 0 && i < 25 ; i++){
-
- printf(" %s",ctime(&(array[i])));
+ if (VERBOSE) printf(" %s",ctime(&(array[i])));
}
@@ -1242,20 +1019,22 @@ void test_recur()
}
+
void test_expand_recurrence(){
time_t arr[10];
time_t now = 931057385;
- int i;
+ int i, numfound = 0;
icalrecur_expand_recurrence( "FREQ=MONTHLY;BYDAY=MO,WE", now,
5, arr );
- printf("Start %s",ctime(&now) );
- for (i=0; i<5; i++)
- {
- printf("i=%d %s\n", i, ctime(&arr[i]) );
- }
-
+ if (VERBOSE) printf("Start %s",ctime(&now) );
+
+ for (i=0; i<5; i++) {
+ numfound++;
+ if (VERBOSE) printf("i=%d %s\n", i, ctime(&arr[i]) );
+ }
+ int_is("Get an array of 5 items", numfound, 5);
}
@@ -1273,23 +1052,6 @@ enum byrule {
BY_SET_POS
};
-struct icalrecur_iterator_impl {
-
- struct icaltimetype dtstart;
- struct icaltimetype last; /* last time return from _iterator_next*/
- int occurrence_no; /* number of step made on this iterator */
- struct icalrecurrencetype rule;
-
- short days[366];
- short days_index;
-
- enum byrule byrule;
- short by_indices[9];
-
-
- short *by_ptrs[9]; /* Pointers into the by_* array elements of the rule */
-};
-
void icalrecurrencetype_test()
{
icalvalue *v = icalvalue_new_from_string(
@@ -1312,6 +1074,10 @@ void icalrecurrencetype_test()
printf("%s",ctime(&tt ));
} while( ! icaltime_is_null_time(next));
+
+ icalvalue_free(v);
+
+ icalrecur_iterator_free(itr);
}
@@ -1327,26 +1093,27 @@ void test_recur_parameter_bug(){
#include <ical.h>
static const char test_icalcomp_str[] =
-"BEGIN:VEVENT\r\n"
-"RRULE\r\n"
-" ;X-EVOLUTION-ENDDATE=20030209T081500\r\n"
-" :FREQ=DAILY;COUNT=10;INTERVAL=6\r\n"
-"END:VEVENT\r\n";
+"BEGIN:VEVENT\n"
+"RRULE;X-EVOLUTION-ENDDATE=20030209T081500:FREQ=DAILY;COUNT=10;INTERVAL=6\n"
+"END:VEVENT\n";
icalcomponent *icalcomp;
icalproperty *prop;
struct icalrecurrencetype recur;
int n_errors;
-
+ char *str;
+
icalcomp = icalparser_parse_string ((char *) test_icalcomp_str);
- if (!icalcomp) {
- fprintf (stderr, "main(): could not parse the component\n");
- exit (EXIT_FAILURE);
- }
+ ok("icalparser_parse_string()",(icalcomp!=NULL));
+ assert(icalcomp!=NULL);
- printf("%s\n\n",icalcomponent_as_ical_string(icalcomp));
+ str = icalcomponent_as_ical_string(icalcomp);
+ is("parsed matches original", str, (char*)test_icalcomp_str);
+ if (VERBOSE) printf("%s\n\n",str);
n_errors = icalcomponent_count_errors (icalcomp);
+ int_is("no parse errors", n_errors, 0);
+
if (n_errors) {
icalproperty *p;
@@ -1355,7 +1122,7 @@ void test_recur_parameter_bug(){
p;
p = icalcomponent_get_next_property (icalcomp,
ICAL_XLICERROR_PROPERTY)) {
- char *str;
+ const char *str;
str = icalproperty_as_ical_string (p);
fprintf (stderr, "error: %s\n", str);
@@ -1363,350 +1130,564 @@ void test_recur_parameter_bug(){
}
prop = icalcomponent_get_first_property (icalcomp, ICAL_RRULE_PROPERTY);
- if (!prop) {
- fprintf (stderr, "main(): could not get the RRULE property");
- exit (EXIT_FAILURE);
- }
+ ok("get RRULE property", (prop!=NULL));
+ assert(prop!=NULL);
recur = icalproperty_get_rrule (prop);
- printf("%s\n",icalrecurrencetype_as_string(&recur));
+ if (VERBOSE) printf("%s\n",icalrecurrencetype_as_string(&recur));
+ icalcomponent_free(icalcomp);
}
void test_duration()
{
-
-
struct icaldurationtype d;
d = icaldurationtype_from_string("PT8H30M");
- printf("%s\n",icaldurationtype_as_ical_string(d));
- assert(icaldurationtype_as_int(d) == 30600);
+ if (VERBOSE) printf("%s\n",icaldurationtype_as_ical_string(d));
+ int_is("PT8H30M", icaldurationtype_as_int(d), 30600);
d = icaldurationtype_from_string("-PT8H30M");
- printf("%s\n",icaldurationtype_as_ical_string(d));
- assert(icaldurationtype_as_int(d) == -30600);
+ if (VERBOSE) printf("%s\n",icaldurationtype_as_ical_string(d));
+ int_is("-PT8H30M", icaldurationtype_as_int(d), -30600);
d = icaldurationtype_from_string("PT10H10M10S");
- printf("%s\n",icaldurationtype_as_ical_string(d));
- assert(icaldurationtype_as_int(d) == 36610);
+ if (VERBOSE) printf("%s\n",icaldurationtype_as_ical_string(d));
+ int_is("PT10H10M10S", icaldurationtype_as_int(d), 36610);
d = icaldurationtype_from_string("P7W");
- printf("%s\n",icaldurationtype_as_ical_string(d));
- assert(icaldurationtype_as_int(d) == 4233600);
+ if (VERBOSE) printf("%s\n",icaldurationtype_as_ical_string(d));
+ int_is("P7W", icaldurationtype_as_int(d), 4233600);
d = icaldurationtype_from_string("P2DT8H30M");
- printf("%s\n",icaldurationtype_as_ical_string(d));
- assert(icaldurationtype_as_int(d) == 203400);
+ if (VERBOSE) printf("%s\n",icaldurationtype_as_ical_string(d));
+ int_is("P2DT8H30M", icaldurationtype_as_int(d), 203400);
icalerror_errors_are_fatal = 0;
+ /* Test conversion of bad input */
+
+ d = icaldurationtype_from_int(1314000);
+ if (VERBOSE) printf("%s %d\n",icaldurationtype_as_ical_string(d),
+ icaldurationtype_as_int(d));
+ is("1314000", icaldurationtype_as_ical_string(d), "P15DT5H");
+
+ d = icaldurationtype_from_string("P2W1DT5H");
+ if (VERBOSE) printf("%s %d\n",icaldurationtype_as_ical_string(d),
+ icaldurationtype_as_int(d));
+ int_is("P15DT5H", icaldurationtype_as_int(d), 0);
+
d = icaldurationtype_from_string("P-2DT8H30M");
- printf("%s\n",icaldurationtype_as_ical_string(d));
- assert(icaldurationtype_as_int(d) == 0);
+ if (VERBOSE) printf("%s\n",icaldurationtype_as_ical_string(d));
+ int_is("P-2DT8H30M", icaldurationtype_as_int(d), 0);
d = icaldurationtype_from_string("P7W8H");
- printf("%s\n",icaldurationtype_as_ical_string(d));
- assert(icaldurationtype_as_int(d) == 0);
+ if (VERBOSE) printf("%s\n",icaldurationtype_as_ical_string(d));
+ int_is("P7W8H", icaldurationtype_as_int(d), 0);
d = icaldurationtype_from_string("T10H");
- printf("%s\n",icaldurationtype_as_ical_string(d));
- assert(icaldurationtype_as_int(d) == 0);
-
+ if (VERBOSE) printf("%s\n",icaldurationtype_as_ical_string(d));
+ int_is("T10H", icaldurationtype_as_int(d), 0);
icalerror_errors_are_fatal = 1;
+ d = icaldurationtype_from_int(4233600);
+ if (VERBOSE) printf("%s\n",icaldurationtype_as_ical_string(d));
+ is("P7W",
+ icaldurationtype_as_ical_string(d), "P7W");
+
+ d = icaldurationtype_from_int(4424400);
+ if (VERBOSE) printf("%s\n",icaldurationtype_as_ical_string(d));
+ is("P51DT5H",
+ icaldurationtype_as_ical_string(d), "P51DT5H");
}
+
void test_period()
{
-
struct icalperiodtype p;
icalvalue *v;
+ char *str;
+
+ str = "19971015T050000Z/PT8H30M";
+ p = icalperiodtype_from_string(str);
+ is(str, icalperiodtype_as_ical_string(p),str);
- p = icalperiodtype_from_string("19971015T050000Z/PT8H30M");
- printf("%s\n",icalperiodtype_as_ical_string(p));
- assert(strcmp(icalperiodtype_as_ical_string(p),
- "19971015T050000Z/PT8H30M") == 0);
- p = icalperiodtype_from_string("19971015T050000Z/19971015T060000Z");
- printf("%s\n",icalperiodtype_as_ical_string(p));
- assert(strcmp(icalperiodtype_as_ical_string(p),
- "19971015T050000Z/19971015T060000Z") == 0);
+ str = "19971015T050000Z/19971015T060000Z";
+ p = icalperiodtype_from_string(str);
+ is(str, icalperiodtype_as_ical_string(p),str);
- p = icalperiodtype_from_string("19970101T120000/PT3H");
- printf("%s\n",icalperiodtype_as_ical_string(p));
- assert(strcmp(icalperiodtype_as_ical_string(p),
- "19970101T120000/PT3H") == 0);
- v = icalvalue_new_from_string(ICAL_PERIOD_VALUE,"19970101T120000/PT3H");
- printf("%s\n",icalvalue_as_ical_string(v));
- assert(strcmp(icalvalue_as_ical_string(v),
- "19970101T120000/PT3H") == 0);
+ str = "19970101T120000/PT3H";
+ v = icalvalue_new_from_string(ICAL_PERIOD_VALUE,str);
+ is(str, icalvalue_as_ical_string(v), str);
+ icalvalue_free(v);
}
-void test_strings(){
+void test_strings(){
icalvalue *v;
v = icalvalue_new_text("foo;bar;bats");
-
- printf("%s\n",icalvalue_as_ical_string(v));
+ if (VERBOSE)
+ printf("%s\n",icalvalue_as_ical_string(v));
+
+ is("test encoding of 'foo;bar;bats'",
+ "foo\\;bar\\;bats", icalvalue_as_ical_string(v));
icalvalue_free(v);
+
v = icalvalue_new_text("foo\\;b\nar\\;ba\tts");
+ if (VERBOSE)
+ printf("%s\n",icalvalue_as_ical_string(v));
- printf("%s\n",icalvalue_as_ical_string(v));
+ is("test encoding of 'foo\\\\;b\\nar\\\\;ba\\tts'",
+ "foo\\\\\\;b\\nar\\\\\\;ba\\tts", icalvalue_as_ical_string(v));
icalvalue_free(v);
-
-
}
+
void test_requeststat()
{
- icalrequeststatus s;
- struct icalreqstattype st, st2;
- char temp[1024];
-
- s = icalenum_num_to_reqstat(2,1);
-
- assert(s == ICAL_2_1_FALLBACK_STATUS);
-
- assert(icalenum_reqstat_major(s) == 2);
- assert(icalenum_reqstat_minor(s) == 1);
-
- printf("2.1: %s\n",icalenum_reqstat_desc(s));
-
- st.code = s;
- st.debug = "booga";
- st.desc = 0;
-
- printf("%s\n",icalreqstattype_as_string(st));
+ icalproperty *p;
+ icalrequeststatus s;
+ struct icalreqstattype st, st2;
+ char temp[1024];
+
+ s = icalenum_num_to_reqstat(2,1);
+
+ ok("icalenum_num_to_reqstat(2,1)",(s == ICAL_2_1_FALLBACK_STATUS));
+
+ ok("icalenum_reqstat_major()",(icalenum_reqstat_major(s) == 2));
+ ok("icalenum_reqstat_minor()",(icalenum_reqstat_minor(s) == 1));
+
+ is ("icalenum_reqstat_desc() -> 2.1", icalenum_reqstat_desc(s),
+ "Success but fallback taken on one or more property values.");
+
+ st.code = s;
+ st.debug = "booga";
+ st.desc = 0;
+
+ is("icalreqstattype_as_string()",
+ icalreqstattype_as_string(st),
+ "2.1;Success but fallback taken on one or more property values.;booga");
+
+ st.desc = " A non-standard description";
+
+ is("icalreqstattype_as_string() w/ non standard description",
+ icalreqstattype_as_string(st),
+ "2.1; A non-standard description;booga");
+
+ st.desc = 0;
+
+ sprintf(temp,"%s\n",icalreqstattype_as_string(st));
+
+
+ st2 = icalreqstattype_from_string("2.1;Success but fallback taken on one or more property values.;booga");
+
+ /* printf("%d -- %d -- %s -- %s\n",*/
+ ok("icalenum_reqstat_major()",(icalenum_reqstat_major(st2.code) == 2));
+ ok("icalenum_reqstat_minor()",(icalenum_reqstat_minor(st2.code) == 1));
+ is("icalenum_reqstat_desc",
+ icalenum_reqstat_desc(st2.code),
+ "Success but fallback taken on one or more property values.");
+
+ st2 = icalreqstattype_from_string("2.1;Success but fallback taken on one or more property values.;booga");
+ if (VERBOSE) printf("%s\n",icalreqstattype_as_string(st2));
+
+ st2 = icalreqstattype_from_string("2.1;Success but fallback taken on one or more property values.;");
+ if (VERBOSE) printf("%s\n",icalreqstattype_as_string(st2));
+
+ st2 = icalreqstattype_from_string("2.1;Success but fallback taken on one or more property values.");
+ if (VERBOSE) printf("%s\n",icalreqstattype_as_string(st2));
+
+ st2 = icalreqstattype_from_string("2.1;");
+ if (VERBOSE) printf("%s\n",icalreqstattype_as_string(st2));
- st.desc = " A non-standard description";
+ is("st2 test again",
+ icalreqstattype_as_string(st2),
+ "2.1;Success but fallback taken on one or more property values.");
+
+ st2 = icalreqstattype_from_string("2.1");
+ is("st2 test #3",
+ icalreqstattype_as_string(st2),
+ "2.1;Success but fallback taken on one or more property values.");
+
+ p = icalproperty_new_from_string("REQUEST-STATUS:2.1;Success but fallback taken on one or more property values.;booga");
- printf("%s\n",icalreqstattype_as_string(st));
+ is("icalproperty_new_from_string()",
+ icalproperty_as_ical_string(p),
+ "REQUEST-STATUS:2.1;Success but fallback taken on one or more property \n values.;booga\n");
+ icalerror_set_error_state(ICAL_MALFORMEDDATA_ERROR,ICAL_ERROR_NONFATAL);
+ st2 = icalreqstattype_from_string("16.4");
+
+ ok("test unknown code", (st2.code == ICAL_UNKNOWN_STATUS));
+
+ st2 = icalreqstattype_from_string("1.");
+
+ ok("test malformed code", (st2.code == ICAL_UNKNOWN_STATUS));
+ icalerror_set_error_state(ICAL_MALFORMEDDATA_ERROR,ICAL_ERROR_DEFAULT);
- st.desc = 0;
+ icalproperty_free(p);
+}
- sprintf(temp,"%s\n",icalreqstattype_as_string(st));
-
- st2 = icalreqstattype_from_string("2.1;Success but fallback taken on one or more property values.;booga");
+void test_dtstart(){
+
+ struct icaltimetype tt,tt2;
+
+ icalproperty *p;
+
- printf("%d -- %d -- %s -- %s\n",icalenum_reqstat_major(st2.code),
- icalenum_reqstat_minor(st2.code),
- icalenum_reqstat_desc(st2.code),
- st2.debug);
+ tt = icaltime_from_string("19970101");
- st2 = icalreqstattype_from_string("2.1;Success but fallback taken on one or more property values.;booga");
- printf("%s\n",icalreqstattype_as_string(st2));
+ int_is("19970101 is a date", tt.is_date, 1);
- st2 = icalreqstattype_from_string("2.1;Success but fallback taken on one or more property values.;");
- printf("%s\n",icalreqstattype_as_string(st2));
+ p = icalproperty_new_dtstart(tt);
- st2 = icalreqstattype_from_string("2.1;Success but fallback taken on one or more property values.");
- printf("%s\n",icalreqstattype_as_string(st2));
+ if (VERBOSE) printf("%s\n",icalvalue_kind_to_string(icalvalue_isa(icalproperty_get_value(p))));
- st2 = icalreqstattype_from_string("2.1;");
- printf("%s\n",icalreqstattype_as_string(st2));
+ ok("ICAL_DATE_VALUE", (icalvalue_isa(icalproperty_get_value(p))==ICAL_DATE_VALUE));
- st2 = icalreqstattype_from_string("2.1");
- printf("%s\n",icalreqstattype_as_string(st2));
+ tt2 = icalproperty_get_dtstart(p);
+ int_is("converted date is date", tt2.is_date, 1);
-#ifndef ICAL_ERRORS_ARE_FATAL
- st2 = icalreqstattype_from_string("16.4");
- assert(st2.code == ICAL_UNKNOWN_STATUS);
+ if (VERBOSE) printf("%s\n",icalproperty_as_ical_string(p));
- st2 = icalreqstattype_from_string("1.");
- assert(st2.code == ICAL_UNKNOWN_STATUS);
-#endif
-}
+ tt = icaltime_from_string("19970101T103000");
-char ictt_str[1024];
-char* ictt_as_string(struct icaltimetype t)
-{
+ int_is("19970101T103000 is not a date", tt.is_date, 0);
- sprintf(ictt_str,"%02d-%02d-%02d %02d:%02d:%02d%s",t.year,t.month,t.day,
- t.hour,t.minute,t.second,t.is_utc?" Z":"");
+ icalproperty_free(p);
- return ictt_str;
-}
+ p = icalproperty_new_dtstart(tt);
+ if (VERBOSE) printf("%s\n",icalvalue_kind_to_string(icalvalue_isa(icalproperty_get_value(p))));
+ ok("ICAL_DATETIME_VALUE", (icalvalue_isa(icalproperty_get_value(p))==ICAL_DATETIME_VALUE));
-char* ical_timet_string(time_t t)
-{
- struct tm stm = *(gmtime(&t));
+ tt2 = icalproperty_get_dtstart(p);
+ int_is("converted datetime is not date", tt2.is_date, 0);
- sprintf(ictt_str,"%02d-%02d-%02d %02d:%02d:%02d Z",stm.tm_year+1900,
- stm.tm_mon+1,stm.tm_mday,stm.tm_hour,stm.tm_min,stm.tm_sec);
+ if (VERBOSE) printf("%s\n",icalproperty_as_ical_string(p));
- return ictt_str;
-
+ icalproperty_free(p);
}
void do_test_time(char* zone)
{
- struct icaltimetype ictt, icttutc, icttutczone, icttdayl,
+ struct icaltimetype ictt, icttutc, icttzone, icttdayl,
icttla, icttny,icttphoenix, icttlocal, icttnorm;
time_t tt,tt2, tt_p200;
- int offset_la, offset_tz;
+ int offset_tz;
icalvalue *v;
short day_of_week,start_day_of_week, day_of_year;
+ icaltimezone *azone, *utczone;
+ char msg[256];
icalerror_errors_are_fatal = 0;
+ azone = icaltimezone_get_builtin_timezone(zone);
+ utczone = icaltimezone_get_utc_timezone();
+
+ /* Test new API */
+ if (VERBOSE) printf("\n---> From time_t \n");
+
+ tt = 1025127869; /* stick with a constant... */
+
+ if (VERBOSE) printf("Orig : %s\n",ical_timet_string(tt));
+ if (VERBOSE) printf("\nicaltime_from_timet(tt,0) (DEPRECATED)\n");
+
+ ictt = icaltime_from_timet(tt, 0);
+
+ is("icaltime_from_timet(1025127869) as UTC", ictt_as_string(ictt),
+ "2002-06-26 21:44:29 (floating)");
+
+ ictt = icaltime_from_timet_with_zone(tt, 0, NULL);
+ is("Floating time from time_t",
+ ictt_as_string(ictt), "2002-06-26 21:44:29 (floating)");
+
+ ictt = icaltime_from_timet_with_zone(tt, 0, azone);
+ ok("icaltime_from_timet_with_zone(tt,0,zone) as zone",
+ strncmp(ictt_as_string(ictt), "2002-06-26 21:44:29", 19)==0);
+
+ ictt = icaltime_from_timet_with_zone(tt, 0, utczone);
+
+ is("icaltime_from_timet_with_zone(tt,0,utc)", ictt_as_string(ictt),
+ "2002-06-26 21:44:29 Z UTC");
+
+ if (VERBOSE) printf("\n---> Convert from floating \n");
+
+ ictt = icaltime_from_timet_with_zone(tt, 0, NULL);
+ icttutc = icaltime_convert_to_zone(ictt, utczone);
+
+ is("Convert from floating to UTC",
+ ictt_as_string(icttutc),
+ "2002-06-26 21:44:29 Z UTC");
+
+ icttzone = icaltime_convert_to_zone(ictt, azone);
+
+ ok("Convert from floating to zone",
+ (strncmp(ictt_as_string(icttzone), "2002-06-26 21:44:29", 19)==0));
+
+ tt2 = icaltime_as_timet(icttzone);
+
+ if (VERBOSE) printf("\n---> Convert from UTC \n");
+
+ ictt = icaltime_from_timet_with_zone(tt, 0, utczone);
+ icttutc = icaltime_convert_to_zone(ictt, utczone);
+
+ is("Convert from UTC to UTC",
+ ictt_as_string(icttutc),
+ "2002-06-26 21:44:29 Z UTC");
+
+ icttzone = icaltime_convert_to_zone(ictt, azone);
+
+ ok("Convert from UTC to zone (test year/mon only..)",
+ (strncmp(ictt_as_string(icttzone), "2002-06-26 21:44:29", 7)==0));
+
+ tt2 = icaltime_as_timet(icttzone);
+
+ if (VERBOSE) printf("No conversion: %s\n", ical_timet_string(tt2));
+
+ ok("No conversion at all (test year/mon only)",
+ (strncmp(ical_timet_string(tt2), "2002-06-26 21:44:29 Z",7) == 0));
+
+ tt2 = icaltime_as_timet_with_zone(icttzone, utczone);
+ if (VERBOSE) printf("Back to UTC : %s\n", ical_timet_string(tt2));
+
+ ok("test time conversion routines",(tt==tt2));
+
+ if (VERBOSE) printf("\n---> Convert from zone \n");
+ ictt = icaltime_from_timet_with_zone(tt, 0, azone);
+ icttzone = icaltime_convert_to_zone(ictt, azone);
+
+ if (VERBOSE)
+ printf("To zone : %s\n", ictt_as_string(icttzone));
+ icttutc = icaltime_convert_to_zone(ictt, utczone);
+
+ if (VERBOSE)
+ printf("To UTC : %s\n", ictt_as_string(icttutc));
+ tt2 = icaltime_as_timet(icttutc);
+
+ if (VERBOSE)
+ printf("No conversion: %s\n", ical_timet_string(tt2));
+
+ tt2 = icaltime_as_timet_with_zone(icttutc, azone);
+
+ if (VERBOSE)
+ printf("Back to zone : %s\n", ical_timet_string(tt2));
+
+ ok("test time conversion, round 2", (tt==tt2));
+
ictt = icaltime_from_string("20001103T183030Z");
tt = icaltime_as_timet(ictt);
- assert(tt==973276230); /* Fri Nov 3 10:30:30 PST 2000 in PST
- Fri Nov 3 18:30:30 PST 2000 in UTC */
+ ok("test icaltime -> time_t for 20001103T183030Z", (tt==973276230));
+ /* Fri Nov 3 10:30:30 PST 2000 in PST
+ Fri Nov 3 18:30:30 PST 2000 in UTC */
- offset_la = icaltime_utc_offset(ictt,"America/Los_Angeles");
- offset_tz = icaltime_utc_offset(ictt, zone);
-
+ if (VERBOSE) {
printf(" Normalize \n");
printf("Orig (ical) : %s\n", ictt_as_string(ictt));
+ }
icttnorm = ictt;
icttnorm.second -= 60 * 60 * 24 * 5;
icttnorm = icaltime_normalize(icttnorm);
- printf("-5d in sec : %s\n", ictt_as_string(icttnorm));
+
+ if (VERBOSE)
+ printf("-5d in sec : %s\n", ictt_as_string(icttnorm));
icttnorm.day += 60;
icttnorm = icaltime_normalize(icttnorm);
- printf("+60 d : %s\n", ictt_as_string(icttnorm));
+ if (VERBOSE)
+ printf("+60 d : %s\n", ictt_as_string(icttnorm));
+
+ /** add test case here.. **/
+ if (VERBOSE)
printf("\n As time_t \n");
tt2 = icaltime_as_timet(ictt);
- printf("20001103T183030Z (timet): %s\n",ical_timet_string(tt2));
- printf("20001103T183030Z : %s\n",ictt_as_string(ictt));
- assert(tt2 == tt);
- icttlocal = icaltime_from_string("20001103T183030");
+ if (VERBOSE) {
+ printf("20001103T183030Z (timet): %s\n",ical_timet_string(tt2));
+ printf("20001103T183030Z : %s\n",ictt_as_string(ictt));
+ }
+
+ /** this test is bogus **/
+ ok("test normalization", (tt2 == tt));
+
+ icttlocal = icaltime_convert_to_zone(ictt, azone);
tt2 = icaltime_as_timet(icttlocal);
- printf("20001103T183030 (timet): %s\n",ical_timet_string(tt2));
- printf("20001103T183030 : %s\n",ictt_as_string(icttlocal));
- assert(tt-tt2 == offset_tz);
+ if (VERBOSE) {
+ printf("20001103T183030 (timet): %s\n",ical_timet_string(tt2));
+ printf("20001103T183030 : %s\n",ictt_as_string(icttlocal));
+ }
- printf("\n From time_t \n");
+ offset_tz = -icaltimezone_get_utc_offset_of_utc_time(azone, &ictt, 0); /* FIXME */
+ if (VERBOSE)
+ printf("offset_tz : %d\n",offset_tz);
- printf("Orig : %s\n",ical_timet_string(tt));
- printf("As utc : %s\n", ictt_as_string(ictt));
+ ok("test utc offset", (tt-tt2 == offset_tz));
- icttlocal = icaltime_as_zone(ictt,zone);
- printf("As local : %s\n", ictt_as_string(icttlocal));
-
+ /* FIXME with the new API, it's not very useful */
+ icttlocal = ictt;
+ icaltimezone_convert_time(&icttlocal,
+ icaltimezone_get_utc_timezone(),
+ icaltimezone_get_builtin_timezone(zone));
- printf("\n Convert to and from lib c \n");
+ if (VERBOSE)
+ printf("As local : %s\n", ictt_as_string(icttlocal));
- printf("System time is: %s\n",ical_timet_string(tt));
+ if (VERBOSE) printf("\n Convert to and from lib c \n");
+
+ if (VERBOSE) printf("System time is: %s\n",ical_timet_string(tt));
v = icalvalue_new_datetime(ictt);
- printf("System time from libical: %s\n",icalvalue_as_ical_string(v));
+ if (VERBOSE)
+ printf("System time from libical: %s\n",icalvalue_as_ical_string(v));
+
+ icalvalue_free(v);
tt2 = icaltime_as_timet(ictt);
+
+ if (VERBOSE)
printf("Converted back to libc: %s\n",ical_timet_string(tt2));
- printf("\n Incrementing time \n");
+ if (VERBOSE) printf("\n Incrementing time \n");
icttnorm = ictt;
icttnorm.year++;
tt2 = icaltime_as_timet(icttnorm);
+ if (VERBOSE)
printf("Add a year: %s\n",ical_timet_string(tt2));
icttnorm.month+=13;
tt2 = icaltime_as_timet(icttnorm);
+ if (VERBOSE)
printf("Add 13 months: %s\n",ical_timet_string(tt2));
icttnorm.second+=90;
tt2 = icaltime_as_timet(icttnorm);
+ if (VERBOSE)
printf("Add 90 seconds: %s\n",ical_timet_string(tt2));
- printf("\n Day Of week \n");
+ if (VERBOSE) printf("\n Day Of week \n");
day_of_week = icaltime_day_of_week(ictt);
start_day_of_week = icaltime_start_doy_of_week(ictt);
day_of_year = icaltime_day_of_year(ictt);
+ sprintf(msg, "Testing day of week %d", day_of_week);
+ int_is(msg, day_of_week, 6);
- printf("Today is day of week %d, day of year %d\n",day_of_week,day_of_year);
- printf("Week started n doy of %d\n",start_day_of_week);
- assert(day_of_week == 6);
- assert(day_of_year == 308);
- assert(start_day_of_week == 303 );
+ sprintf(msg, "Testing day of year %d",day_of_year);
+ int_is(msg, day_of_year, 308);
+
+ sprintf(msg, "Week started on doy of %d", start_day_of_week);
+ int_is(msg, start_day_of_week , 303);
+
+ if (VERBOSE) printf("\n TimeZone Conversions \n");
+
+/*
+ icttla = ictt;
+ icaltimezone_convert_time(&icttla,
+ icaltimezone_get_utc_timezone(),
+ lazone);
+*/
+ icttla = icaltime_convert_to_zone(ictt,
+ icaltimezone_get_builtin_timezone("America/Los_Angeles"));
- printf("\n TimeZone Conversions \n");
+ int_is("Converted hour in America/Los_Angeles is 10", icttla.hour, 10);
- icttla = icaltime_as_zone(ictt,"America/Los_Angeles");
- assert(icttla.hour == 10);
+ icttutc = icaltime_convert_to_zone(icttla,icaltimezone_get_utc_timezone());
- icttutc = icaltime_as_utc(icttla,"America/Los_Angeles");
- assert(icaltime_compare(icttla,
- icaltime_from_string("20001103T103030"))==0);
+ ok("America/Los_Angeles local time is 2000-11-03 10:30:30",
+ (strncmp(ictt_as_string(icttla), "2000-11-03 10:30:30", 19)==0));
- icttutczone = icaltime_as_zone(ictt,"Etc/GMT0");
- icttutczone.is_utc = 1;
- assert(icaltime_compare(icttutc, icttutczone) == 0);
- assert(icaltime_compare(icttutc, ictt) == 0);
+ ok("Test conversion back to UTC",(icaltime_compare(icttutc, ictt) == 0));
- icttny = icaltime_as_zone(ictt,"America/New_York");
+ icttny = icaltime_convert_to_zone(ictt,
+ icaltimezone_get_builtin_timezone("America/New_York"));
- icttphoenix = icaltime_as_zone(ictt,"America/Phoenix");
+ icttphoenix = icaltime_convert_to_zone(ictt,
+ icaltimezone_get_builtin_timezone("America/Phoenix"));
+ if (VERBOSE) {
printf("Orig (ctime): %s\n", ical_timet_string(tt) );
printf("Orig (ical) : %s\n", ictt_as_string(ictt));
printf("UTC : %s\n", ictt_as_string(icttutc));
printf("Los Angeles : %s\n", ictt_as_string(icttla));
printf("Phoenix : %s\n", ictt_as_string(icttphoenix));
printf("New York : %s\n", ictt_as_string(icttny));
-
+ }
+ /** @todo Check results for Phoenix here?... **/
/* Daylight savings test for New York */
+ if (VERBOSE) {
printf("\n Daylight Savings \n");
printf("Orig (ctime): %s\n", ical_timet_string(tt) );
printf("Orig (ical) : %s\n", ictt_as_string(ictt));
printf("NY : %s\n", ictt_as_string(icttny));
+ }
- assert(strcmp(ictt_as_string(icttny),"2000-11-03 13:30:30")==0);
+ ok("Converted time in zone America/New_York is 2000-11-03 13:30:30",
+ (strncmp(ictt_as_string(icttny),"2000-11-03 13:30:30",19)==0));
tt_p200 = tt + 200 * 24 * 60 * 60 ; /* Add 200 days */
- icttdayl = icaltime_from_timet(tt_p200,0);
- icttny = icaltime_as_zone(icttdayl,"America/New_York");
-
+ icttdayl = icaltime_from_timet_with_zone(tt_p200,0,
+ icaltimezone_get_utc_timezone());
+ icttny = icaltime_convert_to_zone(icttdayl,
+ icaltimezone_get_builtin_timezone("America/New_York"));
+
+ if (VERBOSE) {
printf("Orig +200d : %s\n", ical_timet_string(tt_p200) );
printf("NY+200D : %s\n", ictt_as_string(icttny));
+ }
+
+ ok("Converted time +200d in zone America/New_York is 2001-05-22 14:30:30",
+ (strncmp(ictt_as_string(icttny),"2001-05-22 14:30:30",19)==0));
- assert(strcmp(ictt_as_string(icttny),"2001-05-22 14:30:30")==0);
/* Daylight savings test for Los Angeles */
- icttla = icaltime_as_zone(ictt,"America/Los_Angeles");
+ icttla = icaltime_convert_to_zone(ictt,
+ icaltimezone_get_builtin_timezone("America/Los_Angeles"));
+ if (VERBOSE) {
printf("\nOrig (ctime): %s\n", ical_timet_string(tt) );
printf("Orig (ical) : %s\n", ictt_as_string(ictt));
printf("LA : %s\n", ictt_as_string(icttla));
+ }
+
+ ok("Converted time in zone America/Los_Angeles is 2000-11-03 10:30:30",
+ (strncmp(ictt_as_string(icttla),"2000-11-03 10:30:30",19)==0));
- assert(strcmp(ictt_as_string(icttla),"2000-11-03 10:30:30")==0);
-
- icttla = icaltime_as_zone(icttdayl,"America/Los_Angeles");
+ icttla = icaltime_convert_to_zone(icttdayl,
+ icaltimezone_get_builtin_timezone("America/Los_Angeles"));
+
+ if (VERBOSE) {
printf("Orig +200d : %s\n", ical_timet_string(tt_p200) );
printf("LA+200D : %s\n", ictt_as_string(icttla));
+ }
+
+ ok("Converted time +200d in zone America/Los_Angeles is 2001-05-22 11:30:30",
+ (strncmp(ictt_as_string(icttla),"2001-05-22 11:30:30",19)==0));
- assert(strcmp(ictt_as_string(icttla),"2001-05-22 11:30:30")==0);
icalerror_errors_are_fatal = 1;
}
@@ -1715,34 +1696,40 @@ void test_iterators()
{
icalcomponent *c,*inner,*next;
icalcompiter i;
+ char vevent_list[64] = "";
+ char remaining_list[64] = "";
+ char *vevent_list_good = "12347";
+ char *remaining_list_good = "568910";
+
+ int nomore = 1;
+
c= icalcomponent_vanew(
ICAL_VCALENDAR_COMPONENT,
icalcomponent_vanew(ICAL_VEVENT_COMPONENT,
- icalproperty_vanew_version("1"),0),
+ icalproperty_new_version("1"),0),
icalcomponent_vanew(ICAL_VEVENT_COMPONENT,
- icalproperty_vanew_version("2"),0),
+ icalproperty_new_version("2"),0),
icalcomponent_vanew(ICAL_VEVENT_COMPONENT,
- icalproperty_vanew_version("3"),0),
+ icalproperty_new_version("3"),0),
icalcomponent_vanew(ICAL_VEVENT_COMPONENT,
- icalproperty_vanew_version("4"),0),
+ icalproperty_new_version("4"),0),
icalcomponent_vanew(ICAL_VTODO_COMPONENT,
- icalproperty_vanew_version("5"),0),
+ icalproperty_new_version("5"),0),
icalcomponent_vanew(ICAL_VJOURNAL_COMPONENT,
- icalproperty_vanew_version("6"),0),
+ icalproperty_new_version("6"),0),
icalcomponent_vanew(ICAL_VEVENT_COMPONENT,
- icalproperty_vanew_version("7"),0),
+ icalproperty_new_version("7"),0),
icalcomponent_vanew(ICAL_VJOURNAL_COMPONENT,
- icalproperty_vanew_version("8"),0),
+ icalproperty_new_version("8"),0),
icalcomponent_vanew(ICAL_VJOURNAL_COMPONENT,
- icalproperty_vanew_version("9"),0),
+ icalproperty_new_version("9"),0),
icalcomponent_vanew(ICAL_VJOURNAL_COMPONENT,
- icalproperty_vanew_version("10"),0),
+ icalproperty_new_version("10"),0),
0);
- printf("1: ");
-
/* List all of the VEVENTS */
+
for(i = icalcomponent_begin_component(c,ICAL_VEVENT_COMPONENT);
icalcompiter_deref(&i)!= 0; icalcompiter_next(&i)){
@@ -1753,24 +1740,10 @@ void test_iterators()
ICAL_VERSION_PROPERTY);
const char* s = icalproperty_get_version(p);
- printf("%s ",s);
-
- }
-
- printf("\n2: ");
-
-#if 0
- for(inner = icalcomponent_get_first_component(c,ICAL_VEVENT_COMPONENT);
- inner != 0;
- inner = next){
-
- next = icalcomponent_get_next_component(c,ICAL_VEVENT_COMPONENT);
-
- icalcomponent_remove_component(c,inner);
-
- icalcomponent_free(inner);
+ strcat(vevent_list, s);
}
-#endif
+ is("iterate through VEVENTS in a component",
+ vevent_list, vevent_list_good);
/* Delete all of the VEVENTS */
/* reset iterator */
@@ -1779,12 +1752,11 @@ void test_iterators()
while((inner=icalcomponent_get_current_component(c)) != 0 ){
if(icalcomponent_isa(inner) == ICAL_VEVENT_COMPONENT){
icalcomponent_remove_component(c,inner);
+ icalcomponent_free(inner);
} else {
icalcomponent_get_next_component(c,ICAL_VEVENT_COMPONENT);
}
}
-
-
/* List all remaining components */
for(inner = icalcomponent_get_first_component(c,ICAL_ANY_COMPONENT);
@@ -1797,10 +1769,11 @@ void test_iterators()
const char* s = icalproperty_get_version(p);
- printf("%s ",s);
+ strcat(remaining_list, s);
}
- printf("\n3: ");
+ is("iterate through remaining components",
+ remaining_list, remaining_list_good);
/* Remove all remaining components */
@@ -1815,7 +1788,6 @@ void test_iterators()
p=icalcomponent_get_first_property(inner,ICAL_VERSION_PROPERTY);
s = icalproperty_get_version(p);
- printf("rem:%s ",s);
icalcomponent_remove_component(c,inner);
@@ -1824,14 +1796,11 @@ void test_iterators()
if(this != 0){
p=icalcomponent_get_first_property(this,ICAL_VERSION_PROPERTY);
s = icalproperty_get_version(p);
- printf("next:%s; ",s);
}
icalcomponent_free(inner);
}
- printf("\n4: ");
-
/* List all remaining components */
for(inner = icalcomponent_get_first_component(c,ICAL_ANY_COMPONENT);
@@ -1843,95 +1812,33 @@ void test_iterators()
const char* s = icalproperty_get_version(p);
- printf("%s ",s);
- }
-
- printf("\n");
-}
-
-
-
-char* test_set_tz(const char* tzid)
-{
- char *tzstr = 0;
- char *tmp;
-
- /* Put the new time zone into the environment */
- if(getenv("TZ") != 0){
- tzstr = (char*)icalmemory_strdup(getenv("TZ"));
-
- if(tzstr == 0){
- icalerror_set_errno(ICAL_NEWFAILED_ERROR);
- return 0;
- }
- }
-
- tmp = (char*)malloc(1024);
-
- if(tmp == 0){
- icalerror_set_errno(ICAL_NEWFAILED_ERROR);
- return 0;
+ if (s)
+ nomore = 0;
}
- snprintf(tmp,1024,"TZ=%s",tzid);
-
- /* HACK. In some libc versions, putenv gives the string to the
- system and in some it gives a copy, so the following might be a
- memory leak. THe linux man page says that glibc2.1.2 take
- ownership ( no leak) while BSD4.4 uses a copy ( A leak ) */
- putenv(tmp);
-
- return tzstr; /* This will be zero if the TZ env var was not set */
-}
-
-void test_unset_tz(char* tzstr)
-{
- /* restore the original environment */
-
- if(tzstr!=0){
- char temp[1024];
- snprintf(temp,1024,"TZ=%s",tzstr);
- putenv(temp);
- free(tzstr);
- } else {
- putenv("TZ"); /* Delete from environment */
- }
+ ok("test if any components remain after deleting the rest",
+ nomore == 1);
+
+ icalcomponent_free(c);
}
void test_time()
{
- char zones[6][40] = { "America/Los_Angeles","America/New_York","Europe/London","Asia/Shanghai", ""};
+ char *zones[6] = { "America/Los_Angeles","America/New_York","Europe/London","Asia/Shanghai", NULL};
+
int i;
- char* old_tz;
- int orig_month;
- time_t tt;
- struct tm stm;
-
- tt = time(0);
-
- stm = *(localtime(&tt));
-
- orig_month = stm.tm_mon;
do_test_time(0);
- old_tz = test_set_tz(zones[0]);
+ for(i = 0; zones[i] != NULL; i++){
- for(i = 0; zones[i][0] != 0; i++){
-
- if(zones[i][0] != 0){
- test_set_tz(zones[i]);
- }
-
- printf(" ######### Timezone: %s ############\n",zones[i]);
-
+ if (VERBOSE) printf(" ######### Timezone: %s ############\n",zones[i]);
+
do_test_time(zones[i]);
}
- test_unset_tz(old_tz);
-
}
@@ -1958,168 +1865,16 @@ void test_icalset()
printf(" class %d\n",icalclassify(c,0,"user"));
}
-}
-
-void test_classify()
-{
- icalcomponent *c,*match;
- icalset* f = icalset_new_file("../../test-data/classify.ics");
-
- assert(f!=0);
-
- c = icalset_get_first_component(f);
- match = icalset_get_next_component(f);
-
- printf("Class %d\n",icalclassify(c,match,"A@example.com"));
-
-
+ icalset_free(f);
+ icalset_free(d);
}
-void print_span(int c, struct icaltime_span span ){
-
- printf("#%02d start: %s\n",c,ical_timet_string(span.start));
- printf(" end : %s\n",ical_timet_string(span.end));
-
-}
-
-struct icaltimetype icaltime_as_local(struct icaltimetype tt) {
- return icaltime_as_zone(tt,0);
-}
-
-void test_span()
-{
- time_t tm1 = 973378800; /*Sat Nov 4 23:00:00 UTC 2000,
- Sat Nov 4 15:00:00 PST 2000 */
- time_t tm2 = 973382400; /*Sat Nov 5 00:00:00 UTC 2000
- Sat Nov 4 16:00:00 PST 2000 */
- struct icaldurationtype dur;
- struct icaltime_span span;
- icalcomponent *c;
-
- memset(&dur,0,sizeof(dur));
- dur.minutes = 30;
-
- span.start = tm1;
- span.end = tm2;
- print_span(0,span);
-
- /* Specify save timezone as in commend above */
- c =
- icalcomponent_vanew(
- ICAL_VEVENT_COMPONENT,
- icalproperty_vanew_dtstart(
- icaltime_as_local(icaltime_from_timet(tm1,0)),
- icalparameter_new_tzid("US/Pacific"),0),
- icalproperty_vanew_dtend(
- icaltime_as_local(icaltime_from_timet(tm2,0)),
- icalparameter_new_tzid("US/Pacific"),0),
- 0
- );
-
- printf("%s\n",icalcomponent_as_ical_string(c));
-
- span = icalcomponent_get_span(c);
-
- print_span(1,span);
-
- icalcomponent_free(c);
-
- /* Use machine's local timezone. Same as above if run in US/Pacific */
- c =
- icalcomponent_vanew(
- ICAL_VEVENT_COMPONENT,
- icalproperty_vanew_dtstart(icaltime_from_timet(tm1,0),0),
- icalproperty_vanew_dtend(icaltime_from_timet(tm2,0),0),
- 0
- );
-
- span = icalcomponent_get_span(c);
-
- print_span(2,span);
-
- icalcomponent_free(c);
-
- /* Specify different timezone */
- c =
- icalcomponent_vanew(
- ICAL_VEVENT_COMPONENT,
- icalproperty_vanew_dtstart(
- icaltime_as_local(icaltime_from_timet(tm1,0)),
- icalparameter_new_tzid("US/Eastern"),0),
- icalproperty_vanew_dtend(
- icaltime_as_local(icaltime_from_timet(tm2,0)),
- icalparameter_new_tzid("US/Eastern"),0),
- 0
- );
- span = icalcomponent_get_span(c);
- print_span(3,span);
-
- icalcomponent_free(c);
-
-
- /* Specify different timezone for start and end*/
- c =
- icalcomponent_vanew(
- ICAL_VEVENT_COMPONENT,
- icalproperty_vanew_dtstart(
- icaltime_as_local(icaltime_from_timet(tm1,0)),
- icalparameter_new_tzid("US/Eastern"),0),
- icalproperty_vanew_dtend(
- icaltime_as_local(icaltime_from_timet(tm2,0)),
- icalparameter_new_tzid("US/Pacific"),0),
- 0
- );
- span = icalcomponent_get_span(c);
- print_span(4,span);
-
- icalcomponent_free(c);
-
- /* Use Duration */
- c =
- icalcomponent_vanew(
- ICAL_VEVENT_COMPONENT,
- icalproperty_vanew_dtstart(
- icaltime_as_local(icaltime_from_timet(tm1,0)),
- icalparameter_new_tzid("US/Pacific"),0),
- icalproperty_new_duration(dur),
-
- 0
- );
- span = icalcomponent_get_span(c);
- print_span(5,span);
-
- icalcomponent_free(c);
-
-
-#ifndef ICAL_ERRORS_ARE_FATAL
- /* Both UTC and Timezone -- an error */
- icalerror_clear_errno();
- c =
- icalcomponent_vanew(
- ICAL_VEVENT_COMPONENT,
- icalproperty_vanew_dtstart(icaltime_from_timet(tm1,0),
- icalparameter_new_tzid("US/Eastern"),0),
- icalproperty_vanew_dtend(icaltime_from_timet(tm2,0),
- icalparameter_new_tzid("US/Eastern"),0),
- 0
- );
-
- span = icalcomponent_get_span(c);
- assert(icalerrno != ICAL_NO_ERROR);
-
- icalcomponent_free(c);
-
-#endif /*ICAL_ERRORS_ARE_FATAL*/
-
-}
icalcomponent* icalclassify_find_overlaps(icalset* set, icalcomponent* comp);
void test_overlaps()
{
-
-#if 0 /* Hack, not working right now */
icalcomponent *cset,*c;
icalset *set;
time_t tm1 = 973378800; /*Sat Nov 4 23:00:00 UTC 2000,
@@ -2131,7 +1886,6 @@ void test_overlaps()
set = icalset_new_file("../../test-data/overlaps.ics");
- printf("-- 1 -- \n");
c = icalcomponent_vanew(
ICAL_VEVENT_COMPONENT,
icalproperty_vanew_dtstart(icaltime_from_timet(tm1-hh,0),0),
@@ -2140,10 +1894,14 @@ void test_overlaps()
);
cset = icalclassify_find_overlaps(set,c);
+ ok("TODO find overlaps 1", (cset != NULL));
+
+ if (VERBOSE && cset) printf("%s\n",icalcomponent_as_ical_string(cset));
+
+ if (cset) icalcomponent_free(cset);
+ if (c) icalcomponent_free(c);
- printf("%s\n",icalcomponent_as_ical_string(cset));
- printf("-- 2 -- \n");
c = icalcomponent_vanew(
ICAL_VEVENT_COMPONENT,
icalproperty_vanew_dtstart(icaltime_from_timet(tm1-hh,0),0),
@@ -2153,9 +1911,12 @@ void test_overlaps()
cset = icalclassify_find_overlaps(set,c);
- printf("%s\n",icalcomponent_as_ical_string(cset));
+ ok("TODO find overlaps 1", cset != NULL);
+ if (VERBOSE && cset) printf("%s\n",icalcomponent_as_ical_string(cset));
+
+ if (cset) icalcomponent_free(cset);
+ if (c) icalcomponent_free(c);
- printf("-- 3 -- \n");
c = icalcomponent_vanew(
ICAL_VEVENT_COMPONENT,
icalproperty_vanew_dtstart(icaltime_from_timet(tm1+5*hh,0),0),
@@ -2164,63 +1925,144 @@ void test_overlaps()
);
cset = icalclassify_find_overlaps(set,c);
+ ok("TODO find overlaps 1", cset != NULL);
+ if (VERBOSE && cset) printf("%s\n",icalcomponent_as_ical_string(cset));
- printf("%s\n",icalcomponent_as_ical_string(cset));
+ if (set) icalset_free(set);
+ if (cset) icalcomponent_free(cset);
+ if (c) icalcomponent_free(c);
+}
-#endif
-}
void test_fblist()
{
- icalspanlist *sl;
+ icalspanlist *sl, *new_sl;
icalset* set = icalset_new_file("../../test-data/spanlist.ics");
struct icalperiodtype period;
+ icalcomponent *comp;
+ int * foo;
+ int i;
sl = icalspanlist_new(set,
- icaltime_from_string("19970324T120000Z"),
- icaltime_from_string("19990424T020000Z"));
+ icaltime_from_string("19980101T000000Z"),
+ icaltime_from_string("19980108T000000Z"));
- printf("Restricted spanlist\n");
- icalspanlist_dump(sl);
+ ok("open ../../test-data/spanlist.ics", (set!=NULL));
+ assert(set!=NULL);
+
+ if (VERBOSE) printf("Restricted spanlist\n");
+ if (VERBOSE) icalspanlist_dump(sl);
period= icalspanlist_next_free_time(sl,
- icaltime_from_string("19970801T120000Z"));
+ icaltime_from_string("19970801T120000"));
+
+ is("Next Free time start 19970801T120000", icaltime_as_ical_string(period.start), "19970801T120000");
+ is("Next Free time end 19980101T000000", icaltime_as_ical_string(period.end), "19980101T000000");
+
+ period= icalspanlist_next_free_time(sl, period.end);
+
+ is("Next Free time start 19980101T010000", icaltime_as_ical_string(period.start), "19980101T010000");
+ is("Next Free time end 19980102T010000", icaltime_as_ical_string(period.end), "19980102T010000");
+
+ if (VERBOSE) printf("%s\n",
+ icalcomponent_as_ical_string(icalspanlist_as_vfreebusy(sl,
+ "a@foo.com",
+ "b@foo.com")
+ ));
+
+ foo = icalspanlist_as_freebusy_matrix(sl,3600);
+
+ for (i=0; foo[i] != -1; i++); /* find number entries */
+
+ int_is("Calculating freebusy hourly matrix", i, (7*24));
+
+ if (VERBOSE) {
+ for (i=0; foo[i] != -1; i++) {
+ printf("%d", foo[i]);
+ if ((i % 24) == 23)
+ printf("\n");
+ }
+ printf("\n\n");
+ }
+
+
+ free(foo);
+ foo = icalspanlist_as_freebusy_matrix(sl,3600*24);
- printf("Next Free time: %s\n",icaltime_as_ctime(period.start));
- printf(" %s\n",icaltime_as_ctime(period.end));
+ ok("Calculating daily freebusy matrix", (foo!=NULL));
+ {
+ char out_str[80] = "";
+ char *strp = out_str;
+
+ for (i=0; foo[i]!=-1; i++){
+ sprintf(strp, "%d", foo[i]);
+ strp++;
+ }
+ is("Checking freebusy validity", out_str, "1121110");
+ }
+ if (VERBOSE) {
+ for (i=0; foo[i] != -1; i++) {
+ printf("%d", foo[i]);
+ if ((i % 7) == 6)
+ printf("\n");
+ }
+ printf("\n\n");
+ }
+ free(foo);
icalspanlist_free(sl);
- printf("Unrestricted spanlist\n");
+
+ if (VERBOSE) printf("Unrestricted spanlist\n");
sl = icalspanlist_new(set,
- icaltime_from_string("19970324T120000Z"),
+ icaltime_from_string("19970324T120000Z"),
icaltime_null_time());
-
- printf("Restricted spanlist\n");
- icalspanlist_dump(sl);
+ ok("add 19970324T120000Z to spanlist", (sl!=NULL));
+
+ if (VERBOSE) printf("Restricted spanlist\n");
+ if (VERBOSE) icalspanlist_dump(sl);
period= icalspanlist_next_free_time(sl,
icaltime_from_string("19970801T120000Z"));
- printf("Next Free time: %s\n",icaltime_as_ctime(period.start));
- printf(" %s\n",icaltime_as_ctime(period.end));
+ is("Next Free time start 19980101T010000",
+ icaltime_as_ical_string(period.start),
+ "19980101T010000");
+ is("Next Free time end 19980102T010000",
+ icaltime_as_ical_string(period.end),
+ "19980102T010000");
- icalspanlist_free(sl);
+ comp = icalspanlist_as_vfreebusy(sl, "a@foo.com", "b@foo.com");
+
+ ok("Calculating VFREEBUSY component", (comp != NULL));
+ if (VERBOSE) printf("%s\n", icalcomponent_as_ical_string(comp));
+ new_sl = icalspanlist_from_vfreebusy(comp);
+ ok("Calculating spanlist from generated VFREEBUSY component",
+ (new_sl != NULL));
+
+ if (VERBOSE) icalspanlist_dump(new_sl);
+
+ if (sl) icalspanlist_free(sl);
+ if (new_sl) icalspanlist_free(new_sl);
+ if (comp) icalcomponent_free(comp);
+
+ icalset_free(set);
}
+
void test_convenience(){
-
icalcomponent *c;
int duration;
+ struct icaltimetype tt;
c = icalcomponent_vanew(
ICAL_VCALENDAR_COMPONENT,
@@ -2232,14 +2074,15 @@ void test_convenience(){
),
0);
- printf("** 1 DTSTART and DTEND **\n%s\n\n",
- icalcomponent_as_ical_string(c));
+ if (VERBOSE) printf("\n%s\n", icalcomponent_as_ical_string(c));
duration = icaldurationtype_as_int(icalcomponent_get_duration(c))/60;
- printf("Start: %s\n",ictt_as_string(icalcomponent_get_dtstart(c)));
- printf("End: %s\n",ictt_as_string(icalcomponent_get_dtend(c)));
- printf("Dur: %d m\n",duration);
+ is("Start is 1997-08-01 12:00:00 (floating)",
+ ictt_as_string(icalcomponent_get_dtstart(c)), "1997-08-01 12:00:00 (floating)");
+ is("End is 1997-08-01 13:00:00 (floating)",
+ ictt_as_string(icalcomponent_get_dtend(c)), "1997-08-01 13:00:00 (floating)");
+ ok("Duration is 60 m", (duration == 60));
icalcomponent_free(c);
@@ -2253,17 +2096,20 @@ void test_convenience(){
),
0);
- printf("\n** 2 DTSTART and DURATION **\n%s\n\n",
- icalcomponent_as_ical_string(c));
+ if (VERBOSE) printf("\n%s\n", icalcomponent_as_ical_string(c));
duration = icaldurationtype_as_int(icalcomponent_get_duration(c))/60;
- printf("Start: %s\n",ictt_as_string(icalcomponent_get_dtstart(c)));
- printf("End: %s\n",ictt_as_string(icalcomponent_get_dtend(c)));
- printf("Dur: %d m\n",duration);
+ is("Start is 1997-08-01 12:00:00 Z UTC",
+ ictt_as_string(icalcomponent_get_dtstart(c)), "1997-08-01 12:00:00 Z UTC");
+ is("End is 1997-08-01 13:30:00 Z UTC",
+ ictt_as_string(icalcomponent_get_dtend(c)), "1997-08-01 13:30:00 Z UTC");
+ ok("Duration is 90 m", (duration == 90));
icalcomponent_free(c);
+ icalerror_errors_are_fatal = 0;
+
c = icalcomponent_vanew(
ICAL_VCALENDAR_COMPONENT,
icalcomponent_vanew(
@@ -2276,14 +2122,17 @@ void test_convenience(){
icalcomponent_set_duration(c,icaldurationtype_from_string("PT1H30M"));
- printf("** 3 DTSTART and DTEND, Set DURATION **\n%s\n\n",
- icalcomponent_as_ical_string(c));
+ if (VERBOSE) printf("\n%s\n", icalcomponent_as_ical_string(c));
duration = icaldurationtype_as_int(icalcomponent_get_duration(c))/60;
- printf("Start: %s\n",ictt_as_string(icalcomponent_get_dtstart(c)));
- printf("End: %s\n",ictt_as_string(icalcomponent_get_dtend(c)));
- printf("Dur: %d m\n",duration);
+ is("Start is 1997-08-01 12:00:00 (floating)",
+ ictt_as_string(icalcomponent_get_dtstart(c)),
+ "1997-08-01 12:00:00 (floating)");
+ is("End is 1997-08-01 13:00:00 (floating)",
+ ictt_as_string(icalcomponent_get_dtend(c)),
+ "1997-08-01 13:00:00 (floating)");
+ ok("Duration is 60 m", (duration == 60));
icalcomponent_free(c);
@@ -2299,14 +2148,18 @@ void test_convenience(){
icalcomponent_set_dtend(c,icaltime_from_string("19970801T133000Z"));
- printf("\n** 4 DTSTART and DURATION, set DTEND **\n%s\n\n",
- icalcomponent_as_ical_string(c));
+ if (VERBOSE) printf("\n%s\n", icalcomponent_as_ical_string(c));
+
duration = icaldurationtype_as_int(icalcomponent_get_duration(c))/60;
- printf("Start: %s\n",ictt_as_string(icalcomponent_get_dtstart(c)));
- printf("End: %s\n",ictt_as_string(icalcomponent_get_dtend(c)));
- printf("Dur: %d m\n",duration);
+ ok("Start is 1997-08-01 12:00:00 Z UTC",
+ (0 == strcmp("1997-08-01 12:00:00 Z UTC", ictt_as_string(icalcomponent_get_dtstart(c)))));
+ ok("End is 1997-08-01 13:30:00 Z UTC",
+ (0 == strcmp("1997-08-01 13:30:00 Z UTC", ictt_as_string(icalcomponent_get_dtend(c)))));
+ ok("Duration is 90 m", (duration == 90));
+
+ icalerror_errors_are_fatal = 1;
icalcomponent_free(c);
@@ -2321,15 +2174,16 @@ void test_convenience(){
icalcomponent_set_dtstart(c,icaltime_from_string("19970801T120000Z"));
icalcomponent_set_dtend(c,icaltime_from_string("19970801T133000Z"));
- printf("\n** 5 Set DTSTART and DTEND **\n%s\n\n",
- icalcomponent_as_ical_string(c));
+ if (VERBOSE) printf("\n%s\n", icalcomponent_as_ical_string(c));
duration = icaldurationtype_as_int(icalcomponent_get_duration(c))/60;
- printf("Start: %s\n",ictt_as_string(icalcomponent_get_dtstart(c)));
- printf("End: %s\n",ictt_as_string(icalcomponent_get_dtend(c)));
- printf("Dur: %d m\n",duration);
+ ok("Start is 1997-08-01 12:00:00 Z UTC",
+ (0 == strcmp("1997-08-01 12:00:00 Z UTC", ictt_as_string(icalcomponent_get_dtstart(c)))));
+ ok("End is 1997-08-01 13:30:00 Z UTC",
+ (0 == strcmp("1997-08-01 13:30:00 Z UTC", ictt_as_string(icalcomponent_get_dtend(c)))));
+ ok("Duration is 90 m", (duration == 90));
icalcomponent_free(c);
@@ -2345,18 +2199,44 @@ void test_convenience(){
icalcomponent_set_dtstart(c,icaltime_from_string("19970801T120000Z"));
icalcomponent_set_duration(c,icaldurationtype_from_string("PT1H30M"));
- printf("\n** 6 Set DTSTART and DURATION **\n%s\n\n",
- icalcomponent_as_ical_string(c));
+ if (VERBOSE) printf("\n%s\n", icalcomponent_as_ical_string(c));
duration = icaldurationtype_as_int(icalcomponent_get_duration(c))/60;
- printf("Start: %s\n",ictt_as_string(icalcomponent_get_dtstart(c)));
- printf("End: %s\n",ictt_as_string(icalcomponent_get_dtend(c)));
- printf("Dur: %d m\n",duration);
+ ok("Start is 1997-08-01 12:00:00 Z UTC",
+ (0 == strcmp("1997-08-01 12:00:00 Z UTC", ictt_as_string(icalcomponent_get_dtstart(c)))));
+ ok("End is 1997-08-01 13:30:00 Z UTC",
+ (0 == strcmp("1997-08-01 13:30:00 Z UTC", ictt_as_string(icalcomponent_get_dtend(c)))));
+ ok("Duration is 90 m", (duration == 90));
icalcomponent_free(c);
+ c = icalcomponent_vanew(
+ ICAL_VCALENDAR_COMPONENT,
+ icalcomponent_vanew(
+ ICAL_VEVENT_COMPONENT,
+ 0
+ ),
+ 0);
+
+ tt = icaltime_from_string("19970801T120000");
+ icaltime_set_timezone(&tt,
+ icaltimezone_get_builtin_timezone("Europe/Rome"));
+ icalcomponent_set_dtstart(c,tt);
+
+ if (VERBOSE) printf("\n%s\n", icalcomponent_as_ical_string(c));
+
+ icalcomponent_set_duration(c,icaldurationtype_from_string("PT1H30M"));
+ duration = icaldurationtype_as_int(icalcomponent_get_duration(c))/60;
+
+ ok("Start is 1997-08-01 12:00:00 /softwarestudio.org/Olson_20010626_2/Europe/Rome",
+ (0 == strcmp("1997-08-01 12:00:00 /softwarestudio.org/Olson_20010626_2/Europe/Rome", ictt_as_string(icalcomponent_get_dtstart(c)))));
+ ok("End is 1997-08-01 13:30:00 /softwarestudio.org/Olson_20010626_2/Europe/Rome",
+ (0 == strcmp("1997-08-01 13:30:00 /softwarestudio.org/Olson_20010626_2/Europe/Rome", ictt_as_string(icalcomponent_get_dtend(c)))));
+ ok("Duration is 90 m", (duration == 90));
+
+ icalcomponent_free(c);
}
void test_time_parser()
@@ -2366,77 +2246,176 @@ void test_time_parser()
icalerror_errors_are_fatal = 0;
tt = icaltime_from_string("19970101T1000");
- assert(icaltime_is_null_time(tt));
+ ok("19970101T1000 is null time", icaltime_is_null_time(tt));
tt = icaltime_from_string("19970101X100000");
- assert(icaltime_is_null_time(tt));
+ ok("19970101X100000 is null time", icaltime_is_null_time(tt));
tt = icaltime_from_string("19970101T100000");
- assert(!icaltime_is_null_time(tt));
- printf("%s\n",icaltime_as_ctime(tt));
+ ok("19970101T100000 is valid", !icaltime_is_null_time(tt));
+
+ if (VERBOSE) printf("%s\n",icaltime_as_ctime(tt));
tt = icaltime_from_string("19970101T100000Z");
- assert(!icaltime_is_null_time(tt));
- printf("%s\n",icaltime_as_ctime(tt));
+
+ ok("19970101T100000Z is valid" , !icaltime_is_null_time(tt));
+ if (VERBOSE) printf("%s\n",icaltime_as_ctime(tt));
tt = icaltime_from_string("19970101");
- assert(!icaltime_is_null_time(tt));
- printf("%s\n",icaltime_as_ctime(tt));
+ ok("19970101 is valid", (!icaltime_is_null_time(tt)));
- icalerror_errors_are_fatal = 1;
+ if (VERBOSE) printf("%s\n",icaltime_as_ctime(tt));
+ icalerror_errors_are_fatal = 1;
}
void test_recur_parser()
{
- struct icalrecurrencetype rt;
+ struct icalrecurrencetype rt;
+ char *str;
+
+ str = "FREQ=YEARLY;UNTIL=20000131T090000Z;INTERVAL=1;BYDAY=-1TU,3WE,-4FR,SA,SU;BYYEARDAY=34,65,76,78;BYMONTH=1,2,3,4,8";
+ rt = icalrecurrencetype_from_string(str);
+ is(str, icalrecurrencetype_as_string(&rt), str);
+
+ str = "FREQ=DAILY;COUNT=3;INTERVAL=1;BYDAY=-1TU,3WE,-4FR,SA,SU;BYYEARDAY=34,65,76,78;BYMONTH=1,2,3,4,8";
+
+ rt = icalrecurrencetype_from_string(str);
+ is(str, icalrecurrencetype_as_string(&rt), str);
+}
+
+char* ical_strstr(const char *haystack, const char *needle){
+ return strstr(haystack,needle);
+}
+
+void test_start_of_week()
+{
+ struct icaltimetype tt2;
+ struct icaltimetype tt1 = icaltime_from_string("19900110");
+ int dow, doy,start_dow;
- printf("FREQ=YEARLY;UNTIL=20000131T090000Z;BYMONTH=1,2,3,4,8;BYYEARDAY=34,65,76,78;BYDAY=-1TU,3WE,-4FR,SU,SA\n");
+ do{
+ tt1 = icaltime_normalize(tt1);
- rt = icalrecurrencetype_from_string("FREQ=YEARLY;UNTIL=20000131T090000Z;BYMONTH=1,2,3,4,8;BYYEARDAY=34,65,76,78;BYDAY=-1TU,3WE,-4FR,SU,SA");
+ doy = icaltime_start_doy_of_week(tt1);
+ dow = icaltime_day_of_week(tt1);
- printf("%s\n\n",icalrecurrencetype_as_string(&rt));
+ tt2 = icaltime_from_day_of_year(doy,tt1.year);
+ start_dow = icaltime_day_of_week(tt2);
- printf("FREQ=DAILY;COUNT=3;BYMONTH=1,2,3,4,8;BYYEARDAY=34,65,76,78;BYDAY=-1TU,3WE,-4FR,SU,S\n");
+ if(doy == 1){
+ char msg[128];
+ sprintf(msg, "%s", ictt_as_string(tt1));
+ int_is(msg, start_dow, 1);
+ }
- rt = icalrecurrencetype_from_string("FREQ=DAILY;COUNT=3;BYMONTH=1,2,3,4,8;BYYEARDAY=34,65,76,78;BYDAY=-1TU,3WE,-4FR,SU,SA");
+ if(start_dow != 1){ /* Sunday is 1 */
+ printf("failed: Start of week (%s) is not a Sunday \n for %s (doy=%d,dow=%d)\n",ictt_as_string(tt2), ictt_as_string(tt1),dow,start_dow);
+ }
- printf("%s\n",icalrecurrencetype_as_string(&rt));
-}
+ assert(start_dow == 1);
-char* ical_strstr(const char *haystack, const char *needle){
- return strstr(haystack,needle);
+
+ tt1.day+=1;
+
+ } while(tt1.year < 2010);
}
void test_doy()
{
struct icaltimetype tt1, tt2;
- short doy;
+ short doy,doy2;
+ char msg[128];
+
+ doy = -1;
+
+ tt1 = icaltime_from_string("19900101");
+
+ if (VERBOSE) printf("Test icaltime_day_of_year() agreement with mktime\n");
+
+ do{
+ struct tm stm;
+
+ tt1 = icaltime_normalize(tt1);
+
+ stm.tm_sec = tt1.second;
+ stm.tm_min = tt1.minute;
+ stm.tm_hour = tt1.hour;
+ stm.tm_mday = tt1.day;
+ stm.tm_mon = tt1.month-1;
+ stm.tm_year = tt1.year-1900;
+ stm.tm_isdst = -1;
+
+ mktime(&stm);
+
+ doy = icaltime_day_of_year(tt1);
+
+ doy2 = stm.tm_yday+1;
+
+ if (doy == 1) {
+ /** show some test cases **/
+ sprintf(msg, "Year %d - mktime() compare", tt1.year);
+ int_is(msg, doy,doy2);
+ }
+
+ if (doy != doy2){
+ printf("Failed for %s (%d,%d)\n",ictt_as_string(tt1),doy,doy2);
+ }
+ assert(doy == doy2);
+
+ tt1.day+=1;
+
+ } while(tt1.year < 2010);
+
+ if (VERBOSE) printf("\nTest icaltime_day_of_year() agreement with icaltime_from_day_of_year()\n");
+
+ tt1 = icaltime_from_string("19900101");
+
+ do{
+ if(doy == 1){
+ /** show some test cases **/
+ sprintf(msg, "Year %d - icaltime_day_of_year() compare", tt1.year);
+ int_is(msg, doy,doy2);
+ }
+
+ doy = icaltime_day_of_year(tt1);
+ tt2 = icaltime_from_day_of_year(doy,tt1.year);
+ doy2 = icaltime_day_of_year(tt2);
+
+ assert(doy2 == doy);
+ assert(icaltime_compare(tt1,tt2) == 0);
+
+ tt1.day+=1;
+ tt1 = icaltime_normalize(tt1);
+
+ } while(tt1.year < 2010);
+
tt1 = icaltime_from_string("19950301");
doy = icaltime_day_of_year(tt1);
tt2 = icaltime_from_day_of_year(doy,1995);
- printf("%d %s %s\n",doy, icaltime_as_ctime(tt1),icaltime_as_ctime(tt2));
- assert(tt2.day == 1 && tt2.month == 3);
- assert(doy == 60);
+ if(VERBOSE) printf("%d %s %s\n",doy, icaltime_as_ctime(tt1),icaltime_as_ctime(tt2));
+
+ ok("test 19950301", (tt2.day == 1 && tt2.month == 3));
+ ok("day of year == 60", (doy == 60));
tt1 = icaltime_from_string("19960301");
doy = icaltime_day_of_year(tt1);
tt2 = icaltime_from_day_of_year(doy,1996);
- printf("%d %s %s\n",doy, icaltime_as_ctime(tt1),icaltime_as_ctime(tt2));
- assert(tt2.day == 1 && tt2.month == 3);
- assert(doy == 61);
+ if (VERBOSE) printf("%d %s %s\n",doy, icaltime_as_ctime(tt1),icaltime_as_ctime(tt2));
+ ok("test 19960301", (tt2.day == 1 && tt2.month == 3));
+ ok("day of year == 61", (doy == 61));
tt1 = icaltime_from_string("19970301");
doy = icaltime_day_of_year(tt1);
tt2 = icaltime_from_day_of_year(doy,1997);
- printf("%d %s %s\n",doy, icaltime_as_ctime(tt1),icaltime_as_ctime(tt2));
- assert(tt2.day == 1 && tt2.month == 3);
- assert(doy == 60);
+ if (VERBOSE) printf("%d %s %s\n",doy, icaltime_as_ctime(tt1),icaltime_as_ctime(tt2));
-}
+ ok("test 19970301", (tt2.day == 1 && tt2.month == 3));
+ ok("day of year == 60", (doy == 60));
+}
void test_x(){
@@ -2462,15 +2441,15 @@ void test_x(){
int n_errors;
icalcomp = icalparser_parse_string ((char *) test_icalcomp_str);
- if (!icalcomp) {
- fprintf (stderr, "main(): could not parse the component\n");
- exit (EXIT_FAILURE);
- }
+ assert(icalcomp!=NULL);
- printf("%s\n\n",icalcomponent_as_ical_string(icalcomp));
+ if (VERBOSE) printf("%s\n\n",icalcomponent_as_ical_string(icalcomp));
n_errors = icalcomponent_count_errors (icalcomp);
+ int_is("icalparser_parse_string()", n_errors,0);
+
if (n_errors) {
+ /** NOT USED **/
icalproperty *p;
for (p = icalcomponent_get_first_property (icalcomp,
@@ -2478,7 +2457,7 @@ void test_x(){
p;
p = icalcomponent_get_next_property (icalcomp,
ICAL_XLICERROR_PROPERTY)) {
- char *str;
+ const char *str;
str = icalproperty_as_ical_string (p);
fprintf (stderr, "error: %s\n", str);
@@ -2486,44 +2465,67 @@ void test_x(){
}
prop = icalcomponent_get_first_property (icalcomp, ICAL_RRULE_PROPERTY);
- if (!prop) {
- fprintf (stderr, "main(): could not get the RRULE property");
- exit (EXIT_FAILURE);
- }
+ ok("get RRULE property", (prop != NULL));
+ assert(prop!=NULL);
recur = icalproperty_get_rrule (prop);
- printf("%s\n",icalrecurrencetype_as_string(&recur));
+ if (VERBOSE) printf("%s\n",icalrecurrencetype_as_string(&recur));
+
+ icalcomponent_free(icalcomp);
}
void test_gauge_sql() {
-
-
icalgauge *g;
+ char* str;
- printf("\nSELECT DTSTART,DTEND,COMMENT FROM VEVENT,VTODO WHERE VEVENT.SUMMARY = 'Bongoa' AND SEQUENCE < 5\n");
+ str= "SELECT DTSTART,DTEND,COMMENT FROM VEVENT,VTODO WHERE VEVENT.SUMMARY = 'Bongoa' AND SEQUENCE < 5";
- g = icalgauge_new_from_sql("SELECT DTSTART,DTEND,COMMENT FROM VEVENT,VTODO WHERE VEVENT.SUMMARY = 'Bongoa' AND SEQUENCE < 5");
-
- icalgauge_dump(g);
+ g = icalgauge_new_from_sql(str, 0);
+ ok(str, (g!=NULL));
+ if (VERBOSE) icalgauge_dump(g);
icalgauge_free(g);
- printf("\nSELECT * FROM VEVENT,VTODO WHERE VEVENT.SUMMARY = 'Bongoa' AND SEQUENCE < 5 OR METHOD != 'CREATE'\n");
+ str="SELECT * FROM VEVENT,VTODO WHERE VEVENT.SUMMARY = 'Bongoa' AND SEQUENCE < 5 OR METHOD != 'CREATE'";
- g = icalgauge_new_from_sql("SELECT * FROM VEVENT,VTODO WHERE VEVENT.SUMMARY = 'Bongoa' AND SEQUENCE < 5 OR METHOD != 'CREATE'");
-
- icalgauge_dump(g);
+ g = icalgauge_new_from_sql(str, 0);
+ ok(str, (g!=NULL));
+ if (VERBOSE) icalgauge_dump(g);
+
+ icalgauge_free(g);
+
+ str="SELECT * FROM VEVENT WHERE SUMMARY == 'BA301'";
+
+ g = icalgauge_new_from_sql(str, 0);
+ ok(str, (g!=NULL));
+ if (VERBOSE) icalgauge_dump(g);
+
+ icalgauge_free(g);
+
+ str="SELECT * FROM VEVENT WHERE SUMMARY == 'BA301'";
+
+ g = icalgauge_new_from_sql(str, 0);
+ ok(str, (g!=NULL));
+ if (VERBOSE) icalgauge_dump(g);
icalgauge_free(g);
+ str="SELECT * FROM VEVENT WHERE LOCATION == '104 Forum'";
+
+ g = icalgauge_new_from_sql(str, 0);
+ ok(str, (g!=NULL));
+ if (VERBOSE) icalgauge_dump(g);
+
+ icalgauge_free(g);
}
-void test_gauge_compare() {
+void test_gauge_compare() {
icalgauge *g;
icalcomponent *c;
+ char* str;
/* Equality */
@@ -2533,35 +2535,35 @@ void test_gauge_compare() {
icaltime_from_string("20000101T000002")),0),0);
g = icalgauge_new_from_sql(
- "SELECT * FROM VEVENT WHERE DTSTART = '20000101T000002'");
+ "SELECT * FROM VEVENT WHERE DTSTART = '20000101T000002'", 0);
- printf("SELECT * FROM VEVENT WHERE DTSTART = '20000101T000002'\n");
+ ok("SELECT * FROM VEVENT WHERE DTSTART = '20000101T000002'", (c!=0 && g!=0));
assert(c!=0);
assert(g!=0);
- assert(icalgauge_compare(g,c) == 1);
+ int_is("compare",icalgauge_compare(g,c), 1);
icalgauge_free(g);
g = icalgauge_new_from_sql(
- "SELECT * FROM VEVENT WHERE DTSTART = '20000101T000001'");
+ "SELECT * FROM VEVENT WHERE DTSTART = '20000101T000001'", 0);
- printf("SELECT * FROM VEVENT WHERE DTSTART = '20000101T000001'\n");
+ ok("SELECT * FROM VEVENT WHERE DTSTART = '20000101T000001'\n", (g!=0));
assert(g!=0);
- assert(icalgauge_compare(g,c) == 0);
+ int_is("compare",icalgauge_compare(g,c), 0);
icalgauge_free(g);
g = icalgauge_new_from_sql(
- "SELECT * FROM VEVENT WHERE DTSTART != '20000101T000003'");
+ "SELECT * FROM VEVENT WHERE DTSTART != '20000101T000003'", 0);
- printf("SELECT * FROM VEVENT WHERE DTSTART != '20000101T000003'\n");
+ ok("SELECT * FROM VEVENT WHERE DTSTART != '20000101T000003'\n", (c!=0 && g!=0));
assert(g!=0);
- assert(icalgauge_compare(g,c) == 1);
+ int_is("compare",icalgauge_compare(g,c), 1);
icalgauge_free(g);
@@ -2569,47 +2571,48 @@ void test_gauge_compare() {
/* Less than */
g = icalgauge_new_from_sql(
- "SELECT * FROM VEVENT WHERE DTSTART < '20000101T000003'");
+ "SELECT * FROM VEVENT WHERE DTSTART < '20000101T000003'", 0);
- printf("SELECT * FROM VEVENT WHERE DTSTART < '20000101T000003'\n");
+ ok("SELECT * FROM VEVENT WHERE DTSTART < '20000101T000003'", (c!=0 && g!=0));
- assert(icalgauge_compare(g,c) == 1);
+ int_is("compare",icalgauge_compare(g,c), 1);
assert(g!=0);
icalgauge_free(g);
g = icalgauge_new_from_sql(
- "SELECT * FROM VEVENT WHERE DTSTART < '20000101T000002'");
+ "SELECT * FROM VEVENT WHERE DTSTART < '20000101T000002'", 0);
- printf("SELECT * FROM VEVENT WHERE DTSTART < '20000101T000002'\n");
+ ok("SELECT * FROM VEVENT WHERE DTSTART < '20000101T000002'\n", (g!=0));
assert(g!=0);
- assert(icalgauge_compare(g,c) == 0);
+ int_is("compare",icalgauge_compare(g,c), 0);
icalgauge_free(g);
/* Greater than */
g = icalgauge_new_from_sql(
- "SELECT * FROM VEVENT WHERE DTSTART > '20000101T000001'");
+ "SELECT * FROM VEVENT WHERE DTSTART > '20000101T000001'", 0);
- printf("SELECT * FROM VEVENT WHERE DTSTART > '20000101T000001'\n");
+ ok("SELECT * FROM VEVENT WHERE DTSTART > '20000101T000001'\n", (g!=0));
assert(g!=0);
- assert(icalgauge_compare(g,c) == 1);
+ int_is("compare",icalgauge_compare(g,c), 1);
icalgauge_free(g);
g = icalgauge_new_from_sql(
- "SELECT * FROM VEVENT WHERE DTSTART > '20000101T000002'");
+ "SELECT * FROM VEVENT WHERE DTSTART > '20000101T000002'", 0);
- printf("SELECT * FROM VEVENT WHERE DTSTART > '20000101T000002'\n");
+ ok("SELECT * FROM VEVENT WHERE DTSTART > '20000101T000002'\n", (g!=0));
assert(g!=0);
- assert(icalgauge_compare(g,c) == 0);
+ int_is("compare",icalgauge_compare(g,c), 0);
+
icalgauge_free(g);
@@ -2617,53 +2620,117 @@ void test_gauge_compare() {
/* Greater than or Equal to */
g = icalgauge_new_from_sql(
- "SELECT * FROM VEVENT WHERE DTSTART >= '20000101T000002'");
+ "SELECT * FROM VEVENT WHERE DTSTART >= '20000101T000002'", 0);
- printf("SELECT * FROM VEVENT WHERE DTSTART >= '20000101T000002'\n");
+ ok("SELECT * FROM VEVENT WHERE DTSTART >= '20000101T000002'\n", (g!=0));
- assert(g!=0);
- assert(icalgauge_compare(g,c) == 1);
+ int_is("compare",icalgauge_compare(g,c), 1);
icalgauge_free(g);
g = icalgauge_new_from_sql(
- "SELECT * FROM VEVENT WHERE DTSTART >= '20000101T000003'");
+ "SELECT * FROM VEVENT WHERE DTSTART >= '20000101T000003'", 0);
- printf("SELECT * FROM VEVENT WHERE DTSTART >= '20000101T000003'\n");
+ ok("SELECT * FROM VEVENT WHERE DTSTART >= '20000101T000003'\n", (g!=0));
- assert(g!=0);
- assert(icalgauge_compare(g,c) == 0);
+ int_is("compare",icalgauge_compare(g,c), 0);
icalgauge_free(g);
/* Less than or Equal to */
g = icalgauge_new_from_sql(
- "SELECT * FROM VEVENT WHERE DTSTART <= '20000101T000002'");
+ "SELECT * FROM VEVENT WHERE DTSTART <= '20000101T000002'", 0);
- printf("SELECT * FROM VEVENT WHERE DTSTART <= '20000101T000002'\n");
+ ok("SELECT * FROM VEVENT WHERE DTSTART <= '20000101T000002'\n", (g!=0));
assert(g!=0);
- assert(icalgauge_compare(g,c) == 1);
+ int_is("compare",icalgauge_compare(g,c), 1);
icalgauge_free(g);
g = icalgauge_new_from_sql(
- "SELECT * FROM VEVENT WHERE DTSTART <= '20000101T000001'");
+ "SELECT * FROM VEVENT WHERE DTSTART <= '20000101T000001'", 0);
- printf("SELECT * FROM VEVENT WHERE DTSTART <= '20000101T000001'\n");
+ ok("SELECT * FROM VEVENT WHERE DTSTART <= '20000101T000001'\n", (g!=0));
- assert(g!=0);
- assert(icalgauge_compare(g,c) == 0);
+ int_is("compare",icalgauge_compare(g,c), 0);
icalgauge_free(g);
icalcomponent_free(c);
+ /* Combinations */
+
+ c = icalcomponent_vanew(ICAL_VCALENDAR_COMPONENT,
+ icalcomponent_vanew(ICAL_VEVENT_COMPONENT,
+ icalproperty_new_dtstart(
+ icaltime_from_string("20000102T000000")),0),0);
+
+
+ str = "SELECT * FROM VEVENT WHERE DTSTART > '20000101T000000' and DTSTART < '20000103T000000'";
+
+ g = icalgauge_new_from_sql(str, 0);
+ ok(str, (g!=0));
+ int_is("compare",icalgauge_compare(g,c), 1);
+
+ icalgauge_free(g);
+
+ str = "SELECT * FROM VEVENT WHERE DTSTART > '20000101T000000' and DTSTART < '20000102T000000'";
+
+ g = icalgauge_new_from_sql(str, 0);
+ ok(str, (g!=0));
+ int_is("compare",icalgauge_compare(g,c), 0);
+
+ icalgauge_free(g);
+
+ str = "SELECT * FROM VEVENT WHERE DTSTART > '20000101T000000' or DTSTART < '20000102T000000'";
+
+ g = icalgauge_new_from_sql(str, 0);
+ ok(str, (g!=0));
+ int_is("compare",icalgauge_compare(g,c), 1);
+
+ icalgauge_free(g);
+
+
+ icalcomponent_free(c);
+
+ /* Combinations, non-cannonical component */
+
+ c = icalcomponent_vanew(ICAL_VEVENT_COMPONENT,
+ icalproperty_new_dtstart(
+ icaltime_from_string("20000102T000000")),0);
+
+
+ str = "SELECT * FROM VEVENT WHERE DTSTART > '20000101T000000' and DTSTART < '20000103T000000'";
+
+ g = icalgauge_new_from_sql(str, 0);
+ ok(str, (g!=0));
+ int_is("compare",icalgauge_compare(g,c), 1);
+
+ icalgauge_free(g);
+
+ str = "SELECT * FROM VEVENT WHERE DTSTART > '20000101T000000' and DTSTART < '20000102T000000'";
+
+ g = icalgauge_new_from_sql(str, 0);
+ ok(str, (g!=0));
+ int_is("compare",icalgauge_compare(g,c), 0);
+
+ icalgauge_free(g);
+
+ str = "SELECT * FROM VEVENT WHERE DTSTART > '20000101T000000' or DTSTART < '20000102T000000'";
+
+ g = icalgauge_new_from_sql(str, 0);
+ ok(str, (g!=0));
+ int_is("compare",icalgauge_compare(g,c), 1);
+
+ icalgauge_free(g);
+ icalcomponent_free(c);
+
/* Complex comparisions */
@@ -2684,37 +2751,45 @@ void test_gauge_compare() {
0),
0);
+
+ str = "SELECT * FROM VEVENT WHERE VALARM.DTSTART = '20000101T120000'";
- g = icalgauge_new_from_sql(
- "SELECT * FROM VEVENT WHERE VALARM.DTSTART = '20000101T120000'");
-
- printf("SELECT * FROM VEVENT WHERE VALARM.DTSTART = '20000101T120000'\n");
-
- assert(icalgauge_compare(g,c) == 1);
+ g = icalgauge_new_from_sql(str, 0);
+ ok(str, (g!=0));
+ int_is("compare",icalgauge_compare(g,c), 1);
icalgauge_free(g);
- g = icalgauge_new_from_sql(
- "SELECT * FROM VEVENT WHERE COMMENT = 'foo'");
+ str = "SELECT * FROM VEVENT WHERE COMMENT = 'foo'";
+ g = icalgauge_new_from_sql(str, 0);
+ ok(str, (g!=0));
+ int_is("compare",icalgauge_compare(g,c), 1);
- printf("SELECT * FROM VEVENT WHERE COMMENT = 'foo'\n");
-
- assert(icalgauge_compare(g,c) == 1);
+ icalgauge_free(g);
+
+ str = "SELECT * FROM VEVENT WHERE COMMENT = 'foo' AND VALARM.DTSTART = '20000101T120000'";
+ g = icalgauge_new_from_sql(str, 0);
+ ok(str, (g!=0));
+ int_is("compare",icalgauge_compare(g,c), 1);
icalgauge_free(g);
+ str = "SELECT * FROM VEVENT WHERE COMMENT = 'bar' AND VALARM.DTSTART = '20000101T120000'";
+ g = icalgauge_new_from_sql(str, 0);
+ ok(str, (g!=0));
+ int_is("compare",icalgauge_compare(g,c), 0);
- g = icalgauge_new_from_sql(
- "SELECT * FROM VEVENT WHERE COMMENT = 'foo' AND VALARM.DTSTART = '20000101T120000'");
-
- printf("SELECT * FROM VEVENT WHERE COMMENT = 'foo' AND VALARM.DTSTART = '20000101T120000'\n");
+ icalgauge_free(g);
- assert(icalgauge_compare(g,c) == 1);
+ str = "SELECT * FROM VEVENT WHERE COMMENT = 'bar' or VALARM.DTSTART = '20000101T120000'";
+ g = icalgauge_new_from_sql(str, 0);
+ ok(str, (g!=0));
+ int_is("compare",icalgauge_compare(g,c), 1);
icalgauge_free(g);
icalcomponent_free(c);
-
+
}
icalcomponent* make_component(int i){
@@ -2743,18 +2818,21 @@ icalcomponent* make_component(int i){
}
void test_fileset()
{
- icalfileset *fs;
+ icalset *fs;
icalcomponent *c;
int i;
+ int comp_count = 0;
char *path = "test_fileset.ics";
icalgauge *g = icalgauge_new_from_sql(
- "SELECT * FROM VEVENT WHERE DTSTART > '20000103T120000Z' AND DTSTART <= '20000106T120000Z'");
+ "SELECT * FROM VEVENT WHERE DTSTART > '20000103T120000Z' AND DTSTART <= '20000106T120000Z'", 0);
+ ok("icalgauge_new_from_sql()", (g!=NULL));
unlink(path);
fs = icalfileset_new(path);
+ ok("icalfileset_new()", (fs!=NULL));
assert(fs != 0);
for (i = 0; i!= 10; i++){
@@ -2764,60 +2842,68 @@ void test_fileset()
icalfileset_commit(fs);
- icalfileset_free(fs);
+ icalset_free(fs);
+ /** reopen fileset.ics **/
fs = icalfileset_new(path);
+ if (VERBOSE) printf("== No Selections \n");
- printf("== No Selections \n");
-
+ comp_count = 0;
for (c = icalfileset_get_first_component(fs);
c != 0;
c = icalfileset_get_next_component(fs)){
struct icaltimetype t = icalcomponent_get_dtstart(c);
-
- printf("%s\n",icaltime_as_ctime(t));
+ comp_count++;
+ if (VERBOSE) printf("%s\n",icaltime_as_ctime(t));
}
+ int_is("icalfileset get components",comp_count, 10);
icalfileset_select(fs,g);
- printf("\n== DTSTART > '20000103T120000Z' AND DTSTART <= '20000106T120000Z' \n");
+ if (VERBOSE) printf("\n== DTSTART > '20000103T120000Z' AND DTSTART <= '20000106T120000Z' \n");
+ comp_count = 0;
for (c = icalfileset_get_first_component(fs);
c != 0;
c = icalfileset_get_next_component(fs)){
struct icaltimetype t = icalcomponent_get_dtstart(c);
-
- printf("%s\n",icaltime_as_ctime(t));
+ comp_count++;
+ if (VERBOSE) printf("%s\n",icaltime_as_ctime(t));
}
+ int_is("icalfileset get components with gauge",comp_count, 3);
- icalfileset_free(fs);
+ icalset_free(fs);
+
+ /*icalgauge_free(g);*/
}
void microsleep(int us)
{
+#ifndef WIN32
struct timeval tv;
tv.tv_sec = 0;
tv.tv_usec = us;
select(0,0,0,0,&tv);
-
+#else
+ Sleep(us);
+#endif
}
void test_file_locks()
{
+#ifndef WIN32
pid_t pid;
char *path = "test_fileset_locktest.ics";
- icalfileset *fs;
+ icalset *fs;
icalcomponent *c, *c2;
struct icaldurationtype d;
int i;
int final,sec;
- icalfileset_safe_saves = 1;
-
icalerror_clear_errno();
unlink(path);
@@ -2840,7 +2926,7 @@ void test_file_locks()
icalfileset_commit(fs);
}
- icalfileset_free(fs);
+ icalset_free(fs);
assert(icalerrno == ICAL_NO_ERROR);
@@ -2877,7 +2963,7 @@ void test_file_locks()
icalfileset_mark(fs);
icalfileset_commit(fs);
- icalfileset_free(fs);
+ icalset_free(fs);
microsleep(rand()/(RAND_MAX/20));
@@ -2911,7 +2997,7 @@ void test_file_locks()
icalfileset_mark(fs);
icalfileset_commit(fs);
- icalfileset_free(fs);
+ icalset_free(fs);
putc('.',stdout);
fflush(stdout);
@@ -2943,48 +3029,50 @@ void test_file_locks()
assert(sec == final);
+#endif
}
void test_action()
{
icalcomponent *c;
icalproperty *p;
-
+ char *str;
+
static const char test_icalcomp_str[] =
"BEGIN:VEVENT\n"
"ACTION:EMAIL\n"
"ACTION:PROCEDURE\n"
"ACTION:AUDIO\n"
"ACTION:FUBAR\n"
-"END:VEVENT\r\n";
+"END:VEVENT\n";
c = icalparser_parse_string ((char *) test_icalcomp_str);
- if (!c) {
- fprintf (stderr, "main(): could not parse the component\n");
- exit (EXIT_FAILURE);
- }
+
+ ok("icalparser_parse_string(), ACTIONS", (c!=NULL));
+ assert(c!=0);
- printf("%s\n\n",icalcomponent_as_ical_string(c));
+ str = icalcomponent_as_ical_string(c);
+ is("icalcomponent_as_ical_string()", str, ((char*) test_icalcomp_str));
+ if (VERBOSE) printf("%s\n\n",str);
p = icalcomponent_get_first_property(c,ICAL_ACTION_PROPERTY);
- assert(icalproperty_get_action(p) == ICAL_ACTION_EMAIL);
+ ok("ICAL_ACTION_EMAIL", (icalproperty_get_action(p) == ICAL_ACTION_EMAIL));
p = icalcomponent_get_next_property(c,ICAL_ACTION_PROPERTY);
- assert(icalproperty_get_action(p) == ICAL_ACTION_PROCEDURE);
+ ok("ICAL_ACTION_PROCEDURE", (icalproperty_get_action(p) == ICAL_ACTION_PROCEDURE));
p = icalcomponent_get_next_property(c,ICAL_ACTION_PROPERTY);
- assert(icalproperty_get_action(p) == ICAL_ACTION_AUDIO);
+ ok("ICAL_ACTION_AUDIO", (icalproperty_get_action(p) == ICAL_ACTION_AUDIO));
p = icalcomponent_get_next_property(c,ICAL_ACTION_PROPERTY);
- assert(icalproperty_get_action(p) == ICAL_ACTION_X);
- assert(regrstrcmp(icalvalue_get_x(icalproperty_get_value(p)), "FUBAR")==0);
-
-
+ ok("ICAL_ACTION_X", (icalproperty_get_action(p) == ICAL_ACTION_X));
+ is("ICAL_ACTION -> FUBAR", icalvalue_get_x(icalproperty_get_value(p)), "FUBAR");
+ icalcomponent_free(c);
}
@@ -2995,24 +3083,22 @@ void test_trigger()
struct icaltriggertype tr;
icalcomponent *c;
icalproperty *p;
- char* str;
+ const char* str;
static const char test_icalcomp_str[] =
"BEGIN:VEVENT\n"
"TRIGGER;VALUE=DATE-TIME:19980403T120000\n"
-"TRIGGER:-PT15M\n"
-"TRIGGER:19980403T120000\n"
"TRIGGER;VALUE=DURATION:-PT15M\n"
-"END:VEVENT\r\n";
+"TRIGGER;VALUE=DATE-TIME:19980403T120000\n"
+"TRIGGER;VALUE=DURATION:-PT15M\n"
+"END:VEVENT\n";
c = icalparser_parse_string ((char *) test_icalcomp_str);
- if (!c) {
- fprintf (stderr, "main(): could not parse the component\n");
- exit (EXIT_FAILURE);
- }
+ ok("icalparser_parse_string()", (c!= NULL));
+ assert(c!=NULL);
- printf("%s\n\n",icalcomponent_as_ical_string(c));
+ is("parsed triggers", icalcomponent_as_ical_string(c), (char*)test_icalcomp_str);
for(p = icalcomponent_get_first_property(c,ICAL_TRIGGER_PROPERTY);
p != 0;
@@ -3020,20 +3106,21 @@ void test_trigger()
tr = icalproperty_get_trigger(p);
if(!icaltime_is_null_time(tr.time)){
- printf("value=DATE-TIME:%s\n", icaltime_as_ical_string(tr.time));
+ if (VERBOSE) printf("value=DATE-TIME:%s\n", icaltime_as_ical_string(tr.time));
} else {
- printf("value=DURATION:%s\n", icaldurationtype_as_ical_string(tr.duration));
+ if (VERBOSE) printf("value=DURATION:%s\n", icaldurationtype_as_ical_string(tr.duration));
}
}
+ icalcomponent_free(c);
+
/* Trigger, as a DATETIME */
tr.duration = icaldurationtype_null_duration();
tr.time = icaltime_from_string("19970101T120000");
p = icalproperty_new_trigger(tr);
str = icalproperty_as_ical_string(p);
- printf("%s\n",str);
- assert(regrstrcmp("TRIGGER\n ;VALUE=DATE-TIME\n :19970101T120000\n",str) == 0);
+ is("TRIGGER;VALUE=DATE-TIME:19970101T120000", str, "TRIGGER;VALUE=DATE-TIME:19970101T120000\n");
icalproperty_free(p);
/* TRIGGER, as a DURATION */
@@ -3042,8 +3129,7 @@ void test_trigger()
p = icalproperty_new_trigger(tr);
str = icalproperty_as_ical_string(p);
- printf("%s\n",str);
- assert(regrstrcmp("TRIGGER\n ;VALUE=DURATION\n :P3DT3H50M45S\n",str) == 0);
+ is("TRIGGER;VALUE=DURATION:P3DT3H50M45S", str, "TRIGGER;VALUE=DURATION:P3DT3H50M45S\n");
icalproperty_free(p);
/* TRIGGER, as a DATETIME, VALUE=DATETIME*/
@@ -3053,8 +3139,7 @@ void test_trigger()
icalproperty_add_parameter(p,icalparameter_new_value( ICAL_VALUE_DATETIME));
str = icalproperty_as_ical_string(p);
- printf("%s\n",str);
- assert(regrstrcmp("TRIGGER\n ;VALUE=DATE-TIME\n :19970101T120000\n",str) == 0);
+ is("TRIGGER;VALUE=DATE-TIME:19970101T120000", str, "TRIGGER;VALUE=DATE-TIME:19970101T120000\n");
icalproperty_free(p);
/*TRIGGER, as a DURATION, VALUE=DATETIME */
@@ -3065,8 +3150,7 @@ void test_trigger()
str = icalproperty_as_ical_string(p);
- printf("%s\n",str);
- assert(regrstrcmp("TRIGGER\n ;VALUE=DURATION\n :P3DT3H50M45S\n",str) == 0);
+ is("TRIGGER;VALUE=DURATION:P3DT3H50M45S", str, "TRIGGER;VALUE=DURATION:P3DT3H50M45S\n");
icalproperty_free(p);
/* TRIGGER, as a DATETIME, VALUE=DURATION*/
@@ -3076,8 +3160,7 @@ void test_trigger()
icalproperty_add_parameter(p,icalparameter_new_value( ICAL_VALUE_DURATION));
str = icalproperty_as_ical_string(p);
- printf("%s\n",str);
- assert(regrstrcmp("TRIGGER\n ;VALUE=DATE-TIME\n :19970101T120000\n",str) == 0);
+ is("TRIGGER;VALUE=DATE-TIME:19970101T120000", str, "TRIGGER;VALUE=DATE-TIME:19970101T120000\n");
icalproperty_free(p);
/*TRIGGER, as a DURATION, VALUE=DURATION */
@@ -3088,8 +3171,7 @@ void test_trigger()
str = icalproperty_as_ical_string(p);
- printf("%s\n",str);
- assert(regrstrcmp("TRIGGER\n ;VALUE=DURATION\n :P3DT3H50M45S\n",str) == 0);
+ is("TRIGGER;VALUE=DURATION:P3DT3H50M45S", str, "TRIGGER;VALUE=DURATION:P3DT3H50M45S\n");
icalproperty_free(p);
@@ -3100,8 +3182,7 @@ void test_trigger()
icalproperty_add_parameter(p,icalparameter_new_value(ICAL_VALUE_BINARY));
str = icalproperty_as_ical_string(p);
- printf("%s\n",str);
- assert(regrstrcmp("TRIGGER\n ;VALUE=DATE-TIME\n :19970101T120000\n",str) == 0);
+ is("TRIGGER;VALUE=DATE-TIME:19970101T120000", str, "TRIGGER;VALUE=DATE-TIME:19970101T120000\n");
icalproperty_free(p);
/*TRIGGER, as a DURATION, VALUE=BINARY */
@@ -3112,20 +3193,17 @@ void test_trigger()
str = icalproperty_as_ical_string(p);
- printf("%s\n",str);
- assert(regrstrcmp("TRIGGER\n ;VALUE=DURATION\n :P3DT3H50M45S\n",str) == 0);
+ is("TRIGGER;VALUE=DURATION:P3DT3H50M45S", str, "TRIGGER;VALUE=DURATION:P3DT3H50M45S\n");
icalproperty_free(p);
-
-
-
}
+
void test_rdate()
{
struct icaldatetimeperiodtype dtp;
icalproperty *p;
- char* str;
+ const char* str;
struct icalperiodtype period;
period.start = icaltime_from_string("19970101T120000");
@@ -3137,10 +3215,10 @@ void test_rdate()
dtp.period = icalperiodtype_null_period();
p = icalproperty_new_rdate(dtp);
str = icalproperty_as_ical_string(p);
- printf("%s\n",str);
- assert(regrstrcmp("RDATE\n ;VALUE=DATE-TIME\n :19970101T120000\n",str) == 0);
- icalproperty_free(p);
+ is("RDATE as DATE-TIME",
+ "RDATE;VALUE=DATE-TIME:19970101T120000\n",str);
+ icalproperty_free(p);
/* RDATE, as PERIOD */
dtp.time = icaltime_null_time();
@@ -3148,8 +3226,7 @@ void test_rdate()
p = icalproperty_new_rdate(dtp);
str = icalproperty_as_ical_string(p);
- printf("%s\n",str);
- assert(regrstrcmp("RDATE\n ;VALUE=PERIOD\n :19970101T120000/PT3H10M15S\n",str) == 0);
+ is("RDATE, as PERIOD", "RDATE;VALUE=PERIOD:19970101T120000/PT3H10M15S\n",str);
icalproperty_free(p);
/* RDATE, as DATE-TIME, VALUE=DATE-TIME */
@@ -3158,8 +3235,9 @@ void test_rdate()
p = icalproperty_new_rdate(dtp);
icalproperty_add_parameter(p,icalparameter_new_value(ICAL_VALUE_DATETIME));
str = icalproperty_as_ical_string(p);
- printf("%s\n",str);
- assert(regrstrcmp("RDATE\n ;VALUE=DATE-TIME\n :19970101T120000\n",str) == 0);
+
+ is("RDATE, as DATE-TIME, VALUE=DATE-TIME",
+ "RDATE;VALUE=DATE-TIME:19970101T120000\n",str);
icalproperty_free(p);
@@ -3169,8 +3247,8 @@ void test_rdate()
p = icalproperty_new_rdate(dtp);
icalproperty_add_parameter(p,icalparameter_new_value(ICAL_VALUE_DATETIME));
str = icalproperty_as_ical_string(p);
- printf("%s\n",str);
- assert(regrstrcmp("RDATE\n ;VALUE=PERIOD\n :19970101T120000/PT3H10M15S\n",str) == 0);
+ is("RDATE, as PERIOD, VALUE=DATE-TIME",
+ "RDATE;VALUE=PERIOD:19970101T120000/PT3H10M15S\n",str);
icalproperty_free(p);
@@ -3180,8 +3258,9 @@ void test_rdate()
p = icalproperty_new_rdate(dtp);
icalproperty_add_parameter(p,icalparameter_new_value(ICAL_VALUE_PERIOD));
str = icalproperty_as_ical_string(p);
- printf("%s\n",str);
- assert(regrstrcmp("RDATE\n ;VALUE=DATE-TIME\n :19970101T120000\n",str) == 0);
+
+ is("RDATE, as DATE-TIME, VALUE=PERIOD",
+ "RDATE;VALUE=DATE-TIME:19970101T120000\n",str);
icalproperty_free(p);
@@ -3191,8 +3270,9 @@ void test_rdate()
p = icalproperty_new_rdate(dtp);
icalproperty_add_parameter(p,icalparameter_new_value(ICAL_VALUE_PERIOD));
str = icalproperty_as_ical_string(p);
- printf("%s\n",str);
- assert(regrstrcmp("RDATE\n ;VALUE=PERIOD\n :19970101T120000/PT3H10M15S\n",str) == 0);
+
+ is("RDATE, as PERIOD, VALUE=PERIOD",
+ "RDATE;VALUE=PERIOD:19970101T120000/PT3H10M15S\n",str);
icalproperty_free(p);
@@ -3202,8 +3282,9 @@ void test_rdate()
p = icalproperty_new_rdate(dtp);
icalproperty_add_parameter(p,icalparameter_new_value(ICAL_VALUE_BINARY));
str = icalproperty_as_ical_string(p);
- printf("%s\n",str);
- assert(regrstrcmp("RDATE\n ;VALUE=DATE-TIME\n :19970101T120000\n",str) == 0);
+
+ is("RDATE, as DATE-TIME, VALUE=BINARY",
+ "RDATE;VALUE=DATE-TIME:19970101T120000\n",str);
icalproperty_free(p);
@@ -3213,11 +3294,10 @@ void test_rdate()
p = icalproperty_new_rdate(dtp);
icalproperty_add_parameter(p,icalparameter_new_value(ICAL_VALUE_BINARY));
str = icalproperty_as_ical_string(p);
- printf("%s\n",str);
- assert(regrstrcmp("RDATE\n ;VALUE=PERIOD\n :19970101T120000/PT3H10M15S\n",str) == 0);
- icalproperty_free(p);
-
+ is("RDAE, as PERIOD, VALUE=BINARY",
+ "RDATE;VALUE=PERIOD:19970101T120000/PT3H10M15S\n",str);
+ icalproperty_free(p);
}
@@ -3225,11 +3305,12 @@ void test_langbind()
{
icalcomponent *c, *inner;
icalproperty *p;
-
+ char *test_str_parsed;
static const char test_str[] =
"BEGIN:VEVENT\n"
"ATTENDEE;RSVP=TRUE;ROLE=REQ-PARTICIPANT;CUTYPE=GROUP:MAILTO:employee-A@host.com\n"
"COMMENT: Comment that \n spans a line\n"
+"COMMENT: Comment with \"quotable\" \'characters\' and other \t bad magic \n things \f Yeah.\n"
"DTSTART:19970101T120000\n"
"DTSTART:19970101T120000Z\n"
"DTSTART:19970101\n"
@@ -3237,13 +3318,37 @@ void test_langbind()
"FREEBUSY:19970101T120000/19970101T120000\n"
"FREEBUSY:19970101T120000/P3DT4H25M\n"
"END:VEVENT\n";
-
- printf("%s\n",test_str);
+ static const char *test_str_parsed_good =
+"BEGIN:VEVENT\n"
+"ATTENDEE;RSVP=TRUE;ROLE=REQ-PARTICIPANT;CUTYPE=GROUP:MAILTO:\n"
+" employee-A@host.com\n"
+"COMMENT: Comment that spans a line\n"
+"COMMENT: Comment with \\\"quotable\\\" 'characters' and other \\t bad magic \n"
+" things \\f Yeah.\n"
+"DTSTART:19970101T120000\n"
+"DTSTART:19970101T120000Z\n"
+"DTSTART;VALUE=DATE:19970101\n"
+"DURATION:P3DT4H25M\n"
+"FREEBUSY:19970101T120000/19970101T120000\n"
+"FREEBUSY:19970101T120000/P3DT4H25M\n"
+"END:VEVENT\n";
+
+ if (VERBOSE) printf("%s\n",test_str);
c = icalparser_parse_string(test_str);
- inner = icalcomponent_get_inner(c);
+ ok("icalparser_parse_string()", (c!=NULL));
+ assert(c != NULL);
+
+ test_str_parsed = icalcomponent_as_ical_string(c);
+
+ is("parsed version with bad chars, etc",
+ test_str_parsed,
+ test_str_parsed_good);
+
+
+ inner = icalcomponent_get_inner(c);
for(
p = icallangbind_get_first_property(inner,"ANY");
@@ -3251,39 +3356,56 @@ void test_langbind()
p = icallangbind_get_next_property(inner,"ANY")
) {
- printf("%s\n",icallangbind_property_eval_string(p,":"));
+ const char *str = icallangbind_property_eval_string(p,":");
+ /** TODO add tests **/
+ if (VERBOSE) printf("%s\n",str);
}
-
p = icalcomponent_get_first_property(inner,ICAL_ATTENDEE_PROPERTY);
icalproperty_set_parameter_from_string(p,"CUTYPE","INDIVIDUAL");
- printf("%s\n",icalproperty_as_ical_string(p));
-
-
+ is ("Set attendee parameter",
+ icalproperty_as_ical_string(p),
+ "ATTENDEE;RSVP=TRUE;ROLE=REQ-PARTICIPANT;CUTYPE=INDIVIDUAL:MAILTO:\n"
+ " employee-A@host.com\n");
+
icalproperty_set_value_from_string(p,"mary@foo.org","TEXT");
- printf("%s\n",icalproperty_as_ical_string(p));
+ is ("Set attendee parameter value",
+ icalproperty_as_ical_string(p),
+ "ATTENDEE;VALUE=TEXT;RSVP=TRUE;ROLE=REQ-PARTICIPANT;CUTYPE=INDIVIDUAL:\n"
+" mary@foo.org\n");
+ icalcomponent_free(c);
}
void test_property_parse()
{
icalproperty *p;
+ const char *str;
p= icalproperty_new_from_string(
"ATTENDEE;RSVP=TRUE;ROLE=REQ-PARTICIPANT;CUTYPE=GROUP:MAILTO:employee-A@host.com");
+ ok("icalproperty_from_string(), ATTENDEE", (p != 0));
assert (p != 0);
- printf("%s\n",icalproperty_as_ical_string(p));
+ str = icalproperty_as_ical_string(p);
+ if (VERBOSE) printf("%s\n",str);
+
+ icalproperty_free(p);
p= icalproperty_new_from_string("DTSTART:19970101T120000Z\n");
+ ok("icalproperty_from_string(), simple DTSTART", (p != 0));
assert (p != 0);
- printf("%s\n",icalproperty_as_ical_string(p));
+
+ str = icalproperty_as_ical_string(p);
+ if (VERBOSE) printf("%s\n",str);
+
+ icalproperty_free(p);
}
@@ -3303,303 +3425,243 @@ void test_value_parameter()
"END:VEVENT\n";
c = icalparser_parse_string ((char *) test_icalcomp_str);
+ ok("icalparser_parse_string()", (c != NULL));
if (!c) {
- fprintf (stderr, "main(): could not parse the component\n");
exit (EXIT_FAILURE);
}
- printf("%s",icalcomponent_as_ical_string(c));
+ if (VERBOSE) printf("%s",icalcomponent_as_ical_string(c));
p = icalcomponent_get_first_property(c,ICAL_DTSTART_PROPERTY);
param = icalproperty_get_first_parameter(p,ICAL_VALUE_PARAMETER);
- assert(icalparameter_get_value(param) == ICAL_VALUE_DATETIME);
+
+ ok("icalproperty_get_value()", (icalparameter_get_value(param) == ICAL_VALUE_DATETIME));
p = icalcomponent_get_next_property(c,ICAL_DTSTART_PROPERTY);
param = icalproperty_get_first_parameter(p,ICAL_VALUE_PARAMETER);
- assert(icalparameter_get_value(param) == ICAL_VALUE_DATE);
+ ok("icalproperty_get_first_parameter()",(icalparameter_get_value(param) == ICAL_VALUE_DATE));
+ icalcomponent_free(c);
}
-void test_x_property()
+void test_x_parameter()
{
icalproperty *p;
-
- p= icalproperty_new_from_string(
- "X-LIC-PROPERTY: This is a note");
-
- printf("%s\n",icalproperty_as_ical_string(p));
-
- assert(icalproperty_isa(p) == ICAL_X_PROPERTY);
- assert(regrstrcmp(icalproperty_get_x_name(p),"X-LIC-PROPERTY")==0);
- assert(regrstrcmp(icalproperty_get_x(p)," This is a note")==0);
-
-}
-
-int main(int argc, char *argv[])
-{
- int c;
- extern char *optarg;
- extern int optopt;
- int errflg=0;
- char* program_name = strrchr(argv[0],'/');
- int ttime=0, trecur=0,tspan=0, tmisc=0, tgauge = 0, tfile = 0,
- tbasic = 0;
-
- if(argc==1) {
- ttime = trecur = tspan = tmisc = tgauge = tfile = tbasic = 1;
- }
- while ((c = getopt(argc, argv, "t:s:r:m:g:f:b:")) != -1) {
- switch (c) {
-
- case 'b': {
- tbasic = atoi(optarg);
- break;
- }
+ p= icalproperty_new_from_string(
+ "COMMENT;X-A=1;X-B=2: This is a note");
- case 't': {
- ttime = atoi(optarg);
- break;
- }
+ if (VERBOSE) printf("%s\n",icalproperty_as_ical_string(p));
- case 's': {
- tspan = atoi(optarg);
- break;
- }
+ ok("COMMENT property",(icalproperty_isa(p) == ICAL_COMMENT_PROPERTY));
+ is("COMMENT parses param", icalproperty_get_comment(p)," This is a note");
- case 'r': {
- trecur = atoi(optarg);
- break;
- }
+ icalproperty_set_parameter_from_string(p,"X-LIES", "no");
+ icalproperty_set_parameter_from_string(p,"X-LAUGHS", "big");
+ icalproperty_set_parameter_from_string(p,"X-TRUTH", "yes");
+ icalproperty_set_parameter_from_string(p,"X-HUMOUR", "bad");
+ if (VERBOSE) printf("%s\n",icalproperty_as_ical_string(p));
- case 'm': {
- tmisc = atoi(optarg);
- break;
- }
-
+ is("Check X-LIES", icalproperty_get_parameter_as_string(p, "X-LIES"), "no");
+ is("Check X-LAUGHS", icalproperty_get_parameter_as_string(p, "X-LAUGHS"), "big");
+ is("Check X-TRUTH", icalproperty_get_parameter_as_string(p, "X-TRUTH"), "yes");
+ is("Check X-HUMOUR", icalproperty_get_parameter_as_string(p, "X-HUMOUR"), "bad");
- case 'g': {
- tgauge = atoi(optarg);
- break;
- }
-
- case 'f': {
- tfile = atoi(optarg);
- break;
- }
-
- case ':': {/* Option given without an operand */
- fprintf(stderr,
- "%s: Option -%c requires an operand\n",
- program_name,optopt);
- errflg++;
- break;
- }
- case '?': {
- errflg++;
- }
-
- }
-
- }
-
-
- if(ttime==1 || ttime==2){
- printf("\n------------Test time parser ----------\n");
- test_time_parser();
-
- }
-
- if(ttime==1 || ttime==3){
- printf("\n------------Test time----------------\n");
- test_time();
- }
-
- if(ttime==1 || ttime==4){
- printf("\n------------Test day of year---------\n");
- test_doy();
- }
-
- if(ttime==1 || ttime==5){
- printf("\n------------Test duration---------------\n");
- test_duration();
- }
-
- if(ttime==1 || ttime==6){
- printf("\n------------Test period ----------------\n");
- test_period();
- }
-
-
-
- if(trecur==1 || trecur==2){
- printf("\n------------Test recur parser ----------\n");
- test_recur_parser();
- }
-
- if(trecur==1 || trecur==3){
- printf("\n------------Test recur---------------\n");
- test_recur();
- }
+ icalproperty_free(p);
+}
- if(trecur==1 || trecur==4){
- printf("\n------------Test parameter bug---------\n");
- test_recur_parameter_bug();
- }
- if(trecur==1 || trecur==5){
- printf("\n------------Test Array Expansion---------\n");
- test_expand_recurrence();
- }
+void test_x_property()
+{
+ icalproperty *p;
+ p= icalproperty_new_from_string(
+ "X-LIC-PROPERTY: This is a note");
+ if (VERBOSE && p) printf("%s\n",icalproperty_as_ical_string(p));
- if(tspan==1 || tspan==2){
- printf("\n------------Test FBlist------------\n");
- test_fblist();
- }
-
- if(tspan==1 || tspan==3){
- printf("\n------------Test Overlaps------------\n");
- test_overlaps();
- }
-
- if(tspan==1 || tspan==4){
- printf("\n------------Test Span----------------\n");
- test_span();
- }
-
- if(tgauge == 1 || tgauge == 2){
- printf("\n------------Test Gauge SQL----------------\n");
- test_gauge_sql();
- }
-
- if(tgauge == 1 || tgauge == 3){
- printf("\n------------Test Gauge Compare--------------\n");
- test_gauge_compare();
- }
-
- if(tfile ==1 || tfile == 2){
- printf("\n------------Test File Set--------------\n");
- test_fileset();
- }
+ ok("x-property is correct kind",(icalproperty_isa(p) == ICAL_X_PROPERTY));
+ is("icalproperty_get_x_name() works",
+ icalproperty_get_x_name(p),"X-LIC-PROPERTY");
+ is("icalproperty_get_x() works",
+ icalproperty_get_x(p)," This is a note");
- if(tfile ==1 || tfile == 3){
- printf("\n------------Test File Locks--------------\n");
- test_file_locks();
- }
+ icalproperty_free(p);
+}
+void test_utcoffset()
+{
+ icalproperty *p;
+ p = icalproperty_new_from_string("TZOFFSETFROM:-001608");
+ ok("parse TZOOFSETFROM:-001608", (p!=NULL));
- if(tmisc == 1 || tmisc == 2){
- printf("\n------------Test X Props and Params--------\n");
- test_x();
- }
+ if (VERBOSE && p) printf("%s\n",icalproperty_as_ical_string(p));
- if(tmisc == 1 || tmisc == 3){
- printf("\n------------Test Trigger ------------------\n");
- test_trigger();
- }
+ if (p) icalproperty_free(p);
+}
- if(tmisc == 1 || tmisc == 4){
+void test_attach()
+{
+ icalcomponent *c;
- printf("\n------------Test Restriction---------------\n");
- test_restriction();
- }
+ static const char test_icalcomp_str[] =
+"BEGIN:VEVENT\n"
+"ATTACH:CID:jsmith.part3.960817T083000.xyzMain@host1.com\n"
+"ATTACH:FMTTYPE=application/postscript;ftp://xyzCorp.com/pub/reports/r-960812.ps\n"
+"END:VEVENT\n";
- if(tmisc == 1 || tmisc == 5){
+ c = icalparser_parse_string ((char *) test_icalcomp_str);
+ ok("parse simple attachment", (c != NULL));
- printf("\n------------Test RDATE---------------\n");
- test_rdate();
- }
+ if (VERBOSE) printf("%s",icalcomponent_as_ical_string(c));
- if(tmisc == 1 || tmisc == 6){
+ if (c) icalcomponent_free(c);
+}
- printf("\n------------Test language binding---------------\n");
- test_langbind();
- }
+void test_vcal(void)
+{
+ VObject *vcal = 0;
+ icalcomponent *comp;
+ char* file = "../../test-data/user-cal.vcf";
- if(tmisc == 1 || tmisc == 7){
+ vcal = Parse_MIME_FromFileName(file);
+
+ ok("Parsing ../../test-data/user-cal.vcf", (vcal != 0));
- printf("\n------------Test property parser---------------\n");
- test_property_parse();
- }
+ comp = icalvcal_convert(vcal);
- if(tmisc == 1 || tmisc == 8){
- printf("\n------------Test Action ------------------\n");
- test_action();
- }
+ ok("Converting to ical component", (comp != 0));
+
+ if (VERBOSE && comp)
+ printf("%s\n",icalcomponent_as_ical_string(comp));
- if(tmisc == 1 || tmisc == 9){
- printf("\n------------Test Value Parameter ------------------\n");
- test_value_parameter();
- }
+ if (comp) icalcomponent_free(comp);
+ if (vcal) deleteVObject(vcal);
+}
- if(tmisc == 1 || tmisc == 10){
- printf("\n------------Test X property ------------------\n");
- test_x_property();
+int main(int argc, char *argv[])
+{
+ int c;
+ extern char *optarg;
+ extern int optopt;
+ int errflg=0;
+ char* program_name = strrchr(argv[0],'/');
+ int do_test = 0;
+ int do_header = 0;
+
+ set_zone_directory("../../zoneinfo");
+ putenv("TZ=");
+
+ test_start(0);
+
+
+#ifndef WIN32
+ while ((c = getopt(argc, argv, "lvq")) != -1) {
+ switch (c) {
+ case 'v': {
+ VERBOSE = 1;
+ break;
+ }
+ case 'q': {
+ QUIET = 1;
+ break;
+ }
+ case 'l': {
+ do_header = 1;;
+ }
+ case '?': {
+ errflg++;
+ }
+ }
+ }
+ if (optind < argc) {
+ do_test = atoi(argv[argc-1]);
}
+#else
+ if (argc>1)
+ do_test = atoi(argv[2]);
-
- if(tbasic == 1 || tbasic == 2){
- printf("\n------------Test Values---------------\n");
- test_values();
- }
+#endif
- if(tbasic == 1 || tbasic == 3){
- printf("\n------------Test Parameters-----------\n");
- test_parameters();
- }
-
- if(tbasic == 1 || tbasic == 4){
- printf("\n------------Test Properties-----------\n");
- test_properties();
- }
+
+ test_run("Test time parser functions", test_time_parser, do_test, do_header);
+ test_run("Test time", test_time, do_test, do_header);
+ test_run("Test day of Year", test_doy, do_test, do_header);
+ test_run("Test duration", test_duration, do_test, do_header);
+ test_run("Test period", test_period, do_test, do_header);
+ test_run("Test DTSTART", test_dtstart, do_test, do_header);
+ test_run("Test day of year of week start", test_start_of_week, do_test, do_header);
+ test_run("Test recur parser", test_recur_parser, do_test, do_header);
+ test_run("Test recur", test_recur, do_test, do_header);
+ test_run("Test Recurring Events File", test_recur_file, do_test, do_header);
+ test_run("Test parameter bug", test_recur_parameter_bug, do_test, do_header);
+ test_run("Test Array Expansion", test_expand_recurrence, do_test, do_header);
+ test_run("Test Free/Busy lists", test_fblist, do_test, do_header);
+ test_run("Test Overlaps", test_overlaps, do_test, do_header);
+
+ test_run("Test Span", test_icalcomponent_get_span, do_test, do_header);
+ test_run("Test Gauge SQL", test_gauge_sql, do_test, do_header);
+ test_run("Test Gauge Compare", test_gauge_compare, do_test, do_header);
+ test_run("Test File Set", test_fileset, do_test, do_header);
+ test_run("Test File Set (Extended)", test_fileset_extended, do_test, do_header);
+ test_run("Test Dir Set", test_dirset, do_test, do_header);
+ test_run("Test Dir Set (Extended)", test_dirset_extended, do_test, do_header);
+
+ test_run("Test File Locks", test_file_locks, do_test, do_header);
+ test_run("Test X Props and Params", test_x, do_test, do_header);
+ test_run("Test Trigger", test_trigger, do_test, do_header);
+ test_run("Test Restriction", test_restriction, do_test, do_header);
+ test_run("Test RDATE", test_rdate, do_test, do_header);
+ test_run("Test language binding", test_langbind, do_test, do_header);
+ test_run("Test property parser", test_property_parse, do_test, do_header);
+ test_run("Test Action", test_action, do_test, do_header);
+ test_run("Test Value Parameter", test_value_parameter, do_test, do_header);
+ test_run("Test X property", test_x_property, do_test, do_header);
+ test_run("Test X parameter", test_x_parameter, do_test, do_header);
+ test_run("Test request status", test_requeststat, do_test, do_header);
+ test_run("Test UTC-OFFSET", test_utcoffset, do_test, do_header);
+ test_run("Test Values", test_values, do_test, do_header);
+ test_run("Test Parameters", test_parameters, do_test, do_header);
+ test_run("Test Properties", test_properties, do_test, do_header);
+ test_run("Test Components", test_components, do_test, do_header);
+ test_run("Test Convenience", test_convenience, do_test, do_header);
+ test_run("Test classify ", test_classify, do_test, do_header);
+ test_run("Test Iterators", test_iterators, do_test, do_header);
+ test_run("Test strings", test_strings, do_test, do_header);
+ test_run("Test Compare", test_compare, do_test, do_header);
+ test_run("Create Simple Component", create_simple_component, do_test, do_header);
+ test_run("Create Components", create_new_component, do_test, do_header);
+ test_run("Create Components with vaargs", create_new_component_with_va_args, do_test, do_header);
+ test_run("Test Memory", test_memory, do_test, do_header);
+ test_run("Test Attachment", test_attach, do_test, do_header);
+ test_run("Test icalcalendar", test_calendar, do_test, do_header);
+ test_run("Test Dirset", test_dirset, do_test, do_header);
+ test_run("Test vCal to iCal conversion", test_vcal, do_test, do_header);
+ test_run("Test UTF-8 Handling", test_utf8, do_test, do_header);
+
+ /** OPTIONAL TESTS go here... **/
+
+#ifdef WITH_CXX
+ test_run("Test C++ API", test_cxx, do_test, do_header);
+#endif
- if(tbasic == 1 || tbasic == 5){
- printf("\n------------Test Components ----------\n");
- test_components();
- }
+#ifdef WITH_BDB
+ test_run("Test BDB Set", test_bdbset, do_test, do_header);
+#endif
- if(tmisc == 1){
- printf("\n------------Test Convenience ------------\n");
- test_convenience();
-
-
- printf("\n------------Test classify ---------------\n");
- test_classify();
-
-
- printf("\n------------Test Iterators-----------\n");
- test_iterators();
-
-
- printf("\n-----------Test request status-------\n");
- test_requeststat();
-
- printf("\n------------Test strings---------------\n");
- test_strings();
-
- printf("\n------------Test Compare---------------\n");
- test_compare();
-
- printf("\n------------Create Components --------\n");
- create_new_component();
-
- printf("\n----- Create Components with vaargs ---\n");
- create_new_component_with_va_args();
+ icaltimezone_free_builtin_timezones();
+ icalmemory_free_ring();
+ free_zone_directory();
- printf("\n------------Test Memory---------------\n");
- test_memory();
- }
+ test_end();
return 0;
}
-
diff --git a/libical/src/test/regression.h b/libical/src/test/regression.h
new file mode 100644
index 0000000000..633cd3295d
--- /dev/null
+++ b/libical/src/test/regression.h
@@ -0,0 +1,53 @@
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+extern int VERBOSE;
+extern int QUIET;
+
+/* regression-component.c */
+void create_new_component(void);
+void create_new_component_with_va_args(void);
+void create_simple_component(void);
+void test_icalcomponent_get_span(void);
+void create_new_component_with_va_args(void);
+
+/* regression-classify.c */
+void test_classify(void);
+
+/* regression-recur.c */
+void test_recur_file(void);
+
+/* regression-cxx.c */
+void test_cxx(void);
+
+/* regression-storage.c */
+void test_fileset_extended(void);
+void test_dirset_extended(void);
+void test_bdbset(void);
+
+/* regression-utils.c */
+const char* ical_timet_string(const time_t t);
+const char* ictt_as_string(struct icaltimetype t);
+char* icaltime_as_ctime(struct icaltimetype t);
+
+
+void _ok(char*name, int result, char*file, int linenum, char *test);
+void _is(char* test_name, const char* str1, const char* str2, char *file, int linenum);
+void _int_is(char* test_name, int i1, int i2, char *file, int linenum);
+#define ok(TEST, EX) (_ok(TEST, EX, __FILE__, __LINE__, #EX))
+#define is(S1, S2, EX) (_is(S1, S2, EX, __FILE__, __LINE__))
+#define int_is(I1, I2, EX) (_int_is(I1, I2, EX, __FILE__, __LINE__))
+void test_header(char*title, int test_set);
+void test_start(int);
+void test_end(void);
+void test_run(char *test_name,
+ void (*test_fcn)(void),
+ int do_test, int headeronly);
+
+
+
+
+#ifdef __cplusplus
+}
+#endif
diff --git a/libical/src/test/storage.c b/libical/src/test/storage.c
index 2d8bc586f4..9c29d728af 100644
--- a/libical/src/test/storage.c
+++ b/libical/src/test/storage.c
@@ -1,6 +1,6 @@
/* -*- Mode: C -*-
======================================================================
- FILE: usecases.c
+ FILE: storage.c
CREATOR: eric 03 April 1999
DESCRIPTION:
@@ -36,11 +36,46 @@
#include "icalmemory.h"
#include "icaldirset.h"
#include "icalfileset.h"
+#ifdef WITH_BDB4
+#include "icalbdbset.h"
+#endif
#include "icalerror.h"
#include "icalrestriction.h"
#include "icalcalendar.h"
#define OUTPUT_FILE "filesetout.ics"
+#define DATABASE "calendar.db"
+
+/* define sample calendar struct */
+struct calendar {
+ int ID;
+ int total_size;
+
+ /* offsets */
+ int total_size_offset;
+ int vcalendar_size_offset;
+ int vcalendar_offset;
+ int title_size_offset;
+ int title_offset;
+
+ /* data */
+ int vcalendar_size;
+ char *vcalendar;
+
+ int title_size;
+ char *title;
+
+};
+
+int vcalendar_init(struct calendar **cal, char *vcalendar, char *title);
+
+#ifdef WITH_BDB4
+int get_title(DB *dbp, const DBT *pkey, const DBT *pdata, DBT *skey);
+char * parse_vcalendar(const DBT *dbt) ;
+#endif
+
+char * pack_calendar(struct calendar *cal, int size);
+struct calendar * unpack_calendar(char *str, int size);
char str[] = "BEGIN:VCALENDAR\n\
PRODID:\"-//RDU Software//NONSGML HandCal//EN\"\n\
@@ -104,7 +139,6 @@ END:VEVENT\n\
END:VCALENDAR\n\
";
-
void test_fileset()
{
icalfileset *cout;
@@ -151,14 +185,12 @@ void test_fileset()
icalfileset_add_component(cout,clone);
icalfileset_commit(cout);
- icalfileset_free(cout);
+ icalset_free(cout);
}
-
/* Print them out */
-
cout = icalfileset_new(OUTPUT_FILE);
assert(cout != 0);
@@ -183,7 +215,7 @@ void test_fileset()
/* Remove all of them */
- icalfileset_free(cout);
+ icalset_free(cout);
cout = icalfileset_new(OUTPUT_FILE);
assert(cout != 0);
@@ -196,7 +228,7 @@ void test_fileset()
icalfileset_remove_component(cout, itr);
}
- icalfileset_free(cout);
+ icalset_free(cout);
/* Print them out again */
@@ -224,12 +256,393 @@ void test_fileset()
}
- icalfileset_free(cout);
+ icalset_free(cout);
}
+/*
+ In this example, we're storing a calendar with several components
+ under the reference id "calendar_7286" and retrieving records based
+ on title, "month_1" through "month_10". We use a number of the
+ "optional" arguments to specify secondary indices, sub-databases
+ (i.e. having multiple databases residing within a single Berkeley
+ DB file), and keys for storage and retrieval.
+*/
+
+#ifdef WITH_BDB4
+void test_bdbset()
+{
+ icalbdbset *cout;
+ int month = 0;
+ int count=0;
+ int num_components=0;
+ int szdata_len=0;
+ int ret=0;
+ char *subdb, *szdata, *szpacked_data;
+ char uid[255];
+ struct icaltimetype start, end;
+ icalcomponent *c,*clone, *itr;
+ DB *dbp, *sdbp;
+ DBT key, data;
+ DBC *dbcp;
+
+ struct calendar *cal;
+ int cal_size;
+
+ start = icaltime_from_timet( time(0),0);
+ end = start;
+ end.hour++;
+
+ /* Note: as per the Berkeley DB ref pages:
+ *
+ * The database argument is optional, and allows applications to
+ * have multiple databases in a single file. Although no database
+ * argument needs to be specified, it is an error to attempt to
+ * open a second database in a file that was not initially created
+ * using a database name.
+ *
+ */
+
+ subdb = "calendar_id";
+ sdbp = 0;
+
+ /* open database, using subdb */
+ dbp = icalbdbset_database_open(DATABASE, subdb, DB_HASH);
+ sdbp = icalbdbset_secondary_open(dbp,
+ DATABASE,
+ "title",
+ get_title,
+ DB_HASH);
+
+ c = icalparser_parse_string(str2);
+ assert(c != 0);
+
+ /* Add data to the file */
+
+ for(month = 1; month < 10; month++){
+ icalcomponent *event;
+ icalproperty *dtstart, *dtend, *location;
+
+ /* retrieve data */
+ cout = icalbdbset_new(dbp, sdbp, NULL);
+ assert(cout != 0);
+
+ start.month = month;
+ end.month = month;
+
+ clone = icalcomponent_new_clone(c);
+ assert(clone !=0);
+ event = icalcomponent_get_first_component(clone,
+ ICAL_VEVENT_COMPONENT);
+ assert(event != 0);
+
+ dtstart = icalcomponent_get_first_property(event,
+ ICAL_DTSTART_PROPERTY);
+ assert(dtstart!=0);
+ icalproperty_set_dtstart(dtstart,start);
+
+ dtend = icalcomponent_get_first_property(event,ICAL_DTEND_PROPERTY);
+ assert(dtend!=0);
+ icalproperty_set_dtend(dtend,end);
+
+ location = icalcomponent_get_first_property(event, ICAL_LOCATION_PROPERTY);
+ assert(location!=0);
+
+#if 0
+ /* change the uid to include the month */
+ sprintf(uid, "%s_%d", icalcomponent_get_uid(clone), month);
+ icalcomponent_set_uid(clone, uid);
+#endif
+
+ icalbdbset_add_component(cout,clone);
+
+ /* commit changes */
+ icalbdbset_commit(cout);
+
+ num_components = icalcomponent_count_components(clone, ICAL_ANY_COMPONENT);
+
+ icalset_free(cout);
+
+ }
+
+ /* try out the cursor operations */
+ memset(&key, 0, sizeof(DBT));
+ memset(&data, 0, sizeof(DBT));
+
+ ret = icalbdbset_acquire_cursor(dbp, &dbcp);
+ ret = icalbdbset_get_first(dbcp, &key, &data);
+ ret = icalbdbset_get_next(dbcp, &key, &data);
+ ret = icalbdbset_get_last(dbcp, &key, &data);
+
+ /* Print them out */
+
+ for(month = 1, count=0; month < 10; month++){
+ char *title;
+
+ icalcomponent *event;
+ icalproperty *dtstart, *dtend;
+
+ cout = icalbdbset_new(dbp, sdbp, NULL);
+ assert(cout != 0);
+
+ for (itr = icalbdbset_get_first_component(cout);
+ itr != 0;
+ itr = icalbdbset_get_next_component(cout)){
+
+ icalcomponent *event;
+ icalproperty *dtstart, *dtend;
+
+ count++;
+
+ event = icalcomponent_get_first_component(itr,ICAL_VEVENT_COMPONENT);
+
+ dtstart = icalcomponent_get_first_property(event,ICAL_DTSTART_PROPERTY);
+ dtend = icalcomponent_get_first_property(event,ICAL_DTEND_PROPERTY);
+
+ printf("%d %s %s\n",count, icalproperty_as_ical_string(dtstart),
+ icalproperty_as_ical_string(dtend));
+
+ }
+ icalset_free(cout);
+ }
+
+ /* close database */
+ icalbdbset_database_close(dbp);
+ icalbdbset_database_close(sdbp);
+
+ /* open database */
+ dbp = icalbdbset_database_open(DATABASE, subdb, DB_HASH);
+ sdbp = icalbdbset_secondary_open(dbp,
+ DATABASE,
+ "title",
+ get_title,
+ DB_HASH);
+
+ /* Remove all of them */
+ for(month = 1; month < 10; month++){
+
+ cout = icalbdbset_new(dbp, sdbp, NULL);
+ assert(cout != 0);
+
+ for (itr = icalbdbset_get_first_component(cout);
+ itr != 0;
+ itr = icalbdbset_get_next_component(cout)){
+
+ icalbdbset_remove_component(cout, itr);
+ }
+
+ icalbdbset_commit(cout);
+ icalset_free(cout);
+
+ }
+
+ /* Print them out again */
+ for(month = 1, count=0; month < 10; month++){
+ char *title;
+
+ icalcomponent *event;
+ icalproperty *dtstart, *dtend;
+
+ cout = icalbdbset_new(dbp, sdbp, NULL);
+ assert(cout != 0);
+
+ for (itr = icalbdbset_get_first_component(cout);
+ itr != 0;
+ itr = icalbdbset_get_next_component(cout)){
+
+ icalcomponent *event;
+ icalproperty *dtstart, *dtend;
+
+ count++;
+
+ event = icalcomponent_get_first_component(itr,ICAL_VEVENT_COMPONENT);
+
+ dtstart = icalcomponent_get_first_property(event,ICAL_DTSTART_PROPERTY);
+ dtend = icalcomponent_get_first_property(event,ICAL_DTEND_PROPERTY);
+
+ printf("%d %s %s\n",count, icalproperty_as_ical_string(dtstart),
+ icalproperty_as_ical_string(dtend));
+
+ }
+ icalset_free(cout);
+ }
+}
+
+/* get_title -- extracts a secondary key (the vcalendar)
+ * from a primary key/data pair */
+
+/* just create a random title for now */
+
+int get_title(DB *dbp, const DBT *pkey, const DBT *pdata, DBT *skey)
+{
+ icalcomponent *cl;
+ char title[255];
+
+ memset(skey, 0, sizeof(DBT));
+
+ cl = icalparser_parse_string((char *)pdata->data);
+ sprintf(title, "title_%s", icalcomponent_get_uid(cl));
+
+ skey->data = strdup(title);
+ skey->size = strlen(skey->data);
+ return (0);
+}
+
+char * parse_vcalendar(const DBT *dbt)
+{
+ char *str;
+ struct calendar *cal;
+
+ str = (char *)dbt->data;
+ cal = unpack_calendar(str, dbt->size);
+
+ return cal->vcalendar;
+}
+
+#endif
+
+
+int vcalendar_init(struct calendar **rcal, char *vcalendar, char *title)
+{
+ int vcalendar_size, title_size, total_size;
+ struct calendar *cal;
+
+ if(vcalendar)
+ vcalendar_size = strlen(vcalendar);
+ else {
+ vcalendar = "";
+ vcalendar_size = strlen(vcalendar);
+ }
+
+ if(title)
+ title_size = strlen(title);
+ else {
+ title = "";
+ title_size = strlen(title);
+ }
+
+ total_size = sizeof(struct calendar) + vcalendar_size + title_size;
+
+ if((cal = (struct calendar *)malloc(total_size))==NULL)
+ return 0;
+ memset(cal, 0, total_size);
+
+ /* offsets */
+ cal->total_size_offset = sizeof(int);
+ cal->vcalendar_size_offset = (sizeof(int) * 7);
+ cal->vcalendar_offset = cal->vcalendar_size_offset + sizeof(int);
+ cal->title_size_offset = cal->vcalendar_offset + vcalendar_size;
+ cal->title_offset = cal->title_size_offset + sizeof(int);
+
+ /* sizes */
+ cal->total_size = total_size;
+ cal->vcalendar_size = vcalendar_size;
+ cal->title_size = title_size;
+
+ if (vcalendar && *vcalendar)
+ cal->vcalendar = strdup(vcalendar);
+
+ if (title && *title)
+ cal->title = strdup(title);
+
+ *rcal = cal;
+
+ return 0;
+}
+
+char * pack_calendar(struct calendar *cal, int size)
+{
+ char *str;
+
+ if((str = (char *)malloc(sizeof(char) * size))==NULL)
+ return 0;
+
+ /* ID */
+ memcpy(str, &cal->ID, sizeof(cal->ID));
+
+ /* total_size */
+ memcpy(str + cal->total_size_offset,
+ &cal->total_size,
+ sizeof(cal->total_size));
+
+ /* vcalendar_size */
+ memcpy(str + cal->vcalendar_size_offset,
+ &cal->vcalendar_size,
+ sizeof(cal->vcalendar_size));
+
+ /* vcalendar */
+ memcpy(str + cal->vcalendar_offset,
+ cal->vcalendar,
+ cal->vcalendar_size);
+
+ /* title_size */
+ memcpy(str + cal->title_size_offset,
+ &cal->title_size,
+ sizeof(cal->title_size));
+
+ /* title */
+ memcpy(str + cal->title_offset,
+ cal->title,
+ cal->title_size);
+
+ return str;
+}
+
+struct calendar * unpack_calendar(char *str, int size)
+{
+ struct calendar *cal;
+ if((cal = (struct calendar *) malloc(size))==NULL)
+ return 0;
+ memset(cal, 0, size);
+
+ /* offsets */
+ cal->total_size_offset = sizeof(int);
+ cal->vcalendar_size_offset = (sizeof(int) * 7);
+ cal->vcalendar_offset = cal->vcalendar_size_offset + sizeof(int);
+
+ /* ID */
+ memcpy(&cal->ID, str, sizeof(cal->ID));
+
+ /* total_size */
+ memcpy(&cal->total_size,
+ str + cal->total_size_offset,
+ sizeof(cal->total_size));
+
+ /* vcalendar_size */
+ memcpy(&cal->vcalendar_size,
+ str + cal->vcalendar_size_offset,
+ sizeof(cal->vcalendar_size));
+
+ if((cal->vcalendar = (char *)malloc(sizeof(char) *
+ cal->vcalendar_size))==NULL)
+ return 0;
+
+ /* vcalendar */
+ memcpy(cal->vcalendar,
+ (char *)(str + cal->vcalendar_offset),
+ cal->vcalendar_size);
+
+ cal->title_size_offset = cal->vcalendar_offset + cal->vcalendar_size;
+ cal->title_offset = cal->title_size_offset + sizeof(int);
+
+ /* title_size */
+ memcpy(&cal->title_size,
+ str + cal->title_size_offset,
+ sizeof(cal->title_size));
+
+ if((cal->title = (char *)malloc(sizeof(char) *
+ cal->title_size))==NULL)
+ return 0;
+
+ /* title*/
+ memcpy(cal->title,
+ (char *)(str + cal->title_offset),
+ cal->title_size);
+
+ return cal;
+}
int test_dirset()
{
@@ -358,7 +771,7 @@ int test_dirset()
}
- icaldirset_free(s2);
+ icalset_free(s2);
#endif
@@ -383,7 +796,7 @@ int test_dirset()
}
- icaldirset_free(s);
+ icalset_free(s);
return 0;
}
@@ -395,7 +808,7 @@ void test_calendar()
icaldirset *s;
icalcalendar* calendar = icalcalendar_new("calendar");
icalerrorenum error;
- struct icaltimetype atime = icaltime_from_timet( time(0),0,0);
+ struct icaltimetype atime = icaltime_null_time();
comp = icalcomponent_vanew(
ICAL_VEVENT_COMPONENT,
@@ -434,22 +847,23 @@ void test_calendar()
}
#endif
-
int main(int argc, char *argv[])
{
-/* printf("\n------------Test File Set---------------\n");
- test_fileset(); */
+ printf("\n------------Test File Set---------------\n");
+ test_fileset();
printf("\n------------Test Dir Set---------------\n");
test_dirset();
-#if 0
-
+#ifdef WITH_BDB4
+ printf("\n------------Test BerkeleyDB Set---------------\n");
+ test_bdbset();
+#endif
+#if 0
printf("\n------------Test Calendar---------------\n");
test_calendar();
-
#endif
return 0;
diff --git a/libical/src/test/stow.c b/libical/src/test/stow.c
index e676c677f3..01abea4f75 100644
--- a/libical/src/test/stow.c
+++ b/libical/src/test/stow.c
@@ -39,9 +39,7 @@
#include <ctype.h> /* for tolower */
#include "ical.h"
-#include "icalcalendar.h"
-#include "icalfileset.h"
-#include "icalmime.h"
+#include "icalss.h"
char* program_name;
#define TMPSIZE 2048
@@ -180,7 +178,7 @@ icalcomponent* get_first_real_component(icalcomponent *comp)
-char* make_mime(char* to, const char* from, const char* subject,
+char* make_mime(const char* to, const char* from, const char* subject,
const char* text_message, const char* method,
const char* ical_message)
{
@@ -250,13 +248,20 @@ void return_failure(icalcomponent* comp, char* message,
{
char* local_attendee = opt->calid;
FILE* p;
+ const char *org_addr;
icalcomponent *inner = get_first_real_component(comp);
icalproperty *organizer_prop = icalcomponent_get_first_property(inner,ICAL_ORGANIZER_PROPERTY);
const char *organizer = icalproperty_get_organizer(organizer_prop);
- organizer += 7;
+ org_addr = strchr(organizer,':');
+
+ if(org_addr != 0){
+ org_addr++; /* Skip the ';' */
+ } else {
+ org_addr = organizer;
+ }
if (opt->errors == ERRORS_TO_ORGANIZER){
p = popen(SENDMAIL,"w");
@@ -271,7 +276,7 @@ void return_failure(icalcomponent* comp, char* message,
exit(1);
}
- fputs(make_mime(organizer, local_attendee, "iMIP error",
+ fputs(make_mime(org_addr, local_attendee, "iMIP error",
message, "reply",
icalcomponent_as_ical_string(comp)),p);
@@ -380,6 +385,17 @@ char* check_component(icalcomponent* comp, icalproperty **return_status,
int errors = 0;
icalproperty *p;
int found_attendee = 0;
+ struct icalreqstattype rs;
+
+ rs.code = ICAL_UNKNOWN_STATUS;
+ rs.desc = 0;
+ rs.debug = 0;
+
+ /*{
+ icalrequeststatus code;
+ const char* desc;
+ const char* debug;
+ };*/
*return_status = 0;
@@ -401,6 +417,8 @@ char* check_component(icalcomponent* comp, icalproperty **return_status,
strcpy(static_component_error_str,
"Root component is not a VCALENDAR");
component_error_str = static_component_error_str;
+ rs.code = ICAL_3_11_MISSREQCOMP_STATUS;
+
break;
}
@@ -410,8 +428,9 @@ char* check_component(icalcomponent* comp, icalproperty **return_status,
if (icalcomponent_get_first_property(comp,ICAL_METHOD_PROPERTY) == 0)
{
strcpy(static_component_error_str,
- "Component does not have a METHOD property");
+ "The component you sent did not have a METHOD property");
component_error_str = static_component_error_str;
+ rs.code = ICAL_3_11_MISSREQCOMP_STATUS;
break;
}
@@ -421,8 +440,8 @@ char* check_component(icalcomponent* comp, icalproperty **return_status,
/* Check that the compopnent has an organizer */
if(icalcomponent_get_first_property(inner,ICAL_ORGANIZER_PROPERTY) == 0){
fprintf(stderr,"%s: fatal. Component does not have an ORGANIZER property\n",program_name);
-
- exit(1);
+ rs.code = ICAL_3_11_MISSREQCOMP_STATUS;
+ break;
}
@@ -444,7 +463,6 @@ char* check_component(icalcomponent* comp, icalproperty **return_status,
if (found_attendee == 0){
struct icalreqstattype rs;
- char* rs_string;
memset(static_component_error_str,0,PATH_MAX);
snprintf(static_component_error_str,PATH_MAX,
@@ -453,11 +471,6 @@ char* check_component(icalcomponent* comp, icalproperty **return_status,
component_error_str = static_component_error_str;
rs.code = ICAL_3_7_INVCU_STATUS;
- rs.desc = 0;
- rs.debug = component_error_str;
- rs_string = icalreqstattype_as_string(rs);
-
- *return_status = icalproperty_new_requeststatus(rs_string);
break;
}
@@ -480,6 +493,10 @@ char* check_component(icalcomponent* comp, icalproperty **return_status,
} while(0);
+ if(rs.code != ICAL_UNKNOWN_STATUS){
+ *return_status = icalproperty_new_requeststatus(rs);
+ }
+
return component_error_str;
}
@@ -638,35 +655,32 @@ void get_options(int argc, char* argv[], struct options_struct *opt)
p = strrchr(facspath,'/');
- if (p == 0){
- fprintf(stderr,"%s: Invalid calendar filename \"%s\"",
- program_name,facspath);
- exit(1);
- }
-
- *p='\0';
-
- type = test_file(facspath);
-
- errno = 0;
- if (type == NO_FILE){
-
- if(mkdir(facspath,0775) != 0){
- fprintf(stderr,
- "%s: Failed to create calendar directory %s: %s\n",
- program_name,facspath, strerror(errno));
- exit(1);
- } else {
- fprintf(stderr,"%s: Creating calendar directory %s\n",
- program_name,facspath);
- }
-
- } else if(type==REGULAR || type == ERROR){
- fprintf(stderr,"%s: Cannot create calendar directory %s\n",
- program_name,facspath);
- exit(1);
- }
- }
+ if (p != 0){
+ /* Use some other directory */
+ *p='\0';
+
+ type = test_file(facspath);
+
+ errno = 0;
+ if (type == NO_FILE){
+
+ if(mkdir(facspath,0775) != 0){
+ fprintf(stderr,
+ "%s: Failed to create calendar directory %s: %s\n",
+ program_name,facspath, strerror(errno));
+ exit(1);
+ } else {
+ fprintf(stderr,"%s: Creating calendar directory %s\n",
+ program_name,facspath);
+ }
+
+ } else if(type==REGULAR || type == ERROR){
+ fprintf(stderr,"%s: Cannot create calendar directory %s\n",
+ program_name,facspath);
+ exit(1);
+ }
+ }
+ }
}
char* check_options(struct options_struct *opt)
@@ -680,7 +694,7 @@ void store_component(icalcomponent *comp, struct options_struct *opt)
if(opt->storage == STORE_IN_FILE){
- icalfileset *fs = icalfileset_new(opt->output_file);
+ icalset *fs = icalfileset_new(opt->output_file);
if (fs == 0){
fprintf(stderr,
@@ -706,7 +720,7 @@ void store_component(icalcomponent *comp, struct options_struct *opt)
exit(1);
}
- icalfileset_free(fs);
+ icalset_free(fs);
return;
} else {
@@ -726,6 +740,7 @@ icalcomponent* read_nonmime_component(struct options_struct *opt)
FILE *stream;
icalcomponent *comp;
icalparser* parser = icalparser_new();
+ icalerrorstate es = icalerror_get_error_state(ICAL_MALFORMEDDATA_ERROR);
char* line;
if(opt->input_source == INPUT_FROM_FILE){
@@ -746,7 +761,9 @@ icalcomponent* read_nonmime_component(struct options_struct *opt)
do {
line = icalparser_get_line(parser,read_stream);
+ icalerror_set_error_state(ICAL_MALFORMEDDATA_ERROR,ICAL_ERROR_NONFATAL);
comp = icalparser_add_line(parser,line);
+ icalerror_set_error_state(ICAL_MALFORMEDDATA_ERROR,es);
if (comp != 0){
return comp;
@@ -847,12 +864,17 @@ int main(int argc, char* argv[] )
comp = read_component(&opt);
+ /* If the component had any fatal errors, return an error message
+ to the organizer */
if ( (component_error_str =
check_component(comp,&return_status,&opt)) != 0){
+
reply = make_reply(comp,return_status,&opt);
+
return_failure(reply, component_error_str, &opt);
icalcomponent_free(reply);
exit(0);
+
}
store_component(comp,&opt);
diff --git a/libical/src/test/test_fileset.ics b/libical/src/test/test_fileset.ics
new file mode 100644
index 0000000000..35799e4569
--- /dev/null
+++ b/libical/src/test/test_fileset.ics
@@ -0,0 +1,60 @@
+BEGIN:VCALENDAR
+METHOD:REQUEST
+BEGIN:VEVENT
+DTSTART:20000101T120000Z
+END:VEVENT
+END:VCALENDAR
+BEGIN:VCALENDAR
+METHOD:REQUEST
+BEGIN:VEVENT
+DTSTART:20000102T120000Z
+END:VEVENT
+END:VCALENDAR
+BEGIN:VCALENDAR
+METHOD:REQUEST
+BEGIN:VEVENT
+DTSTART:20000103T120000Z
+END:VEVENT
+END:VCALENDAR
+BEGIN:VCALENDAR
+METHOD:REQUEST
+BEGIN:VEVENT
+DTSTART:20000104T120000Z
+END:VEVENT
+END:VCALENDAR
+BEGIN:VCALENDAR
+METHOD:REQUEST
+BEGIN:VEVENT
+DTSTART:20000105T120000Z
+END:VEVENT
+END:VCALENDAR
+BEGIN:VCALENDAR
+METHOD:REQUEST
+BEGIN:VEVENT
+DTSTART:20000106T120000Z
+END:VEVENT
+END:VCALENDAR
+BEGIN:VCALENDAR
+METHOD:REQUEST
+BEGIN:VEVENT
+DTSTART:20000107T120000Z
+END:VEVENT
+END:VCALENDAR
+BEGIN:VCALENDAR
+METHOD:REQUEST
+BEGIN:VEVENT
+DTSTART:20000108T120000Z
+END:VEVENT
+END:VCALENDAR
+BEGIN:VCALENDAR
+METHOD:REQUEST
+BEGIN:VEVENT
+DTSTART:20000109T120000Z
+END:VEVENT
+END:VCALENDAR
+BEGIN:VCALENDAR
+METHOD:REQUEST
+BEGIN:VEVENT
+DTSTART:20000110T120000Z
+END:VEVENT
+END:VCALENDAR
diff --git a/libical/src/test/testclassify.c b/libical/src/test/testclassify.c
index 2c6c785dfa..649d80cc58 100644
--- a/libical/src/test/testclassify.c
+++ b/libical/src/test/testclassify.c
@@ -29,52 +29,29 @@
#include "ical.h"
#include <errno.h>
#include <string.h> /* For strerror */
-#include "icalset.h"
-#include "icalclassify.h"
-
-
-struct class_map {
- ical_class class;
- char *str;
-} class_map[] = {
- {ICAL_NO_CLASS,"No class"},
- {ICAL_PUBLISH_NEW_CLASS,"New Publish"},
- {ICAL_PUBLISH_UPDATE_CLASS,"Update Publish"},
- {ICAL_REQUEST_NEW_CLASS,"New request"},
- {ICAL_REQUEST_UPDATE_CLASS,"Update"},
- {ICAL_REQUEST_RESCHEDULE_CLASS,"Reschedule"},
- {ICAL_REQUEST_DELEGATE_CLASS,"Delegate"},
- {ICAL_REQUEST_NEW_ORGANIZER_CLASS,"New Organizer"},
- {ICAL_REQUEST_FORWARD_CLASS,"Forward"},
- {ICAL_REQUEST_STATUS_CLASS,"Status request"},
- {ICAL_REPLY_ACCEPT_CLASS,"Accept reply"},
- {ICAL_REPLY_DECLINE_CLASS,"Decline reply"},
- {ICAL_REPLY_CRASHER_ACCEPT_CLASS,"Crasher's accept reply"},
- {ICAL_REPLY_CRASHER_DECLINE_CLASS,"Crasher's decline reply"},
- {ICAL_ADD_INSTANCE_CLASS,"Add instance"},
- {ICAL_CANCEL_EVENT_CLASS,"Cancel event"},
- {ICAL_CANCEL_INSTANCE_CLASS,"Cancel instance"},
- {ICAL_CANCEL_ALL_CLASS,"Cancel all instances"},
- {ICAL_REFRESH_CLASS,"Refresh"},
- {ICAL_COUNTER_CLASS,"Counter"},
- {ICAL_DECLINECOUNTER_CLASS,"Decline counter"},
- {ICAL_MALFORMED_CLASS,"Malformed"},
- {ICAL_OBSOLETE_CLASS,"Obsolete"},
- {ICAL_MISSEQUENCED_CLASS,"Missequenced"},
- {ICAL_UNKNOWN_CLASS,"Unknown"}
-};
-
-char* find_class_string(ical_class class)
-{
- int i;
+#include "icalss.h"
- for (i = 0;class_map[i].class != ICAL_UNKNOWN_CLASS;i++){
- if (class_map[i].class == class){
- return class_map[i].str;
- }
+/* Get a note about the purpose of the property*/
+const char* get_note(icalcomponent *c)
+{
+ icalproperty *p;
+ const char* note = 0;
+
+ if(c != 0){
+ for(p = icalcomponent_get_first_property(c,ICAL_X_PROPERTY);
+ p!= 0;
+ p = icalcomponent_get_next_property(c,ICAL_X_PROPERTY)){
+ if(strcmp(icalproperty_get_x_name(p),"X-LIC-NOTE")==0){
+ note = icalproperty_get_x(p);
+ }
+ }
+ }
+
+ if(note == 0){
+ note = "None";
}
-
- return "Unknown";
+
+ return note;
}
@@ -83,71 +60,66 @@ int main(int argc, char* argv[])
icalcomponent *c;
int i=0;
- icalset* f = icalset_new_file("../../test-data/incoming.ics");
+ /* Open up the two storage files, one for the incomming components,
+ one for the calendar */
+ icalset* incoming = icalset_new_file("../../test-data/incoming.ics");
icalset* cal = icalset_new_file("../../test-data/calendar.ics");
- assert(f!= 0);
+ assert(incoming!= 0);
assert(cal!=0);
-
- /* Foreach incoming message */
- for(c=icalset_get_first_component(f);c!=0;
- c=icalset_get_next_component(f)){
+ /* Iterate through all of the incoming components */
+ for(c=icalset_get_first_component(incoming);c!=0;
+ c=icalset_get_next_component(incoming)){
- ical_class class;
- icalcomponent *match;
- icalcomponent *inner = icalcomponent_get_first_real_component(c);
- icalcomponent *p;
- const char *this_uid;
- const char *i_x_note=0;
- const char *c_x_note=0;
+ icalproperty_xlicclass class;
+ icalcomponent *match = 0;
+ const char* this_uid;
i++;
- if(inner == 0){
- continue;
- }
-
- p = icalcomponent_get_first_property(inner,ICAL_UID_PROPERTY);
- this_uid = icalproperty_get_uid(p);
-
- assert(this_uid != 0);
-
- /* Find a booked component that is matched to the incoming
- message, based on the incoming component's UID, SEQUENCE
- and RECURRENCE-ID*/
-
- match = icalset_fetch(cal,this_uid);
-
+ /* Check this component against the restrictions imposed by
+ iTIP. An errors will be inserted as X-LIC-ERROR properties
+ in the component. The Parser will also insert errors if it
+ cannot parse the component */
+ icalcomponent_check_restrictions(c);
+
+ /* If there are any errors, print out the component */
+ if(icalcomponent_count_errors(c) != 0){
+ printf("----- Component has errors ------- \n%s-----------------\n",
+ icalcomponent_as_ical_string(c));
+ }
+
+ /* Use one of the icalcomponent convenience routines to get
+ the UID. This routine will save you from having to use
+ icalcomponent_get_inner(),
+ icalcomponent_get_first_property(), checking the return
+ value, and then calling icalproperty_get_uid. There are
+ several other convenience routines for DTSTART, DTEND,
+ DURATION, SUMMARY, METHOD, and COMMENT */
+ this_uid = icalcomponent_get_uid(c);
+
+ if(this_uid != 0){
+ /* Look in the calendar for a component with the same UID
+ as the incomming component. We should reall also be
+ checking the RECURRENCE-ID. Another way to do this
+ operation is to us icalset_find_match(), which does use
+ the RECURRENCE-ID. */
+ match = icalset_fetch(cal,this_uid);
+ }
+
+
+ /* Classify the incoming component. The third argument is the
+ calid of the user who owns the calendar. In a real program,
+ you would probably switch() on the class.*/
class = icalclassify(c,match,"A@example.com");
- for(p = icalcomponent_get_first_property(c,ICAL_X_PROPERTY);
- p!= 0;
- p = icalcomponent_get_next_property(c,ICAL_X_PROPERTY)){
- if(strcmp(icalproperty_get_x_name(p),"X-LIC-NOTE")==0){
- i_x_note = icalproperty_get_x(p);
- }
- }
-
-
- if(i_x_note == 0){
- i_x_note = "None";
- }
-
- for(p = icalcomponent_get_first_property(match,ICAL_X_PROPERTY);
- p!= 0;
- p = icalcomponent_get_next_property(match,ICAL_X_PROPERTY)){
- if(strcmp(icalproperty_get_x_name(p),"X-LIC-NOTE")==0){
- c_x_note = icalproperty_get_x(p);
- }
- }
-
- if(c_x_note == 0){
- c_x_note = "None";
- }
-
-
- printf("Test %d\nIncoming: %s\nMatched: %s\nClassification: %s\n\n",i,i_x_note,c_x_note,find_class_string(class));
+ printf("Test %d\n\
+Incoming: %s\n\
+Matched: %s\n\
+Classification: %s\n\n",
+ i,get_note(c),get_note(match),
+ icalproperty_enum_to_string(class));
}
return 0;
diff --git a/libical/src/test/testmime.c b/libical/src/test/testmime.c
index 5dfc3b7d31..cdb47d88dc 100644
--- a/libical/src/test/testmime.c
+++ b/libical/src/test/testmime.c
@@ -34,8 +34,7 @@
======================================================================*/
#include "ical.h"
-#include "sspm.h"
-#include "icalmime.h"
+
#include <stdlib.h> /* For rand */
#include <string.h> /* for strrchr, strdup*/
#include <unistd.h> /* for getopt */
@@ -265,7 +264,7 @@ int main(int argc, char* argv[]) {
d.pos = 0;
d.str = buf;
- c = icalmime_parse(string_line_generator,&d);
+ c = icalmime_parse(icalparser_string_line_generator,&d);
printf("%s\n",icalcomponent_as_ical_string(c));