use std::cmp::Ordering;

use super::AllTypes;
use super::print_item::compare_names;

#[test]
fn test_compare_names() {
    for &(a, b) in &[
        ("hello", "world"),
        ("", "world"),
        ("123", "hello"),
        ("123", ""),
        ("123test", "123"),
        ("hello", ""),
        ("hello", "hello"),
        ("hello123", "hello123"),
        ("hello123", "hello12"),
        ("hello12", "hello123"),
        ("hello01abc", "hello01xyz"),
        ("hello0abc", "hello0"),
        ("hello0", "hello0abc"),
        ("01", "1"),
    ] {
        assert_eq!(compare_names(a, b), a.cmp(b), "{:?} - {:?}", a, b);
    }
    assert_eq!(compare_names("u8", "u16"), Ordering::Less);
    assert_eq!(compare_names("u32", "u16"), Ordering::Greater);
    assert_eq!(compare_names("u8_to_f64", "u16_to_f64"), Ordering::Less);
    assert_eq!(compare_names("u32_to_f64", "u16_to_f64"), Ordering::Greater);
    assert_eq!(compare_names("u16_to_f64", "u16_to_f64"), Ordering::Equal);
    assert_eq!(compare_names("u16_to_f32", "u16_to_f64"), Ordering::Less);
}

#[test]
fn test_name_sorting() {
    let names = [
        "Apple", "Banana", "Fruit", "Fruit0", "Fruit00", "Fruit01", "Fruit02", "Fruit1", "Fruit2",
        "Fruit20", "Fruit30x", "Fruit100", "Pear",
    ];
    let mut sorted = names.to_owned();
    sorted.sort_by(|&l, r| compare_names(l, r));
    assert_eq!(names, sorted);
}

#[test]
fn test_all_types_prints_header_once() {
    // Regression test for #82477
    let all_types = AllTypes::new();

    let buffer = all_types.print().to_string();

    assert_eq!(1, buffer.matches("List of all items").count());
}
