phonet 1.0.2

A CLI tool and library to validate phonotactic patterns for constructed languages
Documentation
use phonet::{
    draft::{Message, Note},
    outcome::{FailKind::*, PassStatus::*, TestOutcome},
    Draft,
};

#[test]
fn example_outcome_works() {
    let file = include_str!("../examples/example.phonet");

    let outcome = Draft::from(file).expect("Failed to parse").run();

    assert_eq!(outcome.fail_count, 2);

    let mut list = outcome.messages.iter();

    assert_eq!(
        list.next().unwrap(),
        &Message::Info(Note("Invalid letters".to_string()))
    );
    assert_eq!(
        list.next().unwrap(),
        &Message::Test(TestOutcome {
            word: "taso".to_string(),
            intent: true,
            status: Pass,
        })
    );
    assert_eq!(
        list.next().unwrap(),
        &Message::Test(TestOutcome {
            word: "tyxo".to_string(),
            intent: false,
            status: Pass,
        })
    );

    assert_eq!(
        list.next().unwrap(),
        &Message::Info(Note("Examples of failing tests".to_string()))
    );
    assert_eq!(
        list.next().unwrap(),
        &Message::Test(TestOutcome {
            word: "tyxo".to_string(),
            intent: true,
            status: Fail(CustomReason(Note("Invalid letters".to_string()))),
        })
    );
    assert_eq!(
        list.next().unwrap(),
        &Message::Test(TestOutcome {
            word: "taso".to_string(),
            intent: false,
            status: Fail(ShouldBeInvalid),
        })
    );

    assert_eq!(
        list.next().unwrap(),
        &Message::Info(Note("Syllable structure".to_string()))
    );
    assert_eq!(
        list.next().unwrap(),
        &Message::Test(TestOutcome {
            word: "taso".to_string(),
            intent: true,
            status: Pass,
        })
    );
    assert_eq!(
        list.next().unwrap(),
        &Message::Test(TestOutcome {
            word: "kili".to_string(),
            intent: true,
            status: Pass,
        })
    );
    assert_eq!(
        list.next().unwrap(),
        &Message::Test(TestOutcome {
            word: "ano".to_string(),
            intent: true,
            status: Pass,
        })
    );
    assert_eq!(
        list.next().unwrap(),
        &Message::Test(TestOutcome {
            word: "atoso".to_string(),
            intent: true,
            status: Pass,
        })
    );
    assert_eq!(
        list.next().unwrap(),
        &Message::Test(TestOutcome {
            word: "taaso".to_string(),
            intent: false,
            status: Pass,
        })
    );
    assert_eq!(
        list.next().unwrap(),
        &Message::Test(TestOutcome {
            word: "an".to_string(),
            intent: false,
            status: Pass,
        })
    );

    assert_eq!(
        list.next().unwrap(),
        &Message::Info(Note("Some more tests".to_string()))
    );
    assert_eq!(
        list.next().unwrap(),
        &Message::Test(TestOutcome {
            word: "silo".to_string(),
            intent: true,
            status: Pass,
        })
    );
    assert_eq!(
        list.next().unwrap(),
        &Message::Test(TestOutcome {
            word: "tila".to_string(),
            intent: true,
            status: Pass,
        })
    );
    assert_eq!(
        list.next().unwrap(),
        &Message::Test(TestOutcome {
            word: "akka".to_string(),
            intent: false,
            status: Pass,
        })
    );
    assert_eq!(
        list.next().unwrap(),
        &Message::Test(TestOutcome {
            word: "axe".to_string(),
            intent: false,
            status: Pass,
        })
    );

    // (quiet note)
    assert_eq!(
        list.next().unwrap(),
        &Message::Test(TestOutcome {
            word: "taso".to_string(),
            intent: true,
            status: Pass,
        })
    );
    assert_eq!(
        list.next().unwrap(),
        &Message::Test(TestOutcome {
            word: "taaso".to_string(),
            intent: false,
            status: Pass,
        })
    );
    assert_eq!(
        list.next().unwrap(),
        &Message::Test(TestOutcome {
            word: "ttaso".to_string(),
            intent: false,
            status: Pass,
        })
    );

    assert_eq!(
        list.next().unwrap(),
        &Message::Info(Note("2 tests *should* have failed!".to_string()))
    );

    assert_eq!(list.next(), None);
}