From cd812527635899ce569b3680598704067092cb92 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Felipe=20Torres=20Gonz=C3=A1lez?= Date: Mon, 20 Jan 2025 13:38:39 +0100 Subject: [PATCH] Add unit tests that shall pass once the fix is implemented Changes: - Rstest crate has been added to simplify the unit tests definitions. - Add unit tests that cover the use cases that are meant to be fixed. --- fluent-bundle/Cargo.toml | 1 + fluent-bundle/src/types/number.rs | 94 ++++++++++++++++++++++++++++++- 2 files changed, 94 insertions(+), 1 deletion(-) diff --git a/fluent-bundle/Cargo.toml b/fluent-bundle/Cargo.toml index 02c72737..a4245f3f 100644 --- a/fluent-bundle/Cargo.toml +++ b/fluent-bundle/Cargo.toml @@ -40,6 +40,7 @@ serde = { workspace = true, features = ["derive"] } unic-langid = { workspace = true, features = ["macros"] } rand = "0.8" serde_yaml = "0.9" +rstest = "0.24.0" [features] default = [] diff --git a/fluent-bundle/src/types/number.rs b/fluent-bundle/src/types/number.rs index b9c3b2de..c871a4eb 100644 --- a/fluent-bundle/src/types/number.rs +++ b/fluent-bundle/src/types/number.rs @@ -252,7 +252,8 @@ from_num!(f32 f64); #[cfg(test)] mod tests { - use crate::types::FluentValue; + use crate::types::{FluentNumber, FluentNumberOptions, FluentValue}; + use rstest::*; #[test] fn value_from_copy_ref() { @@ -261,4 +262,95 @@ mod tests { let z: FluentValue = y.into(); assert_eq!(z, FluentValue::try_number("1")); } + + #[rstest] + #[case(10.12, 1, "10.12")] + #[case(10.0, 3, "10.000")] + #[case(10.12, 5, "10.12000")] + fn minimum_fraction_digits(#[case] input: f64, #[case] minfd: usize, #[case] expected: &str) { + let value = FluentNumber::new( + input, + FluentNumberOptions { + minimum_fraction_digits: Some(minfd), + ..Default::default() + }, + ); + + assert_eq!(value.as_string(), expected); + } + + #[rstest] + #[case(10.12, 0, "10")] + #[case(10.0, 3, "10.0")] + #[case(10.123456, 3, "10.123")] + fn maximum_fraction_digits(#[case] input: f64, #[case] maxfd: usize, #[case] expected: &str) { + let value = FluentNumber::new( + input, + FluentNumberOptions { + maximum_fraction_digits: Some(maxfd), + ..Default::default() + }, + ); + + assert_eq!(value.as_string(), expected); + } + + #[rstest] + #[case(10.12, 1, "10.12")] + #[case(10.0, 3, "010.0")] + #[case(10.12, 5, "00010.12")] + fn minimum_integer_digits(#[case] input: f64, #[case] minid: usize, #[case] expected: &str) { + let value = FluentNumber::new( + input, + FluentNumberOptions { + minimum_integer_digits: Some(minid), + ..Default::default() + }, + ); + + assert_eq!(value.as_string(), expected); + } + + #[rstest] + #[case(10.1, 2, 5, "10.10")] + #[case(10.1, 2, 1, "10.1")] + #[case(10.12345, 2, 3, "10.123")] + fn multiple_options_minfd_maxfd( + #[case] input: f64, + #[case] minfd: usize, + #[case] maxfd: usize, + #[case] expected: &str, + ) { + let value = FluentNumber::new( + input, + FluentNumberOptions { + minimum_fraction_digits: Some(minfd), + maximum_fraction_digits: Some(maxfd), + ..Default::default() + }, + ); + + assert_eq!(value.as_string(), expected); + } + + #[rstest] + #[case(10.1, 2, 1, "10.10")] + #[case(10.1, 2, 3, "010.10")] + fn multiple_options_minfd_minid( + #[case] input: f64, + #[case] minfd: usize, + #[case] minid: usize, + #[case] expected: &str, + ) { + let value = FluentNumber::new( + input, + FluentNumberOptions { + minimum_fraction_digits: Some(minfd), + maximum_fraction_digits: Some(minid), + ..Default::default() + }, + ); + + assert_eq!(value.as_string(), expected); + } }