DateTime-Lite

 view release on metacpan or  search on metacpan

t/05.duration.t  view on Meta::CPAN


# NOTE: hours -> minutes conversion
subtest 'hours -> minutes conversion' => sub
{
    my $dur = DateTime::Lite::Duration->new( hours => 2 );
    is( $dur->delta_minutes, 120, '2 hours = 120 minutes in delta_minutes' );
};

# NOTE: nanosecond normalisation across seconds
subtest 'nanosecond normalisation across seconds' => sub
{
    my $dur = DateTime::Lite::Duration->new( nanoseconds => 1_500_000_000 );
    is( $dur->delta_seconds,     1,           'overflow ns: extra second' );
    is( $dur->delta_nanoseconds, 500_000_000, 'overflow ns: remaining nanoseconds' );
};

# NOTE: Predicates
subtest 'Predicates' => sub
{
    my $pos = DateTime::Lite::Duration->new( days => 1 );
    ok( $pos->is_positive,  'positive duration' );
    ok( !$pos->is_negative, 'not negative' );
    ok( !$pos->is_zero,     'not zero' );

    my $neg = DateTime::Lite::Duration->new( days => -1 );
    ok( $neg->is_negative,  'negative duration' );
    ok( !$neg->is_positive, 'not positive' );

    my $zero = DateTime::Lite::Duration->new;
    ok( $zero->is_zero, 'zero duration' );
};

# NOTE: inverse
subtest 'inverse' => sub
{
    my $dur = DateTime::Lite::Duration->new( days => 5, hours => 3 );
    my $inv = $dur->inverse;
    is( $inv->delta_days,    -5,   'inverse days' );
    is( $inv->delta_minutes, -180, 'inverse minutes (3h = 180m)' );
};

# NOTE: clone
subtest 'clone' => sub
{
    my $dur  = DateTime::Lite::Duration->new( months => 6 );
    my $dup  = $dur->clone;
    is( $dup->delta_months, 6, 'clone: months' );
    isnt( Scalar::Util::refaddr( $dur ), Scalar::Util::refaddr( $dup ), 'clone is a different reference' );
};

# NOTE: deltas() hash
subtest 'deltas() hash' => sub
{
    my $dur = DateTime::Lite::Duration->new( days => 3, seconds => 10 );
    my %d   = $dur->deltas;
    is( $d{days},    3,  'deltas: days' );
    is( $d{seconds}, 10, 'deltas: seconds' );
    is( $d{months},  0,  'deltas: months defaults to 0' );
};

# NOTE: calendar_duration / clock_duration
subtest 'calendar_duration / clock_duration' => sub
{
    my $dur = DateTime::Lite::Duration->new(
        months => 2, days => 5, hours => 3, seconds => 10
    );

    my $cal = $dur->calendar_duration;
    is( $cal->delta_months,  2, 'calendar_duration: months' );
    is( $cal->delta_days,    5, 'calendar_duration: days' );
    is( $cal->delta_minutes, 0, 'calendar_duration: no minutes' );

    my $clk = $dur->clock_duration;
    is( $clk->delta_minutes, 180, 'clock_duration: minutes (3h)' );
    is( $clk->delta_seconds, 10,  'clock_duration: seconds' );
    is( $clk->delta_months,  0,   'clock_duration: no months' );
};

# NOTE: end_of_month modes
subtest 'end_of_month modes' => sub
{
    my $dur = DateTime::Lite::Duration->new( months => 1, end_of_month => 'limit' );
    ok( $dur->is_limit_mode,     'limit mode' );
    ok( !$dur->is_wrap_mode,     'not wrap mode' );
    ok( !$dur->is_preserve_mode, 'not preserve mode' );
    is( $dur->end_of_month_mode, 'limit', 'end_of_month_mode()' );
};

# NOTE: Overloaded multiplication
subtest 'Overloaded multiplication' => sub
{
    my $dur  = DateTime::Lite::Duration->new( days => 3 );
    my $dur2 = $dur * 2;
    is( $dur2->delta_days, 6, 'overloaded *: days doubled' );
};

# NOTE: compare()
subtest 'compare()' => sub
{
    my $d1 = DateTime::Lite::Duration->new( days => 1 );
    my $d2 = DateTime::Lite::Duration->new( days => 2 );
    is( DateTime::Lite::Duration->compare( $d1, $d2 ), -1, 'compare: d1 < d2' );
    is( DateTime::Lite::Duration->compare( $d2, $d1 ),  1, 'compare: d2 > d1' );
    is( DateTime::Lite::Duration->compare( $d1, $d1 ),  0, 'compare: equal' );
};

# NOTE: in_units()
subtest 'in_units()' => sub
{
    # 14 months = 1 year + 2 months
    my $dur = DateTime::Lite::Duration->new( months => 14, days => 9, minutes => 125 );

    is( $dur->in_units( 'months' ),   14, 'in_units(months): total months' );
    is( $dur->in_units( 'days' ),      9, 'in_units(days): total days' );
    is( $dur->in_units( 'minutes' ), 125, 'in_units(minutes): total minutes' );

    # years + remaining months
    my( $years, $months ) = $dur->in_units( 'years', 'months' );
    is( $years,  1, 'in_units(years,months): years' );
    is( $months, 2, 'in_units(years,months): remainder months' );

    # weeks + remaining days
    my $dur2 = DateTime::Lite::Duration->new( days => 16 );
    my( $weeks, $days ) = $dur2->in_units( 'weeks', 'days' );
    is( $weeks, 2, 'in_units(weeks,days): weeks' );
    is( $days,  2, 'in_units(weeks,days): remainder days' );

    # hours + remaining minutes
    my $dur3 = DateTime::Lite::Duration->new( minutes => 135 );
    my( $hours, $mins ) = $dur3->in_units( 'hours', 'minutes' );
    is( $hours,  2, 'in_units(hours,minutes): hours' );



( run in 1.164 second using v1.01-cache-2.11-cpan-8f98c5d2c55 )