From 64ce76bdf1ddb29f120e715f83d1852d670ae186 Mon Sep 17 00:00:00 2001 From: Joseph Jon Booker Date: Sat, 5 Apr 2025 01:53:11 -0500 Subject: [PATCH] uucore/format: add docs and tests for resolve_astrick_ methods --- src/uucore/src/lib/features/format/spec.rs | 111 +++++++++++++++++++++ 1 file changed, 111 insertions(+) diff --git a/src/uucore/src/lib/features/format/spec.rs b/src/uucore/src/lib/features/format/spec.rs index b8f0235fe..72de13747 100644 --- a/src/uucore/src/lib/features/format/spec.rs +++ b/src/uucore/src/lib/features/format/spec.rs @@ -474,6 +474,8 @@ impl Spec { } } +/// Determine the width, potentially getting a value from args +/// Returns the non-negative width and whether the value should be left-aligned. fn resolve_asterisk_width<'a>( option: Option>, mut args: impl ArgumentIter<'a>, @@ -492,6 +494,8 @@ fn resolve_asterisk_width<'a>( } } +/// Determines the precision, which should (if defined) +/// be a non-negative number. fn resolve_asterisk_precision<'a>( option: Option>, mut args: impl ArgumentIter<'a>, @@ -548,3 +552,110 @@ fn eat_number(rest: &mut &[u8], index: &mut usize) -> Option { } } } + +#[cfg(test)] +mod tests { + use super::*; + + mod resolve_asterisk_width { + use super::*; + use crate::format::FormatArgument; + + #[test] + fn no_width() { + assert_eq!(None, resolve_asterisk_width(None, Vec::new().iter())); + } + + #[test] + fn fixed_width() { + assert_eq!( + Some((42, false)), + resolve_asterisk_width(Some(CanAsterisk::Fixed(42)), Vec::new().iter()) + ); + } + + #[test] + fn asterisks_with_numbers() { + assert_eq!( + Some((42, false)), + resolve_asterisk_width( + Some(CanAsterisk::Asterisk), + vec![FormatArgument::SignedInt(42)].iter() + ) + ); + assert_eq!( + Some((42, false)), + resolve_asterisk_width( + Some(CanAsterisk::Asterisk), + vec![FormatArgument::Unparsed("42".to_string())].iter() + ) + ); + + assert_eq!( + Some((42, true)), + resolve_asterisk_width( + Some(CanAsterisk::Asterisk), + vec![FormatArgument::SignedInt(-42)].iter() + ) + ); + assert_eq!( + Some((42, true)), + resolve_asterisk_width( + Some(CanAsterisk::Asterisk), + vec![FormatArgument::Unparsed("-42".to_string())].iter() + ) + ); + } + } + + mod resolve_asterisk_precision { + use super::*; + use crate::format::FormatArgument; + + #[test] + fn no_width() { + assert_eq!(None, resolve_asterisk_precision(None, Vec::new().iter())); + } + + #[test] + fn fixed_width() { + assert_eq!( + Some(42), + resolve_asterisk_precision(Some(CanAsterisk::Fixed(42)), Vec::new().iter()) + ); + } + + #[test] + fn asterisks_with_numbers() { + assert_eq!( + Some(42), + resolve_asterisk_precision( + Some(CanAsterisk::Asterisk), + vec![FormatArgument::SignedInt(42)].iter() + ) + ); + assert_eq!( + Some(42), + resolve_asterisk_precision( + Some(CanAsterisk::Asterisk), + vec![FormatArgument::Unparsed("42".to_string())].iter() + ) + ); + + assert_eq!( + Some(0), + resolve_asterisk_precision( + Some(CanAsterisk::Asterisk), + vec![FormatArgument::SignedInt(-42)].iter() + ) + ); + assert_eq!( + Some(0), + resolve_asterisk_precision( + Some(CanAsterisk::Asterisk), + vec![FormatArgument::Unparsed("-42".to_string())].iter() + ) + ); + } + } +}