ruukh 0.0.2

An experimental next-gen frontend framework for the Web in Rust.
#![feature(proc_macro_gen, decl_macro)]

use ruukh::prelude::*;

#[test]
fn should_build_a_component_from_unit_struct() {
    #[component]
    struct Unit;
}

#[test]
fn should_build_a_component_from_struct() {
    #[component]
    struct Button {
        prop_a: i32,
    }

    let _ = ButtonProps!(prop_a: 5);
}

#[test]
fn should_build_a_component_with_props_only() {
    #[component]
    struct Button {
        prop_a: i32,

        #[prop]
        prop_b: i32,

        #[prop]
        prop_c: i32,

        #[prop(default = 4)]
        prop_d: i32,

        #[prop(default)]
        prop_e: i32,
    }

    let _ = ButtonProps {
        prop_a: 5,
        prop_b: 5,
        prop_c: 5,
        prop_d: 5,
        prop_e: 5,
    };

    let props = ButtonProps!(prop_a: 1, prop_b: 2, prop_c: 3, prop_d: 4);

    assert_eq!(props.prop_a, 1);
    assert_eq!(props.prop_b, 2);
    assert_eq!(props.prop_c, 3);
    assert_eq!(props.prop_d, 4);
}

#[test]
fn should_build_a_component_with_state_only() {
    #[component]
    struct Button {
        #[state]
        state_a: i32,
        #[state]
        state_b: bool,
        #[state(default = 5)]
        state_c: i32,
    }

    let _ = ButtonState {
        state_a: 5,
        state_b: false,
        state_c: 5,
    };

    let def = ButtonState::default();
    assert_eq!(def.state_a, 0);
    assert_eq!(def.state_b, false);
    assert_eq!(def.state_c, 5);
}

#[test]
fn should_build_a_component_with_state_and_props() {
    #[component]
    struct Button {
        #[prop]
        prop_a: bool,
        #[state]
        state_a: i32,
        #[state(default = 5)]
        state_c: i32,
    }

    let _ = ButtonProps!(prop_a: false);
    let _ = ButtonState::default();
}

#[test]
fn should_build_a_component_with_event() {
    #[component]
    #[events(
        fn save (&self, num: i32);
    )]
    struct Button;
}

#[test]
fn should_build_a_component_with_events() {
    #[component]
    #[events(
        fn save (&self, num: i32);

        fn click (&self) -> i32;
    )]
    struct Button;
}

#[test]
fn should_build_a_component_with_events_in_separate_attrs() {
    #[component]
    #[events(
        fn save (&self, num: i32);
    )]
    #[events(
        fn click (&self) -> i32;
    )]
    struct Button;
}

#[test]
fn should_build_a_component_with_optional_event() {
    #[component]
    #[events(
        #[optional]
        fn save(&self, num: i32);
    )]
    struct Button;
}

#[test]
fn should_build_a_component_with_everything() {
    #[component]
    #[events(
        #[optional]
        fn save(&self, num: i32);
    )]
    struct Button {
        prop_a: bool,
        #[state]
        state_b: bool,
    }
}

#[test]
fn should_build_a_component_with_default_option_props() {
    #[component]
    struct Button {
        prop_a: Option<bool>,
        #[prop(default = Some(5))]
        prop_b: Option<i32>,
    }

    let props = ButtonProps!();
    assert!(props.prop_a.is_none());
    assert_eq!(props.prop_b, Some(5));

    let props = ButtonProps!(prop_a: Some(false), prop_b: Some(3));
    assert_eq!(props.prop_a, Some(false));
    assert_eq!(props.prop_b, Some(3));
}