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

mod common;

use common::compare_message;
use fluent_embed::localize;
use icu_locale::{langid, LanguageIdentifier};
use rstest::rstest;

#[localize("tests/locale/**/selectors.ftl")]
pub enum Message {
    Emails { unread_emails: u64 },
}

/// End-to-end test of locale-specific selectors implementation by checking final output
#[rstest]
#[case::zero_en(langid!("en-US"), 0, "You have 0 unread emails.")]
#[case::one_en(langid!("en-US"), 1, "You have 1 unread email.")]
#[case::two_en(langid!("en-US"), 2, "You have 2 unread emails.")]
#[case::max_en(
    langid!("en-US"),
    u64::MAX,
    "You have 18,446,744,073,709,551,615 unread emails."
)]
#[case::zero_fr(langid!("fr"), 0, "Vous avez 0 e-mail non lu.")]
#[case::one_fr(langid!("fr"), 1, "Vous avez 1 e-mail non lu.")]
#[case::two_fr(langid!("fr"), 2, "Vous avez 2 e-mails non lus.")]
#[case::max_fr(langid!("fr"), u64::MAX, "Vous avez 18 446 744 073 709 551 615 e-mails non lus.")]
fn message_for_locale(
    #[case] locale: LanguageIdentifier,
    #[case] unread_emails: u64,
    #[case] expected_message: String,
) {
    let data = Message::Emails { unread_emails };
    compare_message(data, expected_message, locale);
}