myelin-engine 0.14.2

This crate contains the physical engine of the simulation, as well as the objects that reside within it
use myelin_engine::prelude::*;
use myelin_engine::simulation::SimulationBuilder;

#[derive(Debug, Clone, Default)]
struct StaticBehavior;

impl<T> ObjectBehavior<T> for StaticBehavior
where
    T: AssociatedObjectData,
{
    fn step(&mut self, _world_interactor: Box<dyn WorldInteractor<T> + '_>) -> Option<Action<T>> {
        None
    }
}

#[test]
fn simulation_runs() {
    let mut simulation = SimulationBuilder::new().build();
    let description = description();

    let behavior: Box<dyn ObjectBehavior<_>> = Box::new(StaticBehavior::default());
    simulation.add_object(description, behavior);

    simulation.step();
    simulation.step();
}

#[test]
fn simulation_returns_object() {
    let mut simulation = SimulationBuilder::new().build();
    let expected_description = description();

    let behavior: Box<dyn ObjectBehavior<_>> = Box::new(StaticBehavior::default());
    let object = simulation.add_object(expected_description.clone(), behavior);
    assert_eq!(expected_description, object.description);
}

#[test]
fn simulation_retrieves_object() {
    let (simulation, id, description) = {
        let mut simulation = SimulationBuilder::new().build();
        let expected_description = description();

        let behavior: Box<dyn ObjectBehavior<_>> = Box::new(StaticBehavior::default());
        let object = simulation.add_object(expected_description.clone(), behavior);
        let id = object.id;
        let description = object.description;
        (simulation, id, description)
    };
    let retrieved_object = simulation.object(id).unwrap();
    assert_eq!(retrieved_object.description, description);
}

fn description() -> ObjectDescription<()> {
    ObjectBuilder::default()
        .shape(
            PolygonBuilder::default()
                .vertex(-5.0, -5.0)
                .vertex(5.0, -5.0)
                .vertex(5.0, 5.0)
                .vertex(-5.0, 5.0)
                .build()
                .unwrap(),
        )
        .location(10.0, 15.0)
        .mobility(Mobility::Immovable)
        .build()
        .unwrap()
}