Experimenting with more structured ways to handle command-line input/output in Rust
//! End-to-end tests for the examples at https://projectfluent.org/fluent/guide/placeables.html

mod common;

use common::compare_message;
use fluent_embed::localize;
use icu_locale::langid;
use rstest::rstest;

#[localize("tests/locale/**/placeables.ftl")]
pub enum Message {
    OpenTabs { quantity: u64 },
    Person { name: String },
    TabStatus { name: String, quantity: u64 },
}

#[rstest]
#[case::zero(0_u64, "0")]
#[case::two(2_u64, "2")]
#[case::max(u64::MAX, "18,446,744,073,709,551,615")]
fn number(#[case] quantity: u64, #[case] expected: String) {
    compare_message(
        Message::OpenTabs { quantity },
        format!("{expected} tabs open."),
        langid!("en-US"),
    )
}

#[rstest]
#[case::empty("")]
#[case::single_hyphen(r#"""#)]
#[case::english("Ferris")]
#[case::accent("Férris")]
#[case::unicode("")]
fn string(#[case] name: String) {
    compare_message(
        Message::Person { name: name.clone() },
        format!("How many tabs does {name} have open?"),
        langid!("en-US"),
    )
}

#[rstest]
#[case::empty(0_u64, "0", "")]
#[case::simple(2_u64, "2", "Ferris")]
#[case::complex(u64::MAX, "18,446,744,073,709,551,615", "")]
fn numbers_and_strings(#[case] quantity: u64, #[case] expected: String, #[case] name: String) {
    compare_message(
        Message::TabStatus {
            name: name.clone(),
            quantity,
        },
        format!("{name} has {expected} tabs open!"),
        langid!("en-US"),
    );
}