with Ada.Assertions; use Ada.Assertions; with Cashe; use Cashe; with ISO.Currencies; use ISO.Currencies; with Cashe.Money_Handling; use Cashe.Money_Handling; with Cashe.Currency_Handling; use Cashe.Currency_Handling; with Cashe.Exchange; use Cashe.Exchange; package body Cashe_Exchange_Tests is procedure Run_Tests is -- Create some currencies to test Bitcoin : constant Custom_Currency := Create (Code => "BTC", Minor_Unit => 8, Name => "Bitcoin", Symbol => "฿"); USD : constant Currency := (Key => C_USD); JPY : constant Currency := (Key => C_JPY); EUR : constant Currency := (Key => C_EUR); -- based on the Jul. 9, 2023 exchange rate -- from openexchangerates.org. BTC_to_USD : constant Decimal := 30196.620159; USD_to_BTC : constant Decimal := 0.0000331163; USD_to_JPY : constant Decimal := 142.17488666; JPY_to_USD : constant Decimal := 0.007033591; USD_to_EUR : constant Decimal := 0.911922; EUR_to_USD : constant Decimal := 1.0965850149; -- Create an exchange. USD_Ex : Currency_Exchange; EUR_Ex : Currency_Exchange; BTC_Ex : Currency_Exchange; No_Base : Currency_Exchange; begin -- Set the base Assert (not USD_Ex.Base_Is_Set); USD_Ex.Set_Base ("USD"); EUR_Ex.Set_Base (From_Code ("EUR")); BTC_Ex.Set_Base (Bitcoin); Assert (USD_Ex.Base_Is_Set); Assert (EUR_Ex.Base_Is_Set); Assert (BTC_Ex.Base_Is_Set); -- Set some exchange rates. -- Bitcoin-USD BTC_Ex.Set_Rate ("USD", BTC_to_USD); BTC_Ex.Set_Rate ("USD", Bitcoin, USD_to_BTC); No_Base.Set_Rate ("USD", Bitcoin, USD_to_BTC); -- USD-JPY USD_Ex.Set_Rate (From_Code ("JPY"), USD_to_JPY); USD_Ex.Set_Rate ("JPY", USD, JPY_to_USD); No_Base.Set_Rate (From_Code ("JPY"), "USD", JPY_to_USD); -- EUR-USD EUR_Ex.Set_Rate ("USD", EUR_to_USD); EUR_Ex.Set_Rate ("USD", EUR, USD_to_EUR); No_Base.Set_Rate ("USD", From_Code ("EUR"), USD_to_EUR); -- Test btc-usd Assert (BTC_Ex.Rate ("USD") = BTC_to_USD); Assert (No_Base.Rate ("USD", Bitcoin) = USD_to_BTC); Assert (BTC_Ex.Convert (From_Major (123.45, USD), Bitcoin) = From_Major (0.0040882059, Bitcoin)); Assert (BTC_Ex.Convert (From_Major (123.45678912, Bitcoin), USD) = From_Major (3727977.7671, USD)); Assert (BTC_Ex.Convert (From_Major (123.45, USD), Bitcoin) = No_Base.Convert (From_Major (123.45, USD), Bitcoin)); -- Test jpy-usd Assert (USD_Ex.Rate (From_Code ("JPY")) = USD_to_JPY); Assert (No_Base.Rate (From_Code ("JPY"), "USD") = JPY_to_USD); Assert (USD_Ex.Convert (From_Major (123.45, USD), JPY) = From_Major (17551, JPY)); Assert (USD_Ex.Convert (From_Major (12345, JPY), USD) = From_Major (86.829680614, USD)); Assert (USD_Ex.Convert (From_Major (12345, JPY), USD) = No_Base.Convert (From_Major (12345, JPY), USD)); -- Test eur-usd Assert (EUR_Ex.Rate ("USD") = EUR_to_USD); Assert (No_Base.Rate ("USD", "EUR") = USD_to_EUR); Assert (EUR_Ex.Convert (From_Major (123.45, USD), EUR) = From_Major (112.5767709, EUR)); Assert (EUR_Ex.Convert (From_Major (123.45, EUR), USD) = From_Major (135.3734201, USD)); Assert (EUR_Ex.Convert (From_Major (123.45, EUR), USD) = No_Base.Convert (From_Major (123.45, EUR), USD)); end Run_Tests; end Cashe_Exchange_Tests;