From e92b9ff723c5c3f1c73ab866e1a945964800f9f4 Mon Sep 17 00:00:00 2001 From: xgdgsc Date: Sat, 18 Mar 2023 12:23:59 +0800 Subject: [PATCH] option level tests --- src/cli/args.rs | 2 +- src/commands/compress.rs | 18 ++++++++++-------- tests/integration.rs | 8 ++++++-- 3 files changed, 17 insertions(+), 11 deletions(-) diff --git a/src/cli/args.rs b/src/cli/args.rs index 8e77f7f..1de90be 100644 --- a/src/cli/args.rs +++ b/src/cli/args.rs @@ -60,7 +60,7 @@ pub enum Subcommand { #[arg(required = true, value_hint = ValueHint::FilePath)] output: PathBuf, - /// Compression raw level as each algo has + /// Compression level, applied to all formats #[arg(short, long)] level: Option, }, diff --git a/src/commands/compress.rs b/src/commands/compress.rs index 6d941ac..5fc5caa 100644 --- a/src/commands/compress.rs +++ b/src/commands/compress.rs @@ -57,7 +57,7 @@ pub fn compress_files( Lz4 => Box::new(lzzzz::lz4f::WriteCompressor::new( encoder, lzzzz::lz4f::PreferencesBuilder::new() - .compression_level(level.map_or(0, |l| (l as i32).clamp(1, lzzzz::lz4f::CLEVEL_MAX))) + .compression_level(level.map_or(1, |l| (l as i32).clamp(1, lzzzz::lz4f::CLEVEL_MAX))) .build(), )?), Lzma => Box::new(xz2::write::XzEncoder::new( @@ -71,16 +71,18 @@ pub fn compress_files( )) .from_writer(encoder), ), - Zstd => Box::new( - zstd::stream::write::Encoder::new( + Zstd => { + let zstd_encoder = zstd::stream::write::Encoder::new( encoder, - level.map_or(0, |l| { + level.map_or(zstd::DEFAULT_COMPRESSION_LEVEL, |l| { (l as i32).clamp(zstd::zstd_safe::min_c_level(), zstd::zstd_safe::max_c_level()) }), - ) - .unwrap() - .auto_finish(), - ), + ); + // Safety: + // Encoder::new() can only fail if `level` is invalid, but Default::default() + // is guaranteed to be valid + Box::new(zstd_encoder.unwrap().auto_finish()) + } Tar | Zip => unreachable!(), }; Ok(encoder) diff --git a/tests/integration.rs b/tests/integration.rs index 4b1d518..5242cff 100644 --- a/tests/integration.rs +++ b/tests/integration.rs @@ -103,7 +103,7 @@ fn single_empty_file(ext: Extension, #[any(size_range(0..8).lift())] exts: Vec, - #[strategy(0i16..30)] level: i16, + #[strategy(proptest::option::of(0i16..30))] level: Option, ) { let dir = tempdir().unwrap(); let dir = dir.path(); @@ -113,7 +113,11 @@ fn single_file( let archive = &dir.join(format!("file.{}", merge_extensions(ext, exts))); let after = &dir.join("after"); fs::write(before_file, []).unwrap(); - ouch!("-A", "c", "-l", level.to_string(), before_file, archive); + if let Some(level) = level { + ouch!("-A", "c", "-l", level.to_string(), before_file, archive); + } else { + ouch!("-A", "c", before_file, archive); + } ouch!("-A", "d", archive, "-d", after); assert_same_directory(before, after, false); }