diff --git a/lib/money.ex b/lib/money.ex index 5fd9198..9fd3ab2 100644 --- a/lib/money.ex +++ b/lib/money.ex @@ -580,7 +580,8 @@ defmodule Money do do_divide(currency, value, rem, count, acc) end - defp next_amount(0, -1, count) when count > 0, do: -1 + defp next_amount(0, rem, count) when count > 0 and rem < 0, do: -1 + defp next_amount(0, rem, count) when count < 0 and rem > 0, do: -1 defp next_amount(value, 0, _count), do: value defp next_amount(value, _rem, _count), do: increment_abs(value) diff --git a/test/money_test.exs b/test/money_test.exs index edd8f4d..d2c7bb5 100644 --- a/test/money_test.exs +++ b/test/money_test.exs @@ -241,6 +241,11 @@ defmodule MoneyTest do usd(-3) ] + assert Money.divide(Money.new(7, :USD), -2) == [ + usd(-4), + usd(-3) + ] + assert Money.divide(Money.new(-7, :USD), -2) == [ usd(4), usd(3) @@ -251,10 +256,47 @@ defmodule MoneyTest do usd(0) ] + assert Money.divide(Money.new(1, :USD), -2) == [ + usd(-1), + usd(0) + ] + assert Money.divide(Money.new(-1, :USD), -2) == [ usd(1), usd(0) ] + + assert Money.divide(Money.new(-3, :USD), 5) == [ + usd(-1), + usd(-1), + usd(-1), + usd(0), + usd(0) + ] + + assert Money.divide(Money.new(3, :USD), -5) == [ + usd(-1), + usd(-1), + usd(-1), + usd(0), + usd(0) + ] + + assert Money.divide(Money.new(-3, :USD), -5) == [ + usd(1), + usd(1), + usd(1), + usd(0), + usd(0) + ] + + assert Money.divide(Money.new(0, :USD), -5) == [ + usd(0), + usd(0), + usd(0), + usd(0), + usd(0) + ] end test "test div" do