euv-core 0.18.21

A declarative, cross-platform UI framework for Rust with virtual DOM, reactive signals, and HTML macros for WebAssembly.
Documentation
use super::*;
#[test]
fn tag_element_constructs() {
    let tag: Tag = Tag::Element(Cow::Borrowed("div"));
    match &tag {
        Tag::Element(name) => assert_eq!(name, "div"),
        Tag::Component(_) => panic!("expected Element"),
        Tag::Portal(_) => panic!("expected Element"),
    }
}

#[test]
fn tag_component_constructs() {
    let tag: Tag = Tag::Component(Cow::Borrowed("MyButton"));
    match &tag {
        Tag::Component(name) => assert_eq!(name, "MyButton"),
        Tag::Element(_) => panic!("expected Component"),
        Tag::Portal(_) => panic!("expected Component"),
    }
}

#[test]
fn tag_clone_preserves_variant() {
    let element: Tag = Tag::Element(Cow::Borrowed("span"));
    let cloned_element: Tag = element.clone();
    match &cloned_element {
        Tag::Element(name) => assert_eq!(name, "span"),
        _ => panic!("expected Element"),
    }
    let component: Tag = Tag::Component(Cow::Borrowed("Header"));
    let cloned_component: Tag = component.clone();
    match &cloned_component {
        Tag::Component(name) => assert_eq!(name, "Header"),
        _ => panic!("expected Component"),
    }
}

#[test]
fn tag_equality_same_variant() {
    let a: Tag = Tag::Element(Cow::Borrowed("div"));
    let b: Tag = Tag::Element(Cow::Borrowed("div"));
    assert_eq!(a, b);
}

#[test]
fn tag_equality_different_variants() {
    let element: Tag = Tag::Element(Cow::Borrowed("div"));
    let component: Tag = Tag::Component(Cow::Borrowed("div"));
    assert_ne!(element, component);
}

#[test]
fn tag_equality_different_inner_values() {
    let a: Tag = Tag::Element(Cow::Borrowed("div"));
    let b: Tag = Tag::Element(Cow::Borrowed("span"));
    assert_ne!(a, b);
}

#[test]
fn tag_hash_same_for_equal_tags() {
    let a: Tag = Tag::Element(Cow::Borrowed("div"));
    let b: Tag = Tag::Element(Cow::Borrowed("div"));
    let mut h1: DefaultHasher = DefaultHasher::new();
    let mut h2: DefaultHasher = DefaultHasher::new();
    a.hash(&mut h1);
    b.hash(&mut h2);
    assert_eq!(h1.finish(), h2.finish());
}

#[test]
fn tag_debug_format_works() {
    let tag: Tag = Tag::Element(Cow::Borrowed("div"));
    let formatted: String = format!("{:?}", tag);
    assert!(formatted.contains("Element"));
    assert!(formatted.contains("div"));
}

#[test]
fn virtual_node_empty_constructs() {
    let node: VirtualNode = VirtualNode::Empty;
    assert!(matches!(node, VirtualNode::Empty));
}

#[test]
fn virtual_node_empty_clone_is_identical() {
    let node: VirtualNode = VirtualNode::Empty;
    let cloned: VirtualNode = node.clone();
    assert!(matches!(cloned, VirtualNode::Empty));
}

#[test]
fn virtual_node_empty_debug_format() {
    let node: VirtualNode = VirtualNode::Empty;
    let formatted: String = format!("{:?}", node);
    assert!(formatted.contains("Empty"));
}

#[test]
fn virtual_node_element_with_no_attributes_no_children() {
    let node: VirtualNode = VirtualNode::Element {
        tag: Tag::Element(Cow::Borrowed("div")),
        attributes: Vec::new(),
        children: Vec::new(),
        key: None,
        props: None,
    };
    match node {
        VirtualNode::Element { tag, .. } => match tag {
            Tag::Element(name) => assert_eq!(name, "div"),
            _ => panic!("expected Element tag"),
        },
        _ => panic!("expected Element variant"),
    }
}

#[test]
fn virtual_node_element_with_key() {
    let node: VirtualNode = VirtualNode::Element {
        tag: Tag::Element(Cow::Borrowed("li")),
        attributes: Vec::new(),
        children: Vec::new(),
        key: Some(String::from("item-1")),
        props: None,
    };
    if let VirtualNode::Element { key, .. } = &node {
        assert_eq!(key.as_ref().unwrap(), "item-1");
    } else {
        panic!("expected Element variant");
    }
}

#[test]
fn virtual_node_element_with_nested_children() {
    let inner: VirtualNode = VirtualNode::Element {
        tag: Tag::Element(Cow::Borrowed("span")),
        attributes: Vec::new(),
        children: Vec::new(),
        key: None,
        props: None,
    };
    let outer: VirtualNode = VirtualNode::Element {
        tag: Tag::Element(Cow::Borrowed("div")),
        attributes: Vec::new(),
        children: vec![inner],
        key: None,
        props: None,
    };
    if let VirtualNode::Element { children, .. } = &outer {
        assert_eq!(children.len(), 1);
        matches!(children[0], VirtualNode::Element { .. });
    } else {
        panic!("expected Element variant");
    }
}

#[test]
fn virtual_node_element_clone_deep_copies() {
    let original: VirtualNode = VirtualNode::Element {
        tag: Tag::Element(Cow::Borrowed("div")),
        attributes: vec![AttributeEntry::new(
            Cow::Borrowed("id"),
            AttributeValue::Text(String::from("root")),
        )],
        children: Vec::new(),
        key: None,
        props: None,
    };
    let cloned: VirtualNode = original.clone();
    if let VirtualNode::Element {
        tag, attributes, ..
    } = &cloned
    {
        match tag {
            Tag::Element(name) => assert_eq!(name, "div"),
            _ => panic!("expected Element tag"),
        }
        assert_eq!(attributes.len(), 1);
    } else {
        panic!("expected Element after clone");
    }
}

#[test]
fn virtual_node_fragment_with_empty_children() {
    let node: VirtualNode = VirtualNode::Fragment(Vec::new());
    if let VirtualNode::Fragment(children) = &node {
        assert!(children.is_empty());
    } else {
        panic!("expected Fragment variant");
    }
}

#[test]
fn virtual_node_fragment_with_pure_rust_children() {
    let children: Vec<VirtualNode> = vec![
        VirtualNode::Empty,
        VirtualNode::Element {
            tag: Tag::Element(Cow::Borrowed("br")),
            attributes: Vec::new(),
            children: Vec::new(),
            key: None,
            props: None,
        },
        VirtualNode::Text(TextNode::new(String::from("hello"), None)),
    ];
    let fragment: VirtualNode = VirtualNode::Fragment(children);
    if let VirtualNode::Fragment(children) = &fragment {
        assert_eq!(children.len(), 3);
    } else {
        panic!("expected Fragment variant");
    }
}

#[test]
fn virtual_node_fragment_clone_preserves_children() {
    let fragment: VirtualNode = VirtualNode::Fragment(vec![VirtualNode::Empty, VirtualNode::Empty]);
    let cloned: VirtualNode = fragment.clone();
    if let VirtualNode::Fragment(children) = &cloned {
        assert_eq!(children.len(), 2);
    } else {
        panic!("expected Fragment after clone");
    }
}

#[test]
fn text_node_partial_eq_visual_equality() {
    let a: TextNode = TextNode::new(String::from("hello"), None);
    let b: TextNode = TextNode::new(String::from("hello"), None);
    assert_eq!(a, b);
}

#[test]
fn text_node_partial_eq_different_content() {
    let a: TextNode = TextNode::new(String::from("hello"), None);
    let b: TextNode = TextNode::new(String::from("world"), None);
    assert_ne!(a, b);
}

#[test]
fn text_node_debug_format_skips_signal_field() {
    let node: TextNode = TextNode::new(String::from("hello"), None);
    let formatted: String = format!("{:?}", node);
    assert!(formatted.contains("TextNode"));
}

#[test]
fn virtual_node_empty_debug_format_includes_variant() {
    let node: VirtualNode = VirtualNode::Empty;
    let formatted: String = format!("{:?}", node);
    assert!(formatted.contains("Empty"));
}

#[test]
fn virtual_node_element_debug_format_includes_tag() {
    let node: VirtualNode = VirtualNode::Element {
        tag: Tag::Element(Cow::Borrowed("div")),
        attributes: Vec::new(),
        children: Vec::new(),
        key: None,
        props: None,
    };
    let formatted: String = format!("{:?}", node);
    assert!(formatted.contains("Element"));
    assert!(formatted.contains("div"));
}

#[test]
fn native_virtual_node_empty_construction_does_not_panic() {
    let result: Result<(), String> = catch_unwind(AssertUnwindSafe(|| {
        let _: VirtualNode = VirtualNode::Empty;
    }))
    .map_err(|_| "panic".to_string());
    assert!(result.is_ok());
}

#[test]
fn native_virtual_node_element_construction_does_not_panic() {
    let result: Result<(), String> = catch_unwind(AssertUnwindSafe(|| {
        let _: VirtualNode = VirtualNode::Element {
            tag: Tag::Element(Cow::Borrowed("div")),
            attributes: Vec::new(),
            children: Vec::new(),
            key: None,
            props: None,
        };
    }))
    .map_err(|_| "panic".to_string());
    assert!(result.is_ok());
}

#[test]
fn native_text_node_construction_does_not_panic() {
    let result: Result<(), String> = catch_unwind(AssertUnwindSafe(|| {
        let _: TextNode = TextNode::new(String::from("x"), None);
    }))
    .map_err(|_| "panic".to_string());
    assert!(result.is_ok());
}

#[test]
fn native_tag_construction_does_not_panic() {
    let result: Result<(), String> = catch_unwind(AssertUnwindSafe(|| {
        let _: Tag = Tag::Element(Cow::Borrowed("div"));
        let _: Tag = Tag::Component(Cow::Borrowed("Foo"));
    }))
    .map_err(|_| "panic".to_string());
    assert!(result.is_ok());
}