bbecs 0.3.0

ECS library for Brooks Builds projects made live on Twitch at https://twitch.tv/brookzerker.
Documentation
use std::cell::RefCell;
use std::rc::Rc;

use bbecs::components::CastComponents;
use bbecs::resources::resource::ResourceCast;
use bbecs::world::{World, WorldMethods};
use eyre::Result;
use ggez::graphics::Color;

const RESOURCE_NAME: &str = "color";
const RESOURCE: Color = Color::new(0.5, 0.2, 0.8, 1.0);

#[test]
fn integration_test_point_resource() -> Result<()> {
    let mut world = World::new();

    world.add_resource(RESOURCE_NAME.to_owned(), RESOURCE);

    let wrapped_retrieved_resource = world.get_resource(RESOURCE_NAME)?.borrow();
    let retrieved_resource: &Color = wrapped_retrieved_resource.cast()?;

    assert_eq!(RESOURCE, *retrieved_resource);

    Ok(())
}

#[test]
#[allow(clippy::float_cmp)]
fn integration_test_point_resource_mut() -> Result<()> {
    let mut world = World::new();

    world.add_resource(RESOURCE_NAME.to_owned(), RESOURCE);

    let mut wrapped_retrieved_resource = world.get_resource(RESOURCE_NAME)?.borrow_mut();
    let retrieved_resource: &mut Color = wrapped_retrieved_resource.cast_mut()?;

    retrieved_resource.r += 0.1;

    drop(wrapped_retrieved_resource);

    let wrapped_retrieved_resource = world.get_resource(RESOURCE_NAME)?.borrow();
    let retrieved_resource: &Color = wrapped_retrieved_resource.cast()?;

    assert_eq!(Color::new(0.6, 0.2, 0.8, 1.0), *retrieved_resource);

    Ok(())
}

#[test]
fn integration_test_point_query() -> Result<()> {
    let mut world = World::new();

    world.register("color")?;

    world
        .spawn_entity()?
        .with_component("color", Color::new(0.5, 0.2, 0.8, 1.0))?;

    let query_results = world.query(vec!["color"])?;
    let colors = query_results.get("color").unwrap();

    let wrapped_colors: &Rc<RefCell<Color>> = colors[0].cast()?;
    let color = wrapped_colors.borrow();

    assert_eq!(*color, Color::new(0.5, 0.2, 0.8, 1.0));
    Ok(())
}

#[test]
fn integration_test_point_query_mut() -> Result<()> {
    let mut world = World::new();

    world.register("color")?;

    world
        .spawn_entity()?
        .with_component("color", Color::new(0.5, 0.2, 0.8, 1.0))?;

    {
        let query_results = world.query(vec!["color"])?;
        let colors = query_results.get("color").unwrap();
        let wrapped_colors: &Rc<RefCell<Color>> = colors[0].cast()?;
        let mut color = wrapped_colors.borrow_mut();
        color.r += 0.1;
    }

    let query_results = world.query(vec!["color"])?;
    let colors = query_results.get("color").unwrap();
    let wrapped_colors: &Rc<RefCell<Color>> = colors[0].cast()?;
    let color = wrapped_colors.borrow();

    assert_eq!(*color, Color::new(0.6, 0.2, 0.8, 1.0));
    Ok(())
}