DateTimeX-Lite

 view release on metacpan or  search on metacpan

t/38local-subtract.t  view on Meta::CPAN

    is( DateTimeX::Lite->compare( $dt2->clone->add_duration($dur2), $dt1 ), 0,
        'subtraction is reversible' );
    is( DateTimeX::Lite->compare( $dt1->clone->subtract_duration($dur2), $dt2 ), 0,
        'subtraction is doubly reversible' );
}

{
    my $dt1 = DateTimeX::Lite->new( year => 2003, month => 4, day => 6,
                             hour => 1, minute => 58,
                             time_zone => "America/Chicago",
                           );

    my $dt2 = DateTimeX::Lite->new( year => 2003, month => 4, day => 6,
                             hour => 3, minute => 1,
                             time_zone => "America/Chicago",
                           );

    my $dur = $dt2->subtract_datetime($dt1);

    my %deltas = $dur->deltas;
    is( $deltas{months}, 0, 'delta_months is 0' );
    is( $deltas{days}, 0, 'delta_days is 0' );
    is( $deltas{minutes}, 3, 'delta_minutes is 3' );
    is( $deltas{seconds}, 0, 'delta_seconds is 0' );
    is( $deltas{nanoseconds}, 0, 'delta_nanoseconds is 0' );

    is( DateTimeX::Lite->compare( $dt1->clone->add_duration($dur), $dt2 ), 0,
        'subtraction is reversible' );
    is( DateTimeX::Lite->compare( $dt2->clone->subtract_duration($dur), $dt1), 0,
        'subtraction is doubly reversible' );
}

{
    my $dt1 = DateTimeX::Lite->new( year => 2003, month => 4, day => 5,
                             hour => 1, minute => 58,
                             time_zone => "America/Chicago",
                           );

    my $dt2 = DateTimeX::Lite->new( year => 2003, month => 4, day => 6,
                             hour => 3, minute => 1,
                             time_zone => "America/Chicago",
                           );

    my $dur = $dt2->subtract_datetime($dt1);

    my %deltas = $dur->deltas;
    is( $deltas{months}, 0, 'delta_months is 0' );
    is( $deltas{days}, 1, 'delta_days is 1' );
    is( $deltas{minutes}, 3, 'delta_minutes is 3' );
    is( $deltas{seconds}, 0, 'delta_seconds is 0' );
    is( $deltas{nanoseconds}, 0, 'delta_nanoseconds is 0' );

    is( DateTimeX::Lite->compare( $dt1->clone->add_duration($dur), $dt2 ), 0,
        'dt1 + dur = dt2' );
    # this are two examples from the docs
    is( DateTimeX::Lite->compare( $dt2->clone->subtract_duration($dur),
                           $dt1->clone->add( hours => 1 ) ),
        0,
        'dt2 - dur != dt1 (not reversible)' );
    is( DateTimeX::Lite->compare( $dt2->clone->subtract_duration( $dur->clock_duration )
                               ->subtract_duration( $dur->calendar_duration ),
                           $dt1 ),
        0,
        'dt2 - dur->clock - dur->cal = dt1 (reversible when componentized)' );

    my $dur2 = $dt1->subtract_datetime($dt2);
    my %deltas2 = $dur2->deltas;
    is( $deltas2{months}, 0, 'delta_months is 0' );
    is( $deltas2{days}, -1, 'delta_days is 1' );
    is( $deltas2{minutes}, -3, 'delta_minutes is 3' );
    is( $deltas2{seconds}, 0, 'delta_seconds is 0' );
    is( $deltas2{nanoseconds}, 0, 'delta_nanoseconds is 0' );
    is( $dt2->clone->add_duration($dur2)->iso8601, '2003-04-05T02:58:00', 'dt2 + dur2 != dt1' );
    is( DateTimeX::Lite->compare( $dt2->clone->add_duration( $dur2->clock_duration )
                               ->add_duration( $dur2->calendar_duration ),
                           $dt1 ),
        0,
        'dt2 + dur2->clock + dur2->cal = dt1' );
    is( DateTimeX::Lite->compare( $dt1->clone->subtract_duration($dur2), $dt2 ), 0,
        'dt1 - dur2 = dt2' );

}

# These tests makes sure that days with DST changes are "normal" when
# they're the smaller operand
{
    my $dt1 = DateTimeX::Lite->new( year => 2003, month => 4, day => 6,
                             hour => 3, minute => 1,
                             time_zone => "America/Chicago",
                           );

    my $dt2 = DateTimeX::Lite->new( year => 2003, month => 4, day => 7,
                             hour => 3, minute => 2,
                             time_zone => "America/Chicago",
                           );

    my $dur = $dt2->subtract_datetime($dt1);

    my %deltas = $dur->deltas;
    is( $deltas{months}, 0, 'delta_months is 0' );
    is( $deltas{days}, 1, 'delta_days is 1' );
    is( $deltas{minutes}, 1, 'delta_minutes is 1' );
    is( $deltas{seconds}, 0, 'delta_seconds is 0' );
    is( $deltas{nanoseconds}, 0, 'delta_nanoseconds is 0' );

    my $dur2 = $dt1->subtract_datetime($dt2);

    my %deltas2 = $dur2->deltas;
    is( $deltas2{months}, 0, 'delta_months is 0' );
    is( $deltas2{days}, -1, 'delta_days is -1' );
    is( $deltas2{minutes}, -1, 'delta_minutes is -1' );
    is( $deltas2{seconds}, 0, 'delta_seconds is 0' );
    is( $deltas2{nanoseconds}, 0, 'delta_nanoseconds is 0' );

}

{
    my $dt1 = DateTimeX::Lite->new( year => 2003, month => 4, day => 5,
                             hour => 1, minute => 58,
                             time_zone => "America/Chicago",
                           );

    my $dt2 = DateTimeX::Lite->new( year => 2003, month => 4, day => 7,
                             hour => 2, minute => 1,
                             time_zone => "America/Chicago",
                           );

    my $dur = $dt2->subtract_datetime($dt1);

    my %deltas = $dur->deltas;
    is( $deltas{months}, 0, 'delta_months is 0' );
    is( $deltas{days}, 2, 'delta_days is 2' );
    is( $deltas{minutes}, 3, 'delta_minutes is 3' );
    is( $deltas{seconds}, 0, 'delta_seconds is 0' );
    is( $deltas{nanoseconds}, 0, 'delta_nanoseconds is 0' );



( run in 1.827 second using v1.01-cache-2.11-cpan-ff9377addf4 )