diff --git a/lib/DDG/Goodie/DurationCalculator.pm b/lib/DDG/Goodie/DurationCalculator.pm index 3488027ff53..36fdbed7fa1 100644 --- a/lib/DDG/Goodie/DurationCalculator.pm +++ b/lib/DDG/Goodie/DurationCalculator.pm @@ -70,7 +70,10 @@ sub get_result { my ($values1, $values2, $action) = @_; return format_result ($values1 + $values2) if $action eq '+'; - return format_result ($values1 - $values2) if $action eq '-'; + + my $subtract = format_result ($values1 - $values2) if $action eq '-'; + return "-($subtract)" if DateTime::Duration->compare($values1, $values2) < 0; + return $subtract; } handle query_lc => sub { diff --git a/t/DurationCalculator.t b/t/DurationCalculator.t index d4f2656c3a2..43d9ca54d35 100644 --- a/t/DurationCalculator.t +++ b/t/DurationCalculator.t @@ -38,7 +38,16 @@ my $sub_query_minus = "2 days minus 43 hours"; my $value_test = "1 second - 1000000000 nanoseconds"; my $month_test = "4 weeks + 2 days"; my $year_test = "23 months + 30 days"; -my $invalid_query = "2 day 2 day + 4 day"; +my $neg_query1 = "1 year - 400 days"; +my $neg_query2 = "1 day + -24 hours"; +my $neg_query3 = "-1 week - 3 days"; +my $neg_query4 = "-1 week + 7 days"; +my $invalid_query1 = "2 day 2 day + 4 day"; +my $invalid_query2 = "1 day + 1 hay"; +my $invalid_query3 = "-54minutes - 39"; +my $invalid_query4 = "4 hours"; + + ddg_goodie_test( [qw( DDG::Goodie::DurationCalculator )], @@ -49,7 +58,14 @@ ddg_goodie_test( $value_test => build_test("no time", $value_test), $month_test => build_test("1 month", $month_test), $year_test => build_test("2 years", $year_test), - $invalid_query => undef, + $neg_query1 => build_test("-(1 month and 3 days)", $neg_query1), + $neg_query2 => build_test("no time", $neg_query2), + $neg_query3 => build_test("-(1 week and 3 days)", $neg_query3), + $neg_query4 => build_test("no time", $neg_query4), + $invalid_query1 => undef, + $invalid_query3 =>undef, + $invalid_query2 =>undef, + $invalid_query4 =>undef, ); done_testing;