use webots_proto::Proto;
use webots_proto::{ProtoExt, RenderOptions};
#[test]
fn test_workflow_valid_proto() {
let input = r#"#VRML_SIM R2025a utf8
PROTO MyRobot [
field SFVec3f translation 0 0 0
field SFString name "robot"
]
{
Robot {
translation IS translation
name IS name
}
}
"#;
let doc: Proto = input.parse().expect("Parse failed");
let diagnostics = doc.validate().expect("Validation failed");
assert!(
!diagnostics.has_errors(),
"Validation failed: {:?}",
diagnostics
);
let rendered = doc
.render(&RenderOptions::default())
.expect("Render failed");
assert!(rendered.contains("Robot {"));
let output = doc.to_lossless_string().expect("Write failed");
assert_eq!(output, input);
}
#[test]
fn test_workflow_template_proto() {
let input = r#"#VRML_SIM R2025a utf8
PROTO MyBox [
field SFVec3f size 1 1 1
]
{
Box {
size %<= fields.size.value.x >% %<= fields.size.value.y >% %<= fields.size.value.z >%
}
}
"#;
let doc: Proto = input.parse().expect("Parse failed");
let diagnostics = doc.validate().expect("Validation failed");
assert!(!diagnostics.has_errors());
let rendered = doc
.render(&RenderOptions::default())
.expect("Render failed");
assert!(rendered.contains("Box {"));
assert!(rendered.contains("size 1 1 1") || rendered.contains("size 1.0 1.0 1.0"));
}
#[test]
fn test_workflow_invalid_proto() {
let input = r#"#VRML_SIM R2025a utf8
PROTO MyRobot [
field SFInt32 val "string"
]
{
Robot {}
}
"#;
let doc: Proto = input.parse().expect("Parse failed");
let diagnostics = doc.validate().expect("Validation failed");
assert!(diagnostics.has_errors());
let error = diagnostics
.iter()
.find(|d| d.message.contains("Type mismatch"));
assert!(error.is_some());
}