mirage-engine 0.1.1

Mirage, an immediate-mode 3D engine for simple games on desktop and the browser
Documentation
//! What `#[derive(Part)]` answers to, seen the way a game sees it.

use mirage_engine::prelude::*;

/// A vocabulary whose parts are named the way a modelling tool names them.
#[derive(Part, Clone, Debug, Eq, Hash, PartialEq)]
enum HullPart {
    Plating,
    #[part("Hull Metal")]
    #[part("hull-metal")]
    Trim,
}

/// A vocabulary of one part, named by its own identifier.
#[derive(Part, Clone, Debug, Eq, Hash, PartialEq)]
struct Skin;

#[test]
fn a_variant_answers_to_its_identifier_until_it_declares_a_name() {
    assert_eq!(HullPart::from_name("Plating"), Some(HullPart::Plating));
    assert_eq!(HullPart::from_name("Hull Metal"), Some(HullPart::Trim));
    assert_eq!(
        HullPart::from_name("hull-metal"),
        Some(HullPart::Trim),
        "and stack"
    );
    assert_eq!(
        HullPart::from_name("Trim"),
        None,
        "a declared name replaces it"
    );
    assert_eq!(HullPart::from_name("Wing"), None);
}

#[test]
fn a_unit_struct_answers_to_its_own_name() {
    assert_eq!(Skin::from_name("Skin"), Some(Skin));
    assert_eq!(Skin::from_name("skin"), None, "names are matched exactly");
}

#[test]
fn every_variant_is_counted_once_in_order_however_many_names_it_answers_to() {
    assert_eq!(HullPart::all(), vec![HullPart::Plating, HullPart::Trim]);
    assert_eq!(
        HullPart::all()
            .iter()
            .map(HullPart::index)
            .collect::<Vec<_>>(),
        vec![0, 1]
    );
    assert_eq!(Skin::all(), vec![Skin]);
    assert_eq!(Skin.index(), 0);
}

#[test]
fn a_mesh_with_no_parts_resolves_no_name() {
    assert_eq!(NoParts::from_name("Hull Metal"), None);
    assert!(NoParts::all().is_empty(), "so startup asks nothing of it");
}