#![cfg(feature = "derive")]
use formars::prelude::*;
#[derive(formars::FormSchema)]
struct Signup {
#[form(label = "Your name")]
name: String,
#[form(label = "Age")]
age: u32,
}
fn obj(pairs: &[(&str, Value)]) -> Value {
let mut o = formars::formars_core::value::Object::new();
for (k, v) in pairs {
o.insert(k, v.clone());
}
Value::Object(o)
}
#[test]
fn derive_and_trait_coexist_and_typed_parse_round_trips() {
let companion = <Signup as FormSchema>::form_schema();
let out = companion
.parse(&Signup {
name: "ada".into(),
age: 42,
})
.expect("typed parse succeeds");
assert_eq!(out.name, "ada");
assert_eq!(out.age, 42);
}
#[test]
fn erased_view_reports_coerce_at_age_path() {
let erased: Box<dyn DynSchema> = Box::new(<Signup as FormSchema>::form_schema());
let issues = erased.validate_value(&obj(&[
("name", Value::from("ada")),
("age", Value::from("not-a-number")),
]));
assert_eq!(issues.len(), 1, "exactly one Coerce issue");
assert_eq!(issues[0].code, IssueCode::Coerce);
assert_eq!(issues[0].path.to_string(), "age");
}
#[test]
fn form_label_attr_reaches_field_meta() {
let schema = <Signup as FormSchema>::form_schema();
let meta = schema
.field_meta("name")
.expect("declared key must carry metadata");
assert_eq!(meta.label.as_deref(), Some("Your name"));
}