use variant_builder_macro::VariantBuilder;
use derive_builder::Builder;
use traced_test::*;
use tracing_setup::*;
use tracing::info;
#[derive(Debug, Clone, PartialEq, Builder)]
#[builder(setter(into))]
struct LeafStruct {
value: i32,
}
impl Default for LeafStruct {
fn default() -> Self {
Self { value: 0 }
}
}
#[derive(VariantBuilder, Debug, Clone, PartialEq)]
enum LeafEnum {
#[default]
#[no_builder]
Simple(i32),
Complex(LeafStruct),
}
#[derive(VariantBuilder, Debug, Clone, PartialEq)]
enum MidEnum {
#[default]
#[nested_builder]
Leaf(LeafEnum),
#[no_builder]
Number(u32),
}
#[derive(VariantBuilder, Debug, Clone, PartialEq)]
enum OuterEnum {
#[default]
#[nested_builder] Mid(MidEnum),
TopStruct(TopStruct),
#[no_builder]
RawStr(String),
}
#[derive(Debug, Clone, PartialEq, Builder)]
#[builder(setter(into))]
struct TopStruct {
label: &'static str,
}
impl Default for TopStruct {
fn default() -> Self {
Self { label: "default" }
}
}
#[traced_test]
fn nested_builder_full_chain() {
let tree = OuterEnum::mid(|| MidEnum::leaf(|| LeafEnum::complex(|b| { b.value(42);
})
)
);
info!(?tree, "constructed full skill‑tree");
assert_eq!(
tree,
OuterEnum::Mid(
MidEnum::Leaf(
LeafEnum::Complex(
LeafStruct { value: 42 }
)
)
)
);
}
#[traced_test]
fn outer_builder_variant() {
let v = OuterEnum::top_struct(|b| { b.label("outer");
});
info!(?v, "constructed OuterEnum::TopStruct");
assert_eq!(v, OuterEnum::TopStruct(TopStruct { label: "outer" }));
}
#[traced_test]
fn outer_no_builder_variant() {
let v = OuterEnum::raw_str("hello".into()); info!(?v, "constructed OuterEnum::RawStr");
assert_eq!(v, OuterEnum::RawStr("hello".into()));
}
#[traced_test]
fn mid_no_builder_variant() {
let m = MidEnum::number(7); info!(?m, "constructed MidEnum::Number");
assert_eq!(m, MidEnum::Number(7));
}
#[traced_test]
fn leaf_no_builder_variant() {
let l = LeafEnum::simple(3); info!(?l, "constructed LeafEnum::Simple");
assert_eq!(l, LeafEnum::Simple(3));
}
#[traced_test]
fn default_variants_chain() {
let default_tree = OuterEnum::default();
info!(?default_tree, "default tree produced");
assert_eq!(
default_tree,
OuterEnum::Mid(
MidEnum::Leaf(
LeafEnum::Simple(0) )
)
);
}
#[test]
#[should_panic(expected = "Simulated failure")]
fn builder_closure_propagates_panic() {
OuterEnum::top_struct(|_b| panic!("Simulated failure"));
}