use revue::layout::Rect;
use revue::render::Buffer;
use revue::style::Color;
use revue::widget::traits::RenderContext;
use revue::widget::View;
use revue::widget::{HSplit, Pane, RichText, SplitOrientation, Splitter, VSplit};
#[test]
fn test_pane_new() {
let pane = Pane::new("pane1");
assert_eq!(pane.id, "pane1");
assert_eq!(pane.min_size, 5); assert_eq!(pane.max_size, 0); assert_eq!(pane.ratio, 0.5); assert!(!pane.collapsible);
assert!(!pane.collapsed);
}
#[test]
fn test_pane_with_min_size() {
let pane = Pane::new("pane1").min_size(10);
assert_eq!(pane.min_size, 10);
}
#[test]
fn test_pane_with_max_size() {
let pane = Pane::new("pane1").max_size(50);
assert_eq!(pane.max_size, 50);
}
#[test]
fn test_pane_with_ratio() {
let pane = Pane::new("pane1").ratio(0.7);
assert_eq!(pane.ratio, 0.7);
}
#[test]
fn test_pane_collapsible() {
let pane = Pane::new("pane1").collapsible();
assert!(pane.collapsible);
}
#[test]
fn test_pane_toggle_collapse() {
let mut pane = Pane::new("pane1").collapsible();
assert!(!pane.collapsed);
pane.toggle_collapse();
assert!(pane.collapsed);
pane.toggle_collapse();
assert!(!pane.collapsed);
}
#[test]
fn test_splitter_new() {
let _splitter = Splitter::new();
}
#[test]
fn test_splitter_with_pane() {
let pane = Pane::new("pane1");
let _splitter = Splitter::new().pane(pane);
}
#[test]
fn test_splitter_with_panes() {
let panes = vec![Pane::new("pane1").ratio(0.3), Pane::new("pane2").ratio(0.7)];
let _splitter = Splitter::new().panes(panes);
}
#[test]
fn test_splitter_horizontal() {
let _splitter = Splitter::new().horizontal();
}
#[test]
fn test_splitter_vertical() {
let _splitter = Splitter::new().vertical();
}
#[test]
fn test_splitter_orientation() {
let _splitter = Splitter::new().orientation(SplitOrientation::Vertical);
}
#[test]
fn test_splitter_color() {
let _splitter = Splitter::new().color(Color::CYAN);
}
#[test]
fn test_splitter_active_color() {
let _splitter = Splitter::new().active_color(Color::YELLOW);
}
#[test]
fn test_hsplit_new() {
let _hsplit = HSplit::new(0.5);
}
#[test]
fn test_hsplit_with_min_widths() {
let _hsplit = HSplit::new(0.5).min_widths(10, 20);
}
#[test]
fn test_hsplit_hide_splitter() {
let _hsplit = HSplit::new(0.5).hide_splitter();
}
#[test]
fn test_vsplit_new() {
let _vsplit = VSplit::new(0.5);
}
#[test]
fn test_pane_complete_builder() {
let pane = Pane::new("my_pane")
.min_size(10)
.max_size(50)
.ratio(0.25)
.collapsible();
assert_eq!(pane.id, "my_pane");
assert_eq!(pane.min_size, 10);
assert_eq!(pane.max_size, 50);
assert_eq!(pane.ratio, 0.25);
assert!(pane.collapsible);
}
#[test]
fn test_splitter_builder_pattern() {
let _splitter = Splitter::new()
.horizontal()
.color(Color::CYAN)
.active_color(Color::YELLOW);
}
#[test]
fn test_splitter_with_collapsible_pane() {
let _splitter = Splitter::new().pane(Pane::new("sidebar").collapsible());
}
#[test]
fn test_splitter_multiple_panes_builder() {
let _splitter = Splitter::new()
.pane(Pane::new("left").ratio(0.3))
.pane(Pane::new("middle").ratio(0.4))
.pane(Pane::new("right").ratio(0.3));
}
#[test]
fn test_hsplit_areas_with_korean_text() {
let hsplit = HSplit::new(0.5);
let area = Rect::new(0, 0, 40, 10);
let (left, right) = hsplit.areas(area);
assert_eq!(left.x, 0);
assert_eq!(left.width, 19);
assert_eq!(right.x, 20); assert_eq!(right.width, 20);
assert_eq!(left.x + left.width, 19);
}
#[test]
fn test_hsplit_korean_text_does_not_overflow_pane() {
let mut buffer = Buffer::new(40, 5);
let hsplit = HSplit::new(0.5);
let area = Rect::new(0, 0, 40, 5);
let (left_area, right_area) = hsplit.areas(area);
let long_korean = "안녕하세요안녕하세요안녕하세요안녕하세요"; let mut ctx = RenderContext::new(&mut buffer, left_area);
let text = RichText::new().push(long_korean, Default::default());
text.render(&mut ctx);
let splitter_x = left_area.x + left_area.width;
for y in 0..5 {
let cell = buffer.get(splitter_x, y).unwrap();
assert!(
cell.symbol == ' ' || cell.symbol == '\0',
"Splitter position x={} y={} should not contain Korean text, got '{}'",
splitter_x,
y,
cell.symbol
);
}
for y in 0..5 {
for x in right_area.x..right_area.x + right_area.width {
let cell = buffer.get(x, y).unwrap();
assert!(
cell.symbol == ' ' || cell.symbol == '\0',
"Right pane position x={} y={} should not contain Korean text, got '{}'",
x,
y,
cell.symbol
);
}
}
}
#[test]
fn test_vsplit_areas_with_korean_text() {
let vsplit = VSplit::new(0.5);
let area = Rect::new(0, 0, 40, 20);
let (top, bottom) = vsplit.areas(area);
assert_eq!(top.y, 0);
assert_eq!(top.height, 9);
assert_eq!(bottom.y, 10); assert_eq!(bottom.height, 10);
}
#[test]
fn test_korean_text_exact_boundary() {
let mut buffer = Buffer::new(20, 3);
let area = Rect::new(0, 0, 10, 3);
let korean = "안녕하세";
let mut ctx = RenderContext::new(&mut buffer, area);
let text = RichText::new().push(korean, Default::default());
text.render(&mut ctx);
assert_eq!(buffer.get(0, 0).unwrap().symbol, '안');
assert_eq!(buffer.get(2, 0).unwrap().symbol, '녕');
assert_eq!(buffer.get(4, 0).unwrap().symbol, '하');
assert_eq!(buffer.get(6, 0).unwrap().symbol, '세');
let outside_cell = buffer.get(10, 0).unwrap();
assert!(
outside_cell.symbol == ' ' || outside_cell.symbol == '\0',
"Position outside pane should be empty"
);
}
#[test]
fn test_korean_text_partial_char_at_boundary() {
let mut buffer = Buffer::new(10, 3);
let area = Rect::new(0, 0, 5, 3);
let korean = "안녕하세요";
let mut ctx = RenderContext::new(&mut buffer, area);
let text = RichText::new().push(korean, Default::default());
text.render(&mut ctx);
assert_eq!(buffer.get(0, 0).unwrap().symbol, '안');
assert_eq!(buffer.get(2, 0).unwrap().symbol, '녕');
let outside_cell = buffer.get(5, 0).unwrap();
assert!(
outside_cell.symbol == ' ' || outside_cell.symbol == '\0',
"Position outside pane should be empty, got '{}'",
outside_cell.symbol
);
}
#[test]
fn test_splitter_pane_areas_korean_ratio() {
let splitter = Splitter::new()
.horizontal()
.pane(Pane::new("left").ratio(0.3))
.pane(Pane::new("right").ratio(0.7));
let area = Rect::new(0, 0, 100, 20);
let areas = splitter.pane_areas(area);
assert_eq!(areas.len(), 2);
assert_eq!(areas[0].0, "left");
assert_eq!(areas[1].0, "right");
let left_width = areas[0].1.width;
let _right_width = areas[1].1.width;
assert!(
areas[0].1.x + left_width < areas[1].1.x,
"Panes should not overlap"
);
}
#[test]
fn test_mixed_korean_ascii_in_pane() {
let mut buffer = Buffer::new(20, 3);
let area = Rect::new(0, 0, 10, 3);
let mixed = "Hi안녕";
let mut ctx = RenderContext::new(&mut buffer, area);
let text = RichText::new().push(mixed, Default::default());
text.render(&mut ctx);
assert_eq!(buffer.get(0, 0).unwrap().symbol, 'H');
assert_eq!(buffer.get(1, 0).unwrap().symbol, 'i');
assert_eq!(buffer.get(2, 0).unwrap().symbol, '안');
assert_eq!(buffer.get(4, 0).unwrap().symbol, '녕');
let outside = buffer.get(6, 0).unwrap();
assert!(outside.symbol == ' ' || outside.symbol == '\0');
}