libikarus 0.1.14

The core functionality of Ikarus wrapped neatly in a rust library
Documentation
#[cfg(test)]
pub mod tests {
    use crate::objects::object::{ObjectScope, ObjectType};
    use crate::persistence::project::Project;
    use crate::tests::{one_object_of_each_type, INFO, NAME};
    use crate::types::location::FolderPosition;

    #[test]
    fn object_creation() -> Result<(), Box<dyn std::error::Error>> {
        let project = Project::open_in_memory()?;

        let _ = one_object_of_each_type(&project);

        Ok(())
    }

    #[test]
    fn object_exists() -> Result<(), Box<dyn std::error::Error>> {
        let project = Project::open_in_memory()?;

        let objects = one_object_of_each_type(&project);

        for object in objects {
            assert!(object.exists()?);
        }

        Ok(())
    }

    #[test]
    fn object_deletion() -> Result<(), Box<dyn std::error::Error>> {
        let project = Project::open_in_memory()?;

        let objects = one_object_of_each_type(&project);

        for object in objects {
            assert!(object.exists()?);

            let cloned = object.clone();

            object.delete()?;

            assert!(!cloned.exists()?);
        }

        Ok(())
    }

    #[test]
    fn object_location_fetching() -> Result<(), Box<dyn std::error::Error>> {
        let project = Project::open_in_memory()?;

        let objects = one_object_of_each_type(&project);

        for object in objects {
            let location = object.location()?;

            assert!(location.parent.is_none());
            assert_eq!(
                location.position,
                // folders are created second
                if object.object_type().is_folder_type() {
                    1
                } else {
                    0
                }
            );
        }

        Ok(())
    }

    #[test]
    fn object_location_changing() -> Result<(), Box<dyn std::error::Error>> {
        let project = Project::open_in_memory()?;

        let objects = one_object_of_each_type(&project);

        for mut object in objects {
            // create a new folder of the same type
            let new_parent = project.get_objects(object.object_type().folder_type().to_bitset())?
                [0]
            .to_folder()?;

            object.set_location(Some(new_parent.clone()), FolderPosition::EndOfFolder)?;

            let location = object.location()?;

            assert_eq!(location.parent, Some(new_parent.clone()));
            assert_eq!(
                location.position,
                // folders are created second
                if object.object_type().is_folder_type() {
                    1
                } else {
                    0
                }
            );
        }

        Ok(())
    }

    #[test]
    fn object_name_and_information_fetching() -> Result<(), Box<dyn std::error::Error>> {
        let project = Project::open_in_memory()?;

        let objects = one_object_of_each_type(&project);

        for object in objects {
            assert_eq!(object.name()?, NAME);
            assert_eq!(object.information()?, INFO);
        }

        Ok(())
    }

    #[test]
    fn object_name_and_information_changing() -> Result<(), Box<dyn std::error::Error>> {
        let project = Project::open_in_memory()?;

        let objects = one_object_of_each_type(&project);

        for mut object in objects {
            let new = "new";
            object.set_name(new)?;
            object.set_information(new)?;
            assert_eq!(object.name()?, new);
            assert_eq!(object.information()?, new);
        }

        Ok(())
    }

    #[test]
    fn object_scope() -> Result<(), Box<dyn std::error::Error>> {
        let project = Project::open_in_memory()?;

        let objects = one_object_of_each_type(&project);

        for object in objects {
            match (object.object_type(), object.scope()?) {
                (ObjectType::Blueprint, ObjectScope::Blueprints) => {}
                (ObjectType::BlueprintFolder, ObjectScope::Blueprints) => {}
                (ObjectType::Entity, ObjectScope::Entities) => {}
                (ObjectType::EntityFolder, ObjectScope::Entities) => {}
                (ObjectType::Property, ObjectScope::Property(_)) => {}
                (ObjectType::PropertyFolder, ObjectScope::Property(_)) => {}
                _ => panic!("invalid scope"),
            }
        }

        Ok(())
    }
}