def test_comparison(): price1 = CurrencyWithTax(Currency(10, "EUR"), Currency(15, "EUR")) price2 = CurrencyWithTax(Currency(30, "EUR"), Currency(45, "EUR")) price_range1 = CurrencyRangeTax(price1, price2) price3 = CurrencyWithTax(Currency(40, "EUR"), Currency(60, "EUR")) price4 = CurrencyWithTax(Currency(80, "EUR"), Currency(120, "EUR")) price_range2 = CurrencyRangeTax(price3, price4) assert price_range1 == CurrencyRangeTax(price1, price2) assert price_range1 != price_range2 assert price_range1 != CurrencyRangeTax(price1, price1) assert price_range1 != CurrencyRangeTax( CurrencyWithTax(Currency(10, "USD"), Currency(15, "USD")), CurrencyWithTax(Currency(30, "USD"), Currency(45, "USD")), ) assert price_range1 != price1
def test_zero_clipping(): price = CurrencyWithTax(Currency(10, "USD"), Currency(10, "USD")) result = fixed_discount(price, Currency(30, "USD")) assert result.net == Currency(0, "USD") assert result.gross == Currency(0, "USD")
def test_ge(): assert Currency(5, "USD") >= Currency(5, "USD") assert not Currency(5, "USD") >= Currency(6, "USD") assert Currency(7, "USD") >= Currency(6, "USD") with pytest.raises(ValueError): Currency(6, "USD") >= Currency(6, "GBP")
def test_subtraction_with_taxed_money_range(): price1 = CurrencyWithTax(Currency(10, "EUR"), Currency(15, "EUR")) price2 = CurrencyWithTax(Currency(30, "EUR"), Currency(45, "EUR")) price_range1 = CurrencyRangeTax(price1, price2) price3 = CurrencyWithTax(Currency(40, "EUR"), Currency(60, "EUR")) price4 = CurrencyWithTax(Currency(80, "EUR"), Currency(120, "EUR")) price_range2 = CurrencyRangeTax(price3, price4) result = price_range2 - price_range1 assert result.start == price3 - price1 assert result.stop == price4 - price2 with pytest.raises(ValueError): price_range2 - CurrencyRangeTax( CurrencyWithTax(Currency(1, "BTC"), Currency(1, "BTC")), CurrencyWithTax(Currency(2, "BTC"), Currency(2, "BTC")), )
def test_add(): assert Currency(5, "USD") + Currency(6, "USD") == Currency(11, "USD") assert not Currency(5, "USD") + Currency(6, "USD") == Currency(12, "USD") with pytest.raises(ValueError): Currency(5, "USD") + Currency(6, "GBP")
def test_mul(): assert Currency(6, "USD") * 5 == Currency(30, "USD") assert 5 * Currency(4, "USD") == Currency(20, "USD") assert not Currency(5, "USD") * 8 == Currency(3, "USD")
def test_str(): currency = CurrencyWithTax(net=Currency(1, "USD"), gross=Currency(1, "USD")) assert str(currency) == "CurrencyWithTax(net=1 USD, gross=1 USD)"
def test_bool(): assert not Currency(0, "USD") assert Currency(1, "GBP")
def test_tax(): price = CurrencyWithTax(Currency(10, "USD"), Currency(15, "USD")) assert price.tax == Currency(5, "USD")
def test_tek_sum(): assert tek_sum([Currency(5, "USD"), Currency(10, "USD")]) == Currency(15, "USD") with pytest.raises(TypeError): tek_sum([])
def test_precision(): price = CurrencyWithTax(Currency("1.01", "BTC"), Currency("1.01", "BTC")) result = percentage_discount(price, percentage=50) assert result.net == Currency("0.51", "BTC") assert result.net == Currency("0.51", "BTC")
def test_currency_mismatch(): with pytest.raises(ValueError): fixed_discount( CurrencyWithTax(Currency(10, "BTC"), Currency(10, "BTC")), Currency(10, "USD"), )
def test_discount_from_net(): price = CurrencyWithTax(Currency(100, "PLN"), Currency(200, "PLN")) result = fractional_discount(price, Decimal("0.5"), from_gross=False) assert result.net == Currency(50, "PLN") assert result.gross == Currency(150, "PLN")
def test_str(): price1 = Currency(10, "EUR") price2 = Currency(30, "EUR") price_range = CurrencyRange(price1, price2) assert str(price_range) == ("CurrencyRange(10 EUR 30 EUR)")
def test_sub(): currency1 = CurrencyWithTax(Currency(10, "USD"), Currency(15, "USD")) currency2 = CurrencyWithTax(Currency(30, "USD"), Currency(45, "USD")) assert currency2 - currency1 == CurrencyWithTax( Currency(20, "USD"), Currency(30, "USD") ) currency3 = currency1 - Currency(5, "USD") assert currency3.net == Currency(5, "USD") assert currency3.gross == Currency(10, "USD") with pytest.raises(ValueError): currency1 - CurrencyWithTax(Currency(10, "GBP"), Currency(10, "GBP")) with pytest.raises(TypeError): currency1 - 1
def test_addition_with_other_types(): price1 = Currency(10, "EUR") price2 = Currency(30, "EUR") price_range = CurrencyRange(price1, price2) with pytest.raises(TypeError): price_range + 1
def test_mult(): currency1 = CurrencyWithTax(Currency(10, "EUR"), Currency(20, "EUR")) assert currency1 * 2 == CurrencyWithTax(Currency(20, "EUR"), Currency(40, "EUR")) assert 2 * currency1 == currency1 * 2 with pytest.raises(TypeError): currency1 * currency1
def test_div(): assert Currency(12, "USD") / Currency(6, "USD") == Decimal(2) assert Currency(12, "USD") / Decimal("2") == Currency(6, "USD")
def test_div(): currency1 = CurrencyWithTax(Currency(10, "EUR"), Currency(20, "EUR")) assert currency1 / 2 == CurrencyWithTax(Currency(5, "EUR"), Currency(10, "EUR")) with pytest.raises(TypeError): currency1 / currency1
def test_sub(): assert Currency(6, "USD") - Currency(6, "USD") == Currency(0, "USD") assert Currency(5, "USD") - Currency(4, "USD") == Currency(1, "USD") assert not Currency(5, "USD") - Currency(4, "USD") == Currency(3, "USD") with pytest.raises(ValueError): Currency(5, "USD") - Currency(6, "GBP")
def test_comparison(): currency = CurrencyWithTax(Currency(10, "EUR"), Currency(15, "EUR")) assert currency == CurrencyWithTax(Currency(10, "EUR"), Currency(15, "EUR")) assert currency != CurrencyWithTax(Currency(20, "EUR"), Currency(30, "EUR")) assert currency != CurrencyWithTax(Currency(10, "GBP"), Currency(15, "GBP")) assert currency != Currency(10, "EUR") assert currency < CurrencyWithTax(Currency(20, "EUR"), Currency(30, "EUR")) assert currency <= CurrencyWithTax(Currency(10, "EUR"), Currency(15, "EUR")) assert currency <= CurrencyWithTax(Currency(20, "EUR"), Currency(30, "EUR")) assert currency > CurrencyWithTax(Currency(1, "EUR"), Currency(1, "EUR")) assert currency >= CurrencyWithTax(Currency(10, "EUR"), Currency(15, "EUR")) assert currency >= CurrencyWithTax(Currency(1, "EUR"), Currency(1, "EUR")) assert not currency <= CurrencyWithTax(Currency(1, "EUR"), Currency(1, "EUR")) assert not currency >= CurrencyWithTax(Currency(20, "EUR"), Currency(30, "EUR")) with pytest.raises(ValueError): currency < CurrencyWithTax(Currency(10, "GBP"), Currency(15, "GBP")) with pytest.raises(TypeError): currency >= Currency(1, "EUR") with pytest.raises(TypeError): currency < Currency(20, "EUR")
def test_str(): currency = Currency(5, "USD") assert str(currency) == "5 USD"
def test_quantize(): price = CurrencyWithTax(Currency("1.001", "EUR"), Currency("1.001", "EUR")) assert price.quantize() == ( CurrencyWithTax(Currency("1.00", "EUR"), Currency("1.00", "EUR")) )
def test_range(): price_range = CurrencyRange(Currency(10, "BTC"), Currency(20, "BTC")) result = flat_tax(price_range, 1) assert result.start == CurrencyWithTax(Currency(10, "BTC"), Currency(20, "BTC")) assert result.stop == CurrencyWithTax(Currency(20, "BTC"), Currency(40, "BTC")) price_range = CurrencyRangeTax( CurrencyWithTax(Currency(10, "BTC"), Currency(10, "BTC")), CurrencyWithTax(Currency(20, "BTC"), Currency(20, "BTC")), ) result = flat_tax(price_range, 1) assert result.start == CurrencyWithTax(Currency(10, "BTC"), Currency(20, "BTC")) assert result.stop == CurrencyWithTax(Currency(20, "BTC"), Currency(40, "BTC"))
def test_currency(): price = CurrencyWithTax(Currency(1, "PLN"), Currency(1, "PLN")) assert price.currency == "PLN"
def test_subtraction_with_other_types(): price1 = CurrencyWithTax(Currency(40, "EUR"), Currency(60, "EUR")) price2 = CurrencyWithTax(Currency(80, "EUR"), Currency(120, "EUR")) price_range = CurrencyRangeTax(price1, price2) with pytest.raises(TypeError): price_range - 1
def test_currency(): price1 = Currency(10, "EUR") price2 = Currency(30, "EUR") price_range = CurrencyRange(price1, price2) assert price_range.currency == "EUR"
def test_currency(): price1 = CurrencyWithTax(Currency(10, "EUR"), Currency(15, "EUR")) price2 = CurrencyWithTax(Currency(30, "EUR"), Currency(45, "EUR")) price_range = CurrencyRangeTax(price1, price2) assert price_range.currency == "EUR"
def test_application(): price = CurrencyWithTax(Currency(30, "BTC"), Currency(30, "BTC")) discount = partial(fixed_discount, discount=Currency(10, "BTC")) result = discount(price) assert result.net == Currency(20, "BTC") assert result.gross == Currency(20, "BTC") price_range = CurrencyRange(price.net, price.net) result = discount(price_range) assert result.start == Currency(20, "BTC") assert result.stop == Currency(20, "BTC") price_range = CurrencyRangeTax(price, price) result = discount(price_range) assert result.start == CurrencyWithTax(Currency(20, "BTC"), Currency(20, "BTC")) assert result.stop == CurrencyWithTax(Currency(20, "BTC"), Currency(20, "BTC")) with pytest.raises(TypeError): discount(1)