Skip to content

Commit 7f435cd

Browse files
committed
Test verbosity calculation behavior
Adds tests for the verbosity calculation behavior, including characterization tests that show the current behavior is incorrectly calculated when u8::MAX is passed to either verbose or quiet.
1 parent c621a6a commit 7f435cd

File tree

1 file changed

+126
-0
lines changed

1 file changed

+126
-0
lines changed

src/lib.rs

+126
Original file line numberDiff line numberDiff line change
@@ -235,4 +235,130 @@ mod test {
235235
use clap::CommandFactory;
236236
Cli::command().debug_assert();
237237
}
238+
239+
#[test]
240+
fn verbosity_error_level() {
241+
let tests = [
242+
// verbose, quiet, expected_level, expected_filter
243+
(0, 0, Some(Level::Error), LevelFilter::Error),
244+
(1, 0, Some(Level::Warn), LevelFilter::Warn),
245+
(2, 0, Some(Level::Info), LevelFilter::Info),
246+
(3, 0, Some(Level::Debug), LevelFilter::Debug),
247+
(4, 0, Some(Level::Trace), LevelFilter::Trace),
248+
(5, 0, Some(Level::Trace), LevelFilter::Trace),
249+
(0, 1, None, LevelFilter::Off),
250+
(0, 2, None, LevelFilter::Off),
251+
(255, 255, Some(Level::Error), LevelFilter::Error),
252+
];
253+
254+
for (verbose, quiet, expected_level, expected_filter) in tests.iter() {
255+
let v = Verbosity::<ErrorLevel>::new(*verbose, *quiet);
256+
assert_eq!(
257+
v.log_level(),
258+
*expected_level,
259+
"verbose = {verbose}, quiet = {quiet}"
260+
);
261+
assert_eq!(
262+
v.log_level_filter(),
263+
*expected_filter,
264+
"verbose = {verbose}, quiet = {quiet}"
265+
);
266+
}
267+
}
268+
269+
/// These are characterization tests that show the current behavior
270+
#[test]
271+
fn verbosity_error_level_max_incorrect() {
272+
let v: Verbosity<ErrorLevel> = Verbosity::new(255, 0);
273+
assert_eq!(v.log_level(), None); // Should be Some(Level::Trace)
274+
assert_eq!(v.log_level_filter(), LevelFilter::Off); // Should be LevelFilter::Trace
275+
276+
let v: Verbosity<ErrorLevel> = Verbosity::new(0, 255);
277+
assert_eq!(v.log_level(), Some(Level::Warn)); // Should be None
278+
assert_eq!(v.log_level_filter(), LevelFilter::Warn); // Should be LevelFilter::Off
279+
}
280+
281+
#[test]
282+
fn verbosity_warn_level() {
283+
let tests = [
284+
// verbose, quiet, expected_level, expected_filter
285+
(0, 0, Some(Level::Warn), LevelFilter::Warn),
286+
(1, 0, Some(Level::Info), LevelFilter::Info),
287+
(2, 0, Some(Level::Debug), LevelFilter::Debug),
288+
(3, 0, Some(Level::Trace), LevelFilter::Trace),
289+
(4, 0, Some(Level::Trace), LevelFilter::Trace),
290+
(0, 1, Some(Level::Error), LevelFilter::Error),
291+
(0, 2, None, LevelFilter::Off),
292+
(0, 3, None, LevelFilter::Off),
293+
(255, 255, Some(Level::Warn), LevelFilter::Warn),
294+
];
295+
296+
for (verbose, quiet, expected_level, expected_filter) in tests.iter() {
297+
let v = Verbosity::<WarnLevel>::new(*verbose, *quiet);
298+
assert_eq!(
299+
v.log_level(),
300+
*expected_level,
301+
"verbose = {verbose}, quiet = {quiet}"
302+
);
303+
assert_eq!(
304+
v.log_level_filter(),
305+
*expected_filter,
306+
"verbose = {verbose}, quiet = {quiet}"
307+
);
308+
}
309+
}
310+
311+
/// These are characterization tests that show the current behavior
312+
#[test]
313+
fn verbosity_warn_level_max_incorrect() {
314+
let v: Verbosity<WarnLevel> = Verbosity::new(255, 0);
315+
assert_eq!(v.log_level(), Some(Level::Error)); // Should be Some(Level::Trace)
316+
assert_eq!(v.log_level_filter(), LevelFilter::Error); // Should be LevelFilter::Trace
317+
318+
let v: Verbosity<WarnLevel> = Verbosity::new(0, 255);
319+
assert_eq!(v.log_level(), Some(Level::Info)); // Should be None
320+
assert_eq!(v.log_level_filter(), LevelFilter::Info); // Should be LevelFilter::Off
321+
}
322+
323+
#[test]
324+
fn verbosity_info_level() {
325+
let tests = [
326+
// verbose, quiet, expected_level, expected_filter
327+
(0, 0, Some(Level::Info), LevelFilter::Info),
328+
(1, 0, Some(Level::Debug), LevelFilter::Debug),
329+
(2, 0, Some(Level::Trace), LevelFilter::Trace),
330+
(3, 0, Some(Level::Trace), LevelFilter::Trace),
331+
(0, 1, Some(Level::Warn), LevelFilter::Warn),
332+
(0, 2, Some(Level::Error), LevelFilter::Error),
333+
(0, 3, None, LevelFilter::Off),
334+
(0, 4, None, LevelFilter::Off),
335+
(255, 255, Some(Level::Info), LevelFilter::Info),
336+
];
337+
338+
for (verbose, quiet, expected_level, expected_filter) in tests.iter() {
339+
let v = Verbosity::<InfoLevel>::new(*verbose, *quiet);
340+
assert_eq!(
341+
v.log_level(),
342+
*expected_level,
343+
"verbose = {verbose}, quiet = {quiet}"
344+
);
345+
assert_eq!(
346+
v.log_level_filter(),
347+
*expected_filter,
348+
"verbose = {verbose}, quiet = {quiet}"
349+
);
350+
}
351+
}
352+
353+
/// These are characterization tests that show the current behavior
354+
#[test]
355+
fn verbosity_info_level_max_incorrect() {
356+
let v: Verbosity<InfoLevel> = Verbosity::new(255, 0);
357+
assert_eq!(v.log_level(), Some(Level::Warn)); // Should be Some(Level::Trace)
358+
assert_eq!(v.log_level_filter(), LevelFilter::Warn); // Should be LevelFilter::Trace
359+
360+
let v: Verbosity<InfoLevel> = Verbosity::new(0, 255);
361+
assert_eq!(v.log_level(), Some(Level::Debug)); // Should be None
362+
assert_eq!(v.log_level_filter(), LevelFilter::Debug); // Should be LevelFilter::Off
363+
}
238364
}

0 commit comments

Comments
 (0)