From ea5d4677d5eade4733ec301bfdb195e1bcb60f71 Mon Sep 17 00:00:00 2001 From: Kasper Date: Mon, 29 Jun 2026 11:42:42 +0200 Subject: [PATCH] Update tests --- src/currency.rs | 12 ++++++------ src/units.rs | 39 +++++++++++++++++++++++++-------------- 2 files changed, 31 insertions(+), 20 deletions(-) diff --git a/src/currency.rs b/src/currency.rs index 5298c13..b347ada 100644 --- a/src/currency.rs +++ b/src/currency.rs @@ -18,15 +18,15 @@ static CURRENCY_CACHE: RwLock>> = RwLock::new(None); pub const BASE_CURRENCY: Unit = Unit::EUR; #[derive(Deserialize, Debug)] -struct CurrencyRate { +pub struct CurrencyRate { #[allow(dead_code)] - date: String, - base: String, - quote: String, - rate: serde_json::Number, + pub date: String, + pub base: String, + pub quote: String, + pub rate: serde_json::Number, } -fn set_currency_cache(rates: Vec) -> Result<(), String> { +pub fn set_currency_cache(rates: Vec) -> Result<(), String> { let mut cache = HashMap::with_capacity(rates.len() + 1); // Add EUR as base diff --git a/src/units.rs b/src/units.rs index 61760fd..57c3689 100644 --- a/src/units.rs +++ b/src/units.rs @@ -1014,6 +1014,8 @@ pub fn pow(left: Number, right: Number) -> Result { #[cfg(test)] mod tests { + use std::str::FromStr; + use fastnum::decimal::Context; use super::*; @@ -1418,6 +1420,29 @@ mod tests { assert!(diff_pct <= d!(0.00000001), "{a} !≈ {b}") } + #[test] + fn test_currency() { + use crate::currency::{CurrencyRate, set_currency_cache}; + use serde_json::Number; + + set_currency_cache(vec![CurrencyRate { + date: "2000-01-01".to_string(), + base: "EUR".to_string(), + quote: "NOK".to_string(), + rate: Number::from_str("11.2839").unwrap(), + }]) + .unwrap(); + + eval_test("1 EUR to NOK", "11.292 NOK"); + eval_test("11.292 EUR to NOK", "≈ 1.0000003236 EUR"); + eval_test("1 NOK to EUR", "≈ 0.0885583 EUR"); + eval_test("1 EUR/liter to NOK/liter", "11.292 NOK/liter"); + eval_test( + "1 EUR/gallon to NOK/liter", + "≈ 2.98303081522821190646982991481066303987 NOK/liter", + ); + } + #[test] fn test_unit_evals() { eval_test("100kg*sqm / 2s^2", "50j"); @@ -1445,19 +1470,5 @@ mod tests { eval_test("0 C to K", "273.15 K"); eval_test("8 megabytes per second * 1 minute", "480mb"); eval_test("8 megaFLOP per second * 1 minute", "480megaFLOP"); - - // Currency unit tests - these test parsing only - // Currency conversions require network access, so they're tested separately - #[cfg(not(target_arch = "wasm32"))] // Skip network-dependent tests on WASM - { - // Test that currency units can be parsed and basic conversions work - let result = crate::eval("100 USD", true, false).unwrap(); - assert_eq!(result.unit, vec![(USD, 1)]); - - let result = crate::eval("1 EUR", true, false).unwrap(); - assert_eq!(result.unit, vec![(EUR, 1)]); - - // Skip currency conversion tests as they require network access - } } } -- knotmirror 0.0.1