summaryrefslogtreecommitdiffstats
path: root/src/icalwrap/icalvevent.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/icalwrap/icalvevent.rs')
-rw-r--r--src/icalwrap/icalvevent.rs71
1 files changed, 68 insertions, 3 deletions
diff --git a/src/icalwrap/icalvevent.rs b/src/icalwrap/icalvevent.rs
index 10d7102..12b1ab9 100644
--- a/src/icalwrap/icalvevent.rs
+++ b/src/icalwrap/icalvevent.rs
@@ -50,10 +50,12 @@ impl IcalVEvent {
}
}
- pub fn get_duration(&self) -> Option<IcalDuration> {
+ fn get_duration_internal(&self) -> Option<IcalDuration> {
unsafe {
let duration = ical::icalcomponent_get_duration(self.ptr);
- if ical::icaldurationtype_is_bad_duration(duration) == 0 {
+ if ical::icaldurationtype_is_bad_duration(duration) == 0
+ && ical::icaldurationtype_is_null_duration(duration) == 0
+ {
Some(IcalDuration::from(duration))
} else {
None
@@ -61,6 +63,19 @@ impl IcalVEvent {
}
}
+ pub fn get_duration(&self) -> Option<IcalDuration> {
+ match self.get_duration_internal() {
+ Some(duration) => Some(duration),
+ None => {
+ if self.get_dtstart()?.is_date() {
+ Some(IcalDuration::from_seconds(24 * 60 * 60))
+ } else {
+ Some(IcalDuration::from_seconds(0))
+ }
+ }
+ }
+ }
+
pub fn get_dtstart(&self) -> Option<IcalTime> {
unsafe {
let dtstart = ical::icalcomponent_get_dtstart(self.ptr);
@@ -249,12 +264,61 @@ mod tests {
}
#[test]
- fn test_get_duration() {
+ fn test_get_duration_internal_normal() {
let cal = IcalVCalendar::from_str(testdata::TEST_EVENT_MULTIDAY, None).unwrap();
let event = cal.get_principal_event();
assert_eq!(
Some(IcalDuration::from_seconds(10 * 24 * 60 * 60 + 18 * 60 * 60)),
+ event.get_duration_internal()
+ );
+ }
+
+ #[test]
+ fn test_get_duration_normal() {
+ let cal = IcalVCalendar::from_str(testdata::TEST_EVENT_MULTIDAY, None).unwrap();
+ let event = cal.get_principal_event();
+
+ assert_eq!(
+ Some(IcalDuration::from_seconds(10 * 24 * 60 * 60 + 18 * 60 * 60)),
+ event.get_duration()
+ );
+ }
+
+ #[test]
+ fn test_get_duration_inernal_startdate_only() {
+ let cal = IcalVCalendar::from_str(testdata::TEST_DTSTART_ONLY_DATE, None).unwrap();
+ let event = cal.get_principal_event();
+
+ assert!(event.get_duration_internal().is_none());
+ }
+
+ #[test]
+ fn test_get_duration_startdate_only() {
+ let cal = IcalVCalendar::from_str(testdata::TEST_DTSTART_ONLY_DATE, None).unwrap();
+ let event = cal.get_principal_event();
+
+ assert_eq!(
+ Some(IcalDuration::from_seconds(24 * 60 * 60)),
+ event.get_duration()
+ );
+ }
+
+ #[test]
+ fn test_get_duration_internal_startdatetime_only() {
+ let cal = IcalVCalendar::from_str(testdata::TEST_DTSTART_ONLY_DATETIME, None).unwrap();
+ let event = cal.get_principal_event();
+
+ assert!(event.get_duration_internal().is_none());
+ }
+
+ #[test]
+ fn test_get_duration_startdatetime_only() {
+ let cal = IcalVCalendar::from_str(testdata::TEST_DTSTART_ONLY_DATETIME, None).unwrap();
+ let event = cal.get_principal_event();
+
+ assert_eq!(
+ Some(IcalDuration::from_seconds(0)),
event.get_duration()
);
}
@@ -296,4 +360,5 @@ mod tests {
assert_eq!(None, event.get_location());
}
+
}