From aacff13ec3afb87c0ac41cd0103c43dfcc305532 Mon Sep 17 00:00:00 2001 From: Pat Laster Date: Fri, 11 Feb 2022 23:02:57 -0600 Subject: [PATCH 1/7] seq: Eliminated special handling of -0.0 --- src/uu/seq/src/extendedbigdecimal.rs | 16 ++-------- src/uu/seq/src/seq.rs | 46 ++++++++++------------------ 2 files changed, 19 insertions(+), 43 deletions(-) diff --git a/src/uu/seq/src/extendedbigdecimal.rs b/src/uu/seq/src/extendedbigdecimal.rs index 3c7e3df53..77d7fa423 100644 --- a/src/uu/seq/src/extendedbigdecimal.rs +++ b/src/uu/seq/src/extendedbigdecimal.rs @@ -130,14 +130,7 @@ impl Display for ExtendedBigDecimal { } ExtendedBigDecimal::Infinity => f32::INFINITY.fmt(f), ExtendedBigDecimal::MinusInfinity => f32::NEG_INFINITY.fmt(f), - ExtendedBigDecimal::MinusZero => { - // FIXME In Rust version 1.53.0 and later, the display - // of floats was updated to allow displaying negative - // zero. See - // https://github.com/rust-lang/rust/pull/78618. Currently, - // this just formats "0.0". - (0.0f32).fmt(f) - } + ExtendedBigDecimal::MinusZero => (-0.0f32).fmt(f), ExtendedBigDecimal::Nan => "nan".fmt(f), } } @@ -280,11 +273,6 @@ mod tests { assert_eq!(format!("{}", ExtendedBigDecimal::Infinity), "inf"); assert_eq!(format!("{}", ExtendedBigDecimal::MinusInfinity), "-inf"); assert_eq!(format!("{}", ExtendedBigDecimal::Nan), "nan"); - // FIXME In Rust version 1.53.0 and later, the display of floats - // was updated to allow displaying negative zero. Until then, we - // just display `MinusZero` as "0.0". - // - // assert_eq!(format!("{}", ExtendedBigDecimal::MinusZero), "-0.0"); - // + assert_eq!(format!("{}", ExtendedBigDecimal::MinusZero), "-0"); } } diff --git a/src/uu/seq/src/seq.rs b/src/uu/seq/src/seq.rs index af961a493..3646effc1 100644 --- a/src/uu/seq/src/seq.rs +++ b/src/uu/seq/src/seq.rs @@ -198,41 +198,29 @@ fn done_printing(next: &T, increment: &T, last: &T) -> boo } /// Write a big decimal formatted according to the given parameters. -/// -/// This method is an adapter to support displaying negative zero on -/// Rust versions earlier than 1.53.0. After that version, we should be -/// able to display negative zero using the default formatting provided -/// by `-0.0f32`, for example. fn write_value_float( writer: &mut impl Write, value: &ExtendedBigDecimal, width: usize, precision: usize, - is_first_iteration: bool, + _is_first_iteration: bool, ) -> std::io::Result<()> { - let value_as_str = if *value == ExtendedBigDecimal::MinusZero && is_first_iteration { - format!( - "-{value:>0width$.precision$}", - value = value, - width = if width > 0 { width - 1 } else { width }, - precision = precision, - ) - } else if *value == ExtendedBigDecimal::Infinity || *value == ExtendedBigDecimal::MinusInfinity - { - format!( - "{value:>width$.precision$}", - value = value, - width = width, - precision = precision, - ) - } else { - format!( - "{value:>0width$.precision$}", - value = value, - width = width, - precision = precision, - ) - }; + let value_as_str = + if *value == ExtendedBigDecimal::Infinity || *value == ExtendedBigDecimal::MinusInfinity { + format!( + "{value:>width$.precision$}", + value = value, + width = width, + precision = precision, + ) + } else { + format!( + "{value:>0width$.precision$}", + value = value, + width = width, + precision = precision, + ) + }; write!(writer, "{}", value_as_str) } From 7fbd80571352f958e9a0ad5721bb17f6e74cc83a Mon Sep 17 00:00:00 2001 From: Jeffrey Finkelstein Date: Sun, 30 Jan 2022 21:35:43 -0500 Subject: [PATCH 2/7] split: refactor to add SuffixType enum Refactor the code to use a `SuffixType` enumeration with two members, `Alphabetic` and `NumericDecimal`, representing the two currently supported ways of producing filename suffixes. This prepares the code to more easily support other formats, like numeric hexadecimal. --- src/uu/split/src/filenames.rs | 62 ++++++++++++++++++++++++----------- src/uu/split/src/split.rs | 20 ++++++++--- 2 files changed, 58 insertions(+), 24 deletions(-) diff --git a/src/uu/split/src/filenames.rs b/src/uu/split/src/filenames.rs index 3e2db3606..1b89190c7 100644 --- a/src/uu/split/src/filenames.rs +++ b/src/uu/split/src/filenames.rs @@ -13,12 +13,13 @@ //! //! ```rust,ignore //! use crate::filenames::FilenameIterator; +//! use crate::filenames::SuffixType; //! //! let prefix = "chunk_".to_string(); //! let suffix = ".txt".to_string(); //! let width = 2; -//! let use_numeric_suffix = false; -//! let it = FilenameIterator::new(prefix, suffix, width, use_numeric_suffix); +//! let suffix_type = SuffixType::Alphabetic; +//! let it = FilenameIterator::new(prefix, suffix, width, suffix_type); //! //! assert_eq!(it.next().unwrap(), "chunk_aa.txt"); //! assert_eq!(it.next().unwrap(), "chunk_ab.txt"); @@ -28,6 +29,26 @@ use crate::number::DynamicWidthNumber; use crate::number::FixedWidthNumber; use crate::number::Number; +/// The format to use for suffixes in the filename for each output chunk. +#[derive(Clone, Copy)] +pub enum SuffixType { + /// Lowercase ASCII alphabetic characters. + Alphabetic, + + /// Decimal numbers. + NumericDecimal, +} + +impl SuffixType { + /// The radix to use when representing the suffix string as digits. + fn radix(&self) -> u8 { + match self { + SuffixType::Alphabetic => 26, + SuffixType::NumericDecimal => 10, + } + } +} + /// Compute filenames from a given index. /// /// This iterator yields filenames for use with ``split``. @@ -42,8 +63,8 @@ use crate::number::Number; /// width in characters. In that case, after the iterator yields each /// string of that width, the iterator is exhausted. /// -/// Finally, if `use_numeric_suffix` is `true`, then numbers will be -/// used instead of lowercase ASCII alphabetic characters. +/// Finally, `suffix_type` controls which type of suffix to produce, +/// alphabetic or numeric. /// /// # Examples /// @@ -52,28 +73,30 @@ use crate::number::Number; /// /// ```rust,ignore /// use crate::filenames::FilenameIterator; +/// use crate::filenames::SuffixType; /// /// let prefix = "chunk_".to_string(); /// let suffix = ".txt".to_string(); /// let width = 2; -/// let use_numeric_suffix = false; -/// let it = FilenameIterator::new(prefix, suffix, width, use_numeric_suffix); +/// let suffix_type = SuffixType::Alphabetic; +/// let it = FilenameIterator::new(prefix, suffix, width, suffix_type); /// /// assert_eq!(it.next().unwrap(), "chunk_aa.txt"); /// assert_eq!(it.next().unwrap(), "chunk_ab.txt"); /// assert_eq!(it.next().unwrap(), "chunk_ac.txt"); /// ``` /// -/// For numeric filenames, set `use_numeric_suffix` to `true`: +/// For numeric filenames, use `SuffixType::NumericDecimal`: /// /// ```rust,ignore /// use crate::filenames::FilenameIterator; +/// use crate::filenames::SuffixType; /// /// let prefix = "chunk_".to_string(); /// let suffix = ".txt".to_string(); /// let width = 2; -/// let use_numeric_suffix = true; -/// let it = FilenameIterator::new(prefix, suffix, width, use_numeric_suffix); +/// let suffix_type = SuffixType::NumericDecimal; +/// let it = FilenameIterator::new(prefix, suffix, width, suffix_type); /// /// assert_eq!(it.next().unwrap(), "chunk_00.txt"); /// assert_eq!(it.next().unwrap(), "chunk_01.txt"); @@ -91,9 +114,9 @@ impl<'a> FilenameIterator<'a> { prefix: &'a str, additional_suffix: &'a str, suffix_length: usize, - use_numeric_suffix: bool, + suffix_type: SuffixType, ) -> FilenameIterator<'a> { - let radix = if use_numeric_suffix { 10 } else { 26 }; + let radix = suffix_type.radix(); let number = if suffix_length == 0 { Number::DynamicWidth(DynamicWidthNumber::new(radix)) } else { @@ -130,39 +153,40 @@ impl<'a> Iterator for FilenameIterator<'a> { mod tests { use crate::filenames::FilenameIterator; + use crate::filenames::SuffixType; #[test] fn test_filename_iterator_alphabetic_fixed_width() { - let mut it = FilenameIterator::new("chunk_", ".txt", 2, false); + let mut it = FilenameIterator::new("chunk_", ".txt", 2, SuffixType::Alphabetic); assert_eq!(it.next().unwrap(), "chunk_aa.txt"); assert_eq!(it.next().unwrap(), "chunk_ab.txt"); assert_eq!(it.next().unwrap(), "chunk_ac.txt"); - let mut it = FilenameIterator::new("chunk_", ".txt", 2, false); + let mut it = FilenameIterator::new("chunk_", ".txt", 2, SuffixType::Alphabetic); assert_eq!(it.nth(26 * 26 - 1).unwrap(), "chunk_zz.txt"); assert_eq!(it.next(), None); } #[test] fn test_filename_iterator_numeric_fixed_width() { - let mut it = FilenameIterator::new("chunk_", ".txt", 2, true); + let mut it = FilenameIterator::new("chunk_", ".txt", 2, SuffixType::NumericDecimal); assert_eq!(it.next().unwrap(), "chunk_00.txt"); assert_eq!(it.next().unwrap(), "chunk_01.txt"); assert_eq!(it.next().unwrap(), "chunk_02.txt"); - let mut it = FilenameIterator::new("chunk_", ".txt", 2, true); + let mut it = FilenameIterator::new("chunk_", ".txt", 2, SuffixType::NumericDecimal); assert_eq!(it.nth(10 * 10 - 1).unwrap(), "chunk_99.txt"); assert_eq!(it.next(), None); } #[test] fn test_filename_iterator_alphabetic_dynamic_width() { - let mut it = FilenameIterator::new("chunk_", ".txt", 0, false); + let mut it = FilenameIterator::new("chunk_", ".txt", 0, SuffixType::Alphabetic); assert_eq!(it.next().unwrap(), "chunk_aa.txt"); assert_eq!(it.next().unwrap(), "chunk_ab.txt"); assert_eq!(it.next().unwrap(), "chunk_ac.txt"); - let mut it = FilenameIterator::new("chunk_", ".txt", 0, false); + let mut it = FilenameIterator::new("chunk_", ".txt", 0, SuffixType::Alphabetic); assert_eq!(it.nth(26 * 25 - 1).unwrap(), "chunk_yz.txt"); assert_eq!(it.next().unwrap(), "chunk_zaaa.txt"); assert_eq!(it.next().unwrap(), "chunk_zaab.txt"); @@ -170,12 +194,12 @@ mod tests { #[test] fn test_filename_iterator_numeric_dynamic_width() { - let mut it = FilenameIterator::new("chunk_", ".txt", 0, true); + let mut it = FilenameIterator::new("chunk_", ".txt", 0, SuffixType::NumericDecimal); assert_eq!(it.next().unwrap(), "chunk_00.txt"); assert_eq!(it.next().unwrap(), "chunk_01.txt"); assert_eq!(it.next().unwrap(), "chunk_02.txt"); - let mut it = FilenameIterator::new("chunk_", ".txt", 0, true); + let mut it = FilenameIterator::new("chunk_", ".txt", 0, SuffixType::NumericDecimal); assert_eq!(it.nth(10 * 9 - 1).unwrap(), "chunk_89.txt"); assert_eq!(it.next().unwrap(), "chunk_9000.txt"); assert_eq!(it.next().unwrap(), "chunk_9001.txt"); diff --git a/src/uu/split/src/split.rs b/src/uu/split/src/split.rs index 57953ae27..e9dab1725 100644 --- a/src/uu/split/src/split.rs +++ b/src/uu/split/src/split.rs @@ -12,6 +12,7 @@ mod number; mod platform; use crate::filenames::FilenameIterator; +use crate::filenames::SuffixType; use clap::{crate_version, App, AppSettings, Arg, ArgMatches}; use std::env; use std::fmt; @@ -240,13 +241,22 @@ impl Strategy { } } +/// Parse the suffix type from the command-line arguments. +fn suffix_type_from(matches: &ArgMatches) -> SuffixType { + if matches.occurrences_of(OPT_NUMERIC_SUFFIXES) > 0 { + SuffixType::NumericDecimal + } else { + SuffixType::Alphabetic + } +} + /// Parameters that control how a file gets split. /// /// You can convert an [`ArgMatches`] instance into a [`Settings`] /// instance by calling [`Settings::from`]. struct Settings { prefix: String, - numeric_suffix: bool, + suffix_type: SuffixType, suffix_length: usize, additional_suffix: String, input: String, @@ -314,7 +324,7 @@ impl Settings { suffix_length: suffix_length_str .parse() .map_err(|_| SettingsError::SuffixLength(suffix_length_str.to_string()))?, - numeric_suffix: matches.occurrences_of(OPT_NUMERIC_SUFFIXES) > 0, + suffix_type: suffix_type_from(matches), additional_suffix, verbose: matches.occurrences_of("verbose") > 0, strategy: Strategy::from(matches).map_err(SettingsError::Strategy)?, @@ -374,7 +384,7 @@ impl<'a> ByteChunkWriter<'a> { &settings.prefix, &settings.additional_suffix, settings.suffix_length, - settings.numeric_suffix, + settings.suffix_type, ); let filename = filename_iterator.next()?; if settings.verbose { @@ -502,7 +512,7 @@ impl<'a> LineChunkWriter<'a> { &settings.prefix, &settings.additional_suffix, settings.suffix_length, - settings.numeric_suffix, + settings.suffix_type, ); let filename = filename_iterator.next()?; if settings.verbose { @@ -594,7 +604,7 @@ where &settings.prefix, &settings.additional_suffix, settings.suffix_length, - settings.numeric_suffix, + settings.suffix_type, ); // Create one writer for each chunk. This will create each From 494dc7ec573dc3d5754fbb707a0c410ef8befe6a Mon Sep 17 00:00:00 2001 From: Jeffrey Finkelstein Date: Sun, 16 Jan 2022 10:36:26 -0500 Subject: [PATCH 3/7] split: add SuffixType::NumericHexadecimal Add a `NumericHexadecimal` member to the `SuffixType` enum so that a future commit can add support for hexadecimal filename suffixes to the `split` program. --- src/uu/split/src/filenames.rs | 6 +- src/uu/split/src/number.rs | 119 +++++++++++++++++++++++++++------- 2 files changed, 101 insertions(+), 24 deletions(-) diff --git a/src/uu/split/src/filenames.rs b/src/uu/split/src/filenames.rs index 1b89190c7..0121ba87f 100644 --- a/src/uu/split/src/filenames.rs +++ b/src/uu/split/src/filenames.rs @@ -37,6 +37,9 @@ pub enum SuffixType { /// Decimal numbers. NumericDecimal, + + /// Hexadecimal numbers. + NumericHexadecimal, } impl SuffixType { @@ -45,6 +48,7 @@ impl SuffixType { match self { SuffixType::Alphabetic => 26, SuffixType::NumericDecimal => 10, + SuffixType::NumericHexadecimal => 16, } } } @@ -86,7 +90,7 @@ impl SuffixType { /// assert_eq!(it.next().unwrap(), "chunk_ac.txt"); /// ``` /// -/// For numeric filenames, use `SuffixType::NumericDecimal`: +/// For decimal numeric filenames, use `SuffixType::NumericDecimal`: /// /// ```rust,ignore /// use crate::filenames::FilenameIterator; diff --git a/src/uu/split/src/number.rs b/src/uu/split/src/number.rs index ef3ccbc4b..d5427e2ca 100644 --- a/src/uu/split/src/number.rs +++ b/src/uu/split/src/number.rs @@ -40,13 +40,19 @@ impl Error for Overflow {} /// specifically for the `split` program. See the /// [`DynamicWidthNumber`] documentation for more information. /// -/// Numbers of radix 10 are displayable and rendered as decimal -/// numbers (for example, "00" or "917"). Numbers of radix 26 are -/// displayable and rendered as lowercase ASCII alphabetic characters -/// (for example, "aa" or "zax"). Numbers of other radices cannot be -/// displayed. The display of a [`DynamicWidthNumber`] includes a -/// prefix whose length depends on the width of the number. See the -/// [`DynamicWidthNumber`] documentation for more information. +/// Numbers of radix +/// +/// * 10 are displayable and rendered as decimal numbers (for example, +/// "00" or "917"), +/// * 16 are displayable and rendered as hexadecimal numbers (for example, +/// "00" or "e7f"), +/// * 26 are displayable and rendered as lowercase ASCII alphabetic +/// characters (for example, "aa" or "zax"). +/// +/// Numbers of other radices cannot be displayed. The display of a +/// [`DynamicWidthNumber`] includes a prefix whose length depends on +/// the width of the number. See the [`DynamicWidthNumber`] +/// documentation for more information. /// /// The digits of a number are accessible via the [`Number::digits`] /// method. The digits are represented as a [`Vec`] with the most @@ -169,12 +175,12 @@ impl Display for Number { /// /// # Displaying /// -/// This number is only displayable if `radix` is 10 or `radix` is -/// 26. If `radix` is 10, then the digits are concatenated and -/// displayed as a fixed-width decimal number. If `radix` is 26, then -/// each digit is translated to the corresponding lowercase ASCII -/// alphabetic character (that is, 'a', 'b', 'c', etc.) and -/// concatenated. +/// This number is only displayable if `radix` is 10, 26, or 26. If +/// `radix` is 10 or 16, then the digits are concatenated and +/// displayed as a fixed-width decimal or hexadecimal number, +/// respectively. If `radix` is 26, then each digit is translated to +/// the corresponding lowercase ASCII alphabetic character (that is, +/// 'a', 'b', 'c', etc.) and concatenated. #[derive(Clone)] pub struct FixedWidthNumber { radix: u8, @@ -228,6 +234,14 @@ impl Display for FixedWidthNumber { let digits: String = self.digits.iter().map(|d| (b'0' + d) as char).collect(); write!(f, "{}", digits) } + 16 => { + let digits: String = self + .digits + .iter() + .map(|d| (if *d < 10 { b'0' + d } else { b'a' + (d - 10) }) as char) + .collect(); + write!(f, "{}", digits) + } 26 => { let digits: String = self.digits.iter().map(|d| (b'a' + d) as char).collect(); write!(f, "{}", digits) @@ -264,14 +278,15 @@ impl Display for FixedWidthNumber { /// /// # Displaying /// -/// This number is only displayable if `radix` is 10 or `radix` is -/// 26. If `radix` is 10, then the digits are concatenated and -/// displayed as a fixed-width decimal number with a prefix of `n - 2` -/// instances of the character '9', where `n` is the number of digits. -/// If `radix` is 26, then each digit is translated to the -/// corresponding lowercase ASCII alphabetic character (that is, 'a', -/// 'b', 'c', etc.) and concatenated with a prefix of `n - 2` -/// instances of the character 'z'. +/// This number is only displayable if `radix` is 10, 16, or 26. If +/// `radix` is 10 or 16, then the digits are concatenated and +/// displayed as a fixed-width decimal or hexadecimal number, +/// respectively, with a prefix of `n - 2` instances of the character +/// '9' of 'f', respectively, where `n` is the number of digits. If +/// `radix` is 26, then each digit is translated to the corresponding +/// lowercase ASCII alphabetic character (that is, 'a', 'b', 'c', +/// etc.) and concatenated with a prefix of `n - 2` instances of the +/// character 'z'. /// /// This notion of displaying the number is specific to the `split` /// program. @@ -349,6 +364,21 @@ impl Display for DynamicWidthNumber { digits = digits, ) } + 16 => { + let num_fill_chars = self.digits.len() - 2; + let digits: String = self + .digits + .iter() + .map(|d| (if *d < 10 { b'0' + d } else { b'a' + (d - 10) }) as char) + .collect(); + write!( + f, + "{empty:f { let num_fill_chars = self.digits.len() - 2; let digits: String = self.digits.iter().map(|d| (b'a' + d) as char).collect(); @@ -424,7 +454,7 @@ mod tests { } #[test] - fn test_dynamic_width_number_display_numeric() { + fn test_dynamic_width_number_display_numeric_decimal() { fn num(n: usize) -> Number { let mut number = Number::DynamicWidth(DynamicWidthNumber::new(10)); for _ in 0..n { @@ -444,6 +474,30 @@ mod tests { assert_eq!(format!("{}", num(10 * 99 + 1)), "990001"); } + #[test] + fn test_dynamic_width_number_display_numeric_hexadecimal() { + fn num(n: usize) -> Number { + let mut number = Number::DynamicWidth(DynamicWidthNumber::new(16)); + for _ in 0..n { + number.increment().unwrap() + } + number + } + + assert_eq!(format!("{}", num(0)), "00"); + assert_eq!(format!("{}", num(15)), "0f"); + assert_eq!(format!("{}", num(16)), "10"); + assert_eq!(format!("{}", num(17)), "11"); + assert_eq!(format!("{}", num(18)), "12"); + + assert_eq!(format!("{}", num(16 * 15 - 1)), "ef"); + assert_eq!(format!("{}", num(16 * 15)), "f000"); + assert_eq!(format!("{}", num(16 * 15 + 1)), "f001"); + assert_eq!(format!("{}", num(16 * 255 - 1)), "feff"); + assert_eq!(format!("{}", num(16 * 255)), "ff0000"); + assert_eq!(format!("{}", num(16 * 255 + 1)), "ff0001"); + } + #[test] fn test_fixed_width_number_increment() { let mut n = Number::FixedWidth(FixedWidthNumber::new(3, 2)); @@ -493,7 +547,7 @@ mod tests { } #[test] - fn test_fixed_width_number_display_numeric() { + fn test_fixed_width_number_display_numeric_decimal() { fn num(n: usize) -> Result { let mut number = Number::FixedWidth(FixedWidthNumber::new(10, 2)); for _ in 0..n { @@ -510,4 +564,23 @@ mod tests { assert_eq!(format!("{}", num(10 * 10 - 1).unwrap()), "99"); assert!(num(10 * 10).is_err()); } + + #[test] + fn test_fixed_width_number_display_numeric_hexadecimal() { + fn num(n: usize) -> Result { + let mut number = Number::FixedWidth(FixedWidthNumber::new(16, 2)); + for _ in 0..n { + number.increment()?; + } + Ok(number) + } + + assert_eq!(format!("{}", num(0).unwrap()), "00"); + assert_eq!(format!("{}", num(15).unwrap()), "0f"); + assert_eq!(format!("{}", num(17).unwrap()), "11"); + assert_eq!(format!("{}", num(16 * 15 - 1).unwrap()), "ef"); + assert_eq!(format!("{}", num(16 * 15).unwrap()), "f0"); + assert_eq!(format!("{}", num(16 * 16 - 1).unwrap()), "ff"); + assert!(num(16 * 16).is_err()); + } } From a4955b4e06c04445d74490517c119107ae2d30b7 Mon Sep 17 00:00:00 2001 From: Jeffrey Finkelstein Date: Sun, 16 Jan 2022 10:41:52 -0500 Subject: [PATCH 4/7] split: add support for -x option (hex suffixes) Add support for the `-x` command-line option to `split`. This option causes `split` to produce filenames with hexadecimal suffixes instead of the default alphabetic suffixes. --- src/uu/split/src/split.rs | 11 +++++++++ tests/by-util/test_split.rs | 24 ++++++++++++++++++- .../split/twohundredfortyonebytes.txt | 1 + 3 files changed, 35 insertions(+), 1 deletion(-) create mode 100644 tests/fixtures/split/twohundredfortyonebytes.txt diff --git a/src/uu/split/src/split.rs b/src/uu/split/src/split.rs index e9dab1725..2c344f4d3 100644 --- a/src/uu/split/src/split.rs +++ b/src/uu/split/src/split.rs @@ -32,6 +32,7 @@ static OPT_ADDITIONAL_SUFFIX: &str = "additional-suffix"; static OPT_FILTER: &str = "filter"; static OPT_NUMBER: &str = "number"; static OPT_NUMERIC_SUFFIXES: &str = "numeric-suffixes"; +static OPT_HEX_SUFFIXES: &str = "hex-suffixes"; static OPT_SUFFIX_LENGTH: &str = "suffix-length"; static OPT_DEFAULT_SUFFIX_LENGTH: &str = "0"; static OPT_VERBOSE: &str = "verbose"; @@ -140,6 +141,14 @@ pub fn uu_app<'a>() -> App<'a> { .default_value(OPT_DEFAULT_SUFFIX_LENGTH) .help("use suffixes of length N (default 2)"), ) + .arg( + Arg::new(OPT_HEX_SUFFIXES) + .short('x') + .long(OPT_HEX_SUFFIXES) + .takes_value(true) + .default_missing_value("0") + .help("use hex suffixes starting at 0, not alphabetic"), + ) .arg( Arg::new(OPT_VERBOSE) .long(OPT_VERBOSE) @@ -245,6 +254,8 @@ impl Strategy { fn suffix_type_from(matches: &ArgMatches) -> SuffixType { if matches.occurrences_of(OPT_NUMERIC_SUFFIXES) > 0 { SuffixType::NumericDecimal + } else if matches.occurrences_of(OPT_HEX_SUFFIXES) > 0 { + SuffixType::NumericHexadecimal } else { SuffixType::Alphabetic } diff --git a/tests/by-util/test_split.rs b/tests/by-util/test_split.rs index 0291d1f4a..e30e29acc 100644 --- a/tests/by-util/test_split.rs +++ b/tests/by-util/test_split.rs @@ -2,7 +2,7 @@ // * // * For the full copyright and license information, please view the LICENSE // * file that was distributed with this source code. -// spell-checker:ignore xzaaa sixhundredfiftyonebytes ninetyonebytes asciilowercase fghij klmno pqrst uvwxyz fivelines +// spell-checker:ignore xzaaa sixhundredfiftyonebytes ninetyonebytes asciilowercase fghij klmno pqrst uvwxyz fivelines twohundredfortyonebytes extern crate rand; extern crate regex; @@ -409,6 +409,28 @@ fn test_numeric_dynamic_suffix_length() { assert_eq!(file_read(&at, "x9000"), "a"); } +#[test] +fn test_hex_dynamic_suffix_length() { + let (at, mut ucmd) = at_and_ucmd!(); + // Split into chunks of one byte each, use hexadecimal digits + // instead of letters as file suffixes. + // + // The input file has (16^2) - 16 + 1 = 241 bytes. This is just + // enough to force `split` to dynamically increase the length of + // the filename for the very last chunk. + // + // x00, x01, x02, ..., xed, xee, xef, xf000 + // + ucmd.args(&["-x", "-b", "1", "twohundredfortyonebytes.txt"]) + .succeeds(); + for i in 0..240 { + let filename = format!("x{:02x}", i); + let contents = file_read(&at, &filename); + assert_eq!(contents, "a"); + } + assert_eq!(file_read(&at, "xf000"), "a"); +} + #[test] fn test_suffixes_exhausted() { new_ucmd!() diff --git a/tests/fixtures/split/twohundredfortyonebytes.txt b/tests/fixtures/split/twohundredfortyonebytes.txt new file mode 100644 index 000000000..10a53a61c --- /dev/null +++ b/tests/fixtures/split/twohundredfortyonebytes.txt @@ -0,0 +1 @@ +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa \ No newline at end of file From e598bf0835639a1c2fe34af00dad646cf4657f28 Mon Sep 17 00:00:00 2001 From: Jeffrey Finkelstein Date: Mon, 14 Feb 2022 21:16:37 -0500 Subject: [PATCH 5/7] tests: add CmdResult::stdout_is_fixture_bytes() Add helper method `CmdResult::stdout_is_fixture_bytes()`, which is like `stdout_is_fixture()` but compares stdout to the raw bytes of a given file instead of decoding the contents of the file to a UTF-8 string. --- tests/common/util.rs | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/tests/common/util.rs b/tests/common/util.rs index 4db4e2561..422d36328 100644 --- a/tests/common/util.rs +++ b/tests/common/util.rs @@ -265,6 +265,28 @@ impl CmdResult { let contents = read_scenario_fixture(&self.tmpd, file_rel_path); self.stdout_is(String::from_utf8(contents).unwrap()) } + + /// Assert that the bytes of stdout exactly match those of the given file. + /// + /// Contrast this with [`CmdResult::stdout_is_fixture`], which + /// decodes the contents of the file as a UTF-8 [`String`] before + /// comparison with stdout. + /// + /// # Examples + /// + /// Use this method in a unit test like this: + /// + /// ```rust,ignore + /// #[test] + /// fn test_something() { + /// new_ucmd!().succeeds().stdout_is_fixture_bytes("expected.bin"); + /// } + /// ``` + pub fn stdout_is_fixture_bytes>(&self, file_rel_path: T) -> &Self { + let contents = read_scenario_fixture(&self.tmpd, file_rel_path); + self.stdout_is_bytes(contents) + } + /// like stdout_is_fixture(...), but replaces the data in fixture file based on values provided in template_vars /// command output pub fn stdout_is_templated_fixture>( From ba1ce7179bf6cd2e24a522f8b9d14271561483f4 Mon Sep 17 00:00:00 2001 From: Jeffrey Finkelstein Date: Mon, 14 Feb 2022 21:20:12 -0500 Subject: [PATCH 6/7] dd: move unit tests into dd.rs and test_dd.rs Clean up unit tests in the `dd` crate to make them easier to manage. This commit does a few things. * move test cases that test the complete functionality of the `dd` program from the `dd_unit_tests` module up to the `tests/by-util/test_dd.rs` module so that they can take advantage of the testing framework and common testing tools provided by uutils, * move test cases that test internal functions of the `dd` implementation into the `tests` module within `dd.rs` so that they live closer to the code they are testing, * replace test cases defined by macros with test cases defined by plain old functions to make the test cases easier to read at a glance. --- src/uu/dd/src/dd.rs | 454 +++++++++++++++++- .../src/dd_unit_tests/block_unblock_tests.rs | 351 -------------- .../dd/src/dd_unit_tests/conv_sync_tests.rs | 106 ---- .../dd/src/dd_unit_tests/conversion_tests.rs | 233 --------- src/uu/dd/src/dd_unit_tests/mod.rs | 89 ---- src/uu/dd/src/dd_unit_tests/sanity_tests.rs | 316 ------------ ...ndom-5828891cb1230748e146f34223bbd3b5.test | Bin 0 -> 74400 bytes .../gnudd-conv-atoe-seq-byte-values.spec | Bin 256 -> 0 bytes .../gnudd-conv-atoibm-seq-byte-values.spec | Bin 256 -> 0 bytes ...nudd-conv-ebcdic-ltou-seq-byte-values.spec | Bin 256 -> 0 bytes ...nudd-conv-ebcdic-utol-seq-byte-values.spec | Bin 256 -> 0 bytes .../gnudd-conv-etoa-seq-byte-values.spec | Bin 256 -> 0 bytes .../gnudd-conv-ibm-ltou-seq-byte-values.spec | Bin 256 -> 0 bytes .../gnudd-conv-ibm-utol-seq-byte-values.spec | Bin 256 -> 0 bytes .../gnudd-conv-ltou-seq-byte-values.spec | Bin 256 -> 0 bytes .../gnudd-conv-utol-seq-byte-values.spec | Bin 256 -> 0 bytes src/uu/dd/test-resources/seq-byte-values.test | Bin 256 -> 0 bytes tests/by-util/test_dd.rs | 363 +++++++++++++- ...hars-37eff01866ba3f538421b30b7cbefcac.test | Bin .../fixtures/dd}/dd-block-cbs16-win.test | 0 .../fixtures/dd}/dd-block-cbs16.spec | 0 .../fixtures/dd}/dd-block-cbs16.test | 0 .../fixtures/dd}/dd-block-cbs8.spec | 0 .../dd}/dd-block-consecutive-nl-cbs16.spec | 0 .../dd}/dd-block-consecutive-nl-win.test | 0 .../fixtures/dd}/dd-block-consecutive-nl.test | 0 .../fixtures/dd}/dd-unblock-cbs16-win.spec | 0 .../fixtures/dd}/dd-unblock-cbs16.spec | 0 .../fixtures/dd}/dd-unblock-cbs16.test | 0 .../fixtures/dd}/dd-unblock-cbs8-win.spec | 0 .../fixtures/dd}/dd-unblock-cbs8.spec | 0 tests/fixtures/dd/deadbeef-16.spec | Bin 0 -> 128 bytes tests/fixtures/dd/deadbeef-16.test | 1 + ...beef-18d99661a1de1fc9af21b0ec2cd67ba3.test | 0 ...d-conv-sync-ibs-1031-obs-521-deadbeef.spec | 0 ...udd-conv-sync-ibs-1031-obs-521-random.spec | Bin ...nudd-conv-sync-ibs-1031-obs-521-zeros.spec | Bin ...d-conv-sync-ibs-521-obs-1031-deadbeef.spec | 0 ...udd-conv-sync-ibs-521-obs-1031-random.spec | Bin ...nudd-conv-sync-ibs-521-obs-1031-zeros.spec | Bin .../dd}/gnudd-deadbeef-first-12345.spec | 0 .../dd}/gnudd-deadbeef-first-16k.spec | 0 .../fixtures/dd}/gnudd-random-first-32k.spec | Bin .../fixtures/dd}/lcase-ascii.test | Bin .../fixtures/dd}/lcase-ebcdic.spec | Bin .../fixtures/dd}/lcase-ebcdic.test | Bin .../fixtures/dd}/lcase-ibm.spec | Bin .../fixtures/dd}/lcase-ibm.test | Bin ...ones-6ae59e64850377ee5470c854761551ea.test | 0 ...ndom-5828891cb1230748e146f34223bbd3b5.test | Bin 0 -> 74400 bytes ...lues-b632a992d3aed5d8d1a59cc5a5a455ba.test | Bin .../fixtures/dd}/seq-byte-values-odd.spec | Bin .../fixtures/dd}/seq-byte-values-odd.test | Bin .../fixtures/dd}/seq-byte-values-swapped.test | Bin .../fixtures/dd}/ucase-ascii.test | Bin .../fixtures/dd}/ucase-ebcdic.spec | Bin .../fixtures/dd}/ucase-ebcdic.test | Bin .../fixtures/dd}/ucase-ibm.spec | Bin .../fixtures/dd}/ucase-ibm.test | Bin ...eros-620f0b67a91f7f74151bc5be745b7110.test | Bin 60 files changed, 813 insertions(+), 1100 deletions(-) delete mode 100644 src/uu/dd/src/dd_unit_tests/block_unblock_tests.rs delete mode 100644 src/uu/dd/src/dd_unit_tests/conv_sync_tests.rs delete mode 100644 src/uu/dd/src/dd_unit_tests/conversion_tests.rs delete mode 100644 src/uu/dd/src/dd_unit_tests/mod.rs delete mode 100644 src/uu/dd/src/dd_unit_tests/sanity_tests.rs create mode 100644 src/uu/dd/test-resources/FAILED-random-5828891cb1230748e146f34223bbd3b5.test delete mode 100644 src/uu/dd/test-resources/gnudd-conv-atoe-seq-byte-values.spec delete mode 100644 src/uu/dd/test-resources/gnudd-conv-atoibm-seq-byte-values.spec delete mode 100644 src/uu/dd/test-resources/gnudd-conv-ebcdic-ltou-seq-byte-values.spec delete mode 100644 src/uu/dd/test-resources/gnudd-conv-ebcdic-utol-seq-byte-values.spec delete mode 100644 src/uu/dd/test-resources/gnudd-conv-etoa-seq-byte-values.spec delete mode 100644 src/uu/dd/test-resources/gnudd-conv-ibm-ltou-seq-byte-values.spec delete mode 100644 src/uu/dd/test-resources/gnudd-conv-ibm-utol-seq-byte-values.spec delete mode 100644 src/uu/dd/test-resources/gnudd-conv-ltou-seq-byte-values.spec delete mode 100644 src/uu/dd/test-resources/gnudd-conv-utol-seq-byte-values.spec delete mode 100644 src/uu/dd/test-resources/seq-byte-values.test rename {src/uu/dd/test-resources => tests/fixtures/dd}/all-valid-ascii-chars-37eff01866ba3f538421b30b7cbefcac.test (100%) rename {src/uu/dd/test-resources => tests/fixtures/dd}/dd-block-cbs16-win.test (100%) rename {src/uu/dd/test-resources => tests/fixtures/dd}/dd-block-cbs16.spec (100%) rename {src/uu/dd/test-resources => tests/fixtures/dd}/dd-block-cbs16.test (100%) rename {src/uu/dd/test-resources => tests/fixtures/dd}/dd-block-cbs8.spec (100%) rename {src/uu/dd/test-resources => tests/fixtures/dd}/dd-block-consecutive-nl-cbs16.spec (100%) rename {src/uu/dd/test-resources => tests/fixtures/dd}/dd-block-consecutive-nl-win.test (100%) rename {src/uu/dd/test-resources => tests/fixtures/dd}/dd-block-consecutive-nl.test (100%) rename {src/uu/dd/test-resources => tests/fixtures/dd}/dd-unblock-cbs16-win.spec (100%) rename {src/uu/dd/test-resources => tests/fixtures/dd}/dd-unblock-cbs16.spec (100%) rename {src/uu/dd/test-resources => tests/fixtures/dd}/dd-unblock-cbs16.test (100%) rename {src/uu/dd/test-resources => tests/fixtures/dd}/dd-unblock-cbs8-win.spec (100%) rename {src/uu/dd/test-resources => tests/fixtures/dd}/dd-unblock-cbs8.spec (100%) create mode 100644 tests/fixtures/dd/deadbeef-16.spec create mode 100644 tests/fixtures/dd/deadbeef-16.test rename {src/uu/dd/test-resources => tests/fixtures/dd}/deadbeef-18d99661a1de1fc9af21b0ec2cd67ba3.test (100%) rename {src/uu/dd/test-resources => tests/fixtures/dd}/gnudd-conv-sync-ibs-1031-obs-521-deadbeef.spec (100%) rename {src/uu/dd/test-resources => tests/fixtures/dd}/gnudd-conv-sync-ibs-1031-obs-521-random.spec (100%) rename {src/uu/dd/test-resources => tests/fixtures/dd}/gnudd-conv-sync-ibs-1031-obs-521-zeros.spec (100%) rename {src/uu/dd/test-resources => tests/fixtures/dd}/gnudd-conv-sync-ibs-521-obs-1031-deadbeef.spec (100%) rename {src/uu/dd/test-resources => tests/fixtures/dd}/gnudd-conv-sync-ibs-521-obs-1031-random.spec (100%) rename {src/uu/dd/test-resources => tests/fixtures/dd}/gnudd-conv-sync-ibs-521-obs-1031-zeros.spec (100%) rename {src/uu/dd/test-resources => tests/fixtures/dd}/gnudd-deadbeef-first-12345.spec (100%) rename {src/uu/dd/test-resources => tests/fixtures/dd}/gnudd-deadbeef-first-16k.spec (100%) rename {src/uu/dd/test-resources => tests/fixtures/dd}/gnudd-random-first-32k.spec (100%) rename {src/uu/dd/test-resources => tests/fixtures/dd}/lcase-ascii.test (100%) rename {src/uu/dd/test-resources => tests/fixtures/dd}/lcase-ebcdic.spec (100%) rename {src/uu/dd/test-resources => tests/fixtures/dd}/lcase-ebcdic.test (100%) rename {src/uu/dd/test-resources => tests/fixtures/dd}/lcase-ibm.spec (100%) rename {src/uu/dd/test-resources => tests/fixtures/dd}/lcase-ibm.test (100%) rename {src/uu/dd/test-resources => tests/fixtures/dd}/ones-6ae59e64850377ee5470c854761551ea.test (100%) create mode 100644 tests/fixtures/dd/random-5828891cb1230748e146f34223bbd3b5.test rename {src/uu/dd/test-resources => tests/fixtures/dd}/seq-byte-values-b632a992d3aed5d8d1a59cc5a5a455ba.test (100%) rename {src/uu/dd/test-resources => tests/fixtures/dd}/seq-byte-values-odd.spec (100%) rename {src/uu/dd/test-resources => tests/fixtures/dd}/seq-byte-values-odd.test (100%) rename {src/uu/dd/test-resources => tests/fixtures/dd}/seq-byte-values-swapped.test (100%) rename {src/uu/dd/test-resources => tests/fixtures/dd}/ucase-ascii.test (100%) rename {src/uu/dd/test-resources => tests/fixtures/dd}/ucase-ebcdic.spec (100%) rename {src/uu/dd/test-resources => tests/fixtures/dd}/ucase-ebcdic.test (100%) rename {src/uu/dd/test-resources => tests/fixtures/dd}/ucase-ibm.spec (100%) rename {src/uu/dd/test-resources => tests/fixtures/dd}/ucase-ibm.test (100%) rename {src/uu/dd/test-resources => tests/fixtures/dd}/zeros-620f0b67a91f7f74151bc5be745b7110.test (100%) diff --git a/src/uu/dd/src/dd.rs b/src/uu/dd/src/dd.rs index 9d9b426b7..f8f3b7081 100644 --- a/src/uu/dd/src/dd.rs +++ b/src/uu/dd/src/dd.rs @@ -7,9 +7,6 @@ // spell-checker:ignore fname, tname, fpath, specfile, testfile, unspec, ifile, ofile, outfile, fullblock, urand, fileio, atoe, atoibm, behaviour, bmax, bremain, btotal, cflags, creat, ctable, ctty, datastructures, doesnt, etoa, fileout, fname, gnudd, iconvflags, nocache, noctty, noerror, nofollow, nolinks, nonblock, oconvflags, outfile, parseargs, rlen, rmax, rposition, rremain, rsofar, rstat, sigusr, sigval, wlen, wstat seekable -#[cfg(test)] -mod dd_unit_tests; - mod datastructures; use datastructures::*; @@ -1171,3 +1168,454 @@ General-Flags ") ) } + +#[cfg(test)] +mod tests { + + use crate::datastructures::{IConvFlags, IFlags, OConvFlags}; + use crate::ReadStat; + use crate::{block, calc_bsize, unblock, uu_app, Input, Output, OutputTrait}; + + use std::cmp; + use std::fs; + use std::fs::File; + use std::io; + use std::io::{BufReader, Read}; + + struct LazyReader { + src: R, + } + + impl Read for LazyReader { + fn read(&mut self, buf: &mut [u8]) -> io::Result { + let reduced = cmp::max(buf.len() / 2, 1); + self.src.read(&mut buf[..reduced]) + } + } + + const NEWLINE: u8 = b'\n'; + const SPACE: u8 = b' '; + + #[test] + fn block_test_no_nl() { + let mut rs = ReadStat::default(); + let buf = [0u8, 1u8, 2u8, 3u8]; + let res = block(&buf, 4, &mut rs); + + assert_eq!(res, vec![vec![0u8, 1u8, 2u8, 3u8],]); + } + + #[test] + fn block_test_no_nl_short_record() { + let mut rs = ReadStat::default(); + let buf = [0u8, 1u8, 2u8, 3u8]; + let res = block(&buf, 8, &mut rs); + + assert_eq!( + res, + vec![vec![0u8, 1u8, 2u8, 3u8, SPACE, SPACE, SPACE, SPACE],] + ); + } + + #[test] + fn block_test_no_nl_trunc() { + let mut rs = ReadStat::default(); + let buf = [0u8, 1u8, 2u8, 3u8, 4u8]; + let res = block(&buf, 4, &mut rs); + + // Commented section(s) should be truncated and appear for reference only. + assert_eq!(res, vec![vec![0u8, 1u8, 2u8, 3u8 /*, 4u8*/],]); + assert_eq!(rs.records_truncated, 1); + } + + #[test] + fn block_test_nl_gt_cbs_trunc() { + let mut rs = ReadStat::default(); + let buf = [ + 0u8, 1u8, 2u8, 3u8, 4u8, NEWLINE, 0u8, 1u8, 2u8, 3u8, 4u8, NEWLINE, 5u8, 6u8, 7u8, 8u8, + ]; + let res = block(&buf, 4, &mut rs); + + assert_eq!( + res, + vec![ + // Commented section(s) should be truncated and appear for reference only. + vec![0u8, 1u8, 2u8, 3u8], + // vec![4u8, SPACE, SPACE, SPACE], + vec![0u8, 1u8, 2u8, 3u8], + // vec![4u8, SPACE, SPACE, SPACE], + vec![5u8, 6u8, 7u8, 8u8], + ] + ); + assert_eq!(rs.records_truncated, 2); + } + + #[test] + fn block_test_surrounded_nl() { + let mut rs = ReadStat::default(); + let buf = [0u8, 1u8, 2u8, 3u8, NEWLINE, 4u8, 5u8, 6u8, 7u8, 8u8]; + let res = block(&buf, 8, &mut rs); + + assert_eq!( + res, + vec![ + vec![0u8, 1u8, 2u8, 3u8, SPACE, SPACE, SPACE, SPACE], + vec![4u8, 5u8, 6u8, 7u8, 8u8, SPACE, SPACE, SPACE], + ] + ); + } + + #[test] + fn block_test_multiple_nl_same_cbs_block() { + let mut rs = ReadStat::default(); + let buf = [ + 0u8, 1u8, 2u8, 3u8, NEWLINE, 4u8, NEWLINE, 5u8, 6u8, 7u8, 8u8, 9u8, + ]; + let res = block(&buf, 8, &mut rs); + + assert_eq!( + res, + vec![ + vec![0u8, 1u8, 2u8, 3u8, SPACE, SPACE, SPACE, SPACE], + vec![4u8, SPACE, SPACE, SPACE, SPACE, SPACE, SPACE, SPACE], + vec![5u8, 6u8, 7u8, 8u8, 9u8, SPACE, SPACE, SPACE], + ] + ); + } + + #[test] + fn block_test_multiple_nl_diff_cbs_block() { + let mut rs = ReadStat::default(); + let buf = [ + 0u8, 1u8, 2u8, 3u8, NEWLINE, 4u8, 5u8, 6u8, 7u8, NEWLINE, 8u8, 9u8, + ]; + let res = block(&buf, 8, &mut rs); + + assert_eq!( + res, + vec![ + vec![0u8, 1u8, 2u8, 3u8, SPACE, SPACE, SPACE, SPACE], + vec![4u8, 5u8, 6u8, 7u8, SPACE, SPACE, SPACE, SPACE], + vec![8u8, 9u8, SPACE, SPACE, SPACE, SPACE, SPACE, SPACE], + ] + ); + } + + #[test] + fn block_test_end_nl_diff_cbs_block() { + let mut rs = ReadStat::default(); + let buf = [0u8, 1u8, 2u8, 3u8, NEWLINE]; + let res = block(&buf, 4, &mut rs); + + assert_eq!(res, vec![vec![0u8, 1u8, 2u8, 3u8],]); + } + + #[test] + fn block_test_end_nl_same_cbs_block() { + let mut rs = ReadStat::default(); + let buf = [0u8, 1u8, 2u8, NEWLINE]; + let res = block(&buf, 4, &mut rs); + + assert_eq!(res, vec![vec![0u8, 1u8, 2u8, SPACE]]); + } + + #[test] + fn block_test_double_end_nl() { + let mut rs = ReadStat::default(); + let buf = [0u8, 1u8, 2u8, NEWLINE, NEWLINE]; + let res = block(&buf, 4, &mut rs); + + assert_eq!( + res, + vec![vec![0u8, 1u8, 2u8, SPACE], vec![SPACE, SPACE, SPACE, SPACE],] + ); + } + + #[test] + fn block_test_start_nl() { + let mut rs = ReadStat::default(); + let buf = [NEWLINE, 0u8, 1u8, 2u8, 3u8]; + let res = block(&buf, 4, &mut rs); + + assert_eq!( + res, + vec![vec![SPACE, SPACE, SPACE, SPACE], vec![0u8, 1u8, 2u8, 3u8],] + ); + } + + #[test] + fn block_test_double_surrounded_nl_no_trunc() { + let mut rs = ReadStat::default(); + let buf = [0u8, 1u8, 2u8, 3u8, NEWLINE, NEWLINE, 4u8, 5u8, 6u8, 7u8]; + let res = block(&buf, 8, &mut rs); + + assert_eq!( + res, + vec![ + vec![0u8, 1u8, 2u8, 3u8, SPACE, SPACE, SPACE, SPACE], + vec![SPACE, SPACE, SPACE, SPACE, SPACE, SPACE, SPACE, SPACE], + vec![4u8, 5u8, 6u8, 7u8, SPACE, SPACE, SPACE, SPACE], + ] + ); + } + + #[test] + fn block_test_double_surrounded_nl_double_trunc() { + let mut rs = ReadStat::default(); + let buf = [ + 0u8, 1u8, 2u8, 3u8, NEWLINE, NEWLINE, 4u8, 5u8, 6u8, 7u8, 8u8, + ]; + let res = block(&buf, 4, &mut rs); + + assert_eq!( + res, + vec![ + // Commented section(s) should be truncated and appear for reference only. + vec![0u8, 1u8, 2u8, 3u8], + vec![SPACE, SPACE, SPACE, SPACE], + vec![4u8, 5u8, 6u8, 7u8 /*, 8u8*/], + ] + ); + assert_eq!(rs.records_truncated, 1); + } + + #[test] + fn unblock_test_full_cbs() { + let buf = [0u8, 1u8, 2u8, 3u8, 4u8, 5u8, 6u8, 7u8]; + let res = unblock(&buf, 8); + + assert_eq!(res, vec![0u8, 1u8, 2u8, 3u8, 4u8, 5u8, 6u8, 7u8, NEWLINE],); + } + + #[test] + fn unblock_test_all_space() { + let buf = [SPACE, SPACE, SPACE, SPACE, SPACE, SPACE, SPACE, SPACE]; + let res = unblock(&buf, 8); + + assert_eq!(res, vec![NEWLINE],); + } + + #[test] + fn unblock_test_decoy_spaces() { + let buf = [0u8, SPACE, SPACE, SPACE, SPACE, SPACE, SPACE, 7u8]; + let res = unblock(&buf, 8); + + assert_eq!( + res, + vec![0u8, SPACE, SPACE, SPACE, SPACE, SPACE, SPACE, 7u8, NEWLINE], + ); + } + + #[test] + fn unblock_test_strip_single_cbs() { + let buf = [0u8, 1u8, 2u8, 3u8, SPACE, SPACE, SPACE, SPACE]; + let res = unblock(&buf, 8); + + assert_eq!(res, vec![0u8, 1u8, 2u8, 3u8, NEWLINE],); + } + + #[test] + fn unblock_test_strip_multi_cbs() { + let buf = vec![ + vec![0u8, SPACE, SPACE, SPACE, SPACE, SPACE, SPACE, SPACE], + vec![0u8, 1u8, SPACE, SPACE, SPACE, SPACE, SPACE, SPACE], + vec![0u8, 1u8, 2u8, SPACE, SPACE, SPACE, SPACE, SPACE], + vec![0u8, 1u8, 2u8, 3u8, SPACE, SPACE, SPACE, SPACE], + ] + .into_iter() + .flatten() + .collect::>(); + + let res = unblock(&buf, 8); + + let exp = vec![ + vec![0u8, NEWLINE], + vec![0u8, 1u8, NEWLINE], + vec![0u8, 1u8, 2u8, NEWLINE], + vec![0u8, 1u8, 2u8, 3u8, NEWLINE], + ] + .into_iter() + .flatten() + .collect::>(); + + assert_eq!(res, exp); + } + + #[test] + fn bsize_test_primes() { + let (n, m) = (7901, 7919); + let res = calc_bsize(n, m); + assert!(res % n == 0); + assert!(res % m == 0); + + assert_eq!(res, n * m); + } + + #[test] + fn bsize_test_rel_prime_obs_greater() { + let (n, m) = (7 * 5119, 13 * 5119); + let res = calc_bsize(n, m); + assert!(res % n == 0); + assert!(res % m == 0); + + assert_eq!(res, 7 * 13 * 5119); + } + + #[test] + fn bsize_test_rel_prime_ibs_greater() { + let (n, m) = (13 * 5119, 7 * 5119); + let res = calc_bsize(n, m); + assert!(res % n == 0); + assert!(res % m == 0); + + assert_eq!(res, 7 * 13 * 5119); + } + + #[test] + fn bsize_test_3fac_rel_prime() { + let (n, m) = (11 * 13 * 5119, 7 * 11 * 5119); + let res = calc_bsize(n, m); + assert!(res % n == 0); + assert!(res % m == 0); + + assert_eq!(res, 7 * 11 * 13 * 5119); + } + + #[test] + fn bsize_test_ibs_greater() { + let (n, m) = (512 * 1024, 256 * 1024); + let res = calc_bsize(n, m); + assert!(res % n == 0); + assert!(res % m == 0); + + assert_eq!(res, n); + } + + #[test] + fn bsize_test_obs_greater() { + let (n, m) = (256 * 1024, 512 * 1024); + let res = calc_bsize(n, m); + assert!(res % n == 0); + assert!(res % m == 0); + + assert_eq!(res, m); + } + + #[test] + fn bsize_test_bs_eq() { + let (n, m) = (1024, 1024); + let res = calc_bsize(n, m); + assert!(res % n == 0); + assert!(res % m == 0); + + assert_eq!(res, m); + } + + #[test] + #[should_panic] + fn test_nocreat_causes_failure_when_ofile_doesnt_exist() { + let args = vec![ + String::from("dd"), + String::from("--conv=nocreat"), + String::from("--of=not-a-real.file"), + ]; + + let matches = uu_app().try_get_matches_from(args).unwrap(); + let _ = Output::::new(&matches).unwrap(); + } + + #[test] + fn test_deadbeef_16_delayed() { + let input = Input { + src: LazyReader { + src: File::open("./test-resources/deadbeef-16.test").unwrap(), + }, + non_ascii: false, + ibs: 16, + print_level: None, + count: None, + cflags: IConvFlags { + sync: Some(0), + ..IConvFlags::default() + }, + iflags: IFlags::default(), + }; + + let output = Output { + dst: File::create("./test-resources/FAILED-deadbeef-16-delayed.test").unwrap(), + obs: 32, + cflags: OConvFlags::default(), + }; + + output.dd_out(input).unwrap(); + + let tmp_fname = "./test-resources/FAILED-deadbeef-16-delayed.test"; + let spec = File::open("./test-resources/deadbeef-16.spec").unwrap(); + + let res = File::open(tmp_fname).unwrap(); + // Check test file isn't empty (unless spec file is too) + assert_eq!( + res.metadata().unwrap().len(), + spec.metadata().unwrap().len() + ); + + let spec = BufReader::new(spec); + let res = BufReader::new(res); + + // Check all bytes match + for (b_res, b_spec) in res.bytes().zip(spec.bytes()) { + assert_eq!(b_res.unwrap(), b_spec.unwrap()); + } + + fs::remove_file(tmp_fname).unwrap(); + } + + #[test] + fn test_random_73k_test_lazy_fullblock() { + let input = Input { + src: LazyReader { + src: File::open("./test-resources/random-5828891cb1230748e146f34223bbd3b5.test") + .unwrap(), + }, + non_ascii: false, + ibs: 521, + print_level: None, + count: None, + cflags: IConvFlags::default(), + iflags: IFlags { + fullblock: true, + ..IFlags::default() + }, + }; + + let output = Output { + dst: File::create("./test-resources/FAILED-random_73k_test_lazy_fullblock.test") + .unwrap(), + obs: 1031, + cflags: OConvFlags::default(), + }; + + output.dd_out(input).unwrap(); + + let tmp_fname = "./test-resources/FAILED-random_73k_test_lazy_fullblock.test"; + let spec = + File::open("./test-resources/random-5828891cb1230748e146f34223bbd3b5.test").unwrap(); + + let res = File::open(tmp_fname).unwrap(); + // Check test file isn't empty (unless spec file is too) + assert_eq!( + res.metadata().unwrap().len(), + spec.metadata().unwrap().len() + ); + + let spec = BufReader::new(spec); + let res = BufReader::new(res); + + // Check all bytes match + for (b_res, b_spec) in res.bytes().zip(spec.bytes()) { + assert_eq!(b_res.unwrap(), b_spec.unwrap()); + } + + fs::remove_file(tmp_fname).unwrap(); + } +} diff --git a/src/uu/dd/src/dd_unit_tests/block_unblock_tests.rs b/src/uu/dd/src/dd_unit_tests/block_unblock_tests.rs deleted file mode 100644 index 919ddbb9c..000000000 --- a/src/uu/dd/src/dd_unit_tests/block_unblock_tests.rs +++ /dev/null @@ -1,351 +0,0 @@ -// spell-checker:ignore fname, tname, fpath, specfile, testfile, unspec, ifile, ofile, outfile, fullblock, urand, fileio, atoe, atoibm, behaviour, bmax, bremain, btotal, cflags, creat, ctable, ctty, datastructures, doesnt, etoa, fileout, fname, gnudd, iconvflags, nocache, noctty, noerror, nofollow, nolinks, nonblock, oconvflags, outfile, parseargs, rlen, rmax, rposition, rremain, rsofar, rstat, sigusr, sigval, wlen, wstat - -use super::*; - -#[cfg(unix)] -macro_rules! make_block_test ( - ( $test_id:ident, $test_name:expr, $src:expr, $block:expr, $spec:expr ) => - { - make_spec_test!($test_id, - $test_name, - Input { - src: $src, - non_ascii: false, - ibs: 512, - print_level: None, - count: None, - cflags: IConvFlags { - block: $block, - ..IConvFlags::default() - }, - iflags: IFlags::default(), - }, - Output { - dst: File::create(format!("./test-resources/FAILED-{}.test", $test_name)).unwrap(), - obs: 512, - cflags: OConvFlags::default(), - }, - $spec, - format!("./test-resources/FAILED-{}.test", $test_name) - ); - }; -); - -#[cfg(unix)] -macro_rules! make_unblock_test ( - ( $test_id:ident, $test_name:expr, $src:expr, $unblock:expr, $spec:expr ) => - { - make_spec_test!($test_id, - $test_name, - Input { - src: $src, - non_ascii: false, - ibs: 512, - print_level: None, - count: None, - cflags: IConvFlags { - unblock: $unblock, - ..IConvFlags::default() - }, - iflags: IFlags::default(), - }, - Output { - dst: File::create(format!("./test-resources/FAILED-{}.test", $test_name)).unwrap(), - obs: 512, - cflags: OConvFlags::default(), - }, - $spec, - format!("./test-resources/FAILED-{}.test", $test_name) - ); - }; -); - -#[test] -fn block_test_no_nl() { - let mut rs = ReadStat::default(); - let buf = [0u8, 1u8, 2u8, 3u8]; - let res = block(&buf, 4, &mut rs); - - assert_eq!(res, vec![vec![0u8, 1u8, 2u8, 3u8],]); -} - -#[test] -fn block_test_no_nl_short_record() { - let mut rs = ReadStat::default(); - let buf = [0u8, 1u8, 2u8, 3u8]; - let res = block(&buf, 8, &mut rs); - - assert_eq!( - res, - vec![vec![0u8, 1u8, 2u8, 3u8, SPACE, SPACE, SPACE, SPACE],] - ); -} - -#[test] -fn block_test_no_nl_trunc() { - let mut rs = ReadStat::default(); - let buf = [0u8, 1u8, 2u8, 3u8, 4u8]; - let res = block(&buf, 4, &mut rs); - - // Commented section(s) should be truncated and appear for reference only. - assert_eq!(res, vec![vec![0u8, 1u8, 2u8, 3u8 /*, 4u8*/],]); - assert_eq!(rs.records_truncated, 1); -} - -#[test] -fn block_test_nl_gt_cbs_trunc() { - let mut rs = ReadStat::default(); - let buf = [ - 0u8, 1u8, 2u8, 3u8, 4u8, NEWLINE, 0u8, 1u8, 2u8, 3u8, 4u8, NEWLINE, 5u8, 6u8, 7u8, 8u8, - ]; - let res = block(&buf, 4, &mut rs); - - assert_eq!( - res, - vec![ - // Commented section(s) should be truncated and appear for reference only. - vec![0u8, 1u8, 2u8, 3u8], - // vec![4u8, SPACE, SPACE, SPACE], - vec![0u8, 1u8, 2u8, 3u8], - // vec![4u8, SPACE, SPACE, SPACE], - vec![5u8, 6u8, 7u8, 8u8], - ] - ); - assert_eq!(rs.records_truncated, 2); -} - -#[test] -fn block_test_surrounded_nl() { - let mut rs = ReadStat::default(); - let buf = [0u8, 1u8, 2u8, 3u8, NEWLINE, 4u8, 5u8, 6u8, 7u8, 8u8]; - let res = block(&buf, 8, &mut rs); - - assert_eq!( - res, - vec![ - vec![0u8, 1u8, 2u8, 3u8, SPACE, SPACE, SPACE, SPACE], - vec![4u8, 5u8, 6u8, 7u8, 8u8, SPACE, SPACE, SPACE], - ] - ); -} - -#[test] -fn block_test_multiple_nl_same_cbs_block() { - let mut rs = ReadStat::default(); - let buf = [ - 0u8, 1u8, 2u8, 3u8, NEWLINE, 4u8, NEWLINE, 5u8, 6u8, 7u8, 8u8, 9u8, - ]; - let res = block(&buf, 8, &mut rs); - - assert_eq!( - res, - vec![ - vec![0u8, 1u8, 2u8, 3u8, SPACE, SPACE, SPACE, SPACE], - vec![4u8, SPACE, SPACE, SPACE, SPACE, SPACE, SPACE, SPACE], - vec![5u8, 6u8, 7u8, 8u8, 9u8, SPACE, SPACE, SPACE], - ] - ); -} - -#[test] -fn block_test_multiple_nl_diff_cbs_block() { - let mut rs = ReadStat::default(); - let buf = [ - 0u8, 1u8, 2u8, 3u8, NEWLINE, 4u8, 5u8, 6u8, 7u8, NEWLINE, 8u8, 9u8, - ]; - let res = block(&buf, 8, &mut rs); - - assert_eq!( - res, - vec![ - vec![0u8, 1u8, 2u8, 3u8, SPACE, SPACE, SPACE, SPACE], - vec![4u8, 5u8, 6u8, 7u8, SPACE, SPACE, SPACE, SPACE], - vec![8u8, 9u8, SPACE, SPACE, SPACE, SPACE, SPACE, SPACE], - ] - ); -} - -#[test] -fn block_test_end_nl_diff_cbs_block() { - let mut rs = ReadStat::default(); - let buf = [0u8, 1u8, 2u8, 3u8, NEWLINE]; - let res = block(&buf, 4, &mut rs); - - assert_eq!(res, vec![vec![0u8, 1u8, 2u8, 3u8],]); -} - -#[test] -fn block_test_end_nl_same_cbs_block() { - let mut rs = ReadStat::default(); - let buf = [0u8, 1u8, 2u8, NEWLINE]; - let res = block(&buf, 4, &mut rs); - - assert_eq!(res, vec![vec![0u8, 1u8, 2u8, SPACE]]); -} - -#[test] -fn block_test_double_end_nl() { - let mut rs = ReadStat::default(); - let buf = [0u8, 1u8, 2u8, NEWLINE, NEWLINE]; - let res = block(&buf, 4, &mut rs); - - assert_eq!( - res, - vec![vec![0u8, 1u8, 2u8, SPACE], vec![SPACE, SPACE, SPACE, SPACE],] - ); -} - -#[test] -fn block_test_start_nl() { - let mut rs = ReadStat::default(); - let buf = [NEWLINE, 0u8, 1u8, 2u8, 3u8]; - let res = block(&buf, 4, &mut rs); - - assert_eq!( - res, - vec![vec![SPACE, SPACE, SPACE, SPACE], vec![0u8, 1u8, 2u8, 3u8],] - ); -} - -#[test] -fn block_test_double_surrounded_nl_no_trunc() { - let mut rs = ReadStat::default(); - let buf = [0u8, 1u8, 2u8, 3u8, NEWLINE, NEWLINE, 4u8, 5u8, 6u8, 7u8]; - let res = block(&buf, 8, &mut rs); - - assert_eq!( - res, - vec![ - vec![0u8, 1u8, 2u8, 3u8, SPACE, SPACE, SPACE, SPACE], - vec![SPACE, SPACE, SPACE, SPACE, SPACE, SPACE, SPACE, SPACE], - vec![4u8, 5u8, 6u8, 7u8, SPACE, SPACE, SPACE, SPACE], - ] - ); -} - -#[test] -fn block_test_double_surrounded_nl_double_trunc() { - let mut rs = ReadStat::default(); - let buf = [ - 0u8, 1u8, 2u8, 3u8, NEWLINE, NEWLINE, 4u8, 5u8, 6u8, 7u8, 8u8, - ]; - let res = block(&buf, 4, &mut rs); - - assert_eq!( - res, - vec![ - // Commented section(s) should be truncated and appear for reference only. - vec![0u8, 1u8, 2u8, 3u8], - vec![SPACE, SPACE, SPACE, SPACE], - vec![4u8, 5u8, 6u8, 7u8 /*, 8u8*/], - ] - ); - assert_eq!(rs.records_truncated, 1); -} - -#[cfg(unix)] -make_block_test!( - block_cbs16, - "block-cbs-16", - File::open("./test-resources/dd-block-cbs16.test").unwrap(), - Some(16), - File::open("./test-resources/dd-block-cbs16.spec").unwrap() -); - -#[cfg(unix)] -make_block_test!( - block_cbs16_as_cbs8, - "block-cbs-16-as-cbs8", - File::open("./test-resources/dd-block-cbs16.test").unwrap(), - Some(8), - File::open("./test-resources/dd-block-cbs8.spec").unwrap() -); - -#[cfg(unix)] -make_block_test!( - block_consecutive_nl, - "block-consecutive-nl", - File::open("./test-resources/dd-block-consecutive-nl.test").unwrap(), - Some(16), - File::open("./test-resources/dd-block-consecutive-nl-cbs16.spec").unwrap() -); - -#[test] -fn unblock_test_full_cbs() { - let buf = [0u8, 1u8, 2u8, 3u8, 4u8, 5u8, 6u8, 7u8]; - let res = unblock(&buf, 8); - - assert_eq!(res, vec![0u8, 1u8, 2u8, 3u8, 4u8, 5u8, 6u8, 7u8, NEWLINE],); -} - -#[test] -fn unblock_test_all_space() { - let buf = [SPACE, SPACE, SPACE, SPACE, SPACE, SPACE, SPACE, SPACE]; - let res = unblock(&buf, 8); - - assert_eq!(res, vec![NEWLINE],); -} - -#[test] -fn unblock_test_decoy_spaces() { - let buf = [0u8, SPACE, SPACE, SPACE, SPACE, SPACE, SPACE, 7u8]; - let res = unblock(&buf, 8); - - assert_eq!( - res, - vec![0u8, SPACE, SPACE, SPACE, SPACE, SPACE, SPACE, 7u8, NEWLINE], - ); -} - -#[test] -fn unblock_test_strip_single_cbs() { - let buf = [0u8, 1u8, 2u8, 3u8, SPACE, SPACE, SPACE, SPACE]; - let res = unblock(&buf, 8); - - assert_eq!(res, vec![0u8, 1u8, 2u8, 3u8, NEWLINE],); -} - -#[test] -fn unblock_test_strip_multi_cbs() { - let buf = vec![ - vec![0u8, SPACE, SPACE, SPACE, SPACE, SPACE, SPACE, SPACE], - vec![0u8, 1u8, SPACE, SPACE, SPACE, SPACE, SPACE, SPACE], - vec![0u8, 1u8, 2u8, SPACE, SPACE, SPACE, SPACE, SPACE], - vec![0u8, 1u8, 2u8, 3u8, SPACE, SPACE, SPACE, SPACE], - ] - .into_iter() - .flatten() - .collect::>(); - - let res = unblock(&buf, 8); - - let exp = vec![ - vec![0u8, NEWLINE], - vec![0u8, 1u8, NEWLINE], - vec![0u8, 1u8, 2u8, NEWLINE], - vec![0u8, 1u8, 2u8, 3u8, NEWLINE], - ] - .into_iter() - .flatten() - .collect::>(); - - assert_eq!(res, exp); -} - -#[cfg(unix)] -make_unblock_test!( - unblock_multi_16, - "unblock-multi-16", - File::open("./test-resources/dd-unblock-cbs16.test").unwrap(), - Some(16), - File::open("./test-resources/dd-unblock-cbs16.spec").unwrap() -); - -#[cfg(unix)] -make_unblock_test!( - unblock_multi_16_as_8, - "unblock-multi-16-as-8", - File::open("./test-resources/dd-unblock-cbs16.test").unwrap(), - Some(8), - File::open("./test-resources/dd-unblock-cbs8.spec").unwrap() -); diff --git a/src/uu/dd/src/dd_unit_tests/conv_sync_tests.rs b/src/uu/dd/src/dd_unit_tests/conv_sync_tests.rs deleted file mode 100644 index 904a97cf5..000000000 --- a/src/uu/dd/src/dd_unit_tests/conv_sync_tests.rs +++ /dev/null @@ -1,106 +0,0 @@ -// spell-checker:ignore fname, tname, fpath, specfile, testfile, unspec, ifile, ofile, outfile, fullblock, urand, fileio, atoe, atoibm, behaviour, bmax, bremain, btotal, cflags, creat, ctable, ctty, datastructures, doesnt, etoa, fileout, fname, gnudd, iconvflags, nocache, noctty, noerror, nofollow, nolinks, nonblock, oconvflags, outfile, parseargs, rlen, rmax, rposition, rremain, rsofar, rstat, sigusr, sigval, wlen, wstat - -use super::*; - -macro_rules! make_sync_test ( - ( $test_id:ident, $test_name:expr, $src:expr, $sync:expr, $ibs:expr, $obs:expr, $spec:expr ) => - { - make_spec_test!($test_id, - $test_name, - Input { - src: $src, - non_ascii: false, - ibs: $ibs, - print_level: None, - count: None, - cflags: IConvFlags { - sync: $sync, - ..IConvFlags::default() - }, - iflags: IFlags::default(), - }, - Output { - dst: File::create(format!("./test-resources/FAILED-{}.test", $test_name)).unwrap(), - obs: $obs, - cflags: OConvFlags::default(), - }, - $spec, - format!("./test-resources/FAILED-{}.test", $test_name) - ); - }; -); - -// Zeros -make_sync_test!( - zeros_4k_conv_sync_obs_gt_ibs, - "zeros_4k_conv_sync_obs_gt_ibs", - File::open("./test-resources/zeros-620f0b67a91f7f74151bc5be745b7110.test").unwrap(), - Some(0u8), - 521, - 1031, - File::open("./test-resources/gnudd-conv-sync-ibs-521-obs-1031-zeros.spec").unwrap() -); - -make_sync_test!( - zeros_4k_conv_sync_ibs_gt_obs, - "zeros_4k_conv_sync_ibs_gt_obs", - File::open("./test-resources/zeros-620f0b67a91f7f74151bc5be745b7110.test").unwrap(), - Some(0u8), - 1031, - 521, - File::open("./test-resources/gnudd-conv-sync-ibs-1031-obs-521-zeros.spec").unwrap() -); - -// Deadbeef -make_sync_test!( - deadbeef_32k_conv_sync_obs_gt_ibs, - "deadbeef_32k_conv_sync_obs_gt_ibs", - File::open("./test-resources/deadbeef-18d99661a1de1fc9af21b0ec2cd67ba3.test").unwrap(), - Some(0u8), - 521, - 1031, - File::open("./test-resources/gnudd-conv-sync-ibs-521-obs-1031-deadbeef.spec").unwrap() -); - -make_sync_test!( - deadbeef_32k_conv_sync_ibs_gt_obs, - "deadbeef_32k_conv_sync_ibs_gt_obs", - File::open("./test-resources/deadbeef-18d99661a1de1fc9af21b0ec2cd67ba3.test").unwrap(), - Some(0u8), - 1031, - 521, - File::open("./test-resources/gnudd-conv-sync-ibs-1031-obs-521-deadbeef.spec").unwrap() -); - -// Random -make_sync_test!( - random_73k_test_bs_prime_obs_gt_ibs_sync, - "random-73k-test-bs-prime-obs-gt-ibs-sync", - File::open("./test-resources/random-5828891cb1230748e146f34223bbd3b5.test").unwrap(), - Some(0u8), - 521, - 1031, - File::open("./test-resources/gnudd-conv-sync-ibs-521-obs-1031-random.spec").unwrap() -); - -make_sync_test!( - random_73k_test_bs_prime_ibs_gt_obs_sync, - "random-73k-test-bs-prime-ibs-gt-obs-sync", - File::open("./test-resources/random-5828891cb1230748e146f34223bbd3b5.test").unwrap(), - Some(0u8), - 1031, - 521, - File::open("./test-resources/gnudd-conv-sync-ibs-1031-obs-521-random.spec").unwrap() -); - -make_sync_test!( - deadbeef_16_delayed, - "deadbeef-16-delayed", - LazyReader { - src: File::open("./test-resources/deadbeef-16.test").unwrap() - }, - Some(0u8), - 16, - 32, - File::open("./test-resources/deadbeef-16.spec").unwrap() -); diff --git a/src/uu/dd/src/dd_unit_tests/conversion_tests.rs b/src/uu/dd/src/dd_unit_tests/conversion_tests.rs deleted file mode 100644 index 9255a1a89..000000000 --- a/src/uu/dd/src/dd_unit_tests/conversion_tests.rs +++ /dev/null @@ -1,233 +0,0 @@ -// spell-checker:ignore fname, tname, fpath, specfile, testfile, unspec, ifile, ofile, outfile, fullblock, urand, fileio, atoe, atoibm, behaviour, bmax, bremain, btotal, cflags, creat, ctable, ctty, datastructures, doesnt, etoa, fileout, fname, gnudd, iconvflags, nocache, noctty, noerror, nofollow, nolinks, nonblock, oconvflags, outfile, parseargs, rlen, rmax, rposition, rremain, rsofar, rstat, sigusr, sigval, wlen, wstat - -use super::*; - -macro_rules! make_conv_test ( - ( $test_id:ident, $test_name:expr, $src:expr, $ctable:expr, $spec:expr ) => - { - make_spec_test!($test_id, - $test_name, - Input { - src: $src, - non_ascii: false, - ibs: 512, - print_level: None, - count: None, - cflags: icf!($ctable), - iflags: IFlags::default(), - }, - Output { - dst: File::create(format!("./test-resources/FAILED-{}.test", $test_name)).unwrap(), - obs: 512, - cflags: OConvFlags::default(), - }, - $spec, - format!("./test-resources/FAILED-{}.test", $test_name) - ); - }; -); - -macro_rules! make_icf_test ( - ( $test_id:ident, $test_name:expr, $src:expr, $icf:expr, $spec:expr ) => - { - make_spec_test!($test_id, - $test_name, - Input { - src: $src, - non_ascii: false, - ibs: 512, - print_level: None, - count: None, - cflags: $icf, - iflags: IFlags::default(), - }, - Output { - dst: File::create(format!("./test-resources/FAILED-{}.test", $test_name)).unwrap(), - obs: 512, - cflags: OConvFlags::default(), - }, - $spec, - format!("./test-resources/FAILED-{}.test", $test_name) - ); - }; -); - -make_conv_test!( - atoe_conv_spec_test, - "atoe-conv-spec-test", - File::open("./test-resources/seq-byte-values-b632a992d3aed5d8d1a59cc5a5a455ba.test").unwrap(), - Some(&ASCII_TO_EBCDIC), - File::open("./test-resources/gnudd-conv-atoe-seq-byte-values.spec").unwrap() -); - -make_conv_test!( - etoa_conv_spec_test, - "etoa-conv-spec-test", - File::open("./test-resources/seq-byte-values-b632a992d3aed5d8d1a59cc5a5a455ba.test").unwrap(), - Some(&EBCDIC_TO_ASCII), - File::open("./test-resources/gnudd-conv-etoa-seq-byte-values.spec").unwrap() -); - -make_conv_test!( - atoibm_conv_spec_test, - "atoibm-conv-spec-test", - File::open("./test-resources/seq-byte-values-b632a992d3aed5d8d1a59cc5a5a455ba.test").unwrap(), - Some(&ASCII_TO_IBM), - File::open("./test-resources/gnudd-conv-atoibm-seq-byte-values.spec").unwrap() -); - -make_conv_test!( - lcase_ascii_to_ucase_ascii, - "lcase_ascii_to_ucase_ascii", - File::open("./test-resources/lcase-ascii.test").unwrap(), - Some(&ASCII_LCASE_TO_UCASE), - File::open("./test-resources/ucase-ascii.test").unwrap() -); - -make_conv_test!( - ucase_ascii_to_lcase_ascii, - "ucase_ascii_to_lcase_ascii", - File::open("./test-resources/ucase-ascii.test").unwrap(), - Some(&ASCII_UCASE_TO_LCASE), - File::open("./test-resources/lcase-ascii.test").unwrap() -); - -make_conv_test!( - // conv=ebcdic,ucase - atoe_and_ucase_conv_spec_test, - "atoe-and-ucase-conv-spec-test", - File::open("./test-resources/seq-byte-values-b632a992d3aed5d8d1a59cc5a5a455ba.test").unwrap(), - Some(&ASCII_TO_EBCDIC_LCASE_TO_UCASE), - File::open("./test-resources/ucase-ebcdic.test").unwrap() -); - -make_conv_test!( - // conv=ebcdic,lcase - atoe_and_lcase_conv_spec_test, - "atoe-and-lcase-conv-spec-test", - File::open("./test-resources/seq-byte-values-b632a992d3aed5d8d1a59cc5a5a455ba.test").unwrap(), - Some(&ASCII_TO_EBCDIC_UCASE_TO_LCASE), - File::open("./test-resources/lcase-ebcdic.test").unwrap() -); - -make_conv_test!( - // conv=ibm,ucase - atoibm_and_ucase_conv_spec_test, - "atoibm-and-ucase-conv-spec-test", - File::open("./test-resources/seq-byte-values-b632a992d3aed5d8d1a59cc5a5a455ba.test").unwrap(), - Some(&ASCII_TO_IBM_UCASE_TO_LCASE), - File::open("./test-resources/lcase-ibm.test").unwrap() -); - -make_conv_test!( - // conv=ibm,lcase - atoibm_and_lcase_conv_spec_test, - "atoibm-and-lcase-conv-spec-test", - File::open("./test-resources/seq-byte-values-b632a992d3aed5d8d1a59cc5a5a455ba.test").unwrap(), - Some(&ASCII_TO_IBM_LCASE_TO_UCASE), - File::open("./test-resources/ucase-ibm.test").unwrap() -); - -#[test] -fn all_valid_ascii_ebcdic_ascii_roundtrip_conv_test() { - // ASCII->EBCDIC - let test_name = "all-valid-ascii-to-ebcdic"; - let tmp_fname_ae = format!("./test-resources/FAILED-{}.test", test_name); - - let i = Input { - src: File::open( - "./test-resources/all-valid-ascii-chars-37eff01866ba3f538421b30b7cbefcac.test", - ) - .unwrap(), - non_ascii: false, - ibs: 128, - print_level: None, - count: None, - cflags: icf!(Some(&ASCII_TO_EBCDIC)), - iflags: IFlags::default(), - }; - - let o = Output { - dst: File::create(&tmp_fname_ae).unwrap(), - obs: 1024, - cflags: OConvFlags::default(), - }; - - o.dd_out(i).unwrap(); - - // EBCDIC->ASCII - let test_name = "all-valid-ebcdic-to-ascii"; - let tmp_fname_ea = format!("./test-resources/FAILED-{}.test", test_name); - - let i = Input { - src: File::open(&tmp_fname_ae).unwrap(), - non_ascii: false, - ibs: 256, - print_level: None, - count: None, - cflags: icf!(Some(&EBCDIC_TO_ASCII)), - iflags: IFlags::default(), - }; - - let o = Output { - dst: File::create(&tmp_fname_ea).unwrap(), - obs: 1024, - cflags: OConvFlags::default(), - }; - - o.dd_out(i).unwrap(); - - // Final Comparison - let res = File::open(&tmp_fname_ea).unwrap(); - let spec = - File::open("./test-resources/all-valid-ascii-chars-37eff01866ba3f538421b30b7cbefcac.test") - .unwrap(); - - assert_eq!( - res.metadata().unwrap().len(), - spec.metadata().unwrap().len() - ); - - let res = BufReader::new(res); - let spec = BufReader::new(spec); - - let res = BufReader::new(res); - - // Check all bytes match - for (b_res, b_spec) in res.bytes().zip(spec.bytes()) { - assert_eq!(b_res.unwrap(), b_spec.unwrap()); - } - - fs::remove_file(&tmp_fname_ae).unwrap(); - fs::remove_file(&tmp_fname_ea).unwrap(); -} - -make_icf_test!( - swab_256_test, - "swab-256", - File::open("./test-resources/seq-byte-values.test").unwrap(), - IConvFlags { - ctable: None, - block: None, - unblock: None, - swab: true, - sync: None, - noerror: false, - }, - File::open("./test-resources/seq-byte-values-swapped.test").unwrap() -); - -make_icf_test!( - swab_257_test, - "swab-257", - File::open("./test-resources/seq-byte-values-odd.test").unwrap(), - IConvFlags { - ctable: None, - block: None, - unblock: None, - swab: true, - sync: None, - noerror: false, - }, - File::open("./test-resources/seq-byte-values-odd.spec").unwrap() -); diff --git a/src/uu/dd/src/dd_unit_tests/mod.rs b/src/uu/dd/src/dd_unit_tests/mod.rs deleted file mode 100644 index 9641c9bba..000000000 --- a/src/uu/dd/src/dd_unit_tests/mod.rs +++ /dev/null @@ -1,89 +0,0 @@ -// spell-checker:ignore fname, tname, fpath, specfile, testfile, unspec, ifile, ofile, outfile, fullblock, urand, fileio, atoe, atoibm, behaviour, bmax, bremain, btotal, cflags, creat, ctable, ctty, datastructures, doesnt, etoa, fileout, fname, gnudd, iconvflags, nocache, noctty, noerror, nofollow, nolinks, nonblock, oconvflags, outfile, parseargs, rlen, rmax, rposition, rremain, rsofar, rstat, sigusr, sigval, wlen, wstat - -use super::*; - -mod block_unblock_tests; -mod conv_sync_tests; -mod conversion_tests; -mod sanity_tests; - -use std::fs; -use std::io::prelude::*; -use std::io::BufReader; - -struct LazyReader { - src: R, -} - -impl Read for LazyReader { - fn read(&mut self, buf: &mut [u8]) -> io::Result { - let reduced = cmp::max(buf.len() / 2, 1); - self.src.read(&mut buf[..reduced]) - } -} - -#[macro_export] -macro_rules! icf ( - ( $ctable:expr ) => - { - IConvFlags { - ctable: $ctable, - ..IConvFlags::default() - } - }; -); - -#[macro_export] -macro_rules! make_spec_test ( - ( $test_id:ident, $test_name:expr, $src:expr ) => - { - // When spec not given, output should match input - make_spec_test!($test_id, $test_name, $src, $src); - }; - ( $test_id:ident, $test_name:expr, $src:expr, $spec:expr ) => - { - make_spec_test!($test_id, - $test_name, - Input { - src: $src, - non_ascii: false, - ibs: 512, - print_level: None, - count: None, - cflags: IConvFlags::default(), - iflags: IFlags::default(), - }, - Output { - dst: File::create(format!("./test-resources/FAILED-{}.test", $test_name)).unwrap(), - obs: 512, - cflags: OConvFlags::default(), - }, - $spec, - format!("./test-resources/FAILED-{}.test", $test_name) - ); - }; - ( $test_id:ident, $test_name:expr, $i:expr, $o:expr, $spec:expr, $tmp_fname:expr ) => - { - #[test] - fn $test_id() - { - $o.dd_out($i).unwrap(); - - let res = File::open($tmp_fname).unwrap(); - // Check test file isn't empty (unless spec file is too) - assert_eq!(res.metadata().unwrap().len(), $spec.metadata().unwrap().len()); - - let spec = BufReader::new($spec); - let res = BufReader::new(res); - - // Check all bytes match - for (b_res, b_spec) in res.bytes().zip(spec.bytes()) - { - assert_eq!(b_res.unwrap(), - b_spec.unwrap()); - } - - fs::remove_file($tmp_fname).unwrap(); - } - }; -); diff --git a/src/uu/dd/src/dd_unit_tests/sanity_tests.rs b/src/uu/dd/src/dd_unit_tests/sanity_tests.rs deleted file mode 100644 index f58d68c48..000000000 --- a/src/uu/dd/src/dd_unit_tests/sanity_tests.rs +++ /dev/null @@ -1,316 +0,0 @@ -// spell-checker:ignore fname, tname, fpath, specfile, testfile, unspec, ifile, ofile, outfile, fullblock, urand, fileio, atoe, atoibm, behaviour, bmax, bremain, btotal, cflags, creat, ctable, ctty, datastructures, doesnt, etoa, fileout, fname, gnudd, iconvflags, nocache, noctty, noerror, nofollow, nolinks, nonblock, oconvflags, outfile, parseargs, rlen, rmax, rposition, rremain, rsofar, rstat, sigusr, sigval, wlen, wstat - -use super::*; - -const DST_PLACEHOLDER: Vec = Vec::new(); - -macro_rules! make_io_test ( - ( $test_id:ident, $test_name:expr, $i:expr, $o:expr, $spec:expr ) => - { - make_spec_test!($test_id, - $test_name, - $i, - Output { - dst: File::create(format!("./test-resources/FAILED-{}.test", $test_name)).unwrap(), - obs: $o.obs, - cflags: $o.cflags, - }, - $spec, - format!("./test-resources/FAILED-{}.test", $test_name) - ); - }; -); - -make_spec_test!( - zeros_4k_test, - "zeros-4k", - File::open("./test-resources/zeros-620f0b67a91f7f74151bc5be745b7110.test").unwrap() -); - -make_spec_test!( - ones_4k_test, - "ones-4k", - File::open("./test-resources/ones-6ae59e64850377ee5470c854761551ea.test").unwrap() -); - -make_spec_test!( - deadbeef_32k_test, - "deadbeef-32k", - File::open("./test-resources/deadbeef-18d99661a1de1fc9af21b0ec2cd67ba3.test").unwrap() -); - -make_spec_test!( - random_73k_test, - "random-73k", - File::open("./test-resources/random-5828891cb1230748e146f34223bbd3b5.test").unwrap() -); - -make_io_test!( - random_73k_test_not_a_multiple_obs_gt_ibs, - "random-73k-not-a-multiple-obs-gt-ibs", - Input { - src: File::open("./test-resources/random-5828891cb1230748e146f34223bbd3b5.test").unwrap(), - non_ascii: false, - ibs: 521, - print_level: None, - count: None, - cflags: IConvFlags::default(), - iflags: IFlags::default(), - }, - Output { - dst: DST_PLACEHOLDER, - obs: 1031, - cflags: OConvFlags::default(), - }, - File::open("./test-resources/random-5828891cb1230748e146f34223bbd3b5.test").unwrap() -); - -make_io_test!( - random_73k_test_obs_lt_not_a_multiple_ibs, - "random-73k-obs-lt-not-a-multiple-ibs", - Input { - src: File::open("./test-resources/random-5828891cb1230748e146f34223bbd3b5.test").unwrap(), - non_ascii: false, - ibs: 1031, - print_level: None, - count: None, - cflags: IConvFlags::default(), - iflags: IFlags::default(), - }, - Output { - dst: DST_PLACEHOLDER, - obs: 521, - cflags: OConvFlags::default(), - }, - File::open("./test-resources/random-5828891cb1230748e146f34223bbd3b5.test").unwrap() -); - -make_io_test!( - deadbeef_all_32k_test_count_reads, - "deadbeef_all_32k_test_count_reads", - Input { - src: File::open("./test-resources/deadbeef-18d99661a1de1fc9af21b0ec2cd67ba3.test").unwrap(), - non_ascii: false, - ibs: 1024, - print_level: None, - count: Some(CountType::Reads(32)), - cflags: IConvFlags::default(), - iflags: IFlags::default(), - }, - Output { - dst: DST_PLACEHOLDER, - obs: 1024, - cflags: OConvFlags::default(), - }, - File::open("./test-resources/deadbeef-18d99661a1de1fc9af21b0ec2cd67ba3.test").unwrap() -); - -make_io_test!( - deadbeef_all_32k_test_count_bytes, - "deadbeef_all_32k_test_count_bytes", - Input { - src: File::open("./test-resources/deadbeef-18d99661a1de1fc9af21b0ec2cd67ba3.test").unwrap(), - non_ascii: false, - ibs: 531, - print_level: None, - count: Some(CountType::Bytes(32 * 1024)), - cflags: IConvFlags::default(), - iflags: IFlags::default(), - }, - Output { - dst: DST_PLACEHOLDER, - obs: 1031, - cflags: OConvFlags::default(), - }, - File::open("./test-resources/deadbeef-18d99661a1de1fc9af21b0ec2cd67ba3.test").unwrap() -); - -make_io_test!( - deadbeef_32k_to_16k_test_count_reads, - "deadbeef_32k_test_count_reads", - Input { - src: File::open("./test-resources/deadbeef-18d99661a1de1fc9af21b0ec2cd67ba3.test").unwrap(), - non_ascii: false, - ibs: 1024, - print_level: None, - count: Some(CountType::Reads(16)), - cflags: IConvFlags::default(), - iflags: IFlags::default(), - }, - Output { - dst: DST_PLACEHOLDER, - obs: 1031, - cflags: OConvFlags::default(), - }, - File::open("./test-resources/gnudd-deadbeef-first-16k.spec").unwrap() -); - -make_io_test!( - deadbeef_32k_to_12345_test_count_bytes, - "deadbeef_32k_to_12345_test_count_bytes", - Input { - src: File::open("./test-resources/deadbeef-18d99661a1de1fc9af21b0ec2cd67ba3.test").unwrap(), - non_ascii: false, - ibs: 531, - print_level: None, - count: Some(CountType::Bytes(12345)), - cflags: IConvFlags::default(), - iflags: IFlags::default(), - }, - Output { - dst: DST_PLACEHOLDER, - obs: 1031, - cflags: OConvFlags::default(), - }, - File::open("./test-resources/gnudd-deadbeef-first-12345.spec").unwrap() -); - -make_io_test!( - random_73k_test_count_reads, - "random-73k-test-count-reads", - Input { - src: File::open("./test-resources/random-5828891cb1230748e146f34223bbd3b5.test").unwrap(), - non_ascii: false, - ibs: 1024, - print_level: None, - count: Some(CountType::Reads(32)), - cflags: IConvFlags::default(), - iflags: IFlags::default(), - }, - Output { - dst: DST_PLACEHOLDER, - obs: 1024, - cflags: OConvFlags::default(), - }, - File::open("./test-resources/gnudd-random-first-32k.spec").unwrap() -); - -make_io_test!( - random_73k_test_count_bytes, - "random-73k-test-count-bytes", - Input { - src: File::open("./test-resources/random-5828891cb1230748e146f34223bbd3b5.test").unwrap(), - non_ascii: false, - ibs: 521, - print_level: None, - count: Some(CountType::Bytes(32 * 1024)), - cflags: IConvFlags::default(), - iflags: IFlags::default(), - }, - Output { - dst: DST_PLACEHOLDER, - obs: 1031, - cflags: OConvFlags::default(), - }, - File::open("./test-resources/gnudd-random-first-32k.spec").unwrap() -); - -make_io_test!( - random_73k_test_lazy_fullblock, - "random-73k-test-lazy-fullblock", - Input { - src: LazyReader { - src: File::open("./test-resources/random-5828891cb1230748e146f34223bbd3b5.test") - .unwrap() - }, - non_ascii: false, - ibs: 521, - print_level: None, - count: None, - cflags: IConvFlags::default(), - iflags: IFlags { - fullblock: true, - ..IFlags::default() - }, - }, - Output { - dst: DST_PLACEHOLDER, - obs: 1031, - cflags: OConvFlags::default(), - }, - File::open("./test-resources/random-5828891cb1230748e146f34223bbd3b5.test").unwrap() -); - -// Test internal buffer size fn -#[test] -fn bsize_test_primes() { - let (n, m) = (7901, 7919); - let res = calc_bsize(n, m); - assert!(res % n == 0); - assert!(res % m == 0); - - assert_eq!(res, n * m); -} - -#[test] -fn bsize_test_rel_prime_obs_greater() { - let (n, m) = (7 * 5119, 13 * 5119); - let res = calc_bsize(n, m); - assert!(res % n == 0); - assert!(res % m == 0); - - assert_eq!(res, 7 * 13 * 5119); -} - -#[test] -fn bsize_test_rel_prime_ibs_greater() { - let (n, m) = (13 * 5119, 7 * 5119); - let res = calc_bsize(n, m); - assert!(res % n == 0); - assert!(res % m == 0); - - assert_eq!(res, 7 * 13 * 5119); -} - -#[test] -fn bsize_test_3fac_rel_prime() { - let (n, m) = (11 * 13 * 5119, 7 * 11 * 5119); - let res = calc_bsize(n, m); - assert!(res % n == 0); - assert!(res % m == 0); - - assert_eq!(res, 7 * 11 * 13 * 5119); -} - -#[test] -fn bsize_test_ibs_greater() { - let (n, m) = (512 * 1024, 256 * 1024); - let res = calc_bsize(n, m); - assert!(res % n == 0); - assert!(res % m == 0); - - assert_eq!(res, n); -} - -#[test] -fn bsize_test_obs_greater() { - let (n, m) = (256 * 1024, 512 * 1024); - let res = calc_bsize(n, m); - assert!(res % n == 0); - assert!(res % m == 0); - - assert_eq!(res, m); -} - -#[test] -fn bsize_test_bs_eq() { - let (n, m) = (1024, 1024); - let res = calc_bsize(n, m); - assert!(res % n == 0); - assert!(res % m == 0); - - assert_eq!(res, m); -} - -#[test] -#[should_panic] -fn test_nocreat_causes_failure_when_ofile_doesnt_exist() { - let args = vec![ - String::from("dd"), - String::from("--conv=nocreat"), - String::from("--of=not-a-real.file"), - ]; - - let matches = uu_app().try_get_matches_from(args).unwrap(); - let _ = Output::::new(&matches).unwrap(); -} diff --git a/src/uu/dd/test-resources/FAILED-random-5828891cb1230748e146f34223bbd3b5.test b/src/uu/dd/test-resources/FAILED-random-5828891cb1230748e146f34223bbd3b5.test new file mode 100644 index 0000000000000000000000000000000000000000..6e997411c30e758e1d8654b02d365940cda4426d GIT binary patch literal 74400 zcmV(lK=i+i(^$GFVXlSjw3R8{V=KI?nI@jzfsnp6H#&|wrjYc#lsB54LAPAi~k(csZ0p#Fx2VRbE3gcN)dp(Y+i@DTL+|x z*AbmV=PX{GI)ZZ!AKbXrOHn$vLy2b}j{OhfXtGE_H-w^a@bpkklRM;1?E7l^Vsmne zwYNA!>m4zUC+Ow6LBQyW@wLKN_|ON!Uj^=HcP|s|bGr^D7!cUh;iN{R`8@-xbd|3@ zh1B-$A&V`x$(=ROZCv_Dz+^uQ`XyC!lJgZrfNXFDAW*ypzP6Wd8kc96rHW?5j=>kV zi?uIEHX=iEz8BrQv`ZJzDz$8}mrjW?EM7(k1_#sL1oC3!<{vWj*7?sl?26oIY1#g< zU#z;|z{TuNHjT<>o-|c=Sss z;LWOgcz0j8te6|MYY6w^I_$GM-)pa8LYFD-b=%+3CRK#!}aVNqEYnZbKV$W41F}YQ>3M1$x ze{)*U3u|vh+Paq5?FMc`IDVc*U`%swieHCs7#%P6opE@x1G>y78uxtcf0pTMNiEEU zFy3_~SQlg7vrj9_J9mIK;?Iq3ng^=YkQvFF^Inu(*_h>Y$!BAdW z8h?7IM>=_i=K+{$_B?Bu6F9fmik=RMioP9qS3w=ylah*+E6!yn7CtNPY5W-4wSm}_Eur^$rY&`~B=eRUI()-q5Le1z4u%DS zB#;D2Pt}cA#(D^inQmyy5R(dJ7bfM4v~PFfqWEE2|u~N7*c>drFT)m zbzFehtMj#JKfIQ4zulk_PAn!A0>prqoEd3PUb5DAl!5_t#ch%z%pAD=gu-L&-wrC~ zaMKaPM+MlGV2pUHC{699R1_~Gh*wHr(`GF3LEz%k@T2S1(%4(oD^tb&XVl() zkdQ`m_v`Pf`xXN(Ct

Ji%D(&yfz4w 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

B`qlH|)*{)`}YFov7{iMxr6Gtkzx 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 G{Qv$j+kb%o diff --git a/src/uu/dd/test-resources/gnudd-conv-atoibm-seq-byte-values.spec b/src/uu/dd/test-resources/gnudd-conv-atoibm-seq-byte-values.spec deleted file mode 100644 index 3835d57cfb07e4c9021a7b8e0e2447a212c3032b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 256 zcmV+b0ssC100ROoH!m&)77HZ}3=a+w5EBwTJSH+37$-j+93LK9Kzn~|TYXSnO-@{3 zYhg?A@bmKZ^!N7p_+EN`OmA+%e8a-U#K*?T$kNf&)7I74*W%ga(r@*PuPY0nPAR{6bBo_uLC@U%nEE@_jFf$r8 zGzd01I6FEN1mQkHK}17FMMy_cNmEi)R99A6SYu*kWM^h+XmN0Ja&>ffc7S+`ij9nq zj+&61o1UGZpR1~^tgo)Iu(PtYw70goxVyT&yuZH7%FWEr&fD7E+~3~o>h0|B?)&=v G{Qv$;Hh?z( diff --git a/src/uu/dd/test-resources/gnudd-conv-ebcdic-ltou-seq-byte-values.spec b/src/uu/dd/test-resources/gnudd-conv-ebcdic-ltou-seq-byte-values.spec deleted file mode 100644 index ed0686639a7ec0d1d4df7e51ef806dd6f76a0e2a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 256 zcmZQ%U}n-a*Vkhe<5uP6;pY<+5EinvQ8SX1P`8(rk(Y~dsIJe6t__Iw^@~Z!PW1lx z;q#}jU%r3)`6I5X&L=a}c5AB>BU7X!qJ=_C5 zgM>!owmXl9N(X($g|C3JZ#hN=wSi8Y;TGdVBi&vL?)#J#X%U`KwoXty#Zr&h5-No diff --git a/src/uu/dd/test-resources/gnudd-conv-ebcdic-utol-seq-byte-values.spec b/src/uu/dd/test-resources/gnudd-conv-ebcdic-utol-seq-byte-values.spec deleted file mode 100644 index 13c82e5e3c8500dbc52f6820c5fe57b5ab5e9762..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 256 zcmZQ%U}n-a*Vkhe<5uP6;pY<+5EinvQ8SX1P`8(rk(Y~dsIJe6t__Iw^@~Z!PW1lx z;q#}jU%r3)`6I5X&L=;wv8K7HwWYnSvt!c4DU+v7oiTmU%q5GLEnTsE?aI9ma%VMG z;*vkG@`68myrP1#lBkL}o2G`g7N?Fhm!W~Nl&J}anWcrbl?cm2J10jMXE#?5_dw6! zpwN);u*ityq|}u3w9Jgcg5sjmlJc^Kiteu7p8me933F!8o4a8C>Q!EA*00;RVe_V~ sTeff8xnuXPg?skzJALZxne*pv-@1F}{=L_)-oAPN?)R_1fBydi0I5)U0RR91 diff --git a/src/uu/dd/test-resources/gnudd-conv-etoa-seq-byte-values.spec b/src/uu/dd/test-resources/gnudd-conv-etoa-seq-byte-values.spec deleted file mode 100644 index 433b1f600bebcdb8e30264c727d5e5c7b6eac6af..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 256 zcmV+b0ssC100ROEoPUOmmkW*!3=a+w5EBxGoree+7>|-293LKmfP;bxgc}!$h>MB^ zj0XmhkdqdblmwQUn46jv6dInOAfln9qo$>(r!LhfJbWvuCabEgtgo)Iup}WVDtvQP%4}h0`GeN0PEO;Ar#QSa{Y@bmJYTvSt5RajSAS@rby_WAfRFf%eWG&eRmIQ#nj G{Qv$fyMKWI diff --git a/src/uu/dd/test-resources/gnudd-conv-ibm-ltou-seq-byte-values.spec b/src/uu/dd/test-resources/gnudd-conv-ibm-ltou-seq-byte-values.spec deleted file mode 100644 index d425e7d012beb1c314cc4e1f72fafed1afe378e2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 256 zcmZQ%U}n-a*Vkhe<5uP6;pY<+5EinvQ8SX1P`8(rk(Y~dsIJe6t__Iw^@~Z!PW1lx z;q#}jU%r3)`6I5X&L=_JxWH%1WXt;%u54+FG1C(p-iH#!{vx9A=gl)>a}c5AB>BU7X!qJ=_C5 zgM>!owmXl9N(X($g|C3JZ#hN=wSi8Y;TGdVBi&W=)tgd*0jy^H;B0yJr2mjT<&^ t+PY=?ww*h6@7lX(|Gv|w&Yn4c?)I&_ckbVN{p#(T_wRoH`upeqKL7->hPMC! diff --git a/src/uu/dd/test-resources/gnudd-conv-ibm-utol-seq-byte-values.spec b/src/uu/dd/test-resources/gnudd-conv-ibm-utol-seq-byte-values.spec deleted file mode 100644 index 1dcaccbcdf8adfd826979f9273c87cd9568b0209..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 256 zcmZQ%U}n-a*Vkhe<5uP6;pY<+5EinvQ8SX1P`8(rk(Y~dsIJe6t__Iw^@~Z!PW1lx z;q#}jU%r3)`6I5X&L=;wv8K7HwWYnSvt!c4DU+v7oiTmU%q5GLEnTsE?aI9ma^o8- zamgQ8dBLB3p`wDalBkL}o2G`g7N?Fhm!W~Nl&J}anWcrbl?cm2J10jMXE#?5_dw6! zpwN);u*ityq|}u3w9Jgcg5sjmlJc^Kiteu7p8mdB6XwjGH+RAO)vMO7S-)=MhRvI{ sZrQ$V=Z@XG_U_rg@ARp&XU?Cyee3R>`}bbIdi&=6yWhY5{`vn80K=@5f_t`kd~5_k(X0cP*ze^QCHK{(ALt`(bqFH zFg7wZF*mccu(qcc@%IZ12o4Gj2@i{mh>nVliH~zkz$ITD zRa;YE*Vxe9)Y{VC*4feB)!WnGH*vz`NmHjxpEh&G>{)Z?%%8V#!Qw?rmn>hla>eRZ zYuBt_w{gSfO@5f_t`kd~5_k(X0cP*ze^QCHK{(ALt`(bqFH zFg7wZF*mccu(q{)Z?%%8V#!Qw?rmn>hla>eRZ zYuBt_w{gSfORaRG6Sz23MU0z>c zVPa!sWoBn+X=-b1ZEkOHadLBXb#`}nd3t+%eSUv{fr5jCg@%WSiHeJijgF6yk&=^? zm6n&7nVOrNot~edp`xRtrKYE-sj922t*)=Iv9hzYwYImoxw^Z&y}rM|!NSAD#m2|T z$;!*j&Cbuz(bCh@)z;V8+1lIO-QM5e;o{@u<>u$;>FVq3?e6dJ@$&QZ_4fDp`TG0( G{r>;0_J4r@ diff --git a/tests/by-util/test_dd.rs b/tests/by-util/test_dd.rs index f9e4120b4..58c577a7d 100644 --- a/tests/by-util/test_dd.rs +++ b/tests/by-util/test_dd.rs @@ -702,5 +702,364 @@ fn test_partial_records_out() { .stderr_is("1+1 records in\n1+1 records out\n"); } -// conv=[ascii,ebcdic,ibm], conv=[ucase,lcase], conv=[block,unblock], conv=sync -// TODO: Move conv tests from unit test module +#[test] +fn test_block_cbs16() { + new_ucmd!() + .args(&["conv=block", "cbs=16"]) + .pipe_in_fixture("dd-block-cbs16.test") + .succeeds() + .stdout_is_fixture_bytes("dd-block-cbs16.spec"); +} + +#[test] +fn test_block_cbs16_as_cbs8() { + new_ucmd!() + .args(&["conv=block", "cbs=8"]) + .pipe_in_fixture("dd-block-cbs16.test") + .succeeds() + .stdout_is_fixture_bytes("dd-block-cbs8.spec"); +} + +#[test] +fn test_block_consecutive_nl() { + new_ucmd!() + .args(&["conv=block", "cbs=16"]) + .pipe_in_fixture("dd-block-consecutive-nl.test") + .succeeds() + .stdout_is_fixture_bytes("dd-block-consecutive-nl-cbs16.spec"); +} + +#[test] +fn test_unblock_multi_16() { + new_ucmd!() + .args(&["conv=unblock", "cbs=16"]) + .pipe_in_fixture("dd-unblock-cbs16.test") + .succeeds() + .stdout_is_fixture_bytes("dd-unblock-cbs16.spec"); +} + +#[test] +fn test_unblock_multi_16_as_8() { + new_ucmd!() + .args(&["conv=unblock", "cbs=8"]) + .pipe_in_fixture("dd-unblock-cbs16.test") + .succeeds() + .stdout_is_fixture_bytes("dd-unblock-cbs8.spec"); +} + +#[test] +fn test_atoe_conv_spec_test() { + new_ucmd!() + .args(&["conv=ebcdic"]) + .pipe_in_fixture("seq-byte-values-b632a992d3aed5d8d1a59cc5a5a455ba.test") + .succeeds() + .stdout_is_fixture_bytes("gnudd-conv-atoe-seq-byte-values.spec"); +} + +#[test] +fn test_etoa_conv_spec_test() { + new_ucmd!() + .args(&["conv=ascii"]) + .pipe_in_fixture("seq-byte-values-b632a992d3aed5d8d1a59cc5a5a455ba.test") + .succeeds() + .stdout_is_fixture_bytes("gnudd-conv-etoa-seq-byte-values.spec"); +} + +#[test] +fn test_atoibm_conv_spec_test() { + new_ucmd!() + .args(&["conv=ibm"]) + .pipe_in_fixture("seq-byte-values-b632a992d3aed5d8d1a59cc5a5a455ba.test") + .succeeds() + .stdout_is_fixture_bytes("gnudd-conv-atoibm-seq-byte-values.spec"); +} + +#[test] +fn test_lcase_ascii_to_ucase_ascii() { + new_ucmd!() + .args(&["conv=ucase"]) + .pipe_in_fixture("lcase-ascii.test") + .succeeds() + .stdout_is_fixture_bytes("ucase-ascii.test"); +} + +#[test] +fn test_ucase_ascii_to_lcase_ascii() { + new_ucmd!() + .args(&["conv=lcase"]) + .pipe_in_fixture("ucase-ascii.test") + .succeeds() + .stdout_is_fixture_bytes("lcase-ascii.test"); +} + +#[test] +fn test_atoe_and_ucase_conv_spec_test() { + new_ucmd!() + .args(&["conv=ebcdic,ucase"]) + .pipe_in_fixture("seq-byte-values-b632a992d3aed5d8d1a59cc5a5a455ba.test") + .succeeds() + .stdout_is_fixture_bytes("ucase-ebcdic.test"); +} + +#[test] +fn test_atoe_and_lcase_conv_spec_test() { + new_ucmd!() + .args(&["conv=ebcdic,lcase"]) + .pipe_in_fixture("seq-byte-values-b632a992d3aed5d8d1a59cc5a5a455ba.test") + .succeeds() + .stdout_is_fixture_bytes("lcase-ebcdic.test"); +} + +// TODO I think uppercase and lowercase are unintentionally swapped in +// the code that parses the command-line arguments. See this line from +// `parseargs.rs`: +// +// (ConvFlag::FmtAtoI, ConvFlag::UCase) => Some(&ASCII_TO_IBM_UCASE_TO_LCASE), +// (ConvFlag::FmtAtoI, ConvFlag::LCase) => Some(&ASCII_TO_IBM_LCASE_TO_UCASE), +// +// If my reading is correct and that is a typo, then the +// UCASE_TO_LCASE and LCASE_TO_UCASE in those lines should be swapped, +// and the expected output for the following two tests should be +// updated accordingly. +#[test] +fn test_atoibm_and_ucase_conv_spec_test() { + new_ucmd!() + .args(&["conv=ibm,ucase"]) + .pipe_in_fixture("seq-byte-values-b632a992d3aed5d8d1a59cc5a5a455ba.test") + .succeeds() + .stdout_is_fixture_bytes("lcase-ibm.test"); +} + +#[test] +fn test_atoibm_and_lcase_conv_spec_test() { + new_ucmd!() + .args(&["conv=ibm,lcase"]) + .pipe_in_fixture("seq-byte-values-b632a992d3aed5d8d1a59cc5a5a455ba.test") + .succeeds() + .stdout_is_fixture_bytes("ucase-ibm.test"); +} + +#[test] +fn test_swab_256_test() { + new_ucmd!() + .args(&["conv=swab"]) + .pipe_in_fixture("seq-byte-values.test") + .succeeds() + .stdout_is_fixture_bytes("seq-byte-values-swapped.test"); +} + +#[test] +fn test_swab_257_test() { + new_ucmd!() + .args(&["conv=swab"]) + .pipe_in_fixture("seq-byte-values-odd.test") + .succeeds() + .stdout_is_fixture_bytes("seq-byte-values-odd.spec"); +} + +#[test] +fn test_zeros_4k_conv_sync_obs_gt_ibs() { + new_ucmd!() + .args(&["conv=sync", "ibs=521", "obs=1031"]) + .pipe_in_fixture("zeros-620f0b67a91f7f74151bc5be745b7110.test") + .succeeds() + .stdout_is_fixture_bytes("gnudd-conv-sync-ibs-521-obs-1031-zeros.spec"); +} + +#[test] +fn test_zeros_4k_conv_sync_ibs_gt_obs() { + new_ucmd!() + .args(&["conv=sync", "ibs=1031", "obs=521"]) + .pipe_in_fixture("zeros-620f0b67a91f7f74151bc5be745b7110.test") + .succeeds() + .stdout_is_fixture_bytes("gnudd-conv-sync-ibs-1031-obs-521-zeros.spec"); +} + +#[test] +fn test_deadbeef_32k_conv_sync_obs_gt_ibs() { + new_ucmd!() + .args(&[ + "conv=sync", + "ibs=521", + "obs=1031", + "if=deadbeef-18d99661a1de1fc9af21b0ec2cd67ba3.test", + ]) + .succeeds() + .stdout_is_fixture_bytes("gnudd-conv-sync-ibs-521-obs-1031-deadbeef.spec"); +} + +#[test] +fn test_deadbeef_32k_conv_sync_ibs_gt_obs() { + new_ucmd!() + .args(&[ + "conv=sync", + "ibs=1031", + "obs=521", + "if=deadbeef-18d99661a1de1fc9af21b0ec2cd67ba3.test", + ]) + .succeeds() + .stdout_is_fixture_bytes("gnudd-conv-sync-ibs-1031-obs-521-deadbeef.spec"); +} + +#[test] +fn test_random_73k_test_bs_prime_obs_gt_ibs_sync() { + new_ucmd!() + .args(&[ + "conv=sync", + "ibs=521", + "obs=1031", + "if=random-5828891cb1230748e146f34223bbd3b5.test", + ]) + .succeeds() + .stdout_is_fixture_bytes("gnudd-conv-sync-ibs-521-obs-1031-random.spec"); +} + +#[test] +fn test_random_73k_test_bs_prime_ibs_gt_obs_sync() { + new_ucmd!() + .args(&[ + "conv=sync", + "ibs=1031", + "obs=521", + "if=random-5828891cb1230748e146f34223bbd3b5.test", + ]) + .succeeds() + .stdout_is_fixture_bytes("gnudd-conv-sync-ibs-1031-obs-521-random.spec"); +} + +#[test] +fn test_identity() { + new_ucmd!() + .args(&["if=zeros-620f0b67a91f7f74151bc5be745b7110.test"]) + .succeeds() + .stdout_is_fixture_bytes("zeros-620f0b67a91f7f74151bc5be745b7110.test"); + new_ucmd!() + .args(&["if=ones-6ae59e64850377ee5470c854761551ea.test"]) + .succeeds() + .stdout_is_fixture_bytes("ones-6ae59e64850377ee5470c854761551ea.test"); + new_ucmd!() + .args(&["if=deadbeef-18d99661a1de1fc9af21b0ec2cd67ba3.test"]) + .succeeds() + .stdout_is_fixture_bytes("deadbeef-18d99661a1de1fc9af21b0ec2cd67ba3.test"); + new_ucmd!() + .args(&["if=random-5828891cb1230748e146f34223bbd3b5.test"]) + .succeeds() + .stdout_is_fixture_bytes("random-5828891cb1230748e146f34223bbd3b5.test"); +} + +#[test] +fn test_random_73k_test_not_a_multiple_obs_gt_ibs() { + new_ucmd!() + .args(&[ + "ibs=521", + "obs=1031", + "if=random-5828891cb1230748e146f34223bbd3b5.test", + ]) + .succeeds() + .stdout_is_fixture_bytes("random-5828891cb1230748e146f34223bbd3b5.test"); +} + +#[test] +fn test_random_73k_test_obs_lt_not_a_multiple_ibs() { + new_ucmd!() + .args(&[ + "ibs=1031", + "obs=521", + "if=random-5828891cb1230748e146f34223bbd3b5.test", + ]) + .succeeds() + .stdout_is_fixture_bytes("random-5828891cb1230748e146f34223bbd3b5.test"); +} + +#[test] +fn test_deadbeef_all_32k_test_count_reads() { + new_ucmd!() + .args(&[ + "bs=1024", + "count=32", + "if=deadbeef-18d99661a1de1fc9af21b0ec2cd67ba3.test", + ]) + .succeeds() + .stdout_is_fixture_bytes("deadbeef-18d99661a1de1fc9af21b0ec2cd67ba3.test"); +} + +#[test] +fn test_deadbeef_all_32k_test_count_bytes() { + new_ucmd!() + .args(&[ + "ibs=531", + "obs=1031", + "count=32x1024", + "oflag=count_bytes", + "if=deadbeef-18d99661a1de1fc9af21b0ec2cd67ba3.test", + ]) + .succeeds() + .stdout_is_fixture_bytes("deadbeef-18d99661a1de1fc9af21b0ec2cd67ba3.test"); +} + +#[test] +fn test_deadbeef_32k_to_16k_test_count_reads() { + new_ucmd!() + .args(&[ + "ibs=1024", + "obs=1031", + "count=16", + "if=deadbeef-18d99661a1de1fc9af21b0ec2cd67ba3.test", + ]) + .succeeds() + .stdout_is_fixture_bytes("gnudd-deadbeef-first-16k.spec"); +} + +#[test] +fn test_deadbeef_32k_to_12345_test_count_bytes() { + new_ucmd!() + .args(&[ + "ibs=531", + "obs=1031", + "count=12345", + "iflag=count_bytes", + "if=deadbeef-18d99661a1de1fc9af21b0ec2cd67ba3.test", + ]) + .succeeds() + .stdout_is_fixture_bytes("gnudd-deadbeef-first-12345.spec"); +} + +#[test] +fn test_random_73k_test_count_reads() { + new_ucmd!() + .args(&[ + "bs=1024", + "count=32", + "if=random-5828891cb1230748e146f34223bbd3b5.test", + ]) + .succeeds() + .stdout_is_fixture_bytes("gnudd-random-first-32k.spec"); +} + +#[test] +fn test_random_73k_test_count_bytes() { + new_ucmd!() + .args(&[ + "ibs=521", + "obs=1031", + "count=32x1024", + "iflag=count_bytes", + "if=random-5828891cb1230748e146f34223bbd3b5.test", + ]) + .succeeds() + .stdout_is_fixture_bytes("gnudd-random-first-32k.spec"); +} + +#[test] +fn test_all_valid_ascii_ebcdic_ascii_roundtrip_conv_test() { + let tmp = new_ucmd!() + .args(&["ibs=128", "obs=1024", "conv=ebcdic"]) + .pipe_in_fixture("all-valid-ascii-chars-37eff01866ba3f538421b30b7cbefcac.test") + .succeeds() + .stdout_move_bytes(); + new_ucmd!() + .args(&["ibs=256", "obs=1024", "conv=ascii"]) + .pipe_in(tmp) + .succeeds() + .stdout_is_fixture_bytes("all-valid-ascii-chars-37eff01866ba3f538421b30b7cbefcac.test"); +} diff --git a/src/uu/dd/test-resources/all-valid-ascii-chars-37eff01866ba3f538421b30b7cbefcac.test b/tests/fixtures/dd/all-valid-ascii-chars-37eff01866ba3f538421b30b7cbefcac.test similarity index 100% rename from src/uu/dd/test-resources/all-valid-ascii-chars-37eff01866ba3f538421b30b7cbefcac.test rename to tests/fixtures/dd/all-valid-ascii-chars-37eff01866ba3f538421b30b7cbefcac.test diff --git a/src/uu/dd/test-resources/dd-block-cbs16-win.test b/tests/fixtures/dd/dd-block-cbs16-win.test similarity index 100% rename from src/uu/dd/test-resources/dd-block-cbs16-win.test rename to tests/fixtures/dd/dd-block-cbs16-win.test diff --git a/src/uu/dd/test-resources/dd-block-cbs16.spec b/tests/fixtures/dd/dd-block-cbs16.spec similarity index 100% rename from src/uu/dd/test-resources/dd-block-cbs16.spec rename to tests/fixtures/dd/dd-block-cbs16.spec diff --git a/src/uu/dd/test-resources/dd-block-cbs16.test b/tests/fixtures/dd/dd-block-cbs16.test similarity index 100% rename from src/uu/dd/test-resources/dd-block-cbs16.test rename to tests/fixtures/dd/dd-block-cbs16.test diff --git a/src/uu/dd/test-resources/dd-block-cbs8.spec b/tests/fixtures/dd/dd-block-cbs8.spec similarity index 100% rename from src/uu/dd/test-resources/dd-block-cbs8.spec rename to tests/fixtures/dd/dd-block-cbs8.spec diff --git a/src/uu/dd/test-resources/dd-block-consecutive-nl-cbs16.spec b/tests/fixtures/dd/dd-block-consecutive-nl-cbs16.spec similarity index 100% rename from src/uu/dd/test-resources/dd-block-consecutive-nl-cbs16.spec rename to tests/fixtures/dd/dd-block-consecutive-nl-cbs16.spec diff --git a/src/uu/dd/test-resources/dd-block-consecutive-nl-win.test b/tests/fixtures/dd/dd-block-consecutive-nl-win.test similarity index 100% rename from src/uu/dd/test-resources/dd-block-consecutive-nl-win.test rename to tests/fixtures/dd/dd-block-consecutive-nl-win.test diff --git a/src/uu/dd/test-resources/dd-block-consecutive-nl.test b/tests/fixtures/dd/dd-block-consecutive-nl.test similarity index 100% rename from src/uu/dd/test-resources/dd-block-consecutive-nl.test rename to tests/fixtures/dd/dd-block-consecutive-nl.test diff --git a/src/uu/dd/test-resources/dd-unblock-cbs16-win.spec b/tests/fixtures/dd/dd-unblock-cbs16-win.spec similarity index 100% rename from src/uu/dd/test-resources/dd-unblock-cbs16-win.spec rename to tests/fixtures/dd/dd-unblock-cbs16-win.spec diff --git a/src/uu/dd/test-resources/dd-unblock-cbs16.spec b/tests/fixtures/dd/dd-unblock-cbs16.spec similarity index 100% rename from src/uu/dd/test-resources/dd-unblock-cbs16.spec rename to tests/fixtures/dd/dd-unblock-cbs16.spec diff --git a/src/uu/dd/test-resources/dd-unblock-cbs16.test b/tests/fixtures/dd/dd-unblock-cbs16.test similarity index 100% rename from src/uu/dd/test-resources/dd-unblock-cbs16.test rename to tests/fixtures/dd/dd-unblock-cbs16.test diff --git a/src/uu/dd/test-resources/dd-unblock-cbs8-win.spec b/tests/fixtures/dd/dd-unblock-cbs8-win.spec similarity index 100% rename from src/uu/dd/test-resources/dd-unblock-cbs8-win.spec rename to tests/fixtures/dd/dd-unblock-cbs8-win.spec diff --git a/src/uu/dd/test-resources/dd-unblock-cbs8.spec b/tests/fixtures/dd/dd-unblock-cbs8.spec similarity index 100% rename from src/uu/dd/test-resources/dd-unblock-cbs8.spec rename to tests/fixtures/dd/dd-unblock-cbs8.spec diff --git a/tests/fixtures/dd/deadbeef-16.spec b/tests/fixtures/dd/deadbeef-16.spec new file mode 100644 index 0000000000000000000000000000000000000000..4eb7c10f190e85dbf88978936a95194d29658839 GIT binary patch literal 128 ScmezW9|9Pl0LuMOFFpVeUq8VB literal 0 HcmV?d00001 diff --git a/tests/fixtures/dd/deadbeef-16.test b/tests/fixtures/dd/deadbeef-16.test new file mode 100644 index 000000000..85f2b7569 --- /dev/null +++ b/tests/fixtures/dd/deadbeef-16.test @@ -0,0 +1 @@ +ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ \ No newline at end of file diff --git a/src/uu/dd/test-resources/deadbeef-18d99661a1de1fc9af21b0ec2cd67ba3.test b/tests/fixtures/dd/deadbeef-18d99661a1de1fc9af21b0ec2cd67ba3.test similarity index 100% rename from src/uu/dd/test-resources/deadbeef-18d99661a1de1fc9af21b0ec2cd67ba3.test rename to tests/fixtures/dd/deadbeef-18d99661a1de1fc9af21b0ec2cd67ba3.test diff --git a/src/uu/dd/test-resources/gnudd-conv-sync-ibs-1031-obs-521-deadbeef.spec b/tests/fixtures/dd/gnudd-conv-sync-ibs-1031-obs-521-deadbeef.spec similarity index 100% rename from src/uu/dd/test-resources/gnudd-conv-sync-ibs-1031-obs-521-deadbeef.spec rename to tests/fixtures/dd/gnudd-conv-sync-ibs-1031-obs-521-deadbeef.spec diff --git a/src/uu/dd/test-resources/gnudd-conv-sync-ibs-1031-obs-521-random.spec b/tests/fixtures/dd/gnudd-conv-sync-ibs-1031-obs-521-random.spec similarity index 100% rename from src/uu/dd/test-resources/gnudd-conv-sync-ibs-1031-obs-521-random.spec rename to tests/fixtures/dd/gnudd-conv-sync-ibs-1031-obs-521-random.spec diff --git a/src/uu/dd/test-resources/gnudd-conv-sync-ibs-1031-obs-521-zeros.spec b/tests/fixtures/dd/gnudd-conv-sync-ibs-1031-obs-521-zeros.spec similarity index 100% rename from src/uu/dd/test-resources/gnudd-conv-sync-ibs-1031-obs-521-zeros.spec rename to tests/fixtures/dd/gnudd-conv-sync-ibs-1031-obs-521-zeros.spec diff --git a/src/uu/dd/test-resources/gnudd-conv-sync-ibs-521-obs-1031-deadbeef.spec b/tests/fixtures/dd/gnudd-conv-sync-ibs-521-obs-1031-deadbeef.spec similarity index 100% rename from src/uu/dd/test-resources/gnudd-conv-sync-ibs-521-obs-1031-deadbeef.spec rename to tests/fixtures/dd/gnudd-conv-sync-ibs-521-obs-1031-deadbeef.spec diff --git a/src/uu/dd/test-resources/gnudd-conv-sync-ibs-521-obs-1031-random.spec b/tests/fixtures/dd/gnudd-conv-sync-ibs-521-obs-1031-random.spec similarity index 100% rename from src/uu/dd/test-resources/gnudd-conv-sync-ibs-521-obs-1031-random.spec rename to tests/fixtures/dd/gnudd-conv-sync-ibs-521-obs-1031-random.spec diff --git a/src/uu/dd/test-resources/gnudd-conv-sync-ibs-521-obs-1031-zeros.spec b/tests/fixtures/dd/gnudd-conv-sync-ibs-521-obs-1031-zeros.spec similarity index 100% rename from src/uu/dd/test-resources/gnudd-conv-sync-ibs-521-obs-1031-zeros.spec rename to tests/fixtures/dd/gnudd-conv-sync-ibs-521-obs-1031-zeros.spec diff --git a/src/uu/dd/test-resources/gnudd-deadbeef-first-12345.spec b/tests/fixtures/dd/gnudd-deadbeef-first-12345.spec similarity index 100% rename from src/uu/dd/test-resources/gnudd-deadbeef-first-12345.spec rename to tests/fixtures/dd/gnudd-deadbeef-first-12345.spec diff --git a/src/uu/dd/test-resources/gnudd-deadbeef-first-16k.spec b/tests/fixtures/dd/gnudd-deadbeef-first-16k.spec similarity index 100% rename from src/uu/dd/test-resources/gnudd-deadbeef-first-16k.spec rename to tests/fixtures/dd/gnudd-deadbeef-first-16k.spec diff --git a/src/uu/dd/test-resources/gnudd-random-first-32k.spec b/tests/fixtures/dd/gnudd-random-first-32k.spec similarity index 100% rename from src/uu/dd/test-resources/gnudd-random-first-32k.spec rename to tests/fixtures/dd/gnudd-random-first-32k.spec diff --git a/src/uu/dd/test-resources/lcase-ascii.test b/tests/fixtures/dd/lcase-ascii.test similarity index 100% rename from src/uu/dd/test-resources/lcase-ascii.test rename to tests/fixtures/dd/lcase-ascii.test diff --git a/src/uu/dd/test-resources/lcase-ebcdic.spec b/tests/fixtures/dd/lcase-ebcdic.spec similarity index 100% rename from src/uu/dd/test-resources/lcase-ebcdic.spec rename to tests/fixtures/dd/lcase-ebcdic.spec diff --git a/src/uu/dd/test-resources/lcase-ebcdic.test b/tests/fixtures/dd/lcase-ebcdic.test similarity index 100% rename from src/uu/dd/test-resources/lcase-ebcdic.test rename to tests/fixtures/dd/lcase-ebcdic.test diff --git a/src/uu/dd/test-resources/lcase-ibm.spec b/tests/fixtures/dd/lcase-ibm.spec similarity index 100% rename from src/uu/dd/test-resources/lcase-ibm.spec rename to tests/fixtures/dd/lcase-ibm.spec diff --git a/src/uu/dd/test-resources/lcase-ibm.test b/tests/fixtures/dd/lcase-ibm.test similarity index 100% rename from src/uu/dd/test-resources/lcase-ibm.test rename to tests/fixtures/dd/lcase-ibm.test diff --git a/src/uu/dd/test-resources/ones-6ae59e64850377ee5470c854761551ea.test b/tests/fixtures/dd/ones-6ae59e64850377ee5470c854761551ea.test similarity index 100% rename from src/uu/dd/test-resources/ones-6ae59e64850377ee5470c854761551ea.test rename to tests/fixtures/dd/ones-6ae59e64850377ee5470c854761551ea.test diff --git a/tests/fixtures/dd/random-5828891cb1230748e146f34223bbd3b5.test b/tests/fixtures/dd/random-5828891cb1230748e146f34223bbd3b5.test new file mode 100644 index 0000000000000000000000000000000000000000..6e997411c30e758e1d8654b02d365940cda4426d GIT binary patch literal 74400 zcmV(lK=i+i(^$GFVXlSjw3R8{V=KI?nI@jzfsnp6H#&|wrjYc#lsB54LAPAi~k(csZ0p#Fx2VRbE3gcN)dp(Y+i@DTL+|x z*AbmV=PX{GI)ZZ!AKbXrOHn$vLy2b}j{OhfXtGE_H-w^a@bpkklRM;1?E7l^Vsmne zwYNA!>m4zUC+Ow6LBQyW@wLKN_|ON!Uj^=HcP|s|bGr^D7!cUh;iN{R`8@-xbd|3@ zh1B-$A&V`x$(=ROZCv_Dz+^uQ`XyC!lJgZrfNXFDAW*ypzP6Wd8kc96rHW?5j=>kV zi?uIEHX=iEz8BrQv`ZJzDz$8}mrjW?EM7(k1_#sL1oC3!<{vWj*7?sl?26oIY1#g< zU#z;|z{TuNHjT<>o-|c=Sss z;LWOgcz0j8te6|MYY6w^I_$GM-)pa8LYFD-b=%+3CRK#!}aVNqEYnZbKV$W41F}YQ>3M1$x ze{)*U3u|vh+Paq5?FMc`IDVc*U`%swieHCs7#%P6opE@x1G>y78uxtcf0pTMNiEEU zFy3_~SQlg7vrj9_J9mIK;?Iq3ng^=YkQvFF^Inu(*_h>Y$!BAdW z8h?7IM>=_i=K+{$_B?Bu6F9fmik=RMioP9qS3w=ylah*+E6!yn7CtNPY5W-4wSm}_Eur^$rY&`~B=eRUI()-q5Le1z4u%DS zB#;D2Pt}cA#(D^inQmyy5R(dJ7bfM4v~PFfqWEE2|u~N7*c>drFT)m zbzFehtMj#JKfIQ4zulk_PAn!A0>prqoEd3PUb5DAl!5_t#ch%z%pAD=gu-L&-wrC~ zaMKaPM+MlGV2pUHC{699R1_~Gh*wHr(`GF3LEz%k@T2S1(%4(oD^tb&XVl() zkdQ`m_v`Pf`xXN(Ct

Ji%D(&yfz4w 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

B`qlH|)*{)`}YFov7{iMxr6Gtkzx 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 S9SNx;fkfR Date: Thu, 17 Feb 2022 10:27:13 +0100 Subject: [PATCH 7/7] README: add link to GNU tests page in documentation --- README.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/README.md b/README.md index 28df6110f..d30fd4c05 100644 --- a/README.md +++ b/README.md @@ -349,6 +349,10 @@ $ make UTILS='UTILITY_1 UTILITY_2' RUNTEST_ARGS='-v' busytest ### Comparing with GNU +Below is the evolution of how many GNU tests uutils passes. A more detailed +breakdown of the GNU test results of the main branch can be found +[in the user manual](https://uutils.github.io/coreutils-docs/user/test_coverage.html). + ![Evolution over time](https://github.com/uutils/coreutils-tracking/blob/main/gnu-results.png?raw=true) To run locally: