use crate::indicator::{ProgressConfig, ProgressIndicator, ProgressRendererKind};
pub struct SilentProgress;
impl SilentProgress {
pub fn new() -> Self {
Self
}
}
impl Default for SilentProgress {
fn default() -> Self {
Self::new()
}
}
impl ProgressIndicator for SilentProgress {
fn start(&mut self, _config: ProgressConfig) {
}
fn update(&mut self, _current: u64, _total: Option<u64>) {
}
fn set_message(&mut self, _message: String) {
}
fn complete(&mut self, _message: Option<String>) {
}
fn success(&self, _message: &str) -> std::io::Result<()> {
Ok(())
}
fn error(&mut self, _message: String) {
}
fn create_child(&mut self) -> Box<dyn ProgressIndicator> {
Box::new(SilentProgress::new())
}
fn suspend(&self, f: &mut dyn FnMut()) {
f();
}
fn println(&self, _message: &str) -> std::io::Result<()> {
Ok(())
}
fn renderer_kind(&self) -> ProgressRendererKind {
ProgressRendererKind::Silent
}
}
#[cfg(test)]
mod tests {
use super::*;
use crate::indicator::ProgressStyle;
#[test]
fn test_no_panic_on_calls() {
let mut progress = SilentProgress::new();
let config = ProgressConfig::new(ProgressStyle::Count).with_total(100);
progress.start(config);
progress.update(50, None);
progress.update(75, Some(200));
progress.set_message("Processing".to_string());
progress.complete(Some("Done".to_string()));
progress.error("Error occurred".to_string());
}
#[test]
fn test_thread_safety() {
use std::sync::{Arc, Mutex};
use std::thread;
let progress = Arc::new(Mutex::new(SilentProgress::new()));
let mut handles = vec![];
for i in 0..10 {
let progress_clone = progress.clone();
let handle = thread::spawn(move || {
let mut p = progress_clone.lock().unwrap();
p.update(i * 10, Some(100));
p.set_message(format!("Thread {i}"));
});
handles.push(handle);
}
for handle in handles {
handle.join().expect("Thread panicked");
}
}
#[test]
fn test_memory_usage() {
use std::mem;
let progress = SilentProgress::new();
assert_eq!(mem::size_of_val(&progress), 0);
let _boxed: Box<dyn ProgressIndicator> = Box::new(progress);
}
#[test]
fn test_default_implementation() {
let progress1 = SilentProgress::new();
let progress2 = SilentProgress;
assert_eq!(
std::mem::size_of_val(&progress1),
std::mem::size_of_val(&progress2)
);
}
#[test]
fn test_multiple_operations() {
let mut progress = SilentProgress::new();
for _i in 0..3 {
let config = ProgressConfig::new(ProgressStyle::Bytes);
progress.start(config);
for j in 0..10 {
progress.update(j * 10, Some(100));
}
progress.complete(None);
}
}
}