zfish 0.1.10

Ultra-light, zero-dependency Rust CLI framework for building beautiful command-line applications
//! Comprehensive Unicode and emoji width test
//! Tests various Unicode categories to ensure proper width calculation

use zfish::table::{BoxStyle, Table};

fn main() {
    println!("\n=== Comprehensive Unicode Width Test ===\n");

    // Test 1: Various emoji types
    println!("Test 1: Emoji Categories");
    let mut table1 = Table::new(vec!["Category", "Emoji", "Description"]);
    table1.set_box_style(BoxStyle::Single);
    table1.add_row(vec!["Faces", "๐Ÿ˜€๐Ÿ˜ƒ๐Ÿ˜„๐Ÿ˜", "Smileys"]);
    table1.add_row(vec!["Objects", "๐Ÿ“ฑ๐Ÿ’ป๐Ÿ–ฅ๏ธโŒš", "Devices"]);
    table1.add_row(vec!["Symbols", "โœ…โŒโš ๏ธ๐Ÿšซ", "Status"]);
    table1.add_row(vec!["Animals", "๐Ÿถ๐Ÿฑ๐Ÿญ๐Ÿน", "Pets"]);
    table1.add_row(vec!["Food", "๐Ÿ•๐Ÿ”๐ŸŸ๐ŸŒญ", "Fast Food"]);
    table1.add_row(vec!["Transport", "๐Ÿš—๐Ÿš•๐Ÿš™๐ŸšŒ", "Vehicles"]);
    table1.print();

    // Test 2: East Asian characters
    println!("\n\nTest 2: East Asian Characters");
    let mut table2 = Table::new(vec!["Script", "Characters", "Type"]);
    table2.set_box_style(BoxStyle::Double);
    table2.add_row(vec!["Chinese", "ไฝ ๅฅฝไธ–็•Œ", "Simplified"]);
    table2.add_row(vec!["Japanese", "ใ“ใ‚“ใซใกใฏ", "Hiragana"]);
    table2.add_row(vec!["Japanese", "ใ‚ณใƒณใƒ‹ใƒใƒ", "Katakana"]);
    table2.add_row(vec!["Japanese", "ไปŠๆ—ฅใฏ", "Kanji"]);
    table2.add_row(vec!["Korean", "์•ˆ๋…•ํ•˜์„ธ์š”", "Hangul"]);
    table2.print();

    // Test 3: Mixed ASCII and Unicode
    println!("\n\nTest 3: Mixed Content");
    let mut table3 = Table::new(vec!["Item", "Value", "Status"]);
    table3.set_box_style(BoxStyle::Heavy);
    table3.add_row(vec!["ASCII only", "Hello", "โœ…"]);
    table3.add_row(vec!["With emoji ๐ŸŽ‰", "Party", "โœ…"]);
    table3.add_row(vec!["ไธญๆ–‡ๆต‹่ฏ•", "Test", "โœ…"]);
    table3.add_row(vec!["Mixed ๆททๅˆ", "Both", "โœ…"]);
    table3.print();

    // Test 4: Emoji with variation selectors and modifiers
    println!("\n\nTest 4: Complex Emoji Sequences");
    let mut table4 = Table::new(vec!["Type", "Example", "Notes"]);
    table4.set_box_style(BoxStyle::Rounded);
    table4.add_row(vec!["Plain", "โš ", "No variation selector"]);
    table4.add_row(vec!["With VS", "โš ๏ธ", "Variation selector FE0F"]);
    table4.add_row(vec!["Skin tone", "๐Ÿ‘‹๐Ÿป", "Light skin tone"]);
    table4.add_row(vec!["Skin tone", "๐Ÿ‘‹๐Ÿฟ", "Dark skin tone"]);
    table4.add_row(vec!["ZWJ", "๐Ÿ‘จโ€๐Ÿ’ป", "Man + ZWJ + Laptop"]);
    table4.add_row(vec!["Flag", "๐Ÿ‡บ๐Ÿ‡ธ", "Regional indicators"]);
    table4.print();

    // Test 5: Special characters
    println!("\n\nTest 5: Special Characters");
    let mut table5 = Table::new(vec!["Category", "Chars", "Width"]);
    table5.set_box_style(BoxStyle::Ascii);
    table5.add_row(vec!["Combining", "e\u{0301}", "1 (e + acute)"]);
    table5.add_row(vec!["Box Draw", "โ”Œโ”€โ”โ”‚โ””โ”˜", "All 1-width"]);
    table5.add_row(vec!["Math", "โˆ‘โˆซโˆ‚โˆ‡", "1-width each"]);
    table5.add_row(vec!["Currency", "$โ‚ฌยฅยฃ", "All 1-width"]);
    table5.add_row(vec!["Fullwidth", "๏ผก๏ผข๏ผฃ๏ผ‘๏ผ’๏ผ“", "All 2-width"]);
    table5.print();

    // Test 6: Performance test with long strings
    println!("\n\nTest 6: Long Content Test");
    let mut table6 = Table::new(vec!["Type", "Content"]);
    table6.set_box_style(BoxStyle::Single);
    table6.add_row(vec!["Emoji string", "๐ŸŽ‰๐ŸŽŠ๐ŸŽ๐ŸŽˆ๐ŸŽ€๐ŸŽ‚๐Ÿฐ๐Ÿง๐Ÿญ๐Ÿฌ๐Ÿซ๐Ÿฉ๐Ÿช"]);
    table6.add_row(vec![
        "Chinese text",
        "่ฟ™ๆ˜ฏไธ€ไธชๅพˆ้•ฟ็š„ไธญๆ–‡ๅญ—็ฌฆไธฒ็”จๆฅๆต‹่ฏ•ๅฎฝๅบฆ่ฎก็ฎ—",
    ]);
    table6.add_row(vec!["Mixed", "Hello ไธ–็•Œ ๐ŸŒ Testing ๆต‹่ฏ• โœ…"]);
    table6.print();

    println!("\nโœ… All comprehensive Unicode tests completed!");
    println!("   - Emojis: โœ… Aligned correctly");
    println!("   - East Asian: โœ… 2-cell width handled");
    println!("   - Variation selectors: โœ… Zero-width handled");
    println!("   - Skin tones: โœ… Modifier handled");
    println!("   - ZWJ sequences: โœ… Properly rendered");
    println!("   - Combining marks: โœ… Zero-width handled\n");
}