use pie_core::{ElemPool, PieList};
use std::fmt::Display;
fn visualize_list<T: Display>(list: &PieList<T>, pool: &ElemPool<T>) -> String {
list.iter(pool).map(|item| item.to_string()).collect()
}
#[test]
fn real_world_editor_test() {
println!("--- Test Start: Editor Simulation ---");
let mut pool = ElemPool::<char>::new();
let mut file_a = PieList::new(&mut pool);
let mut file_b = PieList::new(&mut pool);
println!("Pool starting len: {}", pool.len());
assert_eq!(pool.len(), 0);
assert_eq!(file_a.len(), 0);
assert_eq!(file_b.len(), 0);
file_a.push_back('L', &mut pool).unwrap();
file_a.push_back('i', &mut pool).unwrap();
file_a.push_back('n', &mut pool).unwrap();
file_a.push_back('e', &mut pool).unwrap();
file_a.push_back(' ', &mut pool).unwrap();
file_a.push_back('1', &mut pool).unwrap();
file_a.push_back('\n', &mut pool).unwrap();
file_a.push_back('L', &mut pool).unwrap();
file_a.push_back('i', &mut pool).unwrap();
file_a.push_back('n', &mut pool).unwrap();
file_a.push_back('e', &mut pool).unwrap();
file_a.push_back(' ', &mut pool).unwrap();
file_a.push_back('2', &mut pool).unwrap();
file_a.push_back('\n', &mut pool).unwrap();
let viz_a = visualize_list(&file_a, &pool);
println!("File A content:\n{}", viz_a);
assert_eq!(viz_a, "Line 1\nLine 2\n");
assert_eq!(file_a.len(), 14);
assert_eq!(pool.len(), 14);
file_b.push_back('H', &mut pool).unwrap();
file_b.push_back('e', &mut pool).unwrap();
file_b.push_back('l', &mut pool).unwrap();
file_b.push_back('l', &mut pool).unwrap();
file_b.push_back('o', &mut pool).unwrap();
file_b.push_back('\n', &mut pool).unwrap();
let viz_b = visualize_list(&file_b, &pool);
println!("File B content:\n{}", viz_b);
assert_eq!(viz_b, "Hello\n");
assert_eq!(file_b.len(), 6);
assert_eq!(pool.len(), 20);
let mut cursor_a = file_a.cursor_mut(&mut pool);
for _ in 0..7 {
cursor_a.move_next(&mut pool);
}
assert_eq!(cursor_a.peek(&pool), Some(&'L'));
let mut cut_buffer = cursor_a.split_before(&mut pool).unwrap();
let viz_a_after_cut = visualize_list(&file_a, &pool);
let viz_cut = visualize_list(&cut_buffer, &pool);
println!("File A after cut:\n{}", viz_a_after_cut);
println!("Cut buffer content:\n{}", viz_cut);
assert_eq!(viz_a_after_cut, "Line 2\n");
assert_eq!(file_a.len(), 7);
assert_eq!(viz_cut, "Line 1\n");
assert_eq!(cut_buffer.len(), 7);
assert_eq!(pool.len(), 20);
let mut cursor_b = file_b.cursor_mut(&mut pool);
cursor_b.splice_before(&mut cut_buffer, &mut pool).unwrap();
let viz_b_after_paste = visualize_list(&file_b, &pool);
println!("File B after paste:\n{}", viz_b_after_paste);
let expected_b = "Line 1\nHello\n";
assert_eq!(viz_b_after_paste, expected_b);
assert_eq!(file_b.len(), 13);
assert_eq!(pool.len(), 20);
assert!(cut_buffer.is_empty());
file_a.set_leak_check(false);
file_b.set_leak_check(false);
println!("--- Test Complete ---");
}