flo_ui 0.1.0

Implementation-free user interface description library
Documentation
mod json;
mod types;
mod paint;
mod mouse;
mod bounds;
mod actions;
mod control;
mod modifier;
mod position;
mod font_attr;
mod state_attr;
mod popup_attr;
mod attributes;
mod scroll_attr;
mod appearance_attr;

pub use self::json::*;
pub use self::types::*;
pub use self::paint::*;
pub use self::mouse::*;
pub use self::bounds::*;
pub use self::actions::*;
pub use self::control::*;
pub use self::modifier::*;
pub use self::position::*;
pub use self::font_attr::*;
pub use self::state_attr::*;
pub use self::popup_attr::*;
pub use self::attributes::*;
pub use self::scroll_attr::*;
pub use self::appearance_attr::*;

#[cfg(test)]
mod test {
    use super::*;
    use super::super::diff::*;
    use super::super::image::*;
    use super::super::property::*;
    use super::super::binding_canvas::*;
    use super::super::resource_manager::*;

    use std::sync::*;

    #[test]
    fn can_create_button() {
        let button = Control::button();

        assert!(button.control_type() == ControlType::Button);
    }

    #[test]
    fn can_create_label_with_text() {
        let label = Control::label().with("Hello");

        assert!(label.control_type() == ControlType::Label);
        assert!(label.attributes().any(|attr| attr == &ControlAttribute::Text("Hello".to_property())));
    }

    #[test]
    fn can_create_label_with_many_attributes() {
        let label = Control::label().with(("Hello", Bounds::fill_all()));

        assert!(label.control_type() == ControlType::Label);
        assert!(label.attributes().any(|attr| attr == &ControlAttribute::Text("Hello".to_property())));
        assert!(label.attributes().any(|attr| attr == &ControlAttribute::BoundingBox(Bounds::fill_all())));
    }

    #[test]
    fn can_create_container_with_components() {
        let container = Control::container()
            .with(vec![Control::label().with("Hello")]);

        assert!(container.control_type() == ControlType::Container);
        assert!(container.attributes().any(|attr| attr == &ControlAttribute::SubComponents(vec![Control::label().with("Hello")])));
    }

    #[test]
    fn can_find_all_subcontrollers() {
        let container = Control::container()
            .with(vec![
                Control::empty().with_controller("Test1"),
                Control::empty().with_controller("Test2"),
                Control::container().with(vec![
                    Control::empty().with_controller("Test3")
                ])
            ]);
        
        let subcontrollers = container.all_controllers();

        assert!(subcontrollers.len() == 3);
        assert!(subcontrollers.iter().any(|c| c == "Test1"));
        assert!(subcontrollers.iter().any(|c| c == "Test2"));
        assert!(subcontrollers.iter().any(|c| c == "Test3"));
    }

    #[test]
    fn will_only_report_subcontrollers_once() {
        let container = Control::container()
            .with(vec![
                Control::empty().with_controller("Test1"),
                Control::empty().with_controller("Test2"),
                Control::container().with(vec![
                    Control::empty().with_controller("Test1")
                ])
            ]);
        
        let subcontrollers = container.all_controllers();

        assert!(subcontrollers.len() == 2);
        assert!(subcontrollers.iter().any(|c| c == "Test1"));
        assert!(subcontrollers.iter().any(|c| c == "Test2"));
    }

    #[test]
    fn image_equals_self() {
        let resources       = ResourceManager::new();
        let image_resource  = resources.register(Image::Png(Arc::new(InMemoryImageData::new(vec![]))));
        let image           = Control::empty()
            .with(image_resource);

        assert!(!image.is_different(&image));
    }

    #[test]
    fn different_images_are_different() {
        let resources       = ResourceManager::new();
        let image_resource1 = resources.register(Image::Png(Arc::new(InMemoryImageData::new(vec![]))));
        let image_resource2 = resources.register(Image::Png(Arc::new(InMemoryImageData::new(vec![]))));
        let image1          = Control::empty()
            .with(image_resource1);
        let image2          = Control::empty()
            .with(image_resource2);

        assert!(image1.is_different(&image2));
    }

    #[test]
    fn text_attributes_are_different() {
        let text1   = ControlAttribute::Text("Text1".to_property());
        let text2   = ControlAttribute::Text("Text2".to_property());

        assert!(text1 != text2);
    }

    #[test]
    fn controls_with_text_attributes_are_not_equal() {
        let text1   = Control::empty()
            .with("Text1");
        let text2   = Control::empty()
            .with("Text2");

        assert!(text1 != text2);
    }

    #[test]
    fn controls_with_text_attributes_and_other_attributes_are_not_equal() {
        let text1   = Control::empty()
            .with(Font::Size(12.0))
            .with("Text1")
            .with(Bounds::next_horiz(80.0));
        let text2   = Control::empty()
            .with(Font::Size(12.0))
            .with("Text2")
            .with(Bounds::next_horiz(80.0));

        assert!(text1 != text2);
    }

    #[test]
    fn controls_with_text_attributes_and_other_attributes_are_same() {
        let text1   = Control::empty()
            .with(Font::Size(12.0))
            .with("Text1")
            .with(Bounds::next_horiz(80.0));
        let text2   = Control::empty()
            .with(Font::Size(12.0))
            .with("Text1")
            .with(Bounds::next_horiz(80.0));

        assert!(text1 == text2);
    }

    #[test]
    fn different_text_is_different() {
        let text1   = Control::empty()
            .with("Text1");
        let text2   = Control::empty()
            .with("Text2");

        assert!(text1.is_different(&text2));
    }

    #[test]
    fn different_text_in_subtree_are_not_equal() {
        let text1   = Control::empty()
            .with(vec![
                Control::empty()
                    .with("Text1")
            ]);
        let text2   = Control::empty()
            .with(vec![
                Control::empty()
                    .with("Text2")
            ]);

        assert!(text1 != text2);
    }

    #[test]
    fn different_text_in_subtree_are_not_different() {
        let text1   = Control::empty()
            .with(vec![
                Control::empty()
                    .with("Text1")
            ]);
        let text2   = Control::empty()
            .with(vec![
                Control::empty()
                    .with("Text2")
            ]);

        assert!(!text1.is_different(&text2));
    }

    #[test]
    fn same_text_in_subtree_are_equal() {
        let text1   = Control::empty()
            .with(vec![
                Control::empty()
                    .with("Text1")
            ]);
        let text2   = Control::empty()
            .with(vec![
                Control::empty()
                    .with("Text1")
            ]);

        assert!(text1 == text2);
    }

    #[test]
    fn different_text_is_different_with_other_attributes() {
        let text1   = Control::empty()
            .with("Text1");
        let text2   = Control::empty()
            .with("Text2");

        assert!(text1.is_different(&text2));
    }

    #[test]
    fn canvas_equals_self() {
        let resources       = ResourceManager::new();
        let canvas_resource = resources.register(BindingCanvas::new());
        let canvas1         = Control::canvas();
        let canvas2         = Control::canvas()
            .with(canvas_resource);

        assert!(!canvas1.is_different(&canvas1));
        assert!(!canvas2.is_different(&canvas2));
    }

    #[test]
    fn different_canvases_are_different() {
        let resources        = ResourceManager::new();
        let canvas_resource1 = resources.register(BindingCanvas::new());
        let canvas_resource2 = resources.register(BindingCanvas::new());
        let canvas1          = Control::canvas()
            .with(canvas_resource1);
        let canvas2          = Control::canvas()
            .with(canvas_resource2);

        assert!(canvas1.is_different(&canvas2));
    }
}