#!/usr/bin/perl -w use strict; use Test::More tests => 60; use DateTime::Format::ICal; my $ical = 'DateTime::Format::ICal'; { my $dur = $ical->parse_duration('PT3S'); ok( $dur->is_positive, 'duration should be positive' ); is( $dur->weeks, 0, '0 weeks' ); is( $dur->days, 0, '0 days' ); is( $dur->hours, 0, '0 hours' ); is( $dur->minutes, 0, '0 minutes' ); is( $dur->seconds, 3, '3 seconds' ); is( $ical->format_duration($dur), '+PT3S', 'output should match input' ); } { my $dur = $ical->parse_duration('PT4H3S'); ok( $dur->is_positive, 'duration should be positive' ); is( $dur->weeks, 0, '0 weeks' ); is( $dur->days, 0, '0 days' ); is( $dur->hours, 4, '4 hours' ); is( $dur->minutes, 0, '0 minutes' ); is( $dur->seconds, 3, '3 seconds' ); is( $ical->format_duration($dur), '+PT4H3S', 'output should match input' ); } { my $dur = $ical->parse_duration('PT4H25M3S'); ok( $dur->is_positive, 'duration should be positive' ); is( $dur->weeks, 0, '0 weeks' ); is( $dur->days, 0, '0 days' ); is( $dur->hours, 4, '4 hours' ); is( $dur->minutes, 25, '25 minutes' ); is( $dur->seconds, 3, '3 seconds' ); is( $ical->format_duration($dur), '+PT4H25M3S', 'output should match input' ); } { my $dur = $ical->parse_duration('P22DT4H25M3S'); ok( $dur->is_positive, 'duration should be positive' ); is( $dur->weeks, 3, '3 weeks' ); is( $dur->days, 1, '1 days' ); is( $dur->hours, 4, '4 hours' ); is( $dur->minutes, 25, '25 minutes' ); is( $dur->seconds, 3, '3 seconds' ); is( $ical->format_duration($dur), '+P3W1DT4H25M3S', 'output should match input' ); } { my $dur = $ical->parse_duration('P4W22DT4H25M3S'); ok( $dur->is_positive, 'duration should be positive' ); is( $dur->weeks, 7, '7 weeks' ); is( $dur->days, 1, '1 days' ); is( $dur->hours, 4, '4 hours' ); is( $dur->minutes, 25, '25 minutes' ); is( $dur->seconds, 3, '3 seconds' ); is( $ical->format_duration($dur), '+P7W1DT4H25M3S', 'output should match input' ); } { my $dur = $ical->parse_duration('P4W2D'); ok( $dur->is_positive, 'duration should be positive' ); is( $dur->weeks, 4, '4 weeks' ); is( $dur->days, 2, '2 days' ); is( $dur->hours, 0, '0 hours' ); is( $dur->minutes, 0, '0 minutes' ); is( $dur->seconds, 0, '0 seconds' ); is( $ical->format_duration($dur), '+P4W2D', 'output should match input' ); } { my $dur = $ical->parse_duration('-P4W2D'); ok( $dur->is_negative, 'duration should be negative' ); is( $dur->weeks, 4, '4 weeks' ); is( $dur->days, 2, '2 days' ); is( $dur->hours, 0, '0 hours' ); is( $dur->minutes, 0, '0 minutes' ); is( $dur->seconds + 0, 0, '0 seconds' ); is( $ical->format_duration($dur), '-P4W2D', 'output should match input' ); } { my $dur = $ical->parse_duration('PT0S'); ok( ! $dur->is_positive, 'duration is not positive' ); ok( ! $dur->is_negative, 'duration is not negative' ); ok( $dur->is_zero, 'duration is zero' ); is( $dur->weeks, 0, '0 weeks' ); is( $dur->days, 0, '0 days' ); is( $dur->hours, 0, '0 hours' ); is( $dur->minutes, 0, '0 minutes' ); is( $dur->seconds, 0, '0 seconds' ); is( $ical->format_duration($dur), '+PT0S', 'output should match input' ); } { eval { $ical->parse_duration('+PT') }; like( $@, qr/Invalid.+/, "Invalid duration string" ); } { my $dur = DateTime::Duration->new( minutes => 5 ); is( $ical->format_duration($dur), '+PT5M', 'minutes only' ); }