use revue::layout::Rect;
use revue::render::Buffer;
use revue::style::Color;
use revue::widget::traits::{ProgressBarConfig, RenderContext, View};
use revue::widget::Resizable;
use revue::widget::{HSplit, Positioned, ScrollView, VSplit};
#[test]
fn test_progress_bar_negative_progress() {
let mut buffer = Buffer::new(20, 1);
let area = Rect::new(0, 0, 20, 1);
let mut ctx = RenderContext::new(&mut buffer, area);
let config = ProgressBarConfig {
x: 0,
y: 0,
width: 10,
progress: -0.5,
filled_char: 'â–ˆ',
empty_char: 'â–‘',
fg: Color::WHITE,
};
ctx.draw_progress_bar(&config);
for i in 0..10 {
let cell = buffer.get(i, 0).unwrap();
assert_eq!(cell.symbol, 'â–‘');
}
}
#[test]
fn test_progress_bar_greater_than_one() {
let mut buffer = Buffer::new(20, 1);
let area = Rect::new(0, 0, 20, 1);
let mut ctx = RenderContext::new(&mut buffer, area);
let config = ProgressBarConfig {
x: 0,
y: 0,
width: 10,
progress: 1.5,
filled_char: 'â–ˆ',
empty_char: 'â–‘',
fg: Color::WHITE,
};
ctx.draw_progress_bar(&config);
for i in 0..10 {
let cell = buffer.get(i, 0).unwrap();
assert_eq!(cell.symbol, 'â–ˆ');
}
}
#[test]
fn test_progress_bar_nan() {
let mut buffer = Buffer::new(20, 1);
let area = Rect::new(0, 0, 20, 1);
let mut ctx = RenderContext::new(&mut buffer, area);
let config = ProgressBarConfig {
x: 0,
y: 0,
width: 10,
progress: f32::NAN,
filled_char: 'â–ˆ',
empty_char: 'â–‘',
fg: Color::WHITE,
};
ctx.draw_progress_bar(&config);
}
#[test]
fn test_progress_bar_infinity() {
let mut buffer = Buffer::new(20, 1);
let area = Rect::new(0, 0, 20, 1);
let mut ctx = RenderContext::new(&mut buffer, area);
let config = ProgressBarConfig {
x: 0,
y: 0,
width: 10,
progress: f32::INFINITY,
filled_char: 'â–ˆ',
empty_char: 'â–‘',
fg: Color::WHITE,
};
ctx.draw_progress_bar(&config);
for i in 0..10 {
let cell = buffer.get(i, 0).unwrap();
assert_eq!(cell.symbol, 'â–ˆ');
}
}
#[test]
fn test_progress_bar_neg_infinity() {
let mut buffer = Buffer::new(20, 1);
let area = Rect::new(0, 0, 20, 1);
let mut ctx = RenderContext::new(&mut buffer, area);
let config = ProgressBarConfig {
x: 0,
y: 0,
width: 10,
progress: f32::NEG_INFINITY,
filled_char: 'â–ˆ',
empty_char: 'â–‘',
fg: Color::WHITE,
};
ctx.draw_progress_bar(&config);
for i in 0..10 {
let cell = buffer.get(i, 0).unwrap();
assert_eq!(cell.symbol, 'â–‘');
}
}
#[test]
fn test_progress_bar_zero_width() {
let mut buffer = Buffer::new(20, 1);
let area = Rect::new(0, 0, 20, 1);
let mut ctx = RenderContext::new(&mut buffer, area);
let config = ProgressBarConfig {
x: 0,
y: 0,
width: 0,
progress: 0.5,
filled_char: 'â–ˆ',
empty_char: 'â–‘',
fg: Color::WHITE,
};
ctx.draw_progress_bar(&config);
}
#[test]
fn test_progress_bar_max_width() {
let mut buffer = Buffer::new(16_384, 1);
let area = Rect::new(0, 0, 16_384, 1);
let mut ctx = RenderContext::new(&mut buffer, area);
let config = ProgressBarConfig {
x: 0,
y: 0,
width: 16_384,
progress: 0.5,
filled_char: 'â–ˆ',
empty_char: 'â–‘',
fg: Color::WHITE,
};
ctx.draw_progress_bar(&config);
}
#[test]
fn test_hsplit_negative_ratio() {
let split = HSplit::new(-0.5);
let area = Rect::new(0, 0, 100, 50);
let (left, right) = split.areas(area);
assert!(left.width >= 5);
assert!(right.width >= 5);
assert_eq!(left.width + right.width + 1, 100); }
#[test]
fn test_hsplit_greater_than_one_ratio() {
let split = HSplit::new(1.5);
let area = Rect::new(0, 0, 100, 50);
let (left, right) = split.areas(area);
assert!(left.width >= 5);
assert!(right.width >= 5);
assert_eq!(left.width + right.width + 1, 100);
}
#[test]
fn test_hsplit_zero_ratio() {
let split = HSplit::new(0.0);
let area = Rect::new(0, 0, 100, 50);
let (left, right) = split.areas(area);
assert!(left.width >= 5);
assert!(right.width >= 5);
assert_eq!(left.width + right.width + 1, 100);
}
#[test]
fn test_hsplit_nan_ratio() {
let split = HSplit::new(f32::NAN);
let area = Rect::new(0, 0, 100, 50);
let (left, _right) = split.areas(area);
assert!(left.width >= 5); }
#[test]
fn test_vsplit_negative_ratio() {
let split = VSplit::new(-0.5);
let area = Rect::new(0, 0, 100, 50);
let (top, bottom) = split.areas(area);
assert!(top.height >= 3); assert!(bottom.height >= 3); }
#[test]
fn test_vsplit_greater_than_one_ratio() {
let split = VSplit::new(1.5);
let area = Rect::new(0, 0, 100, 50);
let (top, bottom) = split.areas(area);
assert!(top.height <= 47); assert!(bottom.height >= 3);
}
#[test]
fn test_positioned_negative_percent() {
let mut buffer = Buffer::new(40, 20);
let area = Rect::new(0, 0, 40, 20);
let mut ctx = RenderContext::new(&mut buffer, area);
let pos = Positioned::new(revue::widget::Text::new("Test")).percent(-50.0, -50.0);
pos.render(&mut ctx);
}
#[test]
fn test_positioned_greater_than_100_percent() {
let mut buffer = Buffer::new(40, 20);
let area = Rect::new(0, 0, 40, 20);
let mut ctx = RenderContext::new(&mut buffer, area);
let pos = Positioned::new(revue::widget::Text::new("Test"))
.percent(150.0, 150.0)
.size(10, 1);
pos.render(&mut ctx);
}
#[test]
fn test_positioned_nan_percent() {
let mut buffer = Buffer::new(40, 20);
let area = Rect::new(0, 0, 40, 20);
let mut ctx = RenderContext::new(&mut buffer, area);
let pos = Positioned::new(revue::widget::Text::new("Test")).percent(f32::NAN, f32::NAN);
pos.render(&mut ctx);
}
#[test]
fn test_positioned_infinity_percent() {
let mut buffer = Buffer::new(40, 20);
let area = Rect::new(0, 0, 40, 20);
let mut ctx = RenderContext::new(&mut buffer, area);
let pos =
Positioned::new(revue::widget::Text::new("Test")).percent(f32::INFINITY, f32::INFINITY);
pos.render(&mut ctx);
}
#[test]
fn test_positioned_negative_position() {
let mut buffer = Buffer::new(40, 20);
let area = Rect::new(0, 0, 40, 20);
let mut ctx = RenderContext::new(&mut buffer, area);
let pos = Positioned::new(revue::widget::Text::new("Test")).at(-10, -5);
pos.render(&mut ctx);
}
#[test]
fn test_positioned_very_large_position() {
let mut buffer = Buffer::new(40, 20);
let area = Rect::new(0, 0, 40, 20);
let mut ctx = RenderContext::new(&mut buffer, area);
let pos = Positioned::new(revue::widget::Text::new("Test")).at(10000, 10000);
pos.render(&mut ctx);
}
#[test]
fn test_scroll_view_nan_percentage() {
let sv = ScrollView::new().content_height(100).scroll_offset(50);
let percentage = sv.scroll_percentage(20);
assert!((percentage - 0.625).abs() < 0.01);
let sv_zero = ScrollView::new().content_height(0).scroll_offset(0);
let percentage = sv_zero.scroll_percentage(20);
assert_eq!(percentage, 0.0);
}
#[test]
fn test_scroll_view_max_values() {
let sv = ScrollView::new()
.content_height(u16::MAX)
.scroll_offset(u16::MAX - 20);
let percentage = sv.scroll_percentage(20);
assert!(percentage >= 0.0 && percentage <= 1.0);
}
#[test]
fn test_scroll_view_thumb_calculation() {
let mut buffer = Buffer::new(80, 24);
let area = Rect::new(0, 0, 80, 24);
let mut ctx = RenderContext::new(&mut buffer, area);
let sv = ScrollView::new().content_height(100).scroll_offset(0);
sv.render_scrollbar(&mut ctx);
}
#[test]
fn test_resizable_nan_aspect_ratio() {
let mut r = Resizable::new(20, 10).aspect_ratio(f32::NAN);
r.set_size(40, 10);
let (w, h) = r.size();
assert!(w > 0 || h > 0);
}
#[test]
fn test_resizable_infinity_aspect_ratio() {
let mut r = Resizable::new(20, 10).aspect_ratio(f32::INFINITY);
r.set_size(40, 10);
let (w, h) = r.size();
assert!(w > 0 || h > 0);
}
#[test]
fn test_resizable_zero_aspect_ratio() {
let mut r = Resizable::new(20, 10).aspect_ratio(0.0);
r.set_size(40, 10);
let (w, h) = r.size();
assert!(w >= 1 && h >= 1);
}
#[test]
fn test_resizable_negative_aspect_ratio() {
let mut r = Resizable::new(20, 10).aspect_ratio(-1.5);
r.set_size(40, 10);
let (w, h) = r.size();
assert!(w >= 1 && h >= 1);
}
#[test]
fn test_float_to_u16_negative() {
let val: f32 = -1.0;
let result = val as u16;
assert_eq!(result, 0);
}
#[test]
fn test_float_to_u16_overflow() {
let val: f32 = u16::MAX as f32 + 1000.0;
let result = val as u16;
assert!(result >= u16::MAX - 10); }
#[test]
fn test_float_to_u16_nan_conversion() {
let val: f32 = f32::NAN;
let result = val as u16;
assert_eq!(result, 0);
}
#[test]
fn test_float_to_u16_infinity_conversion() {
let pos_inf: f32 = f32::INFINITY;
let neg_inf: f32 = f32::NEG_INFINITY;
let pos_result = pos_inf as u16;
let neg_result = neg_inf as u16;
assert_eq!(pos_result, u16::MAX);
assert_eq!(neg_result, 0); }
#[test]
fn test_clamp_function() {
assert_eq!((-1.0_f32).clamp(0.0, 1.0), 0.0);
assert_eq!((2.0_f32).clamp(0.0, 1.0), 1.0);
assert_eq!((0.5_f32).clamp(0.0, 1.0), 0.5);
let nan_clamped = (f32::NAN).clamp(0.0, 1.0);
assert!(nan_clamped.is_nan() || nan_clamped >= 0.0); }
#[test]
fn test_saturating_add_with_conversion() {
let base: u16 = 100;
let offset = (-10.0_f32) as u16;
let result = base.saturating_add(offset);
assert_eq!(result, 100);
}
#[test]
fn test_percent_calculation_edge_cases() {
let width: u16 = 100;
let normal = (width as f32 * 0.5) as u16;
assert_eq!(normal, 50);
let overflow = (width as f32 * 200.0) as u16;
let _ = overflow;
let negative = (width as f32 * -0.5) as u16;
assert!(negative < u16::MAX / 2 || negative > u16::MAX / 2); }