use pixelsrc::models::TtpObject;
use pixelsrc::parser::parse_stream;
use pixelsrc::terminal::render_coordinate_grid;
use std::io::Cursor;
#[test]
fn test_grid_basic() {
let input = include_str!("../../../examples/demos/cli/format/grid_sprite.jsonl");
let reader = Cursor::new(input);
let result = parse_stream(reader);
let sprite = result
.objects
.iter()
.find_map(|o| match o {
TtpObject::Sprite(s) if s.name == "arrow" => Some(s),
_ => None,
})
.expect("Sprite 'arrow' should exist");
let output = render_coordinate_grid(&sprite.grid, false);
assert!(output.contains(" 0"), "Should have column 0 header");
assert!(output.contains(" 1"), "Should have column 1 header");
assert!(output.contains(" 2"), "Should have column 2 header");
assert!(output.contains(" 3"), "Should have column 3 header");
assert!(output.contains(" 4"), "Should have column 4 header");
assert!(output.contains("0 │"), "Should have row 0 indicator");
assert!(output.contains("1 │"), "Should have row 1 indicator");
assert!(output.contains("┌"), "Should have top-left corner");
assert!(output.contains("─"), "Should have horizontal border");
}
#[test]
fn test_grid_abbreviated() {
let grid = vec!["{skin}{hair}{eye}".to_string()];
let output = render_coordinate_grid(&grid, false);
assert!(output.contains(" s"), "Should show 's' for {{skin}}");
assert!(output.contains(" h"), "Should show 'h' for {{hair}}");
assert!(output.contains(" e"), "Should show 'e' for {{eye}}");
assert!(!output.contains("{skin}"), "Should not show full {{skin}}");
}
#[test]
fn test_grid_full_names() {
let grid = vec!["{skin}{hair}".to_string()];
let output = render_coordinate_grid(&grid, true);
assert!(output.contains("{skin}"), "Should show full {{skin}}");
assert!(output.contains("{hair}"), "Should show full {{hair}}");
}
#[test]
fn test_grid_underscore() {
let grid = vec!["{_}{a}{_}".to_string()];
let output = render_coordinate_grid(&grid, false);
assert!(output.contains(" _"), "Should show underscore for {{_}}");
}
#[test]
fn test_grid_empty() {
let grid: Vec<String> = vec![];
let output = render_coordinate_grid(&grid, false);
assert!(output.is_empty(), "Empty grid should produce empty output");
}
#[test]
fn test_grid_single_pixel() {
let grid = vec!["{x}".to_string()];
let output = render_coordinate_grid(&grid, false);
assert!(output.contains(" 0"), "Should have column 0 header");
assert!(output.contains("0 │"), "Should have row 0 indicator");
assert!(output.contains(" x"), "Should show 'x' for {{x}}");
}
#[test]
fn test_grid_wide_sprite() {
let grid = vec!["{a}{b}{c}{d}{e}{f}{g}{h}{i}{j}".to_string()];
let output = render_coordinate_grid(&grid, false);
assert!(output.contains(" 9"), "Should have column 9 header");
}
#[test]
fn test_grid_tall_sprite() {
let grid: Vec<String> = (0..10).map(|_| "{x}".to_string()).collect();
let output = render_coordinate_grid(&grid, false);
assert!(output.contains("9 │"), "Should have row 9 indicator");
}
#[test]
fn test_grid_alignment() {
let grid = vec!["{a}{b}{c}".to_string(), "{d}{e}{f}".to_string(), "{g}{h}{i}".to_string()];
let output = render_coordinate_grid(&grid, false);
let lines: Vec<&str> = output.lines().collect();
let content_lines: Vec<&str> = lines.iter().filter(|l| l.contains("│")).cloned().collect();
assert_eq!(content_lines.len(), 3, "Should have 3 content rows");
for line in content_lines {
let after_bar = line.split('│').nth(1).expect("Should have content after │");
let tokens: Vec<&str> = after_bar.split_whitespace().collect();
assert_eq!(tokens.len(), 3, "Each row should have 3 tokens");
}
}