use revue::layout::Rect;
use revue::render::Buffer;
use revue::style::Color;
use revue::widget::traits::RenderContext;
use revue::widget::{clock, digits, timer, DigitStyle, Digits, StyledView, View};
#[test]
fn test_digits_new_with_integer() {
let d = Digits::new(42);
let lines = d.render_lines();
assert!(!lines.is_empty());
}
#[test]
fn test_digits_new_with_string() {
let d = Digits::new("123");
let lines = d.render_lines();
assert!(!lines.is_empty());
}
#[test]
fn test_digits_new_with_negative() {
let d = Digits::new(-100);
let lines = d.render_lines();
assert!(lines.len() > 2); assert!(lines[2].contains('█')); }
#[test]
fn test_digits_from_int() {
let d = Digits::from_int(999);
let lines = d.render_lines();
assert_eq!(lines.len(), 5);
}
#[test]
fn test_digits_from_float() {
let d = Digits::from_float(12.3456, 2);
let lines = d.render_lines();
assert_eq!(lines.len(), 5);
assert!(lines[4].contains('█')); }
#[test]
fn test_digits_from_float_zero_decimals() {
let d = Digits::from_float(42.0, 0);
let lines = d.render_lines();
assert_eq!(lines.len(), 5);
}
#[test]
fn test_digits_from_float_rounding() {
let d = Digits::from_float(3.14159, 3);
let lines = d.render_lines();
assert_eq!(lines.len(), 5);
}
#[test]
fn test_digits_time() {
let d = Digits::time(12, 34, 56);
let lines = d.render_lines();
assert_eq!(lines.len(), 5);
assert!(lines.iter().any(|l| l.contains('█')));
}
#[test]
fn test_digits_time_single_digits() {
let d = Digits::time(5, 7, 9);
let lines = d.render_lines();
assert_eq!(lines.len(), 5);
}
#[test]
fn test_digits_time_midnight() {
let d = Digits::time(0, 0, 0);
let lines = d.render_lines();
assert_eq!(lines.len(), 5);
}
#[test]
fn test_digits_time_max_values() {
let d = Digits::time(23, 59, 59);
let lines = d.render_lines();
assert_eq!(lines.len(), 5);
}
#[test]
fn test_digits_clock() {
let d = Digits::clock(9, 30);
let lines = d.render_lines();
assert_eq!(lines.len(), 5);
}
#[test]
fn test_digits_clock_no_padding_needed() {
let d = Digits::clock(12, 45);
let lines = d.render_lines();
assert_eq!(lines.len(), 5);
}
#[test]
fn test_digits_timer_with_hours() {
let d = Digits::timer(3661); let lines = d.render_lines();
assert_eq!(lines.len(), 5);
}
#[test]
fn test_digits_timer_minutes_only() {
let d = Digits::timer(65); let lines = d.render_lines();
assert_eq!(lines.len(), 5);
}
#[test]
fn test_digits_timer_seconds_only() {
let d = Digits::timer(45);
let lines = d.render_lines();
assert_eq!(lines.len(), 5);
}
#[test]
fn test_digits_timer_zero() {
let d = Digits::timer(0);
let lines = d.render_lines();
assert_eq!(lines.len(), 5);
}
#[test]
fn test_digits_timer_large_value() {
let d = Digits::timer(86400); let lines = d.render_lines();
assert_eq!(lines.len(), 5);
}
#[test]
fn test_digits_style_block() {
let d = Digits::new(123).style(DigitStyle::Block);
let lines = d.render_lines();
assert_eq!(lines.len(), 5);
assert!(lines[0].contains('█'));
}
#[test]
fn test_digits_style_thin() {
let d = Digits::new(456).style(DigitStyle::Thin);
let lines = d.render_lines();
assert_eq!(lines.len(), 5);
assert!(lines[0].contains('┌') || lines[0].contains('─') || lines[0].contains('┐'));
}
#[test]
fn test_digits_style_ascii() {
let d = Digits::new(789).style(DigitStyle::Ascii);
let lines = d.render_lines();
assert_eq!(lines.len(), 5);
assert!(lines[0].contains('+') || lines[0].contains('-'));
}
#[test]
fn test_digits_style_braille() {
let d = Digits::new(999).style(DigitStyle::Braille);
let lines = d.render_lines();
assert_eq!(lines.len(), 4); }
#[test]
fn test_digits_style_default() {
let d = Digits::new(111);
let height = d.height();
assert_eq!(height, 5); }
#[test]
fn test_digits_fg_color() {
let d = Digits::new(42).fg(Color::RED);
let mut buffer = Buffer::new(20, 10);
let area = Rect::new(0, 0, 20, 10);
let mut ctx = RenderContext::new(&mut buffer, area);
d.render(&mut ctx);
}
#[test]
fn test_digits_bg_color() {
let d = Digits::new(42).bg(Color::BLUE);
let mut buffer = Buffer::new(20, 10);
let area = Rect::new(0, 0, 20, 10);
let mut ctx = RenderContext::new(&mut buffer, area);
d.render(&mut ctx);
}
#[test]
fn test_digits_prefix() {
let d = Digits::new(100).prefix("$");
let mut buffer = Buffer::new(30, 10);
let area = Rect::new(0, 0, 30, 10);
let mut ctx = RenderContext::new(&mut buffer, area);
d.render(&mut ctx);
}
#[test]
fn test_digits_suffix() {
let d = Digits::new(50).suffix("%");
let mut buffer = Buffer::new(30, 10);
let area = Rect::new(0, 0, 30, 10);
let mut ctx = RenderContext::new(&mut buffer, area);
d.render(&mut ctx);
}
#[test]
fn test_digits_height_default_styles() {
assert_eq!(Digits::new(0).style(DigitStyle::Block).height(), 5);
assert_eq!(Digits::new(0).style(DigitStyle::Thin).height(), 5);
assert_eq!(Digits::new(0).style(DigitStyle::Ascii).height(), 5);
}
#[test]
fn test_digits_height_braille() {
assert_eq!(Digits::new(0).style(DigitStyle::Braille).height(), 4);
}
#[test]
fn test_digits_digit_width_default_styles() {
assert_eq!(Digits::new(0).style(DigitStyle::Block).digit_width(), 3);
assert_eq!(Digits::new(0).style(DigitStyle::Thin).digit_width(), 3);
assert_eq!(Digits::new(0).style(DigitStyle::Ascii).digit_width(), 3);
}
#[test]
fn test_digits_digit_width_braille() {
assert_eq!(Digits::new(0).style(DigitStyle::Braille).digit_width(), 2);
}
#[test]
fn test_digits_render_lines_single_digit() {
let d = Digits::new("5").style(DigitStyle::Block);
let lines = d.render_lines();
assert_eq!(lines.len(), 5); }
#[test]
fn test_digits_render_lines_multiple_digits() {
let d = Digits::new("123").style(DigitStyle::Block);
let lines = d.render_lines();
assert_eq!(lines.len(), 5);
assert!(lines[0].len() > 3);
}
#[test]
fn test_digits_render_lines_with_colon() {
let d = Digits::new("12:34").style(DigitStyle::Block);
let lines = d.render_lines();
assert_eq!(lines.len(), 5);
}
#[test]
fn test_digits_render_lines_with_decimal() {
let d = Digits::new("12.5").style(DigitStyle::Block);
let lines = d.render_lines();
assert_eq!(lines.len(), 5);
}
#[test]
fn test_digits_render_lines_with_negative() {
let d = Digits::new("-42").style(DigitStyle::Block);
let lines = d.render_lines();
assert_eq!(lines.len(), 5);
assert!(lines[2].contains('█')); }
#[test]
fn test_digits_render_lines_braille_style() {
let d = Digits::new("42").style(DigitStyle::Braille);
let lines = d.render_lines();
assert_eq!(lines.len(), 4); }
#[test]
fn test_digits_render_lines_thin_style() {
let d = Digits::new("42").style(DigitStyle::Thin);
let lines = d.render_lines();
assert_eq!(lines.len(), 5);
assert!(lines[0].contains('┌') || lines[0].contains('─'));
}
#[test]
fn test_digits_render_lines_ascii_style() {
let d = Digits::new("42").style(DigitStyle::Ascii);
let lines = d.render_lines();
assert_eq!(lines.len(), 5);
assert!(lines[0].contains('+') || lines[0].contains('-'));
}
#[test]
fn test_digits_render_lines_empty_value() {
let d = Digits::new("").style(DigitStyle::Block);
let lines = d.render_lines();
assert_eq!(lines.len(), 5);
assert!(lines.iter().all(|l| l.is_empty()));
}
#[test]
fn test_digits_render_lines_with_separator_formatted() {
let d = Digits::new("10000").separator(',');
let lines = d.render_lines();
assert_eq!(lines.len(), 5);
assert!(lines[0].contains(' '));
}
#[test]
fn test_digits_render_basic() {
let d = Digits::new("42");
let mut buffer = Buffer::new(20, 10);
let area = Rect::new(0, 0, 20, 10);
let mut ctx = RenderContext::new(&mut buffer, area);
d.render(&mut ctx);
}
#[test]
fn test_digits_render_with_colors() {
let d = Digits::new("123").fg(Color::CYAN).bg(Color::BLACK);
let mut buffer = Buffer::new(20, 10);
let area = Rect::new(0, 0, 20, 10);
let mut ctx = RenderContext::new(&mut buffer, area);
d.render(&mut ctx);
}
#[test]
fn test_digits_render_time_format() {
let d = Digits::time(12, 30, 45);
let mut buffer = Buffer::new(30, 10);
let area = Rect::new(0, 0, 30, 10);
let mut ctx = RenderContext::new(&mut buffer, area);
d.render(&mut ctx);
}
#[test]
fn test_digits_render_negative_number() {
let d = Digits::new(-999);
let mut buffer = Buffer::new(20, 10);
let area = Rect::new(0, 0, 20, 10);
let mut ctx = RenderContext::new(&mut buffer, area);
d.render(&mut ctx);
}
#[test]
fn test_digits_render_small_buffer() {
let d = Digits::new("42");
let mut buffer = Buffer::new(10, 5);
let area = Rect::new(0, 0, 10, 5);
let mut ctx = RenderContext::new(&mut buffer, area);
d.render(&mut ctx);
}
#[test]
fn test_digits_render_with_prefix_suffix() {
let d = Digits::new("100").prefix("$").suffix(" USD");
let mut buffer = Buffer::new(30, 10);
let area = Rect::new(0, 0, 30, 10);
let mut ctx = RenderContext::new(&mut buffer, area);
d.render(&mut ctx);
}
#[test]
fn test_digits_render_thin_style() {
let d = Digits::new("9876").style(DigitStyle::Thin).fg(Color::GREEN);
let mut buffer = Buffer::new(30, 10);
let area = Rect::new(0, 0, 30, 10);
let mut ctx = RenderContext::new(&mut buffer, area);
d.render(&mut ctx);
}
#[test]
fn test_digits_render_braille_style() {
let d = Digits::new("1234")
.style(DigitStyle::Braille)
.fg(Color::YELLOW);
let mut buffer = Buffer::new(20, 10);
let area = Rect::new(0, 0, 20, 10);
let mut ctx = RenderContext::new(&mut buffer, area);
d.render(&mut ctx);
}
#[test]
fn test_digits_render_ascii_style() {
let d = Digits::new("5678")
.style(DigitStyle::Ascii)
.fg(Color::MAGENTA);
let mut buffer = Buffer::new(30, 10);
let area = Rect::new(0, 0, 30, 10);
let mut ctx = RenderContext::new(&mut buffer, area);
d.render(&mut ctx);
}
#[test]
fn test_helper_digits() {
let d = digits(42);
let lines = d.render_lines();
assert!(!lines.is_empty());
}
#[test]
fn test_helper_digits_with_string() {
let d = digits("12345");
let lines = d.render_lines();
assert_eq!(lines.len(), 5);
}
#[test]
fn test_helper_clock() {
let c = clock(9, 41);
let lines = c.render_lines();
assert_eq!(lines.len(), 5);
}
#[test]
fn test_helper_timer() {
let t = timer(125);
let lines = t.render_lines();
assert_eq!(lines.len(), 5);
}
#[test]
fn test_helper_timer_with_hours() {
let t = timer(7325);
let lines = t.render_lines();
assert_eq!(lines.len(), 5);
}
#[test]
fn test_digits_zero_value() {
let d = Digits::new(0);
let lines = d.render_lines();
assert_eq!(lines.len(), 5);
}
#[test]
fn test_digits_large_number() {
let d = Digits::new(999999999);
let lines = d.render_lines();
assert_eq!(lines.len(), 5);
}
#[test]
fn test_digits_very_large_negative() {
let d = Digits::new(-999999999);
let lines = d.render_lines();
assert_eq!(lines.len(), 5);
}
#[test]
fn test_digits_float_with_many_decimals() {
let d = Digits::from_float(1.0, 10);
let lines = d.render_lines();
assert_eq!(lines.len(), 5);
}
#[test]
fn test_digits_time_boundary_values() {
let d1 = Digits::time(0, 0, 0);
let lines1 = d1.render_lines();
assert_eq!(lines1.len(), 5);
let d2 = Digits::time(23, 59, 59);
let lines2 = d2.render_lines();
assert_eq!(lines2.len(), 5);
}
#[test]
fn test_digits_timer_overflow_day() {
let d = Digits::timer(90000); let lines = d.render_lines();
assert_eq!(lines.len(), 5);
}
#[test]
fn test_digits_all_zeros() {
let d = Digits::new("00000");
let lines = d.render_lines();
assert_eq!(lines.len(), 5);
}
#[test]
fn test_digits_repeated_nines() {
let d = Digits::new("99999");
let lines = d.render_lines();
assert_eq!(lines.len(), 5);
}
#[test]
fn test_digits_clone() {
let d1 = Digits::new(42)
.style(DigitStyle::Thin)
.fg(Color::RED)
.bg(Color::BLUE)
.prefix("$")
.suffix("%");
let d2 = d1.clone();
assert_eq!(d1.height(), d2.height());
assert_eq!(d1.digit_width(), d2.digit_width());
}
#[test]
fn test_digits_time_colon_rendering() {
let d = Digits::new("12:34").style(DigitStyle::Block);
let lines = d.render_lines();
assert!(lines.len() > 0);
}
#[test]
fn test_digits_decimal_dot_rendering() {
let d = Digits::new("3.14").style(DigitStyle::Block);
let lines = d.render_lines();
assert_eq!(lines.len(), 5);
}
#[test]
fn test_digits_multiple_special_chars() {
let d = Digits::new("-12.34");
let lines = d.render_lines();
assert_eq!(lines.len(), 5);
}
#[test]
fn test_digits_element_id() {
let d = digits(42).element_id("my-digits");
assert_eq!(View::id(&d), Some("my-digits"));
}
#[test]
fn test_digits_css_classes() {
let d = digits(123).class("display").class("large");
assert!(d.has_class("display"));
assert!(d.has_class("large"));
assert!(!d.has_class("small"));
}
#[test]
fn test_digits_styled_view_methods() {
let mut d = digits(999);
d.set_id("counter");
assert_eq!(View::id(&d), Some("counter"));
d.add_class("primary");
assert!(d.has_class("primary"));
d.remove_class("primary");
assert!(!d.has_class("primary"));
d.toggle_class("active");
assert!(d.has_class("active"));
d.toggle_class("active");
assert!(!d.has_class("active"));
}
#[test]
fn test_digits_builder_chain() {
let d = digits(12345)
.style(DigitStyle::Thin)
.fg(Color::CYAN)
.bg(Color::BLACK)
.prefix("$")
.suffix(".00")
.separator(',')
.min_width(3)
.leading_zeros(false)
.element_id("price")
.class("currency")
.class("large");
let mut buffer = Buffer::new(40, 10);
let area = Rect::new(0, 0, 40, 10);
let mut ctx = RenderContext::new(&mut buffer, area);
d.render(&mut ctx);
assert_eq!(View::id(&d), Some("price"));
assert!(d.has_class("currency"));
assert!(d.has_class("large"));
}
#[test]
fn test_digits_render_all_styles() {
let mut buffer = Buffer::new(30, 10);
let area = Rect::new(0, 0, 30, 10);
let d = digits(123).style(DigitStyle::Block);
let mut ctx = RenderContext::new(&mut buffer, area);
d.render(&mut ctx);
let d = digits(456).style(DigitStyle::Thin);
let mut ctx = RenderContext::new(&mut buffer, area);
d.render(&mut ctx);
let d = digits(789).style(DigitStyle::Ascii);
let mut ctx = RenderContext::new(&mut buffer, area);
d.render(&mut ctx);
let d = digits(999).style(DigitStyle::Braille);
let mut ctx = RenderContext::new(&mut buffer, area);
d.render(&mut ctx);
}
#[test]
fn test_digits_different_digit_patterns() {
for i in 0..10 {
let d = Digits::new(&format!("{}", i)).style(DigitStyle::Block);
let lines = d.render_lines();
assert_eq!(lines.len(), 5);
assert!(!lines[0].is_empty());
}
}
#[test]
fn test_digits_render_with_offset() {
let d = Digits::new("42");
let mut buffer = Buffer::new(40, 20);
let area = Rect::new(10, 5, 30, 10);
let mut ctx = RenderContext::new(&mut buffer, area);
d.render(&mut ctx);
}
#[test]
fn test_digits_render_zero_area() {
let d = Digits::new("42");
let mut buffer = Buffer::new(20, 10);
let area = Rect::new(0, 0, 0, 10);
let mut ctx = RenderContext::new(&mut buffer, area);
d.render(&mut ctx);
let area = Rect::new(0, 0, 20, 0);
let mut ctx = RenderContext::new(&mut buffer, area);
d.render(&mut ctx);
}
#[test]
fn test_digits_timer_edge_cases() {
let d = Digits::timer(59);
let lines = d.render_lines();
assert_eq!(lines.len(), 5);
let d = Digits::timer(60);
let lines = d.render_lines();
assert_eq!(lines.len(), 5);
let d = Digits::timer(3599);
let lines = d.render_lines();
assert_eq!(lines.len(), 5);
let d = Digits::timer(3600);
let lines = d.render_lines();
assert_eq!(lines.len(), 5);
}
#[test]
fn test_digits_float_edge_cases() {
let d = Digits::from_float(0.0, 2);
let lines = d.render_lines();
assert_eq!(lines.len(), 5);
let d = Digits::from_float(-12.34, 2);
let lines = d.render_lines();
assert_eq!(lines.len(), 5);
let d = Digits::from_float(0.001, 3);
let lines = d.render_lines();
assert_eq!(lines.len(), 5);
}
#[test]
fn test_digits_empty_string_value() {
let d = Digits::new("");
let lines = d.render_lines();
assert!(lines.iter().all(|l| l.is_empty()));
}
#[test]
fn test_digits_spaces_in_value() {
let d = Digits::new("12 34");
let lines = d.render_lines();
assert_eq!(lines.len(), 5);
}
#[test]
fn test_digits_separator_affects_rendering() {
let d1 = Digits::new("10000");
let lines1 = d1.render_lines();
let d2 = Digits::new("10000").separator(',');
let lines2 = d2.render_lines();
assert_eq!(lines1.len(), lines2.len());
}
#[test]
fn test_digits_min_width_affects_rendering() {
let d1 = Digits::new("42");
let lines1 = d1.render_lines();
let d2 = Digits::new("42").min_width(5);
let lines2 = d2.render_lines();
assert_eq!(lines1.len(), lines2.len());
}
#[test]
fn test_digits_all_styles_have_correct_heights() {
let block_height = Digits::new("0").style(DigitStyle::Block).height();
let thin_height = Digits::new("0").style(DigitStyle::Thin).height();
let ascii_height = Digits::new("0").style(DigitStyle::Ascii).height();
let braille_height = Digits::new("0").style(DigitStyle::Braille).height();
assert_eq!(block_height, 5);
assert_eq!(thin_height, 5);
assert_eq!(ascii_height, 5);
assert_eq!(braille_height, 4);
}
#[test]
fn test_digits_all_styles_have_correct_widths() {
let block_width = Digits::new("0").style(DigitStyle::Block).digit_width();
let thin_width = Digits::new("0").style(DigitStyle::Thin).digit_width();
let ascii_width = Digits::new("0").style(DigitStyle::Ascii).digit_width();
let braille_width = Digits::new("0").style(DigitStyle::Braille).digit_width();
assert_eq!(block_width, 3);
assert_eq!(thin_width, 3);
assert_eq!(ascii_width, 3);
assert_eq!(braille_width, 2);
}
#[test]
fn test_digits_render_all_digits() {
for digit in 0..=9 {
let d = Digits::new(&format!("{}", digit)).style(DigitStyle::Block);
let lines = d.render_lines();
assert_eq!(lines.len(), 5);
assert!(!lines[0].is_empty());
}
}
#[test]
fn test_digits_time_all_components() {
let d = Digits::time(1, 2, 3);
let lines = d.render_lines();
assert_eq!(lines.len(), 5);
}
#[test]
fn test_digits_with_prefix_suffix_renders() {
let d = Digits::new("42").prefix("Price: $").suffix(" USD");
let mut buffer = Buffer::new(30, 10);
let area = Rect::new(0, 0, 30, 10);
let mut ctx = RenderContext::new(&mut buffer, area);
d.render(&mut ctx);
}
#[test]
fn test_digits_thin_style_characters() {
let d = Digits::new("0").style(DigitStyle::Thin);
let lines = d.render_lines();
let has_box_char = lines.iter().any(|l| {
l.contains('┌')
|| l.contains('┐')
|| l.contains('└')
|| l.contains('┘')
|| l.contains('│')
|| l.contains('─')
|| l.contains('┬')
|| l.contains('├')
|| l.contains('┤')
|| l.contains('┴')
});
assert!(has_box_char);
}
#[test]
fn test_digits_ascii_style_characters() {
let d = Digits::new("0").style(DigitStyle::Ascii);
let lines = d.render_lines();
let has_ascii_char = lines
.iter()
.any(|l| l.contains('+') || l.contains('-') || l.contains('|'));
assert!(has_ascii_char);
}
#[test]
fn test_digits_block_style_characters() {
let d = Digits::new("0").style(DigitStyle::Block);
let lines = d.render_lines();
let has_block_char = lines.iter().any(|l| l.contains('█'));
assert!(has_block_char);
}
#[test]
fn test_digits_braille_style_characters() {
let d = Digits::new("0").style(DigitStyle::Braille);
let lines = d.render_lines();
assert_eq!(lines.len(), 4);
}