use prosaic_core::{AgreementFeatures, Case, Gender, GrammaticalNumber};
use crate::gender::infer_gender;
pub fn basic_article(word: &str) -> &'static str {
match infer_gender(word) {
Gender::Fem => "die",
Gender::Neut => "das",
_ => "der",
}
}
pub fn article_with_features(features: &AgreementFeatures) -> &'static str {
let plural = matches!(
features.number,
GrammaticalNumber::Plural | GrammaticalNumber::Dual
);
if plural {
return match features.case {
Case::Dative => "den",
Case::Genitive => "der",
_ => "die", };
}
match (features.gender, features.case) {
(Gender::Masc, Case::Nominative) | (Gender::Masc, Case::Unknown) => "der",
(Gender::Masc, Case::Accusative) => "den",
(Gender::Masc, Case::Dative) => "dem",
(Gender::Masc, Case::Genitive) => "des",
(Gender::Fem, Case::Dative) | (Gender::Fem, Case::Genitive) => "der",
(Gender::Fem, _) => "die",
(Gender::Neut, Case::Dative) => "dem",
(Gender::Neut, Case::Genitive) => "des",
(Gender::Neut, _) => "das",
(_, Case::Accusative) => "den",
(_, Case::Dative) => "dem",
(_, Case::Genitive) => "des",
_ => "der",
}
}
pub fn indefinite_article(features: &AgreementFeatures) -> &'static str {
if matches!(
features.number,
GrammaticalNumber::Plural | GrammaticalNumber::Dual
) {
return "";
}
match (features.gender, features.case) {
(Gender::Masc, Case::Accusative) => "einen",
(Gender::Masc, Case::Dative) => "einem",
(Gender::Masc, Case::Genitive) => "eines",
(Gender::Fem, Case::Dative) | (Gender::Fem, Case::Genitive) => "einer",
(Gender::Fem, _) => "eine",
(Gender::Neut, Case::Dative) => "einem",
(Gender::Neut, Case::Genitive) => "eines",
_ => "ein",
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn basic_article_masc_noun() {
assert_eq!(basic_article("Tisch"), "der");
assert_eq!(basic_article("Lehrer"), "der");
}
#[test]
fn basic_article_fem_noun() {
assert_eq!(basic_article("Freiheit"), "die");
assert_eq!(basic_article("Klasse"), "die");
}
#[test]
fn basic_article_neut_noun() {
assert_eq!(basic_article("Buch"), "das");
assert_eq!(basic_article("Ministerium"), "das");
}
#[test]
fn definite_masc_nominative() {
let f = AgreementFeatures::default()
.with_gender(Gender::Masc)
.with_case(Case::Nominative);
assert_eq!(article_with_features(&f), "der");
}
#[test]
fn definite_masc_accusative() {
let f = AgreementFeatures::default()
.with_gender(Gender::Masc)
.with_case(Case::Accusative);
assert_eq!(article_with_features(&f), "den");
}
#[test]
fn definite_masc_dative() {
let f = AgreementFeatures::default()
.with_gender(Gender::Masc)
.with_case(Case::Dative);
assert_eq!(article_with_features(&f), "dem");
}
#[test]
fn definite_masc_genitive() {
let f = AgreementFeatures::default()
.with_gender(Gender::Masc)
.with_case(Case::Genitive);
assert_eq!(article_with_features(&f), "des");
}
#[test]
fn definite_fem_nominative() {
let f = AgreementFeatures::default()
.with_gender(Gender::Fem)
.with_case(Case::Nominative);
assert_eq!(article_with_features(&f), "die");
}
#[test]
fn definite_fem_accusative() {
let f = AgreementFeatures::default()
.with_gender(Gender::Fem)
.with_case(Case::Accusative);
assert_eq!(article_with_features(&f), "die");
}
#[test]
fn definite_fem_dative() {
let f = AgreementFeatures::default()
.with_gender(Gender::Fem)
.with_case(Case::Dative);
assert_eq!(article_with_features(&f), "der");
}
#[test]
fn definite_fem_genitive() {
let f = AgreementFeatures::default()
.with_gender(Gender::Fem)
.with_case(Case::Genitive);
assert_eq!(article_with_features(&f), "der");
}
#[test]
fn definite_neut_nominative() {
let f = AgreementFeatures::default()
.with_gender(Gender::Neut)
.with_case(Case::Nominative);
assert_eq!(article_with_features(&f), "das");
}
#[test]
fn definite_neut_accusative() {
let f = AgreementFeatures::default()
.with_gender(Gender::Neut)
.with_case(Case::Accusative);
assert_eq!(article_with_features(&f), "das");
}
#[test]
fn definite_neut_dative() {
let f = AgreementFeatures::default()
.with_gender(Gender::Neut)
.with_case(Case::Dative);
assert_eq!(article_with_features(&f), "dem");
}
#[test]
fn definite_neut_genitive() {
let f = AgreementFeatures::default()
.with_gender(Gender::Neut)
.with_case(Case::Genitive);
assert_eq!(article_with_features(&f), "des");
}
#[test]
fn definite_plural_nominative() {
let f = AgreementFeatures::default()
.with_number(GrammaticalNumber::Plural)
.with_case(Case::Nominative);
assert_eq!(article_with_features(&f), "die");
}
#[test]
fn definite_plural_accusative() {
let f = AgreementFeatures::default()
.with_number(GrammaticalNumber::Plural)
.with_case(Case::Accusative);
assert_eq!(article_with_features(&f), "die");
}
#[test]
fn definite_plural_dative() {
let f = AgreementFeatures::default()
.with_number(GrammaticalNumber::Plural)
.with_case(Case::Dative);
assert_eq!(article_with_features(&f), "den");
}
#[test]
fn definite_plural_genitive() {
let f = AgreementFeatures::default()
.with_number(GrammaticalNumber::Plural)
.with_case(Case::Genitive);
assert_eq!(article_with_features(&f), "der");
}
#[test]
fn indefinite_masc_nominative() {
let f = AgreementFeatures::default()
.with_gender(Gender::Masc)
.with_case(Case::Nominative);
assert_eq!(indefinite_article(&f), "ein");
}
#[test]
fn indefinite_masc_accusative() {
let f = AgreementFeatures::default()
.with_gender(Gender::Masc)
.with_case(Case::Accusative);
assert_eq!(indefinite_article(&f), "einen");
}
#[test]
fn indefinite_masc_dative() {
let f = AgreementFeatures::default()
.with_gender(Gender::Masc)
.with_case(Case::Dative);
assert_eq!(indefinite_article(&f), "einem");
}
#[test]
fn indefinite_masc_genitive() {
let f = AgreementFeatures::default()
.with_gender(Gender::Masc)
.with_case(Case::Genitive);
assert_eq!(indefinite_article(&f), "eines");
}
#[test]
fn indefinite_fem_nominative() {
let f = AgreementFeatures::default()
.with_gender(Gender::Fem)
.with_case(Case::Nominative);
assert_eq!(indefinite_article(&f), "eine");
}
#[test]
fn indefinite_fem_accusative() {
let f = AgreementFeatures::default()
.with_gender(Gender::Fem)
.with_case(Case::Accusative);
assert_eq!(indefinite_article(&f), "eine");
}
#[test]
fn indefinite_fem_dative() {
let f = AgreementFeatures::default()
.with_gender(Gender::Fem)
.with_case(Case::Dative);
assert_eq!(indefinite_article(&f), "einer");
}
#[test]
fn indefinite_fem_genitive() {
let f = AgreementFeatures::default()
.with_gender(Gender::Fem)
.with_case(Case::Genitive);
assert_eq!(indefinite_article(&f), "einer");
}
#[test]
fn indefinite_neut_nominative() {
let f = AgreementFeatures::default()
.with_gender(Gender::Neut)
.with_case(Case::Nominative);
assert_eq!(indefinite_article(&f), "ein");
}
#[test]
fn indefinite_neut_dative() {
let f = AgreementFeatures::default()
.with_gender(Gender::Neut)
.with_case(Case::Dative);
assert_eq!(indefinite_article(&f), "einem");
}
#[test]
fn indefinite_neut_genitive() {
let f = AgreementFeatures::default()
.with_gender(Gender::Neut)
.with_case(Case::Genitive);
assert_eq!(indefinite_article(&f), "eines");
}
#[test]
fn indefinite_plural_is_empty() {
let f = AgreementFeatures::default().with_number(GrammaticalNumber::Plural);
assert_eq!(indefinite_article(&f), "");
}
}