#[slhx::surface] pub mod ui {} #[cfg(test)] mod tests { use super::ui::control_center::{forms, handles, slots}; use super::ui::issue_card::handles as card_handles; use super::ui::issue_lane::events as lane_events; use hemplate::Hemplate; use slhx::{Effect, IntoEffect, Payload, RenderSlotExt}; use slhx_test::inspect; #[derive(Hemplate)] #[hemplate = "partials"] struct FastMetric { label: &'static str, } #[allow(dead_code)] #[derive(Clone, Debug)] #[slhx::form("launch_work")] struct LaunchWork { title: String, lane: String, impact: Option, } // req: examples/001 req: codegen/002 req: public_api/001 #[test] fn techdemo_uses_generated_slots_for_multi_target_updates() { fn update() -> impl IntoEffect { ( slots::hero_metrics.render(&FastMetric { label: "fast" }), slots::notice.text("typed"), ) } let batch = inspect(update()); assert!(batch.has_slot(slots::hero_metrics)); assert!(batch.has_slot(slots::notice)); } // req: examples/001 req: form/001 req: form/004 req: form/006 req: derive_handler/003 #[test] fn techdemo_form_handler_is_checked_against_hemplate_form() { #[slhx::handler] fn launch_work(_form: slhx::Form) -> impl IntoEffect { slots::notice.text("queued") } let batch = inspect(launch_work(LaunchWork::FORM)); assert!(batch.has_slot(slots::notice)); assert!(matches!(batch.ops(), [Effect::Put { payload: Payload::Text(_), .. }])); } // req: examples/001 req: form/002 req: codegen/003 #[test] fn techdemo_exports_form_and_interaction_handles() { assert_ne!(handles::launch_work.id(), card_handles::advance_work.id()); assert_eq!( forms::launch_work.field("title").resource, forms::launch_work.id() ); } // req: codegen/006 #[test] fn techdemo_exports_generated_event_constants() { assert_eq!(lane_events::drop.as_str(), "drop"); assert!(matches!( slhx::event(lane_events::drop, "card-1"), Effect::Emit { name, payload } if name == "drop" && payload == "card-1" )); } }