/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
/*
* Copyright (C) 2019 Red Hat, Inc. (www.redhat.com)
*
* This program is free software: you can redistribute it and/or modify it
* under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation.
*
* This program is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
* or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License
* for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with this program. If not, see .
*
*/
#include "evolution-data-server-config.h"
#include
#include
static void
verify_ical_attach_equal (ICalAttach *expected,
ICalAttach *received)
{
if (!expected) {
g_assert_null (received);
return;
}
g_assert_nonnull (received);
g_assert_cmpint (i_cal_attach_get_is_url (expected) ? 1 : 0, ==, i_cal_attach_get_is_url (received) ? 1 : 0);
if (i_cal_attach_get_is_url (expected)) {
g_assert_cmpstr (i_cal_attach_get_url (expected), ==, i_cal_attach_get_url (received));
} else {
const gchar *data_expected, *data_received;
data_expected = i_cal_attach_get_data (expected);
data_received = i_cal_attach_get_data (received);
g_assert_nonnull (data_expected);
g_assert_nonnull (data_received);
g_assert_cmpmem (data_expected, strlen (data_expected), data_received, strlen (data_received));
}
}
static void
verify_ical_attach_list_equal (GSList *expected, /* ICalAttach * */
GSList *received) /* ICalAttach * */
{
GSList *link1, *link2;
if (!expected) {
g_assert_null (received);
return;
}
g_assert_nonnull (received);
g_assert_cmpint (g_slist_length (expected), ==, g_slist_length (received));
for (link1 = expected, link2 = received; link1 && link2; link1 = g_slist_next (link1), link2 = g_slist_next (link2)) {
verify_ical_attach_equal (link1->data, link2->data);
}
g_assert_true (link1 == link2);
}
static void
verify_ical_durationtype_equal (ICalDuration *expected,
ICalDuration *received)
{
if (!expected) {
g_assert_null (received);
return;
}
g_assert_nonnull (received);
g_assert_cmpint (i_cal_duration_as_int (expected), ==, i_cal_duration_as_int (received));
}
static void
verify_ical_timetype_equal (ICalTime *expected,
ICalTime *received)
{
ICalTimezone *zone_expected, *zone_received;
if (!expected) {
g_assert_null (received);
return;
}
g_assert_nonnull (received);
g_assert_cmpint (i_cal_time_get_year (expected), ==, i_cal_time_get_year (received));
g_assert_cmpint (i_cal_time_get_month (expected), ==, i_cal_time_get_month (received));
g_assert_cmpint (i_cal_time_get_day (expected), ==, i_cal_time_get_day (received));
g_assert_cmpint (i_cal_time_get_hour (expected), ==, i_cal_time_get_hour (received));
g_assert_cmpint (i_cal_time_get_minute (expected), ==, i_cal_time_get_minute (received));
g_assert_cmpint (i_cal_time_get_second (expected), ==, i_cal_time_get_second (received));
g_assert_cmpint (i_cal_time_is_date (expected) ? 1 : 0, ==, i_cal_time_is_date (received) ? 1 : 0);
g_assert_cmpint (i_cal_time_is_daylight (expected) ? 1 : 0, ==, i_cal_time_is_daylight (received) ? 1 : 0);
zone_expected = i_cal_time_get_timezone (expected);
zone_received = i_cal_time_get_timezone (received);
if (!zone_expected) {
g_assert_null (zone_received);
} else if (zone_received) {
g_assert_cmpstr (i_cal_timezone_get_location (zone_expected), ==, i_cal_timezone_get_location (zone_received));
}
}
static void
verify_struct_parameter_bag_equal (const ECalComponentParameterBag *expected,
const ECalComponentParameterBag *received)
{
gint ii, count;
if (!expected) {
g_assert_null (received);
return;
}
g_assert_nonnull (received);
g_assert_cmpint (e_cal_component_parameter_bag_get_count (expected), ==, e_cal_component_parameter_bag_get_count (received));
count = e_cal_component_parameter_bag_get_count (expected);
for (ii = 0; ii < count; ii++) {
ICalParameter *param_expected, *param_received;
gchar *value_expected, *value_received;
param_expected = e_cal_component_parameter_bag_get (expected, ii);
param_received = e_cal_component_parameter_bag_get (received, ii);
g_assert_nonnull (param_expected);
g_assert_nonnull (param_received);
g_assert_cmpint (i_cal_parameter_isa (param_expected), ==, i_cal_parameter_isa (param_received));
value_expected = i_cal_parameter_as_ical_string (param_expected);
value_received = i_cal_parameter_as_ical_string (param_received);
g_assert_cmpstr (value_expected, ==, value_received);
g_free (value_expected);
g_free (value_received);
}
}
static void
verify_struct_property_bag_equal (const ECalComponentPropertyBag *expected,
const ECalComponentPropertyBag *received)
{
gint ii, count;
if (!expected) {
g_assert_null (received);
return;
}
g_assert_nonnull (received);
g_assert_cmpint (e_cal_component_property_bag_get_count (expected), ==, e_cal_component_property_bag_get_count (received));
count = e_cal_component_property_bag_get_count (expected);
for (ii = 0; ii < count; ii++) {
ICalProperty *prop_expected, *prop_received;
gchar *value_expected, *value_received;
prop_expected = e_cal_component_property_bag_get (expected, ii);
prop_received = e_cal_component_property_bag_get (received, ii);
g_assert_nonnull (prop_expected);
g_assert_nonnull (prop_received);
g_assert_cmpint (i_cal_property_isa (prop_expected), ==, i_cal_property_isa (prop_received));
value_expected = i_cal_property_as_ical_string (prop_expected);
value_received = i_cal_property_as_ical_string (prop_received);
g_assert_cmpstr (value_expected, ==, value_received);
g_free (value_expected);
g_free (value_received);
}
}
static void
verify_struct_attendee_equal (const ECalComponentAttendee *expected,
const ECalComponentAttendee *received)
{
if (!expected) {
g_assert_null (received);
return;
}
g_assert_nonnull (received);
g_assert_cmpstr (e_cal_component_attendee_get_value (expected), ==, e_cal_component_attendee_get_value (received));
g_assert_cmpstr (e_cal_component_attendee_get_member (expected), ==, e_cal_component_attendee_get_member (received));
g_assert_cmpint (e_cal_component_attendee_get_cutype (expected), ==, e_cal_component_attendee_get_cutype (received));
g_assert_cmpint (e_cal_component_attendee_get_role (expected), ==, e_cal_component_attendee_get_role (received));
g_assert_cmpint (e_cal_component_attendee_get_partstat (expected), ==, e_cal_component_attendee_get_partstat (received));
g_assert_cmpint (e_cal_component_attendee_get_rsvp (expected) ? 1 : 0, ==, e_cal_component_attendee_get_rsvp (received) ? 1 : 0);
g_assert_cmpstr (e_cal_component_attendee_get_delegatedfrom (expected), ==, e_cal_component_attendee_get_delegatedfrom (received));
g_assert_cmpstr (e_cal_component_attendee_get_delegatedto (expected), ==, e_cal_component_attendee_get_delegatedto (received));
g_assert_cmpstr (e_cal_component_attendee_get_sentby (expected), ==, e_cal_component_attendee_get_sentby (received));
g_assert_cmpstr (e_cal_component_attendee_get_cn (expected), ==, e_cal_component_attendee_get_cn (received));
g_assert_cmpstr (e_cal_component_attendee_get_language (expected), ==, e_cal_component_attendee_get_language (received));
verify_struct_parameter_bag_equal (e_cal_component_attendee_get_parameter_bag (expected),
e_cal_component_attendee_get_parameter_bag (received));
}
static void
verify_struct_attendee_list_equal (GSList *expected, /* ECalComponentAttendee * */
GSList *received) /* ECalComponentAttendee * */
{
GSList *link1, *link2;
if (!expected) {
g_assert_null (received);
return;
}
g_assert_nonnull (received);
g_assert_cmpint (g_slist_length (expected), ==, g_slist_length (received));
for (link1 = expected, link2 = received; link1 && link2; link1 = g_slist_next (link1), link2 = g_slist_next (link2)) {
verify_struct_attendee_equal (link1->data, link2->data);
}
g_assert_true (link1 == link2);
}
static void
verify_struct_datetime_equal (const ECalComponentDateTime *expected,
const ECalComponentDateTime *received)
{
if (!expected) {
g_assert_null (received);
return;
}
g_assert_nonnull (received);
verify_ical_timetype_equal (e_cal_component_datetime_get_value (expected),
e_cal_component_datetime_get_value (received));
g_assert_cmpstr (e_cal_component_datetime_get_tzid (expected), ==, e_cal_component_datetime_get_tzid (received));
}
static void
verify_struct_id_equal (const ECalComponentId *expected,
const ECalComponentId *received)
{
if (!expected) {
g_assert_null (received);
return;
}
g_assert_nonnull (received);
g_assert_cmpstr (e_cal_component_id_get_uid (expected), ==, e_cal_component_id_get_uid (received));
g_assert_cmpstr (e_cal_component_id_get_rid (expected), ==, e_cal_component_id_get_rid (received));
g_assert_cmpint (e_cal_component_id_hash (expected), ==, e_cal_component_id_hash (received));
g_assert_true (e_cal_component_id_equal (expected, received));
}
static void
verify_struct_organizer_equal (const ECalComponentOrganizer *expected,
const ECalComponentOrganizer *received)
{
if (!expected) {
g_assert_null (received);
return;
}
g_assert_nonnull (received);
g_assert_cmpstr (e_cal_component_organizer_get_value (expected), ==, e_cal_component_organizer_get_value (received));
g_assert_cmpstr (e_cal_component_organizer_get_sentby (expected), ==, e_cal_component_organizer_get_sentby (received));
g_assert_cmpstr (e_cal_component_organizer_get_cn (expected), ==, e_cal_component_organizer_get_cn (received));
g_assert_cmpstr (e_cal_component_organizer_get_language (expected), ==, e_cal_component_organizer_get_language (received));
verify_struct_parameter_bag_equal (e_cal_component_organizer_get_parameter_bag (expected),
e_cal_component_organizer_get_parameter_bag (received));
}
static void
verify_struct_period_equal (const ECalComponentPeriod *expected,
const ECalComponentPeriod *received)
{
if (!expected) {
g_assert_null (received);
return;
}
g_assert_nonnull (received);
g_assert_cmpint (e_cal_component_period_get_kind (expected), ==, e_cal_component_period_get_kind (received));
verify_ical_timetype_equal (e_cal_component_period_get_start (expected),
e_cal_component_period_get_start (received));
switch (e_cal_component_period_get_kind (expected)) {
case E_CAL_COMPONENT_PERIOD_DATETIME:
verify_ical_timetype_equal (e_cal_component_period_get_end (expected),
e_cal_component_period_get_end (received));
break;
case E_CAL_COMPONENT_PERIOD_DURATION:
verify_ical_durationtype_equal (e_cal_component_period_get_duration (expected),
e_cal_component_period_get_duration (received));
break;
}
}
static void
verify_struct_range_equal (const ECalComponentRange *expected,
const ECalComponentRange *received)
{
if (!expected) {
g_assert_null (received);
return;
}
g_assert_nonnull (received);
g_assert_cmpint (e_cal_component_range_get_kind (expected), ==, e_cal_component_range_get_kind (received));
verify_struct_datetime_equal (e_cal_component_range_get_datetime (expected),
e_cal_component_range_get_datetime (received));
}
static void
verify_struct_text_equal (const ECalComponentText *expected,
const ECalComponentText *received)
{
if (!expected) {
g_assert_null (received);
return;
}
g_assert_nonnull (received);
g_assert_cmpstr (e_cal_component_text_get_value (expected), ==, e_cal_component_text_get_value (received));
g_assert_cmpstr (e_cal_component_text_get_altrep (expected), ==, e_cal_component_text_get_altrep (received));
g_assert_cmpstr (e_cal_component_text_get_language (expected), ==, e_cal_component_text_get_language (received));
}
static void
verify_struct_alarm_repeat_equal (const ECalComponentAlarmRepeat *expected,
const ECalComponentAlarmRepeat *received)
{
if (!expected) {
g_assert_null (received);
return;
}
g_assert_nonnull (received);
g_assert_cmpint (e_cal_component_alarm_repeat_get_repetitions (expected), ==, e_cal_component_alarm_repeat_get_repetitions (received));
verify_ical_durationtype_equal (e_cal_component_alarm_repeat_get_interval (expected),
e_cal_component_alarm_repeat_get_interval (received));
g_assert_cmpint (e_cal_component_alarm_repeat_get_interval_seconds (expected), ==, e_cal_component_alarm_repeat_get_interval_seconds (received));
g_assert_cmpint (e_cal_component_alarm_repeat_get_interval_seconds (expected), ==,
i_cal_duration_as_int (e_cal_component_alarm_repeat_get_interval (expected)));
g_assert_cmpint (e_cal_component_alarm_repeat_get_interval_seconds (received), ==,
i_cal_duration_as_int (e_cal_component_alarm_repeat_get_interval (received)));
g_assert_cmpint (e_cal_component_alarm_repeat_get_interval_seconds (expected), ==,
i_cal_duration_as_int (e_cal_component_alarm_repeat_get_interval (received)));
}
static void
verify_struct_alarm_trigger_equal (const ECalComponentAlarmTrigger *expected,
const ECalComponentAlarmTrigger *received)
{
if (!expected) {
g_assert_null (received);
return;
}
g_assert_nonnull (received);
g_assert_cmpint (e_cal_component_alarm_trigger_get_kind (expected), ==, e_cal_component_alarm_trigger_get_kind (received));
switch (e_cal_component_alarm_trigger_get_kind (expected)) {
case E_CAL_COMPONENT_ALARM_TRIGGER_NONE:
break;
case E_CAL_COMPONENT_ALARM_TRIGGER_RELATIVE_START:
case E_CAL_COMPONENT_ALARM_TRIGGER_RELATIVE_END:
verify_ical_durationtype_equal (e_cal_component_alarm_trigger_get_duration (expected),
e_cal_component_alarm_trigger_get_duration (received));
break;
case E_CAL_COMPONENT_ALARM_TRIGGER_ABSOLUTE:
verify_ical_timetype_equal (e_cal_component_alarm_trigger_get_absolute_time (expected),
e_cal_component_alarm_trigger_get_absolute_time (received));
break;
}
verify_struct_parameter_bag_equal (e_cal_component_alarm_trigger_get_parameter_bag (expected),
e_cal_component_alarm_trigger_get_parameter_bag (received));
}
static void
verify_struct_alarm_equal (const ECalComponentAlarm *expected,
const ECalComponentAlarm *received)
{
if (!expected) {
g_assert_null (received);
return;
}
g_assert_nonnull (received);
g_assert_cmpstr (e_cal_component_alarm_get_uid (expected), ==, e_cal_component_alarm_get_uid (received));
g_assert_cmpint (e_cal_component_alarm_get_action (expected), ==, e_cal_component_alarm_get_action (received));
verify_struct_text_equal (e_cal_component_alarm_get_summary (expected),
e_cal_component_alarm_get_summary (received));
verify_struct_text_equal (e_cal_component_alarm_get_description (expected),
e_cal_component_alarm_get_description (received));
verify_struct_alarm_repeat_equal (e_cal_component_alarm_get_repeat (expected),
e_cal_component_alarm_get_repeat (received));
verify_struct_alarm_trigger_equal (e_cal_component_alarm_get_trigger (expected),
e_cal_component_alarm_get_trigger (received));
g_assert_cmpint (e_cal_component_alarm_has_attendees (expected) ? 1 : 0, ==, e_cal_component_alarm_has_attendees (received) ? 1 : 0);
verify_struct_attendee_list_equal (e_cal_component_alarm_get_attendees (expected),
e_cal_component_alarm_get_attendees (received));
g_assert_cmpint (e_cal_component_alarm_has_attachments (expected) ? 1 : 0, ==, e_cal_component_alarm_has_attachments (received) ? 1 : 0);
verify_ical_attach_list_equal (e_cal_component_alarm_get_attachments (expected),
e_cal_component_alarm_get_attachments (received));
verify_struct_property_bag_equal (e_cal_component_alarm_get_property_bag (expected),
e_cal_component_alarm_get_property_bag (received));
verify_ical_timetype_equal (e_cal_component_alarm_get_acknowledged (expected),
e_cal_component_alarm_get_acknowledged (received));
}
static void
verify_struct_alarm_instance_equal (const ECalComponentAlarmInstance *expected,
const ECalComponentAlarmInstance *received)
{
if (!expected) {
g_assert_null (received);
return;
}
g_assert_nonnull (received);
g_assert_cmpstr (e_cal_component_alarm_instance_get_uid (expected), ==, e_cal_component_alarm_instance_get_uid (received));
g_assert_cmpstr (e_cal_component_alarm_instance_get_rid (expected), ==, e_cal_component_alarm_instance_get_rid (received));
g_assert_cmpint (e_cal_component_alarm_instance_get_time (expected), ==, e_cal_component_alarm_instance_get_time (received));
g_assert_cmpint (e_cal_component_alarm_instance_get_occur_start (expected), ==, e_cal_component_alarm_instance_get_occur_start (received));
g_assert_cmpint (e_cal_component_alarm_instance_get_occur_end (expected), ==, e_cal_component_alarm_instance_get_occur_end (received));
g_assert_true (e_cal_component_alarm_instance_get_component (expected) == e_cal_component_alarm_instance_get_component (received));
}
static void
verify_struct_alarms_equal (const ECalComponentAlarms *expected,
const ECalComponentAlarms *received)
{
GSList *inst_expected, *inst_received, *link1, *link2;
const gchar *uid_expected, *uid_received;
gchar *rid_expected, *rid_received;
if (!expected) {
g_assert_null (received);
return;
}
g_assert_nonnull (received);
uid_expected = e_cal_component_get_uid (e_cal_component_alarms_get_component (expected));
uid_received = e_cal_component_get_uid (e_cal_component_alarms_get_component (received));
g_assert_cmpstr (uid_expected, ==, uid_received);
rid_expected = e_cal_component_get_recurid_as_string (e_cal_component_alarms_get_component (expected));
rid_received = e_cal_component_get_recurid_as_string (e_cal_component_alarms_get_component (received));
g_assert_cmpstr (rid_expected, ==, rid_received);
g_free (rid_expected);
g_free (rid_received);
inst_expected = e_cal_component_alarms_get_instances (expected);
inst_received = e_cal_component_alarms_get_instances (received);
g_assert_cmpint (g_slist_length (inst_expected), ==, g_slist_length (inst_received));
for (link1 = inst_expected, link2 = inst_received; link1 && link2; link1 = g_slist_next (link1), link2 = g_slist_next (link2)) {
verify_struct_alarm_instance_equal (link1->data, link2->data);
}
g_assert_true (link1 == link2);
}
static void
test_component_struct_alarm (void)
{
struct _values {
const gchar *uid;
ECalComponentAlarmAction action;
const gchar *summary;
const gchar *description;
gboolean with_repeat;
gboolean with_trigger;
gboolean with_attendees;
gboolean with_attachments;
gboolean with_properties;
gboolean with_acknowledged;
} values[] = {
{ "1", E_CAL_COMPONENT_ALARM_AUDIO, NULL, NULL, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE },
{ "2", E_CAL_COMPONENT_ALARM_DISPLAY, NULL, "display text", FALSE, FALSE, FALSE, FALSE, FALSE, TRUE },
{ "3", E_CAL_COMPONENT_ALARM_EMAIL, "summary text", NULL, TRUE, FALSE, FALSE, FALSE, FALSE, FALSE },
{ "4", E_CAL_COMPONENT_ALARM_PROCEDURE, NULL, "procedure", FALSE, TRUE, FALSE, FALSE, TRUE, TRUE },
{ "5", E_CAL_COMPONENT_ALARM_AUDIO, NULL, NULL, FALSE, FALSE, TRUE, FALSE, TRUE, FALSE },
{ "6", E_CAL_COMPONENT_ALARM_DISPLAY, NULL, "display text", FALSE, FALSE, FALSE, TRUE, TRUE, TRUE },
{ "7", E_CAL_COMPONENT_ALARM_EMAIL, "summary", "description", TRUE, FALSE, TRUE, FALSE, TRUE, FALSE },
{ "8", E_CAL_COMPONENT_ALARM_PROCEDURE, NULL, "procedure", TRUE, TRUE, TRUE, TRUE, TRUE, TRUE }
};
gint ii, nth_summary = 0, nth_description = 0, nth_repeat = 0, nth_trigger = 0, nth_attendees = 0, nth_attachments = 0, nth_properties = 0, nth_acknowledged = 0;
for (ii = 0; ii < G_N_ELEMENTS (values); ii++) {
ECalComponentAlarm *expected, *received;
ICalComponent *icalcomp;
expected = e_cal_component_alarm_new ();
e_cal_component_alarm_set_uid (expected, values[ii].uid);
e_cal_component_alarm_set_action (expected, values[ii].action);
if (values[ii].summary) {
nth_summary++;
if ((nth_summary & 1) != 0) {
ECalComponentText *txt;
txt = e_cal_component_text_new (values[ii].summary, "alt-representation");
e_cal_component_alarm_set_summary (expected, txt);
e_cal_component_text_free (txt);
} else {
e_cal_component_alarm_take_summary (expected, e_cal_component_text_new (values[ii].summary, NULL));
}
}
if (values[ii].description) {
nth_description++;
if ((nth_description & 1) != 0) {
ECalComponentText *txt;
txt = e_cal_component_text_new (values[ii].description, "alt-representation");
e_cal_component_alarm_set_description (expected, txt);
e_cal_component_text_free (txt);
} else {
e_cal_component_alarm_take_description (expected, e_cal_component_text_new (values[ii].description, NULL));
}
}
if (values[ii].with_repeat) {
nth_repeat++;
if ((nth_repeat & 1) != 0) {
ECalComponentAlarmRepeat *rpt;
rpt = e_cal_component_alarm_repeat_new_seconds (3, 6);
e_cal_component_alarm_set_repeat (expected, rpt);
e_cal_component_alarm_repeat_free (rpt);
} else {
e_cal_component_alarm_take_repeat (expected, e_cal_component_alarm_repeat_new_seconds (9, 12));
}
}
if (values[ii].with_trigger) {
nth_trigger++;
if ((nth_trigger & 1) != 0) {
ECalComponentAlarmTrigger *trg;
ICalTime *tt;
tt = i_cal_time_new_from_string ("20201030T102030");
g_assert_nonnull (tt);
trg = e_cal_component_alarm_trigger_new_absolute (tt);
e_cal_component_alarm_set_trigger (expected, trg);
e_cal_component_alarm_trigger_free (trg);
g_object_unref (tt);
} else {
ICalTime *tt;
tt = i_cal_time_new_from_string ("21211129T122233");
g_assert_nonnull (tt);
e_cal_component_alarm_take_trigger (expected, e_cal_component_alarm_trigger_new_absolute (tt));
g_object_unref (tt);
}
}
if (values[ii].with_attendees) {
GSList *attendees = NULL;
gint jj;
nth_attendees++;
for (jj = 0; jj < nth_attendees; jj++) {
ECalComponentAttendee *att;
gchar *value;
value = g_strdup_printf ("mailto:attendee-%d", jj);
att = e_cal_component_attendee_new ();
e_cal_component_attendee_set_value (att, value);
g_free (value);
attendees = g_slist_prepend (attendees, att);
}
if ((nth_attendees & 1) != 0) {
e_cal_component_alarm_set_attendees (expected, attendees);
g_slist_free_full (attendees, e_cal_component_attendee_free);
} else {
e_cal_component_alarm_take_attendees (expected, attendees);
}
}
if (values[ii].with_attachments) {
GSList *attachments = NULL;
gint jj;
nth_attachments++;
for (jj = 0; jj < nth_attachments; jj++) {
ICalAttach *attach;
gchar *value;
if ((jj & 1) != 0) {
value = g_strdup_printf ("https://www.no.where/link%d", jj);
attach = i_cal_attach_new_from_url (value);
} else {
value = g_strdup_printf ("Content*%d", jj);
attach = i_cal_attach_new_from_data (value, NULL, NULL);
}
g_free (value);
g_assert_nonnull (attach);
attachments = g_slist_prepend (attachments, attach);
}
if ((nth_attachments & 1) != 0) {
e_cal_component_alarm_set_attachments (expected, attachments);
g_slist_free_full (attachments, g_object_unref);
} else {
e_cal_component_alarm_take_attachments (expected, attachments);
}
}
if (values[ii].with_properties) {
ECalComponentPropertyBag *bag;
gint ii;
nth_properties++;
bag = e_cal_component_alarm_get_property_bag (expected);
g_assert_nonnull (bag);
for (ii = nth_properties; ii > 0; ii--) {
ICalProperty *prop;
if (ii == 0) {
prop = i_cal_property_new_url ("https://www.gnome.org");
} else if (ii == 1) {
prop = i_cal_property_new_voter ("mailto:user@no.where");
} else {
gchar *x_name;
x_name = g_strdup_printf ("X-CUSTOM-PROP-%d", ii);
prop = i_cal_property_new_x (x_name + 2);
i_cal_property_set_x_name (prop, x_name);
g_free (x_name);
}
g_assert_nonnull (prop);
e_cal_component_property_bag_take (bag, prop);
}
g_assert_cmpint (e_cal_component_property_bag_get_count (bag), ==, nth_properties);
}
if (values[ii].with_acknowledged) {
ICalTime *tt;
nth_acknowledged++;
tt = i_cal_time_new_current_with_zone (i_cal_timezone_get_utc_timezone ());
if ((nth_acknowledged & 1) != 0) {
e_cal_component_alarm_set_acknowledged (expected, tt);
g_object_unref (tt);
} else {
e_cal_component_alarm_take_acknowledged (expected, tt);
}
if (nth_acknowledged == 3)
e_cal_component_alarm_set_acknowledged (expected, NULL);
}
received = e_cal_component_alarm_copy (expected);
verify_struct_alarm_equal (expected, received);
e_cal_component_alarm_free (received);
icalcomp = e_cal_component_alarm_get_as_component (expected);
g_assert_nonnull (icalcomp);
received = e_cal_component_alarm_new_from_component (icalcomp);
verify_struct_alarm_equal (expected, received);
e_cal_component_alarm_free (received);
g_object_unref (icalcomp);
icalcomp = i_cal_component_new_valarm ();
g_assert_nonnull (icalcomp);
e_cal_component_alarm_fill_component (expected, icalcomp);
received = e_cal_component_alarm_new ();
e_cal_component_alarm_set_from_component (received, icalcomp);
g_object_unref (icalcomp);
verify_struct_alarm_equal (expected, received);
e_cal_component_alarm_free (received);
e_cal_component_alarm_free (expected);
}
g_assert_cmpint (nth_summary, >, 1);
g_assert_cmpint (nth_description, >, 1);
g_assert_cmpint (nth_repeat, >, 1);
g_assert_cmpint (nth_trigger, >, 1);
g_assert_cmpint (nth_attendees, >, 1);
g_assert_cmpint (nth_attachments, >, 1);
g_assert_cmpint (nth_properties, >, 1);
g_assert_cmpint (nth_acknowledged, >, 3);
}
static void
test_component_struct_alarms (void)
{
ECalComponent *comp;
ECalComponentAlarms *expected, *received;
ECalComponentAlarmInstance *instance;
GSList *instances = NULL;
comp = e_cal_component_new_vtype (E_CAL_COMPONENT_EVENT);
e_cal_component_set_uid (comp, "123");
expected = e_cal_component_alarms_new (comp);
g_assert_nonnull (e_cal_component_alarms_get_component (expected));
g_assert_cmpstr ("123", ==, e_cal_component_get_uid (e_cal_component_alarms_get_component (expected)));
received = e_cal_component_alarms_copy (expected);
verify_struct_alarms_equal (expected, received);
e_cal_component_alarms_free (received);
instance = e_cal_component_alarm_instance_new ("1", (time_t) 1, (time_t) 2, (time_t) 3);
e_cal_component_alarms_add_instance (expected, instance);
g_assert_cmpint (1, ==, g_slist_length (e_cal_component_alarms_get_instances (expected)));
verify_struct_alarm_instance_equal (instance, e_cal_component_alarms_get_instances (expected)->data);
e_cal_component_alarm_instance_free (instance);
g_object_unref (comp);
received = e_cal_component_alarms_copy (expected);
verify_struct_alarms_equal (expected, received);
e_cal_component_alarms_free (received);
instance = e_cal_component_alarm_instance_new ("2", (time_t) 2, (time_t) 3, (time_t) 4);
e_cal_component_alarm_instance_set_rid (instance, "r1");
e_cal_component_alarms_take_instance (expected, instance);
g_assert_cmpint (2, ==, g_slist_length (e_cal_component_alarms_get_instances (expected)));
received = e_cal_component_alarms_copy (expected);
verify_struct_alarms_equal (expected, received);
e_cal_component_alarms_free (received);
g_assert_true (!e_cal_component_alarms_remove_instance (expected, GINT_TO_POINTER (123)));
g_assert_true (e_cal_component_alarms_remove_instance (expected, instance));
received = e_cal_component_alarms_copy (expected);
verify_struct_alarms_equal (expected, received);
e_cal_component_alarms_free (received);
e_cal_component_alarms_set_instances (expected, NULL);
g_assert_cmpint (0, ==, g_slist_length (e_cal_component_alarms_get_instances (expected)));
received = e_cal_component_alarms_copy (expected);
verify_struct_alarms_equal (expected, received);
e_cal_component_alarms_free (received);
instances = NULL;
instances = g_slist_prepend (instances, e_cal_component_alarm_instance_new ("3", (time_t) 3, (time_t) 4, (time_t) 5));
instances = g_slist_prepend (instances, e_cal_component_alarm_instance_new ("4", (time_t) 4, (time_t) 5, (time_t) 6));
instances = g_slist_prepend (instances, e_cal_component_alarm_instance_new ("5", (time_t) 5, (time_t) 6, (time_t) 7));
e_cal_component_alarms_set_instances (expected, instances);
g_assert_cmpint (3, ==, g_slist_length (e_cal_component_alarms_get_instances (expected)));
g_slist_free_full (instances, e_cal_component_alarm_instance_free);
received = e_cal_component_alarms_copy (expected);
verify_struct_alarms_equal (expected, received);
e_cal_component_alarms_free (received);
instances = NULL;
instances = g_slist_prepend (instances, e_cal_component_alarm_instance_new ("6", (time_t) 6, (time_t) 7, (time_t) 8));
instances = g_slist_prepend (instances, e_cal_component_alarm_instance_new ("7", (time_t) 7, (time_t) 8, (time_t) 9));
e_cal_component_alarms_take_instances (expected, instances);
g_assert_cmpint (2, ==, g_slist_length (e_cal_component_alarms_get_instances (expected)));
received = e_cal_component_alarms_copy (expected);
verify_struct_alarms_equal (expected, received);
e_cal_component_alarms_free (received);
e_cal_component_alarms_free (expected);
}
static void
test_component_struct_alarm_instance (void)
{
struct _values {
const gchar *uid;
const gchar *rid;
gboolean with_component;
gint instance_time;
gint occur_start;
gint occur_end;
} values[] = {
{ "1", NULL, TRUE, 1, 2, 3 },
{ "2", "r1", FALSE, 2, 3, 4 },
{ "3", "r2", TRUE, 3, 4, 6 },
{ "4", NULL, FALSE, 4, 5, 6 },
{ "5", "r3", FALSE, 5, 6, 7 }
};
ECalComponent *comp;
gint ii;
comp = e_cal_component_new ();
for (ii = 0; ii < G_N_ELEMENTS (values); ii++) {
ECalComponentAlarmInstance *expected, *received;
if ((ii & 1) != 0) {
expected = e_cal_component_alarm_instance_new (values[ii].uid,
(time_t) values[ii].instance_time,
(time_t) values[ii].occur_start,
(time_t) values[ii].occur_end);
} else {
expected = e_cal_component_alarm_instance_new ("X", (time_t) 100, (time_t) 200, (time_t) 300);
e_cal_component_alarm_instance_set_uid (expected, values[ii].uid);
e_cal_component_alarm_instance_set_time (expected, (time_t) values[ii].instance_time);
e_cal_component_alarm_instance_set_occur_start (expected, (time_t) values[ii].occur_start);
e_cal_component_alarm_instance_set_occur_end (expected, (time_t) values[ii].occur_end);
}
e_cal_component_alarm_instance_set_rid (expected, values[ii].rid);
if (values[ii].with_component)
e_cal_component_alarm_instance_set_component (expected, comp);
else if (ii < 3)
e_cal_component_alarm_instance_set_component (expected, NULL);
g_assert_nonnull (expected);
g_assert_cmpstr (e_cal_component_alarm_instance_get_uid (expected), ==, values[ii].uid);
g_assert_cmpstr (e_cal_component_alarm_instance_get_rid (expected), ==, values[ii].rid);
g_assert_cmpint (e_cal_component_alarm_instance_get_time (expected), ==, (time_t) values[ii].instance_time);
g_assert_cmpint (e_cal_component_alarm_instance_get_occur_start (expected), ==, (time_t) values[ii].occur_start);
g_assert_cmpint (e_cal_component_alarm_instance_get_occur_end (expected), ==, (time_t) values[ii].occur_end);
if (values[ii].with_component)
g_assert_true (e_cal_component_alarm_instance_get_component (expected) == comp);
else
g_assert_null (e_cal_component_alarm_instance_get_component (expected));
received = e_cal_component_alarm_instance_copy (expected);
verify_struct_alarm_instance_equal (expected, received);
e_cal_component_alarm_instance_free (received);
if (values[ii].with_component && ii < 3) {
e_cal_component_alarm_instance_set_component (expected, NULL);
g_assert_null (e_cal_component_alarm_instance_get_component (expected));
received = e_cal_component_alarm_instance_copy (expected);
verify_struct_alarm_instance_equal (expected, received);
e_cal_component_alarm_instance_free (received);
}
e_cal_component_alarm_instance_free (expected);
}
g_assert_cmpint (ii, >, 1);
g_clear_object (&comp);
}
static void
test_component_add_params_to_bag (ECalComponentParameterBag *bag,
gint n_params)
{
gint ii;
g_assert_nonnull (bag);
for (ii = 0; ii < n_params; ii++) {
ICalParameter *param;
if (ii == 0) {
param = i_cal_parameter_new_local (I_CAL_LOCAL_TRUE);
} else if (ii == 1) {
param = i_cal_parameter_new_localize ("en_US");
} else {
gchar *x_name;
x_name = g_strdup_printf ("X-CUSTOM-PARAM-%d", ii);
param = i_cal_parameter_new_x (x_name + 2);
i_cal_parameter_set_xname (param, x_name);
g_free (x_name);
}
g_assert_nonnull (param);
e_cal_component_parameter_bag_take (bag, param);
}
g_assert_cmpint (e_cal_component_parameter_bag_get_count (bag), ==, n_params);
}
static void
test_component_struct_alarm_repeat (void)
{
struct _values {
gint repetitions;
gint interval;
} values[] = {
{ 10, 20 },
{ 30, 40 },
{ 50, 60 },
{ 70, 80 },
{ 90, 55 }
};
gint ii;
for (ii = 0; ii < G_N_ELEMENTS (values); ii++) {
ECalComponentAlarmRepeat *expected, *received;
ICalDuration *dur;
if ((ii % 4) == 0) {
dur = i_cal_duration_new_from_int (values[ii].interval);
expected = e_cal_component_alarm_repeat_new (values[ii].repetitions, dur);
g_object_unref (dur);
} else if ((ii % 4) == 1) {
expected = e_cal_component_alarm_repeat_new_seconds (values[ii].repetitions, values[ii].interval);
} else if ((ii % 4) == 2) {
expected = e_cal_component_alarm_repeat_new_seconds (1000, 2000);
e_cal_component_alarm_repeat_set_repetitions (expected, values[ii].repetitions);
e_cal_component_alarm_repeat_set_interval_seconds (expected, values[ii].interval);
} else {
dur = i_cal_duration_new_from_int (values[ii].interval);
expected = e_cal_component_alarm_repeat_new_seconds (1000, 2000);
e_cal_component_alarm_repeat_set_repetitions (expected, values[ii].repetitions);
e_cal_component_alarm_repeat_set_interval (expected, dur);
g_object_unref (dur);
}
g_assert_nonnull (expected);
dur = i_cal_duration_new_from_int (values[ii].interval);
g_assert_nonnull (dur);
g_assert_cmpint (e_cal_component_alarm_repeat_get_repetitions (expected), ==, values[ii].repetitions);
g_assert_cmpint (e_cal_component_alarm_repeat_get_interval_seconds (expected), ==, values[ii].interval);
verify_ical_durationtype_equal (dur, e_cal_component_alarm_repeat_get_interval (expected));
g_object_unref (dur);
received = e_cal_component_alarm_repeat_copy (expected);
verify_struct_alarm_repeat_equal (expected, received);
e_cal_component_alarm_repeat_free (received);
e_cal_component_alarm_repeat_free (expected);
}
g_assert_cmpint (ii, >, 4);
}
static void
test_component_struct_alarm_trigger (void)
{
struct _values {
ECalComponentAlarmTriggerKind kind;
gint duration;
const gchar *abs_time;
} values[] = {
{ E_CAL_COMPONENT_ALARM_TRIGGER_RELATIVE_START, -100, NULL },
{ E_CAL_COMPONENT_ALARM_TRIGGER_ABSOLUTE, 0, "21090807T001122Z" },
{ E_CAL_COMPONENT_ALARM_TRIGGER_RELATIVE_END, 200, NULL },
{ E_CAL_COMPONENT_ALARM_TRIGGER_ABSOLUTE, 0, "21090807T213243Z" }
};
gint ii, set_kind;
for (set_kind = 0; set_kind < 3; set_kind++) {
for (ii = 0; ii < G_N_ELEMENTS (values); ii++) {
ECalComponentAlarmTrigger *expected = NULL, *received;
ICalDuration *dur;
ICalTime *tt;
ICalProperty *prop;
if (set_kind == 0) {
/* nothing, create it as it should be */
} else if (set_kind == 1) {
dur = i_cal_duration_new_from_int (33);
expected = e_cal_component_alarm_trigger_new_relative (E_CAL_COMPONENT_ALARM_TRIGGER_RELATIVE_END, dur);
g_object_unref (dur);
g_assert_nonnull (expected);
} else if (set_kind == 2) {
tt = i_cal_time_new_today ();
expected = e_cal_component_alarm_trigger_new_absolute (tt);
g_object_unref (tt);
g_assert_nonnull (expected);
} else {
g_assert_not_reached ();
}
if (expected) {
if (values[ii].kind == e_cal_component_alarm_trigger_get_kind (expected)) {
if (values[ii].kind == E_CAL_COMPONENT_ALARM_TRIGGER_ABSOLUTE) {
tt = i_cal_time_new_from_string (values[ii].abs_time);
e_cal_component_alarm_trigger_set_absolute_time (expected, tt);
g_object_unref (tt);
} else {
dur = i_cal_duration_new_from_int (values[ii].duration);
e_cal_component_alarm_trigger_set_kind (expected, values[ii].kind);
e_cal_component_alarm_trigger_set_duration (expected, dur);
g_object_unref (dur);
}
} else if (values[ii].kind == E_CAL_COMPONENT_ALARM_TRIGGER_ABSOLUTE) {
tt = i_cal_time_new_from_string (values[ii].abs_time);
e_cal_component_alarm_trigger_set_absolute (expected, tt);
g_object_unref (tt);
} else {
dur = i_cal_duration_new_from_int (values[ii].duration);
e_cal_component_alarm_trigger_set_relative (expected, values[ii].kind, dur);
g_object_unref (dur);
}
} else {
if (values[ii].kind == E_CAL_COMPONENT_ALARM_TRIGGER_ABSOLUTE) {
tt = i_cal_time_new_from_string (values[ii].abs_time);
expected = e_cal_component_alarm_trigger_new_absolute (tt);
g_assert_nonnull (expected);
g_assert_nonnull (e_cal_component_alarm_trigger_get_absolute_time (expected));
verify_ical_timetype_equal (tt, e_cal_component_alarm_trigger_get_absolute_time (expected));
g_object_unref (tt);
} else {
dur = i_cal_duration_new_from_int (values[ii].duration);
expected = e_cal_component_alarm_trigger_new_relative (values[ii].kind, dur);
g_assert_nonnull (expected);
g_object_unref (dur);
}
}
g_assert_nonnull (expected);
if (set_kind == 1)
test_component_add_params_to_bag (e_cal_component_alarm_trigger_get_parameter_bag (expected), ii + 1);
g_assert_cmpint (values[ii].kind, ==, e_cal_component_alarm_trigger_get_kind (expected));
if (values[ii].kind == E_CAL_COMPONENT_ALARM_TRIGGER_ABSOLUTE) {
tt = i_cal_time_new_from_string (values[ii].abs_time);
g_assert_nonnull (tt);
verify_ical_timetype_equal (tt, e_cal_component_alarm_trigger_get_absolute_time (expected));
g_object_unref (tt);
} else {
dur = i_cal_duration_new_from_int (values[ii].duration);
g_assert_nonnull (dur);
verify_ical_durationtype_equal (dur, e_cal_component_alarm_trigger_get_duration (expected));
g_object_unref (dur);
}
received = e_cal_component_alarm_trigger_copy (expected);
verify_struct_alarm_trigger_equal (expected, received);
e_cal_component_alarm_trigger_free (received);
prop = e_cal_component_alarm_trigger_get_as_property (expected);
g_assert_nonnull (prop);
received = e_cal_component_alarm_trigger_new_from_property (prop);
verify_struct_alarm_trigger_equal (expected, received);
e_cal_component_alarm_trigger_free (received);
dur = i_cal_duration_new_from_int (33);
received = e_cal_component_alarm_trigger_new_relative (E_CAL_COMPONENT_ALARM_TRIGGER_RELATIVE_END, dur);
g_object_unref (dur);
e_cal_component_alarm_trigger_set_from_property (received, prop);
verify_struct_alarm_trigger_equal (expected, received);
e_cal_component_alarm_trigger_free (received);
tt = i_cal_time_new_today ();
received = e_cal_component_alarm_trigger_new_absolute (tt);
g_object_unref (tt);
e_cal_component_alarm_trigger_set_from_property (received, prop);
verify_struct_alarm_trigger_equal (expected, received);
e_cal_component_alarm_trigger_free (received);
g_object_unref (prop);
prop = i_cal_property_new (I_CAL_TRIGGER_PROPERTY);
e_cal_component_alarm_trigger_fill_property (expected, prop);
received = e_cal_component_alarm_trigger_new_from_property (prop);
verify_struct_alarm_trigger_equal (expected, received);
e_cal_component_alarm_trigger_free (received);
g_object_unref (prop);
e_cal_component_alarm_trigger_free (expected);
}
}
}
static void
test_component_struct_attendee (void)
{
struct _values {
const gchar *value;
const gchar *member;
ICalParameterCutype cutype;
ICalParameterRole role;
ICalParameterPartstat partstat;
gboolean rsvp;
const gchar *delegatedfrom;
const gchar *delegatedto;
const gchar *sentby;
const gchar *cn;
const gchar *language;
} values[] = {
{ "mailto:att1",
"member",
I_CAL_CUTYPE_INDIVIDUAL,
I_CAL_ROLE_CHAIR,
I_CAL_PARTSTAT_NEEDSACTION,
FALSE,
"mailto:delgfrom",
"mailto:delgto",
"mailto:sentby",
"First attendee",
"en_US" },
{ "mailto:room",
NULL,
I_CAL_CUTYPE_ROOM,
I_CAL_ROLE_REQPARTICIPANT,
I_CAL_PARTSTAT_ACCEPTED,
FALSE,
NULL,
NULL,
NULL,
"Meeting room",
NULL },
{ "mailto:att2",
NULL,
I_CAL_CUTYPE_INDIVIDUAL,
I_CAL_ROLE_REQPARTICIPANT,
I_CAL_PARTSTAT_TENTATIVE,
TRUE,
NULL,
NULL,
NULL,
NULL,
"en_US" }
};
gint ii, set_kind;
for (set_kind = 0; set_kind < 4; set_kind++) {
for (ii = 0; ii < G_N_ELEMENTS (values); ii++) {
ECalComponentAttendee *expected = NULL, *received;
ICalProperty *prop;
if (set_kind == 1) {
expected = e_cal_component_attendee_new ();
} else if (set_kind == 2) {
expected = e_cal_component_attendee_new_full ("value", "member",
I_CAL_CUTYPE_INDIVIDUAL,
I_CAL_ROLE_CHAIR,
I_CAL_PARTSTAT_DECLINED,
TRUE,
"delegatedfrom", "delegatedto",
"sentby", "cn", "language");
}
if (expected) {
e_cal_component_attendee_set_value (expected, values[ii].value);
e_cal_component_attendee_set_member (expected, values[ii].member);
e_cal_component_attendee_set_cutype (expected, values[ii].cutype);
e_cal_component_attendee_set_role (expected, values[ii].role);
e_cal_component_attendee_set_partstat (expected, values[ii].partstat);
e_cal_component_attendee_set_rsvp (expected, values[ii].rsvp);
e_cal_component_attendee_set_delegatedfrom (expected, values[ii].delegatedfrom);
e_cal_component_attendee_set_delegatedto (expected, values[ii].delegatedto);
e_cal_component_attendee_set_sentby (expected, values[ii].sentby);
e_cal_component_attendee_set_cn (expected, values[ii].cn);
e_cal_component_attendee_set_language (expected, values[ii].language);
} else {
expected = e_cal_component_attendee_new_full (values[ii].value,
values[ii].member,
values[ii].cutype,
values[ii].role,
values[ii].partstat,
values[ii].rsvp,
values[ii].delegatedfrom,
values[ii].delegatedto,
values[ii].sentby,
values[ii].cn,
values[ii].language);
}
g_assert_nonnull (expected);
if (set_kind == 1)
test_component_add_params_to_bag (e_cal_component_attendee_get_parameter_bag (expected), ii + 1);
g_assert_cmpstr (e_cal_component_attendee_get_value (expected), ==, values[ii].value);
g_assert_cmpstr (e_cal_component_attendee_get_member (expected), ==, values[ii].member);
g_assert_cmpint (e_cal_component_attendee_get_cutype (expected), ==, values[ii].cutype);
g_assert_cmpint (e_cal_component_attendee_get_role (expected), ==, values[ii].role);
g_assert_cmpint (e_cal_component_attendee_get_partstat (expected), ==, values[ii].partstat);
g_assert_cmpint (e_cal_component_attendee_get_rsvp (expected) ? 1 : 0, ==, values[ii].rsvp ? 1 : 0);
g_assert_cmpstr (e_cal_component_attendee_get_delegatedfrom (expected), ==, values[ii].delegatedfrom);
g_assert_cmpstr (e_cal_component_attendee_get_delegatedto (expected), ==, values[ii].delegatedto);
g_assert_cmpstr (e_cal_component_attendee_get_sentby (expected), ==, values[ii].sentby);
g_assert_cmpstr (e_cal_component_attendee_get_cn (expected), ==, values[ii].cn);
g_assert_cmpstr (e_cal_component_attendee_get_language (expected), ==, values[ii].language);
received = e_cal_component_attendee_copy (expected);
verify_struct_attendee_equal (expected, received);
e_cal_component_attendee_free (received);
prop = e_cal_component_attendee_get_as_property (expected);
g_assert_nonnull (prop);
received = e_cal_component_attendee_new_from_property (prop);
verify_struct_attendee_equal (expected, received);
e_cal_component_attendee_free (received);
received = e_cal_component_attendee_new_full ("value", "member",
I_CAL_CUTYPE_INDIVIDUAL,
I_CAL_ROLE_CHAIR,
I_CAL_PARTSTAT_DECLINED,
TRUE,
"delegatedfrom", "delegatedto",
"sentby", "cn", "language");
e_cal_component_attendee_set_from_property (received, prop);
verify_struct_attendee_equal (expected, received);
e_cal_component_attendee_free (received);
g_object_unref (prop);
prop = i_cal_property_new (I_CAL_ATTENDEE_PROPERTY);
e_cal_component_attendee_fill_property (expected, prop);
received = e_cal_component_attendee_new_from_property (prop);
verify_struct_attendee_equal (expected, received);
e_cal_component_attendee_free (received);
g_object_unref (prop);
e_cal_component_attendee_free (expected);
}
}
}
static void
test_component_struct_datetime (void)
{
struct _values {
const gchar *time;
const gchar *tzid;
} values[] = {
{ "20181215T111213Z", NULL },
{ "20190131T121314", "Europe/Berlin" },
{ "20200708T010305Z", NULL },
{ "20211215T101112", "America/New_York" },
{ "20221110T090807", "UTC" },
{ "20231009", NULL }
};
gint ii, set_kind;
for (set_kind = 0; set_kind < 4; set_kind++) {
for (ii = 0; ii < G_N_ELEMENTS (values); ii++) {
ECalComponentDateTime *expected = NULL, *received;
ICalTime *tt;
if (set_kind == 2) {
tt = i_cal_time_new_from_string ("19981019");
expected = e_cal_component_datetime_new (tt, NULL);
g_object_unref (tt);
} else if (set_kind == 3) {
tt = i_cal_time_new_from_string ("19981019");
expected = e_cal_component_datetime_new_take (tt, g_strdup ("Unknown"));
}
tt = i_cal_time_new_from_string (values[ii].time);
g_assert_nonnull (tt);
if (expected) {
if (((set_kind + ii) % 3) == 0) {
e_cal_component_datetime_set (expected, tt, values[ii].tzid);
} else if (((set_kind + ii) % 3) == 1) {
ICalTime *ttcopy;
ttcopy = i_cal_time_clone (tt);
g_assert_nonnull (ttcopy);
e_cal_component_datetime_take_value (expected, ttcopy);
e_cal_component_datetime_take_tzid (expected, g_strdup (values[ii].tzid));
} else {
e_cal_component_datetime_set_value (expected, tt);
e_cal_component_datetime_set_tzid (expected, values[ii].tzid);
}
} else {
if (set_kind == 0) {
expected = e_cal_component_datetime_new (tt, values[ii].tzid);
} else {
ICalTime *ttcopy;
ttcopy = i_cal_time_clone (tt);
g_assert_nonnull (ttcopy);
expected = e_cal_component_datetime_new_take (ttcopy, g_strdup (values[ii].tzid));
}
}
g_assert_nonnull (expected);
verify_ical_timetype_equal (e_cal_component_datetime_get_value (expected), tt);
g_assert_cmpstr (e_cal_component_datetime_get_tzid (expected), ==, values[ii].tzid);
g_object_unref (tt);
received = e_cal_component_datetime_copy (expected);
verify_struct_datetime_equal (expected, received);
e_cal_component_datetime_free (received);
e_cal_component_datetime_free (expected);
}
}
}
static void
test_component_struct_id (void)
{
struct _values {
const gchar *uid;
const gchar *rid;
} values[] = {
{ "123", "20181215T111213Z" },
{ "222", NULL },
{ "333", NULL },
{ "44", "20211215T101112" }
};
gint ii, set_kind;
for (set_kind = 0; set_kind < 4; set_kind++) {
for (ii = 0; ii < G_N_ELEMENTS (values); ii++) {
ECalComponentId *expected = NULL, *received;
if (set_kind == 2) {
expected = e_cal_component_id_new ("4567", "123");
} else if (set_kind == 3) {
expected = e_cal_component_id_new_take (g_strdup ("5678"), g_strdup ("Unknown"));
}
if (expected) {
e_cal_component_id_set_uid (expected, values[ii].uid);
e_cal_component_id_set_rid (expected, values[ii].rid);
} else {
if (set_kind == 0) {
expected = e_cal_component_id_new (values[ii].uid, values[ii].rid);
} else {
expected = e_cal_component_id_new_take (g_strdup (values[ii].uid), g_strdup (values[ii].rid));
}
}
g_assert_nonnull (expected);
g_assert_cmpstr (e_cal_component_id_get_uid (expected), ==, values[ii].uid);
g_assert_cmpstr (e_cal_component_id_get_rid (expected), ==, values[ii].rid);
received = e_cal_component_id_copy (expected);
verify_struct_id_equal (expected, received);
g_assert_cmpint (e_cal_component_id_hash (expected), ==, e_cal_component_id_hash (received));
g_assert_true (e_cal_component_id_equal (expected, received));
e_cal_component_id_free (received);
e_cal_component_id_free (expected);
}
}
}
static void
test_component_struct_organizer (void)
{
struct _values {
const gchar *value;
const gchar *sentby;
const gchar *cn;
const gchar *language;
} values[] = {
{ "mailto:org1",
"mailto:sentby",
"First organizer",
"en_US" },
{ "mailto:room",
NULL,
"Meeting room",
NULL },
{ "mailto:org2",
NULL,
NULL,
"en_US" }
};
gint ii, set_kind;
for (set_kind = 0; set_kind < 4; set_kind++) {
for (ii = 0; ii < G_N_ELEMENTS (values); ii++) {
ECalComponentOrganizer *expected = NULL, *received;
ICalProperty *prop;
if (set_kind == 1) {
expected = e_cal_component_organizer_new ();
} else if (set_kind == 2) {
expected = e_cal_component_organizer_new_full ("value", "sentby", "cn", "language");
}
if (expected) {
e_cal_component_organizer_set_value (expected, values[ii].value);
e_cal_component_organizer_set_sentby (expected, values[ii].sentby);
e_cal_component_organizer_set_cn (expected, values[ii].cn);
e_cal_component_organizer_set_language (expected, values[ii].language);
} else {
expected = e_cal_component_organizer_new_full (values[ii].value,
values[ii].sentby,
values[ii].cn,
values[ii].language);
}
g_assert_nonnull (expected);
if (set_kind == 1)
test_component_add_params_to_bag (e_cal_component_organizer_get_parameter_bag (expected), ii + 1);
g_assert_cmpstr (e_cal_component_organizer_get_value (expected), ==, values[ii].value);
g_assert_cmpstr (e_cal_component_organizer_get_sentby (expected), ==, values[ii].sentby);
g_assert_cmpstr (e_cal_component_organizer_get_cn (expected), ==, values[ii].cn);
g_assert_cmpstr (e_cal_component_organizer_get_language (expected), ==, values[ii].language);
received = e_cal_component_organizer_copy (expected);
verify_struct_organizer_equal (expected, received);
e_cal_component_organizer_free (received);
prop = e_cal_component_organizer_get_as_property (expected);
g_assert_nonnull (prop);
received = e_cal_component_organizer_new_from_property (prop);
verify_struct_organizer_equal (expected, received);
e_cal_component_organizer_free (received);
received = e_cal_component_organizer_new_full ("value", "sentby", "cn", "language");
e_cal_component_organizer_set_from_property (received, prop);
verify_struct_organizer_equal (expected, received);
e_cal_component_organizer_free (received);
g_object_unref (prop);
prop = i_cal_property_new (I_CAL_ORGANIZER_PROPERTY);
e_cal_component_organizer_fill_property (expected, prop);
received = e_cal_component_organizer_new_from_property (prop);
verify_struct_organizer_equal (expected, received);
e_cal_component_organizer_free (received);
g_object_unref (prop);
e_cal_component_organizer_free (expected);
}
}
}
#define X_PARAM_NAME "X-PARAM"
#define X_PARAM_VALUE "xVaLuE"
static gboolean
test_parameter_bag_filter_cb (ICalParameter *param,
gpointer user_data)
{
ICalParameterKind *expected = user_data, kind;
gint ii;
g_return_val_if_fail (expected != NULL, FALSE);
kind = i_cal_parameter_isa (param);
for (ii = 0; expected[ii] != I_CAL_ANY_PARAMETER; ii++) {
if (kind == expected[ii])
return TRUE;
}
return FALSE;
}
static void
test_check_parameter_bag (const ECalComponentParameterBag *bag,
const ICalParameterKind *expected)
{
ICalParameter *param;
gint ii;
g_assert_nonnull (bag);
g_assert_nonnull (expected);
for (ii = 0; expected[ii] != I_CAL_ANY_PARAMETER; ii++) {
param = e_cal_component_parameter_bag_get (bag, ii);
g_assert_nonnull (param);
g_assert_cmpint (i_cal_parameter_isa (param), ==, expected[ii]);
if (i_cal_parameter_isa (param) == I_CAL_X_PARAMETER) {
g_assert_cmpstr (i_cal_parameter_get_xname (param), ==, X_PARAM_NAME);
g_assert_cmpstr (i_cal_parameter_get_xvalue (param), ==, X_PARAM_VALUE);
}
}
/* Out of bounds */
param = e_cal_component_parameter_bag_get (bag, ii);
g_assert_null (param);
}
static void
test_component_struct_parameter_bag (void)
{
const gchar *prop_str =
"ATTENDEE;CHARSET=utf-8;CN=User;CUTYPE=INDIVIDUAL;" X_PARAM_NAME "=" X_PARAM_VALUE ";LANGUAGE=en-US:mailto:user@no.where";
ICalParameterKind expected_unfiltered[] = {
I_CAL_CHARSET_PARAMETER,
I_CAL_CN_PARAMETER,
I_CAL_CUTYPE_PARAMETER,
I_CAL_X_PARAMETER,
I_CAL_LANGUAGE_PARAMETER,
I_CAL_ANY_PARAMETER /* sentinel */
},
expected_filtered[] = {
I_CAL_CN_PARAMETER,
I_CAL_CUTYPE_PARAMETER,
I_CAL_X_PARAMETER,
I_CAL_ANY_PARAMETER /* sentinel */
};
ICalProperty *prop;
ICalParameter *param;
ECalComponentParameterBag *bag, *bag2;
gint ii;
prop = i_cal_property_new_from_string (prop_str);
g_assert_nonnull (prop);
g_assert_cmpint (i_cal_property_count_parameters (prop), ==, 5);
bag = e_cal_component_parameter_bag_new ();
g_assert_nonnull (bag);
e_cal_component_parameter_bag_set_from_property (bag, prop, NULL, NULL);
g_assert_cmpint (e_cal_component_parameter_bag_get_count (bag), ==, G_N_ELEMENTS (expected_unfiltered) - 1);
test_check_parameter_bag (bag, expected_unfiltered);
bag2 = e_cal_component_parameter_bag_copy (bag);
g_assert_nonnull (bag2);
g_assert_cmpint (e_cal_component_parameter_bag_get_count (bag2), ==, G_N_ELEMENTS (expected_unfiltered) - 1);
test_check_parameter_bag (bag2, expected_unfiltered);
e_cal_component_parameter_bag_free (bag2);
e_cal_component_parameter_bag_free (bag);
bag = e_cal_component_parameter_bag_new_from_property (prop, NULL, NULL);
g_assert_nonnull (bag);
g_assert_cmpint (e_cal_component_parameter_bag_get_count (bag), ==, G_N_ELEMENTS (expected_unfiltered) - 1);
test_check_parameter_bag (bag, expected_unfiltered);
e_cal_component_parameter_bag_free (bag);
bag = e_cal_component_parameter_bag_new ();
g_assert_nonnull (bag);
e_cal_component_parameter_bag_set_from_property (bag, prop, test_parameter_bag_filter_cb, expected_filtered);
g_assert_cmpint (e_cal_component_parameter_bag_get_count (bag), ==, G_N_ELEMENTS (expected_filtered) - 1);
test_check_parameter_bag (bag, expected_filtered);
e_cal_component_parameter_bag_free (bag);
bag = e_cal_component_parameter_bag_new_from_property (prop, test_parameter_bag_filter_cb, expected_filtered);
g_assert_nonnull (bag);
g_assert_cmpint (e_cal_component_parameter_bag_get_count (bag), ==, G_N_ELEMENTS (expected_filtered) - 1);
test_check_parameter_bag (bag, expected_filtered);
g_object_unref (prop);
prop = i_cal_property_new (I_CAL_COMMENT_PROPERTY);
g_assert_nonnull (prop);
e_cal_component_parameter_bag_fill_property (bag, prop);
g_assert_cmpint (i_cal_property_count_parameters (prop), ==, e_cal_component_parameter_bag_get_count (bag));
g_object_unref (prop);
bag2 = e_cal_component_parameter_bag_copy (bag);
while (e_cal_component_parameter_bag_get_count (bag) > 1) {
e_cal_component_parameter_bag_remove (bag, 1);
}
e_cal_component_parameter_bag_assign (bag2, bag);
g_assert_cmpint (e_cal_component_parameter_bag_get_count (bag), ==, e_cal_component_parameter_bag_get_count (bag2));
e_cal_component_parameter_bag_free (bag2);
prop = i_cal_property_new (I_CAL_ATTENDEE_PROPERTY);
g_assert_nonnull (prop);
e_cal_component_parameter_bag_fill_property (bag, prop);
g_assert_cmpint (i_cal_property_count_parameters (prop), ==, 1);
g_object_unref (prop);
e_cal_component_parameter_bag_clear (bag);
prop = i_cal_property_new (I_CAL_ATTENDEE_PROPERTY);
g_assert_nonnull (prop);
e_cal_component_parameter_bag_fill_property (bag, prop);
g_assert_cmpint (i_cal_property_count_parameters (prop), ==, 0);
g_object_unref (prop);
param = i_cal_parameter_new_cn ("234");
e_cal_component_parameter_bag_add (bag, param);
g_object_unref (param);
param = i_cal_parameter_new_cutype (I_CAL_CUTYPE_ROOM);
e_cal_component_parameter_bag_take (bag, param);
g_assert_cmpint (e_cal_component_parameter_bag_get_count (bag), ==, 2);
for (ii = 0; ii < 2; ii++) {
ICalParameter *param2;
param2 = e_cal_component_parameter_bag_get (bag, ii);
if (ii == 0) {
g_assert_true (param != param2);
g_assert_cmpint (i_cal_parameter_isa (param2), ==, I_CAL_CN_PARAMETER);
g_assert_cmpstr (i_cal_parameter_get_cn (param2), ==, "234");
} else {
g_assert_true (param == param2);
g_assert_cmpint (i_cal_parameter_isa (param2), ==, I_CAL_CUTYPE_PARAMETER);
g_assert_cmpint (i_cal_parameter_get_cutype (param2), ==, I_CAL_CUTYPE_ROOM);
}
}
prop = i_cal_property_new (I_CAL_DESCRIPTION_PROPERTY);
g_assert_nonnull (prop);
e_cal_component_parameter_bag_fill_property (bag, prop);
g_assert_cmpint (i_cal_property_count_parameters (prop), ==, e_cal_component_parameter_bag_get_count (bag));
g_object_unref (prop);
e_cal_component_parameter_bag_clear (bag);
e_cal_component_parameter_bag_take (bag, i_cal_parameter_new_cutype (I_CAL_CUTYPE_ROOM));
e_cal_component_parameter_bag_take (bag, i_cal_parameter_new_cn ("111"));
e_cal_component_parameter_bag_take (bag, i_cal_parameter_new_cutype (I_CAL_CUTYPE_ROOM));
e_cal_component_parameter_bag_take (bag, i_cal_parameter_new_cutype (I_CAL_CUTYPE_RESOURCE));
g_assert_cmpint (e_cal_component_parameter_bag_get_count (bag), ==, 4);
g_assert_cmpint (e_cal_component_parameter_bag_get_first_by_kind (bag, I_CAL_CUTYPE_PARAMETER), ==, 0);
g_assert_cmpint (e_cal_component_parameter_bag_get_first_by_kind (bag, I_CAL_CN_PARAMETER), ==, 1);
g_assert_cmpint (e_cal_component_parameter_bag_remove_by_kind (bag, I_CAL_TZID_PARAMETER, FALSE), ==, 0);
g_assert_cmpint (e_cal_component_parameter_bag_get_count (bag), ==, 4);
g_assert_cmpint (e_cal_component_parameter_bag_remove_by_kind (bag, I_CAL_TZID_PARAMETER, TRUE), ==, 0);
g_assert_cmpint (e_cal_component_parameter_bag_get_count (bag), ==, 4);
g_assert_cmpint (e_cal_component_parameter_bag_remove_by_kind (bag, I_CAL_CUTYPE_PARAMETER, FALSE), ==, 1);
g_assert_cmpint (e_cal_component_parameter_bag_get_count (bag), ==, 3);
g_assert_cmpint (e_cal_component_parameter_bag_get_first_by_kind (bag, I_CAL_CN_PARAMETER), ==, 0);
g_assert_cmpint (e_cal_component_parameter_bag_get_first_by_kind (bag, I_CAL_CUTYPE_PARAMETER), ==, 1);
g_assert_cmpint (e_cal_component_parameter_bag_remove_by_kind (bag, I_CAL_CUTYPE_PARAMETER, TRUE), ==, 2);
g_assert_cmpint (e_cal_component_parameter_bag_get_count (bag), ==, 1);
g_assert_cmpint (e_cal_component_parameter_bag_get_first_by_kind (bag, I_CAL_CN_PARAMETER), ==, 0);
g_assert_cmpint (e_cal_component_parameter_bag_get_first_by_kind (bag, I_CAL_CUTYPE_PARAMETER), >=, e_cal_component_parameter_bag_get_count (bag));
e_cal_component_parameter_bag_free (bag);
}
#undef X_PARAM_NAME
#undef X_PARAM_VALUE
static void
test_component_struct_period (void)
{
struct _values {
const gchar *start;
const gchar *end;
gint duration;
} values[] = {
{ "20181215T111213Z", "20181215T121314Z", -1 },
{ "20190131T121314Z", NULL, 10 * 24 * 60 * 60 },
{ "20200708T010305Z", NULL, 2 * 60 * 60 },
{ "20211215T101112", "20211215T121314", -1 },
{ "20221110T090807", "20221110T100908", -1 },
{ "20231009", "20241110", -1 },
{ "20240908T070605", NULL, -1 },
{ "20250807", NULL, -1 }
};
gint ii, set_kind, flipflop1 = 0, flipflop2 = 0;
for (set_kind = 0; set_kind < 6; set_kind++) {
for (ii = 0; ii < G_N_ELEMENTS (values); ii++) {
ECalComponentPeriod *expected = NULL, *received;
ICalTime *start, *end = NULL;
ICalDuration *duration = NULL;
start = i_cal_time_new_from_string (values[ii].start);
g_assert_nonnull (start);
if (values[ii].duration == -1) {
if (values[ii].end) {
end = i_cal_time_new_from_string (values[ii].end);
g_assert_nonnull (end);
}
} else {
duration = i_cal_duration_new_from_int (values[ii].duration);
g_assert_nonnull (duration);
}
if ((set_kind % 3) == 1) {
ICalTime *ttstart, *ttend;
ttstart = i_cal_time_new_from_string ("19981019");
ttend = i_cal_time_new_from_string ("19981019");
g_assert_nonnull (ttstart);
expected = e_cal_component_period_new_datetime (ttstart, ttend);
g_clear_object (&ttstart);
g_clear_object (&ttend);
} else if ((set_kind % 3) == 2) {
ICalTime *ttstart;
ICalDuration *ttduration;
ttstart = i_cal_time_new_from_string ("19981019");
ttduration = i_cal_duration_new_from_int (123456);
g_assert_nonnull (ttstart);
g_assert_nonnull (ttduration);
expected = e_cal_component_period_new_duration (ttstart, ttduration);
g_clear_object (&ttstart);
g_clear_object (&ttduration);
}
if (expected) {
if (duration) {
if (e_cal_component_period_get_kind (expected) == E_CAL_COMPONENT_PERIOD_DURATION) {
flipflop1++;
if ((flipflop1 & 1) != 0) {
e_cal_component_period_set_duration_full (expected, start, duration);
} else {
e_cal_component_period_set_start (expected, start);
e_cal_component_period_set_duration (expected, duration);
}
} else {
e_cal_component_period_set_duration_full (expected, start, duration);
}
} else if (e_cal_component_period_get_kind (expected) == E_CAL_COMPONENT_PERIOD_DATETIME) {
flipflop2++;
if ((flipflop2 & 1) != 0) {
e_cal_component_period_set_datetime_full (expected, start, end);
} else {
e_cal_component_period_set_start (expected, start);
e_cal_component_period_set_end (expected, end);
}
} else {
e_cal_component_period_set_datetime_full (expected, start, end);
}
} else {
if (duration)
expected = e_cal_component_period_new_duration (start, duration);
else
expected = e_cal_component_period_new_datetime (start, end);
}
g_assert_nonnull (expected);
verify_ical_timetype_equal (start, e_cal_component_period_get_start (expected));
if (duration) {
g_assert_cmpint (e_cal_component_period_get_kind (expected), ==, E_CAL_COMPONENT_PERIOD_DURATION);
verify_ical_durationtype_equal (duration, e_cal_component_period_get_duration (expected));
} else {
g_assert_cmpint (e_cal_component_period_get_kind (expected), ==, E_CAL_COMPONENT_PERIOD_DATETIME);
verify_ical_timetype_equal (end, e_cal_component_period_get_end (expected));
}
g_clear_object (&start);
g_clear_object (&end);
g_clear_object (&duration);
received = e_cal_component_period_copy (expected);
verify_struct_period_equal (expected, received);
e_cal_component_period_free (received);
e_cal_component_period_free (expected);
}
}
g_assert_cmpint (flipflop1, >, 2);
g_assert_cmpint (flipflop2, >, 2);
}
#define X_PROP_NAME "X-PROP"
#define X_PROP_VALUE "xVaLuE"
static gboolean
test_property_bag_filter_cb (ICalProperty *prop,
gpointer user_data)
{
ICalPropertyKind *expected = user_data, kind;
gint ii;
g_return_val_if_fail (expected != NULL, FALSE);
kind = i_cal_property_isa (prop);
for (ii = 0; expected[ii] != I_CAL_ANY_PROPERTY; ii++) {
if (kind == expected[ii])
return TRUE;
}
return FALSE;
}
static void
test_check_property_bag (const ECalComponentPropertyBag *bag,
const ICalPropertyKind *expected)
{
ICalProperty *prop;
gint ii;
g_assert_nonnull (bag);
g_assert_nonnull (expected);
for (ii = 0; expected[ii] != I_CAL_ANY_PROPERTY; ii++) {
prop = e_cal_component_property_bag_get (bag, ii);
g_assert_nonnull (prop);
g_assert_cmpint (i_cal_property_isa (prop), ==, expected[ii]);
if (i_cal_property_isa (prop) == I_CAL_X_PROPERTY) {
g_assert_cmpstr (i_cal_property_get_x_name (prop), ==, X_PROP_NAME);
g_assert_cmpstr (i_cal_property_get_x (prop), ==, X_PROP_VALUE);
}
}
/* Out of bounds */
prop = e_cal_component_property_bag_get (bag, ii);
g_assert_null (prop);
}
static void
test_component_struct_property_bag (void)
{
const gchar *comp_str =
"BEGIN:VTODO\r\n"
"UID:1\r\n"
"STATUS:CANCELLED\r\n"
X_PROP_NAME ":" X_PROP_VALUE "\r\n"
"END:VTODO\r\n";
ICalPropertyKind expected_unfiltered[] = {
I_CAL_UID_PROPERTY,
I_CAL_STATUS_PROPERTY,
I_CAL_X_PROPERTY,
I_CAL_ANY_PROPERTY /* sentinel */
},
expected_filtered[] = {
I_CAL_STATUS_PROPERTY,
I_CAL_X_PROPERTY,
I_CAL_ANY_PROPERTY /* sentinel */
};
ICalComponent *icomp;
ICalProperty *prop;
ECalComponentPropertyBag *bag, *bag2;
gint ii;
icomp = i_cal_component_new_from_string (comp_str);
g_assert_nonnull (icomp);
g_assert_cmpint (i_cal_component_count_properties (icomp, I_CAL_ANY_PROPERTY), ==, 3);
bag = e_cal_component_property_bag_new ();
g_assert_nonnull (bag);
e_cal_component_property_bag_set_from_component (bag, icomp, NULL, NULL);
g_assert_cmpint (e_cal_component_property_bag_get_count (bag), ==, G_N_ELEMENTS (expected_unfiltered) - 1);
test_check_property_bag (bag, expected_unfiltered);
bag2 = e_cal_component_property_bag_copy (bag);
g_assert_nonnull (bag2);
g_assert_cmpint (e_cal_component_property_bag_get_count (bag2), ==, G_N_ELEMENTS (expected_unfiltered) - 1);
test_check_property_bag (bag2, expected_unfiltered);
e_cal_component_property_bag_free (bag2);
e_cal_component_property_bag_free (bag);
bag = e_cal_component_property_bag_new_from_component (icomp, NULL, NULL);
g_assert_nonnull (bag);
g_assert_cmpint (e_cal_component_property_bag_get_count (bag), ==, G_N_ELEMENTS (expected_unfiltered) - 1);
test_check_property_bag (bag, expected_unfiltered);
e_cal_component_property_bag_free (bag);
bag = e_cal_component_property_bag_new ();
g_assert_nonnull (bag);
e_cal_component_property_bag_set_from_component (bag, icomp, test_property_bag_filter_cb, expected_filtered);
g_assert_cmpint (e_cal_component_property_bag_get_count (bag), ==, G_N_ELEMENTS (expected_filtered) - 1);
test_check_property_bag (bag, expected_filtered);
e_cal_component_property_bag_free (bag);
bag = e_cal_component_property_bag_new_from_component (icomp, test_property_bag_filter_cb, expected_filtered);
g_assert_nonnull (bag);
g_assert_cmpint (e_cal_component_property_bag_get_count (bag), ==, G_N_ELEMENTS (expected_filtered) - 1);
test_check_property_bag (bag, expected_filtered);
g_object_unref (icomp);
icomp = i_cal_component_new_vevent ();
g_assert_nonnull (icomp);
e_cal_component_property_bag_fill_component (bag, icomp);
g_assert_cmpint (i_cal_component_count_properties (icomp, I_CAL_ANY_PROPERTY), ==, e_cal_component_property_bag_get_count (bag));
g_object_unref (icomp);
bag2 = e_cal_component_property_bag_copy (bag);
while (e_cal_component_property_bag_get_count (bag) > 1) {
e_cal_component_property_bag_remove (bag, 1);
}
e_cal_component_property_bag_assign (bag2, bag);
g_assert_cmpint (e_cal_component_property_bag_get_count (bag), ==, e_cal_component_property_bag_get_count (bag2));
e_cal_component_property_bag_free (bag2);
icomp = i_cal_component_new_vevent ();
g_assert_nonnull (icomp);
e_cal_component_property_bag_fill_component (bag, icomp);
g_assert_cmpint (i_cal_component_count_properties (icomp, I_CAL_ANY_PROPERTY), ==, 1);
g_object_unref (icomp);
e_cal_component_property_bag_clear (bag);
icomp = i_cal_component_new_vevent ();
g_assert_nonnull (icomp);
e_cal_component_property_bag_fill_component (bag, icomp);
g_assert_cmpint (i_cal_component_count_properties (icomp, I_CAL_ANY_PROPERTY), ==, 0);
g_object_unref (icomp);
prop = i_cal_property_new_uid ("234");
e_cal_component_property_bag_add (bag, prop);
g_object_unref (prop);
prop = i_cal_property_new_status (I_CAL_STATUS_CANCELLED);
e_cal_component_property_bag_take (bag, prop);
g_assert_cmpint (e_cal_component_property_bag_get_count (bag), ==, 2);
for (ii = 0; ii < 2; ii++) {
ICalProperty *prop2;
prop2 = e_cal_component_property_bag_get (bag, ii);
if (ii == 0) {
g_assert_true (prop != prop2);
g_assert_cmpint (i_cal_property_isa (prop2), ==, I_CAL_UID_PROPERTY);
g_assert_cmpstr (i_cal_property_get_uid (prop2), ==, "234");
} else {
g_assert_true (prop == prop2);
g_assert_cmpint (i_cal_property_isa (prop2), ==, I_CAL_STATUS_PROPERTY);
g_assert_cmpint (i_cal_property_get_status (prop2), ==, I_CAL_STATUS_CANCELLED);
}
}
icomp = i_cal_component_new_vevent ();
g_assert_nonnull (icomp);
e_cal_component_property_bag_fill_component (bag, icomp);
g_assert_cmpint (i_cal_component_count_properties (icomp, I_CAL_ANY_PROPERTY), ==, e_cal_component_property_bag_get_count (bag));
g_object_unref (icomp);
e_cal_component_property_bag_clear (bag);
e_cal_component_property_bag_take (bag, i_cal_property_new_status (I_CAL_STATUS_CANCELLED));
e_cal_component_property_bag_take (bag, i_cal_property_new_uid ("111"));
e_cal_component_property_bag_take (bag, i_cal_property_new_status (I_CAL_STATUS_COMPLETED));
e_cal_component_property_bag_take (bag, i_cal_property_new_status (I_CAL_STATUS_INPROCESS));
g_assert_cmpint (e_cal_component_property_bag_get_count (bag), ==, 4);
g_assert_cmpint (e_cal_component_property_bag_get_first_by_kind (bag, I_CAL_STATUS_PROPERTY), ==, 0);
g_assert_cmpint (e_cal_component_property_bag_get_first_by_kind (bag, I_CAL_UID_PROPERTY), ==, 1);
g_assert_cmpint (e_cal_component_property_bag_remove_by_kind (bag, I_CAL_TZID_PROPERTY, FALSE), ==, 0);
g_assert_cmpint (e_cal_component_property_bag_get_count (bag), ==, 4);
g_assert_cmpint (e_cal_component_property_bag_remove_by_kind (bag, I_CAL_TZID_PROPERTY, TRUE), ==, 0);
g_assert_cmpint (e_cal_component_property_bag_get_count (bag), ==, 4);
g_assert_cmpint (e_cal_component_property_bag_remove_by_kind (bag, I_CAL_STATUS_PROPERTY, FALSE), ==, 1);
g_assert_cmpint (e_cal_component_property_bag_get_count (bag), ==, 3);
g_assert_cmpint (e_cal_component_property_bag_get_first_by_kind (bag, I_CAL_UID_PROPERTY), ==, 0);
g_assert_cmpint (e_cal_component_property_bag_get_first_by_kind (bag, I_CAL_STATUS_PROPERTY), ==, 1);
g_assert_cmpint (e_cal_component_property_bag_remove_by_kind (bag, I_CAL_STATUS_PROPERTY, TRUE), ==, 2);
g_assert_cmpint (e_cal_component_property_bag_get_count (bag), ==, 1);
g_assert_cmpint (e_cal_component_property_bag_get_first_by_kind (bag, I_CAL_UID_PROPERTY), ==, 0);
g_assert_cmpint (e_cal_component_property_bag_get_first_by_kind (bag, I_CAL_STATUS_PROPERTY), >=, e_cal_component_property_bag_get_count (bag));
e_cal_component_property_bag_free (bag);
}
#undef X_PROP_NAME
#undef X_PROP_VALUE
static void
test_component_struct_range (void)
{
struct _values {
const gchar *time;
const gchar *tzid;
} values[] = {
{ "20181215T111213Z", NULL },
{ "20190131T121314", "Europe/Berlin" },
{ "20200708T010305Z", NULL },
{ "20211215T101112", "America/New_York" },
{ "20221110T090807", "UTC" },
{ "20231009", NULL }
};
ECalComponentRangeKind range_kinds[] = {
E_CAL_COMPONENT_RANGE_SINGLE,
E_CAL_COMPONENT_RANGE_THISPRIOR,
E_CAL_COMPONENT_RANGE_THISFUTURE
};
gint ii, jj, set_kind;
for (set_kind = 0; set_kind < 4; set_kind++) {
for (ii = 0; ii < G_N_ELEMENTS (values); ii++) {
for (jj = 0; jj < G_N_ELEMENTS (range_kinds); jj++) {
ECalComponentRange *expected = NULL, *received;
ECalComponentDateTime *dt;
if (set_kind == 2) {
dt = e_cal_component_datetime_new_take (i_cal_time_new_from_string ("19981019"), NULL);
expected = e_cal_component_range_new (E_CAL_COMPONENT_RANGE_SINGLE, dt);
e_cal_component_datetime_free (dt);
} else if (set_kind == 3) {
dt = e_cal_component_datetime_new_take (i_cal_time_new_from_string ("19981019"), NULL);
expected = e_cal_component_range_new_take (E_CAL_COMPONENT_RANGE_SINGLE, dt);
}
dt = e_cal_component_datetime_new_take (i_cal_time_new_from_string (values[ii].time), g_strdup (values[ii].tzid));
g_assert_nonnull (dt);
if (expected) {
e_cal_component_range_set_kind (expected, range_kinds[jj]);
if (((set_kind + ii) & 1) != 0) {
e_cal_component_range_set_datetime (expected, dt);
} else {
ECalComponentDateTime *dtcopy;
dtcopy = e_cal_component_datetime_copy (dt);
g_assert_nonnull (dtcopy);
e_cal_component_range_take_datetime (expected, dtcopy);
}
} else {
if (set_kind == 0) {
expected = e_cal_component_range_new (range_kinds[jj], dt);
} else {
ECalComponentDateTime *dtcopy;
dtcopy = e_cal_component_datetime_copy (dt);
g_assert_nonnull (dtcopy);
expected = e_cal_component_range_new_take (range_kinds[jj], dtcopy);
}
}
g_assert_nonnull (expected);
verify_struct_datetime_equal (e_cal_component_range_get_datetime (expected), dt);
g_assert_cmpint (e_cal_component_range_get_kind (expected), ==, range_kinds[jj]);
e_cal_component_datetime_free (dt);
received = e_cal_component_range_copy (expected);
verify_struct_range_equal (expected, received);
e_cal_component_range_free (received);
e_cal_component_range_free (expected);
}
}
}
}
static void
test_component_struct_text (void)
{
struct _values {
const gchar *value;
const gchar *altrep;
const gchar *language;
} values[] = {
{ "value1", NULL, NULL },
{ "value2", "altrep1", NULL },
{ "value3", "altrep2", NULL },
{ "value4", NULL, NULL },
{ "value1", NULL, "en_US" },
{ "value2", "altrep1", "en" },
{ "value3", "altrep2", "en_GB" },
{ "value4", NULL, "en" }
};
ICalProperty *prop;
ECalComponentText *expected, *received;
gint ii, set_kind;
for (set_kind = 0; set_kind < 3; set_kind++) {
for (ii = 0; ii < G_N_ELEMENTS (values); ii++) {
expected = NULL;
if (set_kind == 1) {
expected = e_cal_component_text_new ("non-empty", NULL);
} else if (set_kind == 2) {
expected = e_cal_component_text_new ("non-empty-text", "non-empty-altrep");
}
if (expected) {
e_cal_component_text_set_value (expected, values[ii].value);
e_cal_component_text_set_altrep (expected, values[ii].altrep);
e_cal_component_text_set_language (expected, values[ii].language);
} else {
expected = e_cal_component_text_new (values[ii].value, values[ii].altrep);
e_cal_component_text_set_language (expected, values[ii].language);
}
g_assert_nonnull (expected);
g_assert_cmpstr (e_cal_component_text_get_value (expected), ==, values[ii].value);
g_assert_cmpstr (e_cal_component_text_get_altrep (expected), ==, values[ii].altrep);
g_assert_cmpstr (e_cal_component_text_get_language (expected), ==, values[ii].language);
received = e_cal_component_text_copy (expected);
verify_struct_text_equal (expected, received);
e_cal_component_text_free (received);
e_cal_component_text_free (expected);
}
}
prop = i_cal_property_new_summary ("summary1");
expected = e_cal_component_text_new ("summary1", NULL);
received = e_cal_component_text_new_from_property (prop);
g_assert_nonnull (received);
g_assert_cmpstr (e_cal_component_text_get_value (received), ==, "summary1");
g_assert_null (e_cal_component_text_get_altrep (received));
g_assert_null (e_cal_component_text_get_language (received));
verify_struct_text_equal (expected, received);
e_cal_component_text_set_value (expected, "summary2");
e_cal_component_text_set_altrep (expected, "altrep");
e_cal_component_text_fill_property (expected, prop);
e_cal_component_text_set_from_property (received, prop);
g_assert_cmpstr (e_cal_component_text_get_value (received), ==, "summary2");
g_assert_cmpstr (e_cal_component_text_get_altrep (received), ==, "altrep");
g_assert_null (e_cal_component_text_get_language (received));
verify_struct_text_equal (expected, received);
e_cal_component_text_set_value (expected, "summary3");
e_cal_component_text_set_altrep (expected, NULL);
e_cal_component_text_set_language (expected, "en");
e_cal_component_text_fill_property (expected, prop);
e_cal_component_text_set_from_property (received, prop);
g_assert_cmpstr (e_cal_component_text_get_value (received), ==, "summary3");
g_assert_null (e_cal_component_text_get_altrep (received));
g_assert_cmpstr (e_cal_component_text_get_language (received), ==, "en");
verify_struct_text_equal (expected, received);
e_cal_component_text_set_value (expected, "summary4");
e_cal_component_text_set_altrep (expected, "altrep2");
e_cal_component_text_set_language (expected, "en_GB");
e_cal_component_text_fill_property (expected, prop);
e_cal_component_text_set_from_property (received, prop);
g_assert_cmpstr (e_cal_component_text_get_value (received), ==, "summary4");
g_assert_cmpstr (e_cal_component_text_get_altrep (received), ==, "altrep2");
g_assert_cmpstr (e_cal_component_text_get_language (received), ==, "en_GB");
verify_struct_text_equal (expected, received);
e_cal_component_text_set_value (expected, "summary5");
e_cal_component_text_set_altrep (expected, NULL);
e_cal_component_text_set_language (expected, NULL);
e_cal_component_text_fill_property (expected, prop);
e_cal_component_text_set_from_property (received, prop);
g_assert_cmpstr (e_cal_component_text_get_value (received), ==, "summary5");
g_assert_null (e_cal_component_text_get_altrep (received));
g_assert_null (e_cal_component_text_get_language (received));
verify_struct_text_equal (expected, received);
e_cal_component_text_free (received);
e_cal_component_text_free (expected);
g_clear_object (&prop);
}
static void
verify_changes (ECalComponent *comp,
void (* verify_func) (ECalComponent *comp,
gpointer user_data),
gpointer user_data)
{
ECalComponent *clone;
ICalComponent *icalcomp;
gchar *icalstr;
e_cal_component_commit_sequence (comp);
clone = e_cal_component_clone (comp);
g_assert_nonnull (clone);
verify_func (clone, user_data);
g_object_unref (clone);
icalstr = e_cal_component_get_as_string (comp);
g_assert_nonnull (icalstr);
clone = e_cal_component_new_from_string (icalstr);
g_free (icalstr);
g_assert_nonnull (clone);
verify_func (clone, user_data);
g_object_unref (clone);
icalcomp = e_cal_component_get_icalcomponent (comp);
g_assert_nonnull (icalcomp);
clone = e_cal_component_new_from_icalcomponent (i_cal_component_clone (icalcomp));
g_assert_nonnull (clone);
verify_func (clone, user_data);
g_object_unref (clone);
icalcomp = e_cal_component_get_icalcomponent (comp);
g_assert_nonnull (icalcomp);
icalcomp = i_cal_component_clone (icalcomp);
g_assert_nonnull (icalcomp);
clone = e_cal_component_new ();
g_assert_nonnull (clone);
g_assert_true (e_cal_component_set_icalcomponent (clone, icalcomp));
verify_func (clone, user_data);
g_object_unref (clone);
verify_func (comp, user_data);
}
static void
verify_component_vtype (ECalComponent *comp,
gpointer user_data)
{
g_assert_cmpint (e_cal_component_get_vtype (comp), ==, GPOINTER_TO_INT (user_data));
}
static void
test_component_vtype (void)
{
ECalComponentVType values[] = {
E_CAL_COMPONENT_EVENT,
E_CAL_COMPONENT_TODO,
E_CAL_COMPONENT_JOURNAL,
E_CAL_COMPONENT_FREEBUSY,
E_CAL_COMPONENT_TIMEZONE
};
ECalComponent *comp;
gint ii;
comp = e_cal_component_new ();
g_assert_nonnull (comp);
for (ii = 0; ii < G_N_ELEMENTS (values); ii++) {
e_cal_component_set_new_vtype (comp, values[ii]);
verify_changes (comp, verify_component_vtype, GINT_TO_POINTER (values[ii]));
}
g_object_unref (comp);
}
static void
verify_component_uid (ECalComponent *comp,
gpointer user_data)
{
const gchar *uid = user_data;
ECalComponentId *id;
g_assert_cmpstr (e_cal_component_get_uid (comp), ==, uid);
id = e_cal_component_get_id (comp);
g_assert_nonnull (id);
g_assert_nonnull (e_cal_component_id_get_uid (id));
g_assert_null (e_cal_component_id_get_rid (id));
g_assert_cmpstr (e_cal_component_id_get_uid (id), ==, uid);
e_cal_component_id_free (id);
}
static void
test_component_uid (void)
{
ECalComponent *comp;
comp = e_cal_component_new_vtype (E_CAL_COMPONENT_EVENT);
g_assert_nonnull (comp);
e_cal_component_set_uid (comp, "123");
verify_changes (comp, verify_component_uid, (gpointer) "123");
e_cal_component_set_uid (comp, "456");
verify_changes (comp, verify_component_uid, (gpointer) "456");
g_object_unref (comp);
}
static GSList * /* gchar * */
test_split_categories (const gchar *categories)
{
GSList *list = NULL;
gchar **split;
gint ii;
if (!categories)
return NULL;
split = g_strsplit (categories, ",", -1);
if (split) {
for (ii = 0; split[ii]; ii++) {
list = g_slist_prepend (list, g_strdup (split[ii]));
}
g_strfreev (split);
}
return g_slist_reverse (list);
}
static void
verify_component_categories (ECalComponent *comp,
gpointer user_data)
{
const gchar *categories = user_data;
gchar *categories_str;
GSList *expected, *received, *link1, *link2;
categories_str = e_cal_component_get_categories (comp);
g_assert_cmpstr (categories_str, ==, categories);
g_free (categories_str);
expected = test_split_categories (categories);
received = e_cal_component_get_categories_list (comp);
g_assert_cmpint (g_slist_length (expected), ==, g_slist_length (received));
for (link1 = expected, link2 = received;
link1 && link2;
link1 = g_slist_next (link1), link2 = g_slist_next (link2)) {
g_assert_cmpstr (link1->data, ==, link2->data);
}
g_assert_true (link1 == link2);
g_slist_free_full (expected, g_free);
g_slist_free_full (received, g_free);
}
static void
test_component_categories (void)
{
const gchar *values[] = {
"cat01",
"cat02",
NULL,
"cat03,cat04,cat05",
"cat06",
"cat07,cat08",
NULL
};
ECalComponent *comp;
gint ii;
for (ii = 0; ii < G_N_ELEMENTS (values); ii++) {
GSList *list;
comp = e_cal_component_new_vtype (E_CAL_COMPONENT_EVENT);
g_assert_nonnull (comp);
e_cal_component_set_categories (comp, values[ii]);
verify_changes (comp, verify_component_categories, (gpointer) values[ii]);
g_object_unref (comp);
comp = e_cal_component_new_vtype (E_CAL_COMPONENT_EVENT);
g_assert_nonnull (comp);
list = test_split_categories (values[ii]);
e_cal_component_set_categories_list (comp, list);
g_slist_free_full (list, g_free);
verify_changes (comp, verify_component_categories, (gpointer) values[ii]);
g_object_unref (comp);
}
}
static void
verify_component_classification (ECalComponent *comp,
gpointer user_data)
{
g_assert_cmpint (e_cal_component_get_classification (comp), ==, GPOINTER_TO_INT (user_data));
}
static void
test_component_classification (void)
{
ECalComponentClassification values[] = {
E_CAL_COMPONENT_CLASS_NONE,
E_CAL_COMPONENT_CLASS_PUBLIC,
E_CAL_COMPONENT_CLASS_PRIVATE,
E_CAL_COMPONENT_CLASS_CONFIDENTIAL
};
ECalComponent *comp;
gint ii;
comp = e_cal_component_new_vtype (E_CAL_COMPONENT_EVENT);
g_assert_nonnull (comp);
for (ii = 0; ii < G_N_ELEMENTS (values); ii++) {
e_cal_component_set_classification (comp, values[ii]);
verify_changes (comp, verify_component_classification, GINT_TO_POINTER (values[ii]));
}
g_object_unref (comp);
}
/* Each part is separated by ':', text from its altrep is separated by '|' */
static GSList * /* ECalComponentText * */
test_split_texts (const gchar *value)
{
GSList *result = NULL;
gchar **textsv;
gint ii;
if (!value)
return NULL;
textsv = g_strsplit (value, ":", -1);
if (textsv) {
for (ii = 0; textsv[ii]; ii++) {
ECalComponentText *comptext;
gchar *altrep, *language = NULL;
altrep = strchr (textsv[ii], '|');
if (altrep) {
*altrep = '\0';
altrep++;
language = strchr (altrep, '|');
if (language) {
*language = '\0';
language++;
if (!*language)
language = NULL;
}
if (!*altrep)
altrep = NULL;
}
comptext = e_cal_component_text_new (textsv[ii], altrep);
g_assert_nonnull (comptext);
if (language)
e_cal_component_text_set_language (comptext, language);
result = g_slist_prepend (result, comptext);
}
g_strfreev (textsv);
}
return g_slist_reverse (result);
}
static void
verify_component_text_list (GSList * (* get_func) (ECalComponent *comp),
ECalComponent *comp,
gpointer user_data)
{
GSList *expected, *received, *link1, *link2;
g_assert_true (get_func != NULL);
expected = user_data;
received = get_func (comp);
g_assert_cmpint (g_slist_length (expected), ==, g_slist_length (received));
for (link1 = expected, link2 = received;
link1 && link2;
link1 = g_slist_next (link1), link2 = g_slist_next (link2)) {
ECalComponentText *text1 = link1->data, *text2 = link2->data;
g_assert_nonnull (text1);
g_assert_nonnull (text2);
verify_struct_text_equal (text1, text2);
}
g_assert_true (link1 == link2);
g_slist_free_full (received, e_cal_component_text_free);
}
static void
test_component_text_list (void (* set_func) (ECalComponent *comp,
const GSList *values),
void (* verify_func) (ECalComponent *comp,
gpointer user_data))
{
const gchar *values[] = {
"text",
"line1\nline2|altrep",
"text|altrep",
"text1:text2|altrep2:text3a\ntext3b|altrep3",
"text||en",
"line1\nline2|altrep|en_US",
"text|altrep|en_GB",
"text1:text2|altrep2|en_GB:text3a\ntext3b|altrep3|en",
NULL
};
ECalComponent *comp;
gint ii;
g_assert_true (set_func != NULL);
g_assert_true (verify_func != NULL);
comp = e_cal_component_new_vtype (E_CAL_COMPONENT_EVENT);
g_assert_nonnull (comp);
for (ii = 0; ii < G_N_ELEMENTS (values); ii++) {
GSList *expected = test_split_texts (values[ii]);
set_func (comp, expected);
verify_changes (comp, verify_func, expected);
g_slist_free_full (expected, e_cal_component_text_free);
}
g_object_unref (comp);
}
static void
verify_component_icaltime (ICalTime * (* get_func) (ECalComponent *comp),
ECalComponent *comp,
gpointer user_data)
{
ICalTime *expected, *received;
g_assert_true (get_func != NULL);
expected = user_data;
received = get_func (comp);
verify_ical_timetype_equal (expected, received);
g_clear_object (&received);
}
static void
test_component_icaltime (void (* set_func) (ECalComponent *comp,
const ICalTime *tt),
void (* verify_func) (ECalComponent *comp,
gpointer user_data),
gboolean can_null_value)
{
const gchar *values[] = {
"20181215T111213Z",
"20190131T121314Z",
NULL,
"20200708T010305Z"
};
ECalComponent *comp;
gint ii;
g_assert_true (set_func != NULL);
g_assert_true (verify_func != NULL);
comp = e_cal_component_new_vtype (E_CAL_COMPONENT_EVENT);
g_assert_nonnull (comp);
for (ii = 0; ii < G_N_ELEMENTS (values); ii++) {
ICalTime *tt;
if (values[ii]) {
tt = i_cal_time_new_from_string (values[ii]);
g_assert_nonnull (tt);
} else if (!can_null_value) {
continue;
} else {
tt = NULL;
}
set_func (comp, tt);
verify_changes (comp, verify_func, tt);
g_clear_object (&tt);
}
g_object_unref (comp);
}
static void
verify_component_datetime (ECalComponentDateTime * (* get_func) (ECalComponent *comp),
ECalComponent *comp,
gpointer user_data)
{
ECalComponentDateTime *expected, *received;
g_assert_true (get_func != NULL);
expected = user_data;
received = get_func (comp);
verify_struct_datetime_equal (expected, received);
e_cal_component_datetime_free (received);
}
static void
test_component_datetime (void (* set_func) (ECalComponent *comp,
const ECalComponentDateTime *dt),
void (* verify_func) (ECalComponent *comp,
gpointer user_data))
{
struct _values {
const gchar *time;
const gchar *tzid;
} values[] = {
{ "20181215T111213Z", NULL },
{ "20190131T121314Z", NULL },
{ NULL, NULL },
{ "20200708T010305Z", NULL },
{ "20211215T101112", "America/New_York" },
{ "20221110T090807", "UTC" },
{ "20231009", NULL }
};
ECalComponent *comp;
gint ii;
g_assert_true (set_func != NULL);
g_assert_true (verify_func != NULL);
comp = e_cal_component_new_vtype (set_func == e_cal_component_set_due ? E_CAL_COMPONENT_TODO : E_CAL_COMPONENT_EVENT);
g_assert_nonnull (comp);
for (ii = 0; ii < G_N_ELEMENTS (values); ii++) {
ECalComponentDateTime *dt;
if (values[ii].time) {
dt = e_cal_component_datetime_new_take (i_cal_time_new_from_string (values[ii].time), g_strdup (values[ii].tzid));
g_assert_nonnull (dt);
if (values[ii].tzid) {
ICalTime *tt;
ICalTimezone *zone;
zone = i_cal_timezone_get_builtin_timezone (values[ii].tzid);
if (zone) {
tt = e_cal_component_datetime_get_value (dt);
i_cal_time_set_timezone (tt, zone);
}
}
} else {
dt = NULL;
}
set_func (comp, dt);
verify_changes (comp, verify_func, dt);
e_cal_component_datetime_free (dt);
}
g_object_unref (comp);
}
static void
verify_component_rules (GSList * (* get_func) (ECalComponent *comp),
GSList * (* get_props_func) (ECalComponent *comp),
gboolean is_exception,
ECalComponent *comp,
gpointer user_data)
{
GSList *expected, *received, *received_props;
expected = user_data;
received = get_func (comp);
received_props = get_props_func (comp);
if (!expected) {
g_assert_null (received);
g_assert_null (received_props);
if (is_exception) {
g_assert_true (!e_cal_component_has_exrules (comp));
g_assert_true (!e_cal_component_has_exceptions (comp));
} else {
g_assert_true (!e_cal_component_has_rrules (comp));
g_assert_true (!e_cal_component_has_recurrences (comp));
g_assert_true (e_cal_component_has_simple_recurrence (comp));
}
} else {
GSList *link1, *link2, *link3;
if (is_exception) {
g_assert_true (e_cal_component_has_exrules (comp));
g_assert_true (e_cal_component_has_exceptions (comp));
g_assert_true (!e_cal_component_has_rrules (comp));
} else {
g_assert_true (!e_cal_component_has_exrules (comp));
g_assert_true (!e_cal_component_has_exceptions (comp));
g_assert_true (e_cal_component_has_rrules (comp));
g_assert_true (e_cal_component_has_recurrences (comp));
if (expected->next)
g_assert_true (!e_cal_component_has_simple_recurrence (comp));
else
g_assert_true (e_cal_component_has_simple_recurrence (comp));
}
g_assert_cmpint (g_slist_length (expected), ==, g_slist_length (received));
g_assert_cmpint (g_slist_length (expected), ==, g_slist_length (received_props));
for (link1 = expected, link2 = received, link3 = received_props;
link1 && link2 && link3;
link1 = g_slist_next (link1), link2 = g_slist_next (link2), link3 = g_slist_next (link3)) {
ICalRecurrence *rt_expected, *rt_received, *rt_received_prop;
ICalProperty *prop_received;
gchar *str_expected, *str_received, *str_received_prop;
rt_expected = link1->data;
rt_received = link2->data;
prop_received = link3->data;
if (is_exception) {
rt_received_prop = i_cal_property_get_exrule (prop_received);
} else {
rt_received_prop = i_cal_property_get_rrule (prop_received);
}
str_expected = i_cal_recurrence_to_string (rt_expected);
str_received = i_cal_recurrence_to_string (rt_received);
str_received_prop = i_cal_recurrence_to_string (rt_received_prop);
g_assert_cmpstr (str_expected, ==, str_received);
g_assert_cmpstr (str_expected, ==, str_received_prop);
g_free (str_expected);
g_free (str_received);
g_free (str_received_prop);
g_clear_object (&rt_received_prop);
}
g_assert_true (link1 == link2);
g_assert_true (link2 == link3);
}
g_slist_free_full (received, g_object_unref);
g_slist_free_full (received_props, g_object_unref);
}
static void
test_component_rules (void (* set_func) (ECalComponent *comp,
const GSList *recur_list),
void (* verify_func) (ECalComponent *comp,
gpointer user_data))
{
const gchar *values[] = {
"FREQ=DAILY;COUNT=10;INTERVAL=6",
NULL, /* terminator */
NULL, /* terminator */
"FREQ=YEARLY;BYDAY=-1SU;BYMONTH=3",
"FREQ=DAILY;BYDAY=1SU",
NULL /* terminator */
};
ECalComponent *comp;
GSList *rules = NULL;
gint ii;
g_assert_nonnull (set_func);
g_assert_nonnull (verify_func);
comp = e_cal_component_new_vtype (E_CAL_COMPONENT_EVENT);
g_assert_nonnull (comp);
for (ii = 0; ii < G_N_ELEMENTS (values); ii++) {
if (values[ii]) {
ICalRecurrence *rt;
rt = i_cal_recurrence_new_from_string (values[ii]);
g_assert_nonnull (rt);
rules = g_slist_prepend (rules, rt);
} else {
rules = g_slist_reverse (rules);
set_func (comp, rules);
verify_changes (comp, verify_func, rules);
g_slist_free_full (rules, g_object_unref);
rules = NULL;
}
}
g_object_unref (comp);
g_assert_null (rules);
}
static void
verify_component_comments (ECalComponent *comp,
gpointer user_data)
{
verify_component_text_list (e_cal_component_get_comments, comp, user_data);
}
static void
test_component_comments (void)
{
test_component_text_list (e_cal_component_set_comments, verify_component_comments);
}
static void
test_component_comments_locale (void)
{
const gchar *comp_str =
"BEGIN:VEVENT\r\n"
"UID:1\r\n"
"COMMENT;LANGUAGE=en-US:desc-en-US\r\n"
"COMMENT;LANGUAGE=en:desc-en\r\n"
"COMMENT;LANGUAGE=en-GB:desc-en-GB\r\n"
"COMMENT:desc\r\n"
"END:VEVENT\r\n";
ECalComponent *comp;
ECalComponentText *text;
comp = e_cal_component_new_from_string (comp_str);
g_assert_nonnull (comp);
text = e_cal_component_dup_comment_for_locale (comp, NULL);
g_assert_nonnull (text);
e_cal_component_text_free (text);
text = e_cal_component_dup_comment_for_locale (comp, "en_US");
g_assert_cmpstr (e_cal_component_text_get_value (text), ==, "desc-en-US");
e_cal_component_text_free (text);
text = e_cal_component_dup_comment_for_locale (comp, "en_GB");
g_assert_cmpstr (e_cal_component_text_get_value (text), ==, "desc-en-GB");
e_cal_component_text_free (text);
text = e_cal_component_dup_comment_for_locale (comp, "en");
g_assert_cmpstr (e_cal_component_text_get_value (text), ==, "desc-en");
e_cal_component_text_free (text);
text = e_cal_component_dup_comment_for_locale (comp, "xxx");
g_assert_cmpstr (e_cal_component_text_get_value (text), ==, "desc");
e_cal_component_text_free (text);
g_clear_object (&comp);
comp_str =
"BEGIN:VEVENT\r\n"
"UID:1\r\n"
"COMMENT;LANGUAGE=en-US:desc-en-US\r\n"
"COMMENT;LANGUAGE=en:desc-en\r\n"
"COMMENT;LANGUAGE=en-GB:desc-en-GB\r\n"
"END:VEVENT\r\n";
comp = e_cal_component_new_from_string (comp_str);
g_assert_nonnull (comp);
text = e_cal_component_dup_comment_for_locale (comp, "xxx");
g_assert_nonnull (text);
g_assert_cmpstr (e_cal_component_text_get_value (text), ==, "desc-en-US");
e_cal_component_text_free (text);
g_clear_object (&comp);
}
static void
verify_component_completed (ECalComponent *comp,
gpointer user_data)
{
verify_component_icaltime (e_cal_component_get_completed, comp, user_data);
}
static void
test_component_completed (void)
{
test_component_icaltime (e_cal_component_set_completed, verify_component_completed, TRUE);
}
static void
verify_component_contacts (ECalComponent *comp,
gpointer user_data)
{
verify_component_text_list (e_cal_component_get_contacts, comp, user_data);
}
static void
test_component_contacts (void)
{
test_component_text_list (e_cal_component_set_contacts, verify_component_contacts);
}
static void
verify_component_created (ECalComponent *comp,
gpointer user_data)
{
verify_component_icaltime (e_cal_component_get_created, comp, user_data);
}
static void
test_component_created (void)
{
test_component_icaltime (e_cal_component_set_created, verify_component_created, TRUE);
}
static void
verify_component_descriptions (ECalComponent *comp,
gpointer user_data)
{
verify_component_text_list (e_cal_component_get_descriptions, comp, user_data);
}
static void
test_component_descriptions (void)
{
test_component_text_list (e_cal_component_set_descriptions, verify_component_descriptions);
}
static void
test_component_descriptions_locale (void)
{
const gchar *comp_str =
"BEGIN:VEVENT\r\n"
"UID:1\r\n"
"DESCRIPTION;LANGUAGE=en-US:desc-en-US\r\n"
"DESCRIPTION;LANGUAGE=en:desc-en\r\n"
"DESCRIPTION;LANGUAGE=en-GB:desc-en-GB\r\n"
"DESCRIPTION:desc\r\n"
"END:VEVENT\r\n";
ECalComponent *comp;
ECalComponentText *text;
comp = e_cal_component_new_from_string (comp_str);
g_assert_nonnull (comp);
text = e_cal_component_dup_description_for_locale (comp, NULL);
g_assert_nonnull (text);
e_cal_component_text_free (text);
text = e_cal_component_dup_description_for_locale (comp, "en_US");
g_assert_cmpstr (e_cal_component_text_get_value (text), ==, "desc-en-US");
e_cal_component_text_free (text);
text = e_cal_component_dup_description_for_locale (comp, "en_GB");
g_assert_cmpstr (e_cal_component_text_get_value (text), ==, "desc-en-GB");
e_cal_component_text_free (text);
text = e_cal_component_dup_description_for_locale (comp, "en");
g_assert_cmpstr (e_cal_component_text_get_value (text), ==, "desc-en");
e_cal_component_text_free (text);
text = e_cal_component_dup_description_for_locale (comp, "xxx");
g_assert_cmpstr (e_cal_component_text_get_value (text), ==, "desc");
e_cal_component_text_free (text);
g_clear_object (&comp);
comp_str =
"BEGIN:VEVENT\r\n"
"UID:1\r\n"
"DESCRIPTION;LANGUAGE=en-US:desc-en-US\r\n"
"DESCRIPTION;LANGUAGE=en:desc-en\r\n"
"DESCRIPTION;LANGUAGE=en-GB:desc-en-GB\r\n"
"END:VEVENT\r\n";
comp = e_cal_component_new_from_string (comp_str);
g_assert_nonnull (comp);
text = e_cal_component_dup_description_for_locale (comp, "xxx");
g_assert_nonnull (text);
g_assert_cmpstr (e_cal_component_text_get_value (text), ==, "desc-en-US");
e_cal_component_text_free (text);
g_clear_object (&comp);
}
static void
verify_component_dtend (ECalComponent *comp,
gpointer user_data)
{
verify_component_datetime (e_cal_component_get_dtend, comp, user_data);
}
static void
test_component_dtend (void)
{
test_component_datetime (e_cal_component_set_dtend, verify_component_dtend);
}
static void
verify_component_dtstamp (ECalComponent *comp,
gpointer user_data)
{
verify_component_icaltime (e_cal_component_get_dtstamp, comp, user_data);
}
static void
test_component_dtstamp (void)
{
test_component_icaltime (e_cal_component_set_dtstamp, verify_component_dtstamp, FALSE);
}
static void
verify_component_dtstart (ECalComponent *comp,
gpointer user_data)
{
verify_component_datetime (e_cal_component_get_dtstart, comp, user_data);
}
static void
test_component_dtstart (void)
{
test_component_datetime (e_cal_component_set_dtstart, verify_component_dtstart);
}
static void
verify_component_due (ECalComponent *comp,
gpointer user_data)
{
verify_component_datetime (e_cal_component_get_due, comp, user_data);
}
static void
test_component_due (void)
{
test_component_datetime (e_cal_component_set_due, verify_component_due);
}
static void
verify_component_exdates (ECalComponent *comp,
gpointer user_data)
{
GSList *expected, *received;
expected = user_data;
received = e_cal_component_get_exdates (comp);
if (!expected) {
g_assert_null (received);
g_assert_true (!e_cal_component_has_exdates (comp));
g_assert_true (!e_cal_component_has_exceptions (comp));
} else {
GSList *link1, *link2;
g_assert_true (e_cal_component_has_exdates (comp));
g_assert_true (e_cal_component_has_exceptions (comp));
g_assert_cmpint (g_slist_length (expected), ==, g_slist_length (received));
for (link1 = expected, link2 = received; link1 && link2; link1 = g_slist_next (link1), link2 = g_slist_next (link2)) {
ECalComponentDateTime *dt_expected = link1->data, *dt_received = link2->data;
verify_struct_datetime_equal (dt_expected, dt_received);
}
g_assert_true (link1 == link2);
}
g_slist_free_full (received, e_cal_component_datetime_free);
}
static void
test_component_exdates (void)
{
struct _values {
const gchar *time;
const gchar *tzid;
} values[] = {
{ "20181215T111213Z", NULL },
{ "20190131T121314Z", NULL },
{ NULL, NULL }, /* terminator */
{ NULL, NULL }, /* terminator */
{ "20200708T010305Z", NULL },
{ "20211215T101112", "America/New_York" },
{ "20221110T090807", "UTC" },
{ "20231009", NULL },
{ NULL, NULL } /* terminator */
};
ECalComponent *comp;
GSList *exdates = NULL;
gint ii;
comp = e_cal_component_new_vtype (E_CAL_COMPONENT_EVENT);
g_assert_nonnull (comp);
for (ii = 0; ii < G_N_ELEMENTS (values); ii++) {
if (values[ii].time) {
ECalComponentDateTime *dt;
dt = e_cal_component_datetime_new_take (i_cal_time_new_from_string (values[ii].time), g_strdup (values[ii].tzid));
g_assert_nonnull (dt);
if (values[ii].tzid) {
ICalTime *tt;
ICalTimezone *zone;
zone = i_cal_timezone_get_builtin_timezone (values[ii].tzid);
if (zone) {
tt = e_cal_component_datetime_get_value (dt);
i_cal_time_set_timezone (tt, zone);
}
}
exdates = g_slist_prepend (exdates, dt);
} else {
exdates = g_slist_reverse (exdates);
e_cal_component_set_exdates (comp, exdates);
verify_changes (comp, verify_component_exdates, exdates);
g_slist_free_full (exdates, e_cal_component_datetime_free);
exdates = NULL;
}
}
g_object_unref (comp);
g_assert_null (exdates);
}
static void
verify_component_exrules (ECalComponent *comp,
gpointer user_data)
{
verify_component_rules (e_cal_component_get_exrules, e_cal_component_get_exrule_properties, TRUE, comp, user_data);
}
static void
test_component_exrules (void)
{
test_component_rules (e_cal_component_set_exrules, verify_component_exrules);
}
static void
verify_component_geo (ECalComponent *comp,
gpointer user_data)
{
ICalGeo *expected, *received;
expected = user_data;
received = e_cal_component_get_geo (comp);
if (!expected) {
g_assert_null (received);
} else {
g_assert_nonnull (received);
g_assert_cmpfloat (i_cal_geo_get_lat (expected), ==, i_cal_geo_get_lat (received));
g_assert_cmpfloat (i_cal_geo_get_lon (expected), ==, i_cal_geo_get_lon (received));
}
g_clear_object (&received);
}
static void
test_component_geo (void)
{
struct _values {
gdouble lat;
gdouble lon;
} values[] = {
{ 10.0, 20.0 },
{ -1.0, -1.0 },
{ 50.0, 30.0 }
};
ECalComponent *comp;
gint ii;
comp = e_cal_component_new_vtype (E_CAL_COMPONENT_EVENT);
g_assert_nonnull (comp);
for (ii = 0; ii < G_N_ELEMENTS (values); ii++) {
ICalGeo *geo = NULL;
if (values[ii].lat > 0.0)
geo = i_cal_geo_new (values[ii].lat, values[ii].lon);
e_cal_component_set_geo (comp, geo);
verify_changes (comp, verify_component_geo, geo);
g_clear_object (&geo);
}
g_object_unref (comp);
}
static void
verify_component_lastmodified (ECalComponent *comp,
gpointer user_data)
{
verify_component_icaltime (e_cal_component_get_last_modified, comp, user_data);
}
static void
test_component_lastmodified (void)
{
test_component_icaltime (e_cal_component_set_last_modified, verify_component_lastmodified, TRUE);
}
static void
verify_component_organizer (ECalComponent *comp,
gpointer user_data)
{
ECalComponentOrganizer *expected, *received;
expected = user_data;
received = e_cal_component_get_organizer (comp);
if (!expected) {
g_assert_null (received);
g_assert_true (!e_cal_component_has_organizer (comp));
} else {
g_assert_nonnull (received);
g_assert_true (e_cal_component_has_organizer (comp));
verify_struct_organizer_equal (expected, received);
}
e_cal_component_organizer_free (received);
}
static void
test_component_organizer (void)
{
struct _values {
const gchar *value;
const gchar *sentby;
const gchar *cn;
const gchar *language;
} values[] = {
{ "mailto:org1", NULL, "First Organizer", NULL },
{ NULL, NULL, NULL, NULL },
{ "mailto:org2","mailto:sentby2", "Second Organizer", "en_US" }
};
ECalComponent *comp;
gint ii;
comp = e_cal_component_new_vtype (E_CAL_COMPONENT_EVENT);
g_assert_nonnull (comp);
for (ii = 0; ii < G_N_ELEMENTS (values); ii++) {
ECalComponentOrganizer *org = NULL;
if (values[ii].value) {
org = e_cal_component_organizer_new_full (values[ii].value, values[ii].sentby, values[ii].cn, values[ii].language);
if (ii == 0)
test_component_add_params_to_bag (e_cal_component_organizer_get_parameter_bag (org), ii + 1);
}
e_cal_component_set_organizer (comp, org);
verify_changes (comp, verify_component_organizer, org);
e_cal_component_organizer_free (org);
}
g_object_unref (comp);
}
static void
verify_component_percentcomplete (ECalComponent *comp,
gpointer user_data)
{
gint expected, received;
expected = GPOINTER_TO_INT (user_data);
received = e_cal_component_get_percent_complete (comp);
g_assert_cmpint (expected, ==, received);
}
static void
test_component_percentcomplete (void)
{
gint values[] = { 10, -1, 13, 0, 78, 99, -1, 100 };
ECalComponent *comp;
gint ii;
comp = e_cal_component_new_vtype (E_CAL_COMPONENT_EVENT);
g_assert_nonnull (comp);
for (ii = 0; ii < G_N_ELEMENTS (values); ii++) {
e_cal_component_set_percent_complete (comp, values[ii]);
verify_changes (comp, verify_component_percentcomplete, GINT_TO_POINTER (values[ii]));
}
g_object_unref (comp);
}
static void
verify_component_priority (ECalComponent *comp,
gpointer user_data)
{
gint expected, received;
expected = GPOINTER_TO_INT (user_data);
received = e_cal_component_get_priority (comp);
g_assert_cmpint (expected, ==, received);
}
static void
test_component_priority (void)
{
gint values[] = { 8, 7, 6, 5, -1, 4, 3, 2, 1, 0, -1, 9 };
ECalComponent *comp;
gint ii;
comp = e_cal_component_new_vtype (E_CAL_COMPONENT_EVENT);
g_assert_nonnull (comp);
for (ii = 0; ii < G_N_ELEMENTS (values); ii++) {
e_cal_component_set_priority (comp, values[ii]);
verify_changes (comp, verify_component_priority, GINT_TO_POINTER (values[ii]));
}
g_object_unref (comp);
}
static void
verify_component_recurid (ECalComponent *comp,
gpointer user_data)
{
ECalComponentRange *expected, *received;
ECalComponentId *id;
gchar *rid_str;
expected = user_data;
received = e_cal_component_get_recurid (comp);
rid_str = e_cal_component_get_recurid_as_string (comp);
id = e_cal_component_get_id (comp);
g_assert_nonnull (id);
if (!expected) {
g_assert_null (received);
g_assert_null (rid_str);
g_assert_null (e_cal_component_id_get_rid (id));
g_assert_true (!e_cal_component_is_instance (comp));
} else {
g_assert_nonnull (rid_str);
g_assert_nonnull (e_cal_component_id_get_rid (id));
g_assert_true (e_cal_component_is_instance (comp));
g_assert_cmpstr (e_cal_component_id_get_rid (id), ==, rid_str);
verify_struct_range_equal (expected, received);
}
e_cal_component_range_free (received);
e_cal_component_id_free (id);
g_free (rid_str);
}
static void
test_component_recurid (void)
{
struct _values {
const gchar *time;
const gchar *tzid;
ECalComponentRangeKind range_kind;
} values[] = {
{ "20181215T111213Z", NULL, E_CAL_COMPONENT_RANGE_SINGLE },
{ "20190131T121314Z", NULL, E_CAL_COMPONENT_RANGE_THISFUTURE },
{ NULL, NULL, E_CAL_COMPONENT_RANGE_SINGLE },
{ "20200708T010305Z", NULL, E_CAL_COMPONENT_RANGE_SINGLE },
{ "20211215T101112", "America/New_York", E_CAL_COMPONENT_RANGE_SINGLE },
{ "20221110T090807", "UTC", E_CAL_COMPONENT_RANGE_THISFUTURE },
{ "20231009", NULL, E_CAL_COMPONENT_RANGE_THISFUTURE }
};
ECalComponent *comp;
gint ii;
comp = e_cal_component_new_vtype (E_CAL_COMPONENT_EVENT);
g_assert_nonnull (comp);
for (ii = 0; ii < G_N_ELEMENTS (values); ii++) {
ECalComponentRange *rid = NULL;
if (values[ii].time) {
ECalComponentDateTime *dt;
dt = e_cal_component_datetime_new_take (i_cal_time_new_from_string (values[ii].time), g_strdup (values[ii].tzid));
g_assert_nonnull (dt);
if (values[ii].tzid) {
ICalTime *tt;
ICalTimezone *zone;
zone = i_cal_timezone_get_builtin_timezone (values[ii].tzid);
if (zone) {
tt = e_cal_component_datetime_get_value (dt);
i_cal_time_set_timezone (tt, zone);
}
}
rid = e_cal_component_range_new_take (values[ii].range_kind, dt);
}
e_cal_component_set_recurid (comp, rid);
verify_changes (comp, verify_component_recurid, rid);
e_cal_component_range_free (rid);
}
g_object_unref (comp);
}
static void
verify_component_rdates (ECalComponent *comp,
gpointer user_data)
{
GSList *expected, *received;
expected = user_data;
received = e_cal_component_get_rdates (comp);
if (!expected) {
g_assert_null (received);
g_assert_true (!e_cal_component_has_rdates (comp));
g_assert_true (!e_cal_component_has_recurrences (comp));
} else {
GSList *link1, *link2;
g_assert_true (e_cal_component_has_rdates (comp));
g_assert_true (e_cal_component_has_recurrences (comp));
g_assert_cmpint (g_slist_length (expected), ==, g_slist_length (received));
for (link1 = expected, link2 = received; link1 && link2; link1 = g_slist_next (link1), link2 = g_slist_next (link2)) {
ECalComponentPeriod *period_expected = link1->data, *period_received = link2->data;
verify_struct_period_equal (period_expected, period_received);
}
g_assert_true (link1 == link2);
}
g_slist_free_full (received, e_cal_component_period_free);
}
static void
test_component_rdates (void)
{
struct _values {
const gchar *start;
const gchar *end;
gint duration;
} values[] = {
{ "20181215T111213Z", "20181215T121314Z", -1 },
{ "20190131T121314Z", NULL, 10 * 24 * 60 * 60 },
{ NULL, NULL, -1 }, /* terminator */
{ NULL, NULL, -1 }, /* terminator */
{ "20200708T010305Z", NULL, 2 * 60 * 60 },
{ "20211215T101112", "20211215T121314", -1 },
{ "20221110T090807", "20221110T100908", -1 },
{ "20231009", "20241110", -1 },
{ NULL, NULL, -1 }, /* terminator */
{ "20240908T070605", NULL, -1 },
{ "20250807", NULL, -1 },
{ NULL, NULL, -1 } /* terminator */
};
ECalComponent *comp;
GSList *rdates = NULL;
gint ii;
comp = e_cal_component_new_vtype (E_CAL_COMPONENT_EVENT);
g_assert_nonnull (comp);
for (ii = 0; ii < G_N_ELEMENTS (values); ii++) {
if (values[ii].start) {
ICalTime *start, *end = NULL;
ICalDuration *duration = NULL;
ECalComponentPeriod *period;
start = i_cal_time_new_from_string (values[ii].start);
g_assert_nonnull (start);
if (values[ii].duration == -1) {
if (values[ii].end) {
end = i_cal_time_new_from_string (values[ii].end);
g_assert_nonnull (end);
}
period = e_cal_component_period_new_datetime (start, end);
} else {
duration = i_cal_duration_new_from_int (values[ii].duration);
g_assert_nonnull (duration);
period = e_cal_component_period_new_duration (start, duration);
}
g_assert_nonnull (period);
rdates = g_slist_prepend (rdates, period);
g_clear_object (&start);
g_clear_object (&end);
g_clear_object (&duration);
} else {
rdates = g_slist_reverse (rdates);
e_cal_component_set_rdates (comp, rdates);
verify_changes (comp, verify_component_rdates, rdates);
g_slist_free_full (rdates, e_cal_component_period_free);
rdates = NULL;
}
}
g_object_unref (comp);
g_assert_null (rdates);
}
static void
verify_component_rrules (ECalComponent *comp,
gpointer user_data)
{
verify_component_rules (e_cal_component_get_rrules, e_cal_component_get_rrule_properties, FALSE, comp, user_data);
}
static void
test_component_rrules (void)
{
test_component_rules (e_cal_component_set_rrules, verify_component_rrules);
}
static void
verify_component_sequence (ECalComponent *comp,
gpointer user_data)
{
gint expected, received;
expected = GPOINTER_TO_INT (user_data);
received = e_cal_component_get_sequence (comp);
g_assert_cmpint (expected, ==, received);
}
static void
test_component_sequence (void)
{
gint values[] = { 8, 7, 6, 5, -1, 4, 3, 2, 1, 0, -1, 9 };
ECalComponent *comp;
gint ii;
comp = e_cal_component_new_vtype (E_CAL_COMPONENT_EVENT);
g_assert_nonnull (comp);
for (ii = 0; ii < G_N_ELEMENTS (values); ii++) {
e_cal_component_set_sequence (comp, values[ii]);
e_cal_component_abort_sequence (comp);
verify_changes (comp, verify_component_sequence, GINT_TO_POINTER (values[ii]));
}
g_object_unref (comp);
}
static void
verify_component_status (ECalComponent *comp,
gpointer user_data)
{
ICalPropertyStatus expected, received;
expected = GPOINTER_TO_INT (user_data);
received = e_cal_component_get_status (comp);
g_assert_cmpint (expected, ==, received);
}
static void
test_component_status (void)
{
ICalPropertyStatus values[] = {
I_CAL_STATUS_TENTATIVE,
I_CAL_STATUS_CONFIRMED,
I_CAL_STATUS_COMPLETED,
I_CAL_STATUS_NEEDSACTION,
I_CAL_STATUS_CANCELLED,
I_CAL_STATUS_INPROCESS,
I_CAL_STATUS_DRAFT,
I_CAL_STATUS_FINAL,
I_CAL_STATUS_NONE
};
ECalComponent *comp;
gint ii;
comp = e_cal_component_new_vtype (E_CAL_COMPONENT_EVENT);
g_assert_nonnull (comp);
for (ii = 0; ii < G_N_ELEMENTS (values); ii++) {
e_cal_component_set_status (comp, values[ii]);
verify_changes (comp, verify_component_status, GINT_TO_POINTER (values[ii]));
}
g_object_unref (comp);
}
static void
verify_component_summary (ECalComponent *comp,
gpointer user_data)
{
ECalComponentText *expected, *received;
expected = user_data;
received = e_cal_component_get_summary (comp);
if (expected) {
g_assert_nonnull (received);
verify_struct_text_equal (expected, received);
} else {
g_assert_null (received);
}
e_cal_component_text_free (received);
}
static void
test_component_summary (void)
{
const gchar *values[] = {
"text",
"line1\nline2|altrep",
"text|altrep",
NULL,
"text1:text2|altrep2:text3a\ntext3b|altrep3",
"text||en",
"line1\nline2|altrep|en_US",
"text|altrep|en_GB",
"text1:text2|altrep2|en:text3a\ntext3b|altrep3|en_US"
};
ECalComponent *comp;
gint ii;
comp = e_cal_component_new_vtype (E_CAL_COMPONENT_EVENT);
g_assert_nonnull (comp);
for (ii = 0; ii < G_N_ELEMENTS (values); ii++) {
GSList *expected = test_split_texts (values[ii]), *link;
if (expected) {
for (link = expected; link; link = g_slist_next (link)) {
ECalComponentText *text = link->data;
e_cal_component_set_summary (comp, text);
verify_changes (comp, verify_component_summary, text);
}
} else {
e_cal_component_set_summary (comp, NULL);
verify_changes (comp, verify_component_summary, NULL);
}
g_slist_free_full (expected, e_cal_component_text_free);
}
g_object_unref (comp);
}
static void
test_component_summary_locale (void)
{
const gchar *comp_str =
"BEGIN:VEVENT\r\n"
"UID:1\r\n"
"SUMMARY;LANGUAGE=en-US:summ-en-US\r\n"
"SUMMARY;LANGUAGE=en:summ-en\r\n"
"SUMMARY;LANGUAGE=en-GB:summ-en-GB\r\n"
"SUMMARY:summ\r\n"
"END:VEVENT\r\n";
ECalComponent *comp;
ECalComponentText *text;
comp = e_cal_component_new_from_string (comp_str);
g_assert_nonnull (comp);
text = e_cal_component_dup_summary_for_locale (comp, NULL);
g_assert_nonnull (text);
e_cal_component_text_free (text);
text = e_cal_component_dup_summary_for_locale (comp, "en_US");
g_assert_cmpstr (e_cal_component_text_get_value (text), ==, "summ-en-US");
e_cal_component_text_free (text);
text = e_cal_component_dup_summary_for_locale (comp, "en_GB");
g_assert_cmpstr (e_cal_component_text_get_value (text), ==, "summ-en-GB");
e_cal_component_text_free (text);
text = e_cal_component_dup_summary_for_locale (comp, "en");
g_assert_cmpstr (e_cal_component_text_get_value (text), ==, "summ-en");
e_cal_component_text_free (text);
text = e_cal_component_dup_summary_for_locale (comp, "xxx");
g_assert_cmpstr (e_cal_component_text_get_value (text), ==, "summ");
e_cal_component_text_free (text);
g_clear_object (&comp);
comp_str =
"BEGIN:VEVENT\r\n"
"UID:1\r\n"
"SUMMARY;LANGUAGE=en-US:summ-en-US\r\n"
"SUMMARY;LANGUAGE=en:summ-en\r\n"
"SUMMARY;LANGUAGE=en-GB:summ-en-GB\r\n"
"END:VEVENT\r\n";
comp = e_cal_component_new_from_string (comp_str);
g_assert_nonnull (comp);
text = e_cal_component_dup_summary_for_locale (comp, "xxx");
g_assert_nonnull (text);
g_assert_cmpstr (e_cal_component_text_get_value (text), ==, "summ-en-US");
e_cal_component_text_free (text);
g_clear_object (&comp);
}
static void
verify_component_summaries (ECalComponent *comp,
gpointer user_data)
{
verify_component_text_list (e_cal_component_dup_summaries, comp, user_data);
}
static void
test_component_summaries (void)
{
const gchar *comp_str =
"BEGIN:VEVENT\r\n"
"UID:1\r\n"
"SUMMARY;LANGUAGE=en-US:summ-en-US\r\n"
"SUMMARY;LANGUAGE=en:summ-en\r\n"
"SUMMARY;LANGUAGE=en-GB:summ-en-GB\r\n"
"SUMMARY:summ\r\n"
"END:VEVENT\r\n";
ECalComponent *comp;
ECalComponentText *text;
GSList *slist1, *slist2;
comp = e_cal_component_new_from_string (comp_str);
g_assert_nonnull (comp);
slist1 = e_cal_component_dup_summaries (comp);
g_assert_cmpint (g_slist_length (slist1), ==, 4);
text = e_cal_component_text_new ("summary", NULL);
e_cal_component_set_summary (comp, text);
slist2 = e_cal_component_dup_summaries (comp);
g_assert_cmpint (g_slist_length (slist2), ==, 1);
verify_struct_text_equal (text, slist2->data);
g_slist_free_full (slist2, e_cal_component_text_free);
e_cal_component_text_free (text);
e_cal_component_set_summaries (comp, slist1);
verify_changes (comp, verify_component_summaries, slist1);
g_slist_free_full (slist1, e_cal_component_text_free);
g_clear_object (&comp);
}
static void
verify_component_transparency (ECalComponent *comp,
gpointer user_data)
{
ECalComponentTransparency expected, received;
expected = GPOINTER_TO_INT (user_data);
received = e_cal_component_get_transparency (comp);
g_assert_cmpint (expected, ==, received);
}
static void
test_component_transparency (void)
{
ECalComponentTransparency values[] = {
E_CAL_COMPONENT_TRANSP_TRANSPARENT,
E_CAL_COMPONENT_TRANSP_NONE,
E_CAL_COMPONENT_TRANSP_OPAQUE
};
ECalComponent *comp;
gint ii;
comp = e_cal_component_new_vtype (E_CAL_COMPONENT_EVENT);
g_assert_nonnull (comp);
for (ii = 0; ii < G_N_ELEMENTS (values); ii++) {
e_cal_component_set_transparency (comp, values[ii]);
verify_changes (comp, verify_component_transparency, GINT_TO_POINTER (values[ii]));
}
g_object_unref (comp);
}
static void
verify_component_url (ECalComponent *comp,
gpointer user_data)
{
gchar *expected, *received;
expected = user_data;
received = e_cal_component_get_url (comp);
g_assert_cmpstr (expected, ==, received);
g_free (received);
}
static void
test_component_url (void)
{
const gchar *values[] = {
"https://www.gnome.org",
NULL,
"https://wiki.gnome.org/Apps/Evolution"
};
ECalComponent *comp;
gint ii;
comp = e_cal_component_new_vtype (E_CAL_COMPONENT_EVENT);
g_assert_nonnull (comp);
for (ii = 0; ii < G_N_ELEMENTS (values); ii++) {
e_cal_component_set_url (comp, values[ii]);
verify_changes (comp, verify_component_url, (gpointer) values[ii]);
}
g_object_unref (comp);
}
static void
verify_component_attendees (ECalComponent *comp,
gpointer user_data)
{
GSList *expected, *received;
expected = user_data;
received = e_cal_component_get_attendees (comp);
if (!expected) {
g_assert_null (received);
g_assert_true (!e_cal_component_has_attendees (comp));
} else {
GSList *link1, *link2;
g_assert_nonnull (received);
g_assert_true (e_cal_component_has_attendees (comp));
g_assert_cmpint (g_slist_length (expected), ==, g_slist_length (received));
for (link1 = expected, link2 = received; link1 && link2; link1 = g_slist_next (link1), link2 = g_slist_next (link2)) {
ECalComponentAttendee *att_expected = link1->data, *att_received = link2->data;
verify_struct_attendee_equal (att_expected, att_received);
}
g_assert_true (link1 == link2);
}
g_slist_free_full (received, e_cal_component_attendee_free);
}
static void
test_component_attendees (void)
{
struct _values {
const gchar *value;
const gchar *member;
ICalParameterCutype cutype;
ICalParameterRole role;
ICalParameterPartstat partstat;
gboolean rsvp;
const gchar *delegatedfrom;
const gchar *delegatedto;
const gchar *sentby;
const gchar *cn;
const gchar *language;
gboolean with_parameters;
} values[] = {
{ "mailto:att1",
"member",
I_CAL_CUTYPE_INDIVIDUAL,
I_CAL_ROLE_CHAIR,
I_CAL_PARTSTAT_NEEDSACTION,
FALSE,
"mailto:delgfrom",
"mailto:delgto",
"mailto:sentby",
"First attendee",
"en_US",
FALSE },
{ NULL, NULL, I_CAL_CUTYPE_NONE, I_CAL_ROLE_NONE, I_CAL_PARTSTAT_NONE, FALSE, NULL, NULL, NULL, NULL, NULL, FALSE }, /* terminator */
{ NULL, NULL, I_CAL_CUTYPE_NONE, I_CAL_ROLE_NONE, I_CAL_PARTSTAT_NONE, FALSE, NULL, NULL, NULL, NULL, NULL, FALSE }, /* terminator */
{ "mailto:room",
NULL,
I_CAL_CUTYPE_ROOM,
I_CAL_ROLE_REQPARTICIPANT,
I_CAL_PARTSTAT_ACCEPTED,
FALSE,
NULL,
NULL,
NULL,
"Meeting room",
NULL,
TRUE },
{ "mailto:att2",
NULL,
I_CAL_CUTYPE_INDIVIDUAL,
I_CAL_ROLE_REQPARTICIPANT,
I_CAL_PARTSTAT_TENTATIVE,
TRUE,
NULL,
NULL,
NULL,
NULL,
"en_US",
FALSE },
{ NULL, NULL, I_CAL_CUTYPE_NONE, I_CAL_ROLE_NONE, I_CAL_PARTSTAT_NONE, FALSE, NULL, NULL, NULL, NULL, NULL, FALSE } /* terminator */
};
ECalComponent *comp;
GSList *attendees = NULL;
gint ii;
comp = e_cal_component_new_vtype (E_CAL_COMPONENT_EVENT);
g_assert_nonnull (comp);
for (ii = 0; ii < G_N_ELEMENTS (values); ii++) {
if (values[ii].value) {
ECalComponentAttendee *att;
att = e_cal_component_attendee_new_full (values[ii].value,
values[ii].member,
values[ii].cutype,
values[ii].role,
values[ii].partstat,
values[ii].rsvp,
values[ii].delegatedfrom,
values[ii].delegatedto,
values[ii].sentby,
values[ii].cn,
values[ii].language);
if (values[ii].with_parameters)
test_component_add_params_to_bag (e_cal_component_attendee_get_parameter_bag (att), ii + 1);
attendees = g_slist_prepend (attendees, att);
} else {
attendees = g_slist_reverse (attendees);
e_cal_component_set_attendees (comp, attendees);
verify_changes (comp, verify_component_attendees, attendees);
g_slist_free_full (attendees, e_cal_component_attendee_free);
attendees = NULL;
}
}
g_object_unref (comp);
g_assert_null (attendees);
}
static void
verify_component_location (ECalComponent *comp,
gpointer user_data)
{
gchar *expected, *received;
expected = user_data;
received = e_cal_component_get_location (comp);
g_assert_cmpstr (expected, ==, received);
g_free (received);
}
static void
test_component_location (void)
{
const gchar *values[] = {
"Headquarter",
NULL,
"Phone call, +123-456-7890"
};
ECalComponent *comp;
gint ii;
comp = e_cal_component_new_vtype (E_CAL_COMPONENT_EVENT);
g_assert_nonnull (comp);
for (ii = 0; ii < G_N_ELEMENTS (values); ii++) {
e_cal_component_set_location (comp, values[ii]);
verify_changes (comp, verify_component_location, (gpointer) values[ii]);
}
g_object_unref (comp);
}
static void
verify_component_attachments (ECalComponent *comp,
gpointer user_data)
{
GSList *expected, *received;
expected = user_data;
received = e_cal_component_get_attachments (comp);
if (!expected) {
g_assert_null (received);
g_assert_true (!e_cal_component_has_attachments (comp));
} else {
ECalComponent *clone;
g_assert_nonnull (received);
g_assert_true (e_cal_component_has_attachments (comp));
verify_ical_attach_list_equal (expected, received);
/* Also test whether the attachments can be accessed after the component is freed */
clone = e_cal_component_clone (comp);
g_assert_nonnull (clone);
g_slist_free_full (received, g_object_unref);
received = e_cal_component_get_attachments (clone);
g_object_unref (clone);
g_assert_nonnull (received);
g_assert_cmpint (g_slist_length (expected), ==, g_slist_length (received));
verify_ical_attach_list_equal (expected, received);
}
g_slist_free_full (received, g_object_unref);
}
static void
test_component_attachments (void)
{
struct _values {
gboolean is_url;
const gchar *content;
} values[] = {
{ TRUE, "https://www.gnome.org/index.html" },
{ FALSE, NULL }, /* terminator */
{ FALSE, NULL }, /* terminator */
{ FALSE, "0123456789ABCDEF" },
{ TRUE, "http://www.example.com/files/data.dat" },
{ FALSE, NULL } /* terminator */
};
ECalComponent *comp;
GSList *attachments = NULL;
gint ii;
comp = e_cal_component_new_vtype (E_CAL_COMPONENT_EVENT);
g_assert_nonnull (comp);
for (ii = 0; ii < G_N_ELEMENTS (values); ii++) {
if (values[ii].content) {
ICalAttach *attach;
if (values[ii].is_url)
attach = i_cal_attach_new_from_url (values[ii].content);
else
attach = i_cal_attach_new_from_data (values[ii].content, NULL, NULL);
g_assert_nonnull (attach);
attachments = g_slist_prepend (attachments, attach);
} else {
attachments = g_slist_reverse (attachments);
e_cal_component_set_attachments (comp, attachments);
verify_changes (comp, verify_component_attachments, attachments);
g_slist_free_full (attachments, g_object_unref);
attachments = NULL;
}
}
g_object_unref (comp);
g_assert_null (attachments);
}
static void
verify_component_alarms (ECalComponent *comp,
gpointer user_data)
{
GSList *expected, *received, *received_uids;
expected = user_data;
received = e_cal_component_get_all_alarms (comp);
received_uids = e_cal_component_get_alarm_uids (comp);
if (!expected) {
g_assert_null (received);
g_assert_null (received_uids);
g_assert_true (!e_cal_component_has_alarms (comp));
} else {
GSList *link1, *link2, *link3;
g_assert_nonnull (received);
g_assert_nonnull (received_uids);
g_assert_true (e_cal_component_has_alarms (comp));
g_assert_cmpint (g_slist_length (expected), ==, g_slist_length (received));
g_assert_cmpint (g_slist_length (expected), ==, g_slist_length (received_uids));
for (link1 = expected, link2 = received, link3 = received_uids;
link1 && link2 && link3;
link1 = g_slist_next (link1), link2 = g_slist_next (link2), link3 = g_slist_next (link3)) {
const ECalComponentAlarm *al_expected = link1->data;
const ECalComponentAlarm *al_received = link2->data;
const gchar *uid_received = link3->data;
g_assert_nonnull (al_expected);
g_assert_nonnull (al_received);
g_assert_nonnull (uid_received);
g_assert_cmpstr (e_cal_component_alarm_get_uid (al_expected), ==, uid_received);
g_assert_cmpstr (e_cal_component_alarm_get_uid (al_expected), ==, e_cal_component_alarm_get_uid (al_received));
verify_struct_alarm_equal (al_expected, al_received);
}
g_assert_true (link1 == link2);
g_assert_true (link1 == link3);
if (expected->next) {
ECalComponentAlarm *al_expected;
ECalComponentAlarm *al_received;
al_expected = expected->next->data;
al_received = e_cal_component_get_alarm (comp, e_cal_component_alarm_get_uid (al_expected));
g_assert_nonnull (al_expected);
g_assert_nonnull (al_received);
g_assert_cmpstr (e_cal_component_alarm_get_uid (al_expected), ==, e_cal_component_alarm_get_uid (al_received));
e_cal_component_remove_alarm (comp, e_cal_component_alarm_get_uid (al_expected));
e_cal_component_alarm_free (al_received);
g_slist_free_full (received, e_cal_component_alarm_free);
g_slist_free_full (received_uids, g_free);
g_assert_true (e_cal_component_has_alarms (comp));
received = e_cal_component_get_all_alarms (comp);
received_uids = e_cal_component_get_alarm_uids (comp);
g_assert_cmpint (g_slist_length (expected) - 1, ==, g_slist_length (received));
g_assert_cmpint (g_slist_length (expected) - 1, ==, g_slist_length (received_uids));
for (link1 = received, link2 = received_uids;
link1 && link2;
link1 = g_slist_next (link1), link2 = g_slist_next (link2)) {
const gchar *uid_received;
al_received = link1->data;
uid_received = link2->data;
g_assert_nonnull (al_received);
g_assert_nonnull (uid_received);
g_assert_cmpstr (e_cal_component_alarm_get_uid (al_received), ==, uid_received);
g_assert_cmpstr (e_cal_component_alarm_get_uid (al_expected), !=, uid_received);
g_assert_cmpstr (e_cal_component_alarm_get_uid (al_expected), !=, e_cal_component_alarm_get_uid (al_received));
}
g_assert_true (link1 == link2);
} else {
e_cal_component_remove_alarm (comp, e_cal_component_alarm_get_uid (expected->data));
g_assert_true (!e_cal_component_has_alarms (comp));
g_assert_null (e_cal_component_get_all_alarms (comp));
g_assert_null (e_cal_component_get_alarm_uids (comp));
}
}
g_slist_free_full (received, e_cal_component_alarm_free);
g_slist_free_full (received_uids, g_free);
}
static void
test_component_alarms (void)
{
struct _values {
const gchar *uid;
ECalComponentAlarmAction action;
const gchar *description;
gint trigger;
gboolean trigger_with_parameters;
} values[] = {
{ "alarm1", E_CAL_COMPONENT_ALARM_DISPLAY, "display reminder", -5, TRUE },
{ NULL, E_CAL_COMPONENT_ALARM_NONE, NULL, 0, FALSE }, /* terminator */
{ NULL, E_CAL_COMPONENT_ALARM_NONE, NULL, 0, FALSE }, /* terminator */
{ "alarm2", E_CAL_COMPONENT_ALARM_AUDIO, "audio reminder", 10, FALSE },
{ "alarm3", E_CAL_COMPONENT_ALARM_EMAIL, "email reminder", 0, TRUE },
{ "alarm4", E_CAL_COMPONENT_ALARM_PROCEDURE, "procedure reminder", -30, FALSE },
{ NULL, E_CAL_COMPONENT_ALARM_NONE, NULL, 0, FALSE }, /* terminator */
};
ECalComponent *comp;
GSList *alarms = NULL;
gint ii;
comp = e_cal_component_new_vtype (E_CAL_COMPONENT_EVENT);
g_assert_nonnull (comp);
for (ii = 0; ii < G_N_ELEMENTS (values); ii++) {
if (values[ii].uid) {
ECalComponentAlarm *alarm;
ECalComponentAlarmTriggerKind kind;
ICalDuration *duration;
duration = i_cal_duration_new_from_int (values[ii].trigger * 60);
if (values[ii].trigger < 0)
kind = E_CAL_COMPONENT_ALARM_TRIGGER_RELATIVE_START;
else
kind = E_CAL_COMPONENT_ALARM_TRIGGER_RELATIVE_END;
alarm = e_cal_component_alarm_new ();
e_cal_component_alarm_set_uid (alarm, values[ii].uid);
e_cal_component_alarm_set_action (alarm, values[ii].action);
e_cal_component_alarm_take_description (alarm, e_cal_component_text_new (values[ii].description, NULL));
e_cal_component_alarm_take_trigger (alarm, e_cal_component_alarm_trigger_new_relative (kind, duration));
if (values[ii].trigger_with_parameters) {
ECalComponentAlarmTrigger *trigger;
trigger = e_cal_component_alarm_get_trigger (alarm);
test_component_add_params_to_bag (e_cal_component_alarm_trigger_get_parameter_bag (trigger), ii + 1);
}
if (values[ii].trigger < 0) {
ECalComponentPropertyBag *bag;
ICalProperty *prop;
bag = e_cal_component_alarm_get_property_bag (alarm);
prop = i_cal_property_new_url ("https://www.gnome.org");
e_cal_component_property_bag_take (bag, prop);
prop = i_cal_property_new_carlevel (I_CAL_CARLEVEL_CARFULL1);
e_cal_component_property_bag_take (bag, prop);
g_assert_cmpint (e_cal_component_property_bag_get_count (bag), ==, 2);
}
e_cal_component_add_alarm (comp, alarm);
alarms = g_slist_prepend (alarms, alarm);
g_object_unref (duration);
} else {
alarms = g_slist_reverse (alarms);
verify_changes (comp, verify_component_alarms, alarms);
e_cal_component_remove_all_alarms (comp);
g_slist_free_full (alarms, e_cal_component_alarm_free);
alarms = NULL;
}
}
g_object_unref (comp);
g_assert_null (alarms);
}
static void
test_component_striperrors (void)
{
const gchar *vevent =
"BEGIN:VEVENT\r\n"
"DTSTART:20150102T100000Z\r\n"
"DTEND:20150102T100100Z\r\n"
"DTSTAMP:20150108T132939Z\r\n"
"UID:123\r\n"
"CREATED:20150102T181646Z\r\n"
"X-LIC-ERROR;X-LIC-ERRORTYPE=VALUE-PARSE-ERROR:No value for DESCRIPTION \r\n"
" property. Removing entire property:\r\n"
"LAST-MODIFIED:20150102T181722Z\r\n"
"X-LIC-ERROR;X-LIC-ERRORTYPE=VALUE-PARSE-ERROR:No value for LOCATION \r\n"
" property. Removing entire property:\r\n"
"SUMMARY:with errors\r\n"
"END:VEVENT\r\n";
ECalComponent *comp;
ICalComponent *icalcomp;
comp = e_cal_component_new_from_string (vevent);
g_assert_nonnull (comp);
icalcomp = e_cal_component_get_icalcomponent (comp);
g_assert_nonnull (icalcomp);
g_assert_cmpint (i_cal_component_count_properties (icalcomp, I_CAL_XLICERROR_PROPERTY), ==, 2);
e_cal_component_strip_errors (comp);
g_assert_cmpint (i_cal_component_count_properties (icalcomp, I_CAL_XLICERROR_PROPERTY), ==, 0);
g_object_unref (comp);
}
gint
main (gint argc,
gchar **argv)
{
g_test_init (&argc, &argv, NULL);
g_test_bug_base ("https://bugzilla.gnome.org/");
g_test_add_func ("/ECalComponent/struct/Alarm", test_component_struct_alarm);
g_test_add_func ("/ECalComponent/struct/Alarms", test_component_struct_alarms);
g_test_add_func ("/ECalComponent/struct/AlarmInstance", test_component_struct_alarm_instance);
g_test_add_func ("/ECalComponent/struct/AlarmRepeat", test_component_struct_alarm_repeat);
g_test_add_func ("/ECalComponent/struct/AlarmTrigger", test_component_struct_alarm_trigger);
g_test_add_func ("/ECalComponent/struct/Attendee", test_component_struct_attendee);
g_test_add_func ("/ECalComponent/struct/DateTime", test_component_struct_datetime);
g_test_add_func ("/ECalComponent/struct/Id", test_component_struct_id);
g_test_add_func ("/ECalComponent/struct/Organizer", test_component_struct_organizer);
g_test_add_func ("/ECalComponent/struct/ParameterBag", test_component_struct_parameter_bag);
g_test_add_func ("/ECalComponent/struct/Period", test_component_struct_period);
g_test_add_func ("/ECalComponent/struct/PropertyBag", test_component_struct_property_bag);
g_test_add_func ("/ECalComponent/struct/Range", test_component_struct_range);
g_test_add_func ("/ECalComponent/struct/Text", test_component_struct_text);
g_test_add_func ("/ECalComponent/vtype", test_component_vtype);
g_test_add_func ("/ECalComponent/uid", test_component_uid);
g_test_add_func ("/ECalComponent/categories", test_component_categories);
g_test_add_func ("/ECalComponent/classification", test_component_classification);
g_test_add_func ("/ECalComponent/comments", test_component_comments);
g_test_add_func ("/ECalComponent/comments-locale", test_component_comments_locale);
g_test_add_func ("/ECalComponent/completed", test_component_completed);
g_test_add_func ("/ECalComponent/contacts", test_component_contacts);
g_test_add_func ("/ECalComponent/created", test_component_created);
g_test_add_func ("/ECalComponent/descriptions", test_component_descriptions);
g_test_add_func ("/ECalComponent/descriptions-locale", test_component_descriptions_locale);
g_test_add_func ("/ECalComponent/dtend", test_component_dtend);
g_test_add_func ("/ECalComponent/dtstamp", test_component_dtstamp);
g_test_add_func ("/ECalComponent/dtstart", test_component_dtstart);
g_test_add_func ("/ECalComponent/due", test_component_due);
g_test_add_func ("/ECalComponent/exdates", test_component_exdates);
g_test_add_func ("/ECalComponent/exrules", test_component_exrules);
g_test_add_func ("/ECalComponent/geo", test_component_geo);
g_test_add_func ("/ECalComponent/lastmodified", test_component_lastmodified);
g_test_add_func ("/ECalComponent/organizer", test_component_organizer);
g_test_add_func ("/ECalComponent/percentcomplete", test_component_percentcomplete);
g_test_add_func ("/ECalComponent/priority", test_component_priority);
g_test_add_func ("/ECalComponent/recurid", test_component_recurid);
g_test_add_func ("/ECalComponent/rdates", test_component_rdates);
g_test_add_func ("/ECalComponent/rrules", test_component_rrules);
g_test_add_func ("/ECalComponent/sequence", test_component_sequence);
g_test_add_func ("/ECalComponent/status", test_component_status);
g_test_add_func ("/ECalComponent/summary", test_component_summary);
g_test_add_func ("/ECalComponent/summaries", test_component_summaries);
g_test_add_func ("/ECalComponent/summary-locale", test_component_summary_locale);
g_test_add_func ("/ECalComponent/transparency", test_component_transparency);
g_test_add_func ("/ECalComponent/url", test_component_url);
g_test_add_func ("/ECalComponent/attendees", test_component_attendees);
g_test_add_func ("/ECalComponent/location", test_component_location);
g_test_add_func ("/ECalComponent/attachments", test_component_attachments);
g_test_add_func ("/ECalComponent/alarms", test_component_alarms);
g_test_add_func ("/ECalComponent/striperrors", test_component_striperrors);
return g_test_run ();
}