use gilt::segment::Segment;
use gilt::style::Style;
#[test]
fn divide_complex_multi_segment() {
let bold = Style::parse("bold");
let italic = Style::parse("italic");
let segments = vec![
Segment::styled("Hello", bold.clone()),
Segment::styled(" World!", italic.clone()),
];
let parts = Segment::divide(&segments, &[1, 2, 12]);
assert_eq!(parts.len(), 3, "expected 3 portions");
assert_eq!(parts[0], vec![Segment::styled("H", bold.clone())]);
assert_eq!(parts[1], vec![Segment::styled("e", bold.clone())]);
assert_eq!(
parts[2],
vec![
Segment::styled("llo", bold.clone()),
Segment::styled(" World!", italic.clone()),
]
);
let parts2 = Segment::divide(&segments, &[4, 20]);
assert_eq!(parts2.len(), 2, "expected 2 portions");
assert_eq!(parts2[0], vec![Segment::styled("Hell", bold.clone())]);
assert_eq!(
parts2[1],
vec![
Segment::styled("o", bold.clone()),
Segment::styled(" World!", italic.clone()),
]
);
}
#[test]
fn divide_emoji_at_2_cell_boundary() {
let bold = Style::parse("bold");
let italic = Style::parse("italic");
let segments = vec![
Segment::styled("Hello", bold.clone()),
Segment::styled("💩💩💩", italic.clone()),
];
let parts = Segment::divide(&segments, &[7]);
assert_eq!(parts.len(), 1);
assert_eq!(
parts[0],
vec![
Segment::styled("Hello", bold.clone()),
Segment::styled("💩", italic.clone()),
]
);
let parts = Segment::divide(&segments, &[8]);
assert_eq!(parts.len(), 1);
assert_eq!(
parts[0],
vec![
Segment::styled("Hello", bold.clone()),
Segment::styled("💩 ", italic.clone()),
]
);
let parts = Segment::divide(&segments, &[8, 11]);
assert_eq!(parts.len(), 2);
assert_eq!(
parts[0],
vec![
Segment::styled("Hello", bold.clone()),
Segment::styled("💩 ", italic.clone()),
]
);
assert_eq!(parts[1], vec![Segment::styled(" 💩", italic.clone())]);
}
#[test]
fn divide_at_exact_segment_end() {
let segments = vec![
Segment::text("foo"),
Segment::text("bar"),
Segment::text("baz"),
];
let parts = Segment::divide(&segments, &[1, 3, 9]);
assert_eq!(parts.len(), 3);
assert_eq!(parts[0], vec![Segment::text("f")]);
assert_eq!(parts[1], vec![Segment::text("oo")]);
assert_eq!(parts[2], vec![Segment::text("bar"), Segment::text("baz")]);
}
#[test]
fn divide_at_exact_segment_start() {
let bold = Style::parse("bold");
let italic = Style::parse("italic");
let segments = vec![
Segment::styled("Hello", bold.clone()),
Segment::styled(" World!", italic.clone()),
];
let parts = Segment::divide(&segments, &[1]);
assert_eq!(parts.len(), 1);
assert_eq!(parts[0], vec![Segment::styled("H", bold.clone())]);
let parts = Segment::divide(&segments, &[1, 2]);
assert_eq!(parts.len(), 2);
assert_eq!(parts[0], vec![Segment::styled("H", bold.clone())]);
assert_eq!(parts[1], vec![Segment::styled("e", bold.clone())]);
}
#[test]
fn split_lines_terminator_keeps_newline() {
let segments = vec![Segment::text("Hello\nWorld")];
let lines = Segment::split_lines_terminator(&segments);
assert_eq!(lines.len(), 2);
assert_eq!(lines[0].0, vec![Segment::text("Hello")]);
assert!(lines[0].1, "first line should be marked as terminated");
assert_eq!(lines[1].0, vec![Segment::text("World")]);
assert!(!lines[1].1, "last line should NOT be marked as terminated");
let styled = Style::parse("bold");
let segments2 = vec![
Segment::styled("Line1\n", styled.clone()),
Segment::text("Line2"),
];
let lines2 = Segment::split_lines_terminator(&segments2);
assert_eq!(lines2.len(), 2);
assert!(
lines2[0].1,
"first line (bold) should be marked as terminated"
);
assert!(
!lines2[1].1,
"second line should NOT be marked as terminated"
);
assert_eq!(lines2[1].0, vec![Segment::text("Line2")]);
}