Framework for embedding localizations into Rust types
//! End-to-end tests for the example at https://projectfluent.org/fluent/guide/selectors.html

mod common;

use common::compare_message;
use icu_locale::{Locale, locale};
use l10n_embed_derive::localize;
use rstest::rstest;

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

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

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

/// End-to-end test of locale-specific selectors implementation by checking final output
#[rstest]
#[case::zero_en(locale!("en-US"), 0, "You have no unread emails.")]
#[case::one_en(locale!("en-US"), 1, "You have an unread email.")]
#[case::two_en(locale!("en-US"), 2, "You have 2 unread emails.")]
#[case::max_en(
    locale!("en-US"),
    u64::MAX,
    "You have 18,446,744,073,709,551,615 unread emails."
)]
#[case::zero_fr(locale!("fr"), 0, "Vous n'avez aucun e-mail non lu.")]
#[case::one_fr(locale!("fr"), 1, "Vous avez un e-mail non lu.")]
#[case::two_fr(locale!("fr"), 2, "Vous avez 2 e-mails non lus.")]
#[case::max_fr(locale!("fr"), u64::MAX, "Vous avez 18 446 744 073 709 551 615 e-mails non lus.")]
fn numbers(#[case] locale: Locale, #[case] unread_emails: u64, #[case] expected_message: String) {
    compare_message(Numbers { unread_emails }, &expected_message, locale.clone());
    compare_message(
        MessageEnum::Numbers { unread_emails },
        expected_message,
        locale,
    );
}

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