use rbx_dom_weak::{
types::{
BrickColor, CFrame, Color3, Color3uint8, Enum, Font, Ref, Region3, SharedString, Vector3,
},
InstanceBuilder, WeakDom,
};
use crate::{text_deserializer::DecodedModel, to_writer};
#[test]
fn just_folder() {
let tree = WeakDom::new(InstanceBuilder::new("Folder"));
let mut buffer = Vec::new();
to_writer(&mut buffer, &tree, &[tree.root_ref()]).expect("failed to encode model");
let decoded = DecodedModel::from_reader(buffer.as_slice());
insta::assert_yaml_snapshot!(decoded);
}
#[test]
fn partially_present() {
let tree = WeakDom::new(InstanceBuilder::new("Folder").with_children(vec![
InstanceBuilder::new("StringValue").with_property("Value", "Hello"),
InstanceBuilder::new("StringValue"),
]));
let root_refs = tree.root().children();
let mut buffer = Vec::new();
to_writer(&mut buffer, &tree, root_refs).expect("failed to encode model");
let decoded = DecodedModel::from_reader(buffer.as_slice());
insta::assert_yaml_snapshot!(decoded);
}
#[test]
fn unknown_property() {
let tree =
WeakDom::new(InstanceBuilder::new("Folder").with_property("WILL_NEVER_EXIST", "Hi, mom!"));
let mut buffer = Vec::new();
to_writer(&mut buffer, &tree, &[tree.root_ref()]).expect("failed to encode model");
let decoded = DecodedModel::from_reader(buffer.as_slice());
insta::assert_yaml_snapshot!(decoded);
}
#[test]
fn unimplemented_type_known_property() {
let tree = WeakDom::new(InstanceBuilder::new("UIListLayout").with_property(
"Padding",
Region3::new(Vector3::new(0.0, 0.0, 50.0), Vector3::new(0.0, 0.0, 50.0)),
));
let mut buffer = Vec::new();
let result = to_writer(&mut buffer, &tree, &[tree.root_ref()]);
assert!(result.is_err());
}
#[test]
fn unimplemented_type_unknown_property() {
let tree = WeakDom::new(InstanceBuilder::new("Folder").with_property(
"WILL_NEVER_EXIST",
Region3::new(Vector3::new(0.0, 0.0, 50.0), Vector3::new(0.0, 0.0, 50.0)),
));
let mut buffer = Vec::new();
let result = to_writer(&mut buffer, &tree, &[tree.root_ref()]);
assert!(result.is_err());
}
#[test]
fn unknown_id() {
let tree = WeakDom::new(InstanceBuilder::new("Folder"));
let mut buffer = Vec::new();
let result = to_writer(&mut buffer, &tree, &[Ref::new()]);
assert!(result.is_err());
}
#[test]
fn migrated_properties() {
let tree = WeakDom::new(InstanceBuilder::new("Folder").with_children([
InstanceBuilder::new("ScreenGui").with_property("ScreenInsets", Enum::from_u32(0)),
InstanceBuilder::new("ScreenGui").with_property("IgnoreGuiInset", true),
InstanceBuilder::new("Part").with_property("Color", Color3::new(1.0, 1.0, 1.0)),
InstanceBuilder::new("Part").with_property("BrickColor", BrickColor::Alder),
InstanceBuilder::new("Part").with_property("brickColor", BrickColor::Alder),
InstanceBuilder::new("TextLabel").with_property("FontFace", Font::default()),
InstanceBuilder::new("TextLabel").with_property("Font", Enum::from_u32(8)),
]));
let mut buffer = Vec::new();
to_writer(&mut buffer, &tree, &[tree.root_ref()]).expect("failed to encode model");
let decoded = DecodedModel::from_reader(buffer.as_slice());
insta::assert_yaml_snapshot!(decoded);
}
#[test]
fn logical_properties_basepart_size() {
let tree = WeakDom::new(
InstanceBuilder::new("Folder")
.with_child(
InstanceBuilder::new("Part").with_property("Size", Vector3::new(1.0, 2.0, 3.0)),
)
.with_child(
InstanceBuilder::new("Part").with_property("size", Vector3::new(4.0, 5.0, 6.0)),
)
.with_child(InstanceBuilder::new("Part")),
);
let mut buffer = Vec::new();
to_writer(&mut buffer, &tree, tree.root().children()).expect("failed to encode model");
let decoded = DecodedModel::from_reader(buffer.as_slice());
insta::assert_yaml_snapshot!(decoded);
}
#[test]
fn part_color() {
let tree = WeakDom::new(
InstanceBuilder::new("Folder")
.with_child(
InstanceBuilder::new("Part")
.with_property("Color3uint8", Color3::new(-0.25, 0.5, 1.2)),
)
.with_child(
InstanceBuilder::new("Part")
.with_property("Color3uint8", Color3uint8::new(25, 86, 254)),
)
.with_child(
InstanceBuilder::new("Part").with_property("Color", Color3::new(0.0, 0.5, 1.0)),
)
.with_child(
InstanceBuilder::new("Part").with_property("Color", Color3uint8::new(1, 30, 100)),
),
);
let mut buf = Vec::new();
let _ = to_writer(&mut buf, &tree, tree.root().children());
let decoded = DecodedModel::from_reader(buf.as_slice());
insta::assert_yaml_snapshot!(decoded);
}
#[test]
fn default_shared_string() {
let mut tree = WeakDom::new(InstanceBuilder::new("Folder"));
let ref_1 = tree.insert(
tree.root_ref(),
InstanceBuilder::new("Model").with_property(
"ModelMeshData",
SharedString::new(b"arbitrary string".to_vec()),
),
);
let ref_2 = tree.insert(tree.root_ref(), InstanceBuilder::new("Model"));
let mut buf = Vec::new();
let _ = to_writer(&mut buf, &tree, &[ref_1, ref_2]);
let decoded = DecodedModel::from_reader(buf.as_slice());
insta::assert_yaml_snapshot!(decoded);
}
#[test]
fn does_not_serialize() {
let default_vector3 = Vector3::new(0.0, 0.0, 0.0);
let default_cframe = CFrame::identity();
let root = InstanceBuilder::new("Folder").with_children([
InstanceBuilder::new("Motor6D").with_property("ChildName", String::new()),
InstanceBuilder::new("FaceControls").with_property("RightCheekRaiser", 0.0f32),
InstanceBuilder::new("Motor6D").with_property("ReplicateCurrentOffset6D", default_vector3),
InstanceBuilder::new("GuiService").with_property("MenuIsOpen", false),
InstanceBuilder::new("PVInstance").with_property("Origin", default_cframe),
InstanceBuilder::new("Stats").with_property("RenderCPUFrameTime", 0.0f32),
InstanceBuilder::new("VRService").with_property("VREnabled", false),
InstanceBuilder::new("TorsionSpringConstraint").with_property("CurrentAngle", 0.0f32),
InstanceBuilder::new("Lighting").with_property("ShadowColor", Color3::new(0.0, 0.0, 0.0)),
InstanceBuilder::new("BasePart").with_property("ExtentsCFrame", default_cframe),
]);
let tree = WeakDom::new(root);
let mut buf = Vec::new();
let _ = to_writer(&mut buf, &tree, tree.root().children());
let decoded = DecodedModel::from_reader(buf.as_slice());
insta::assert_yaml_snapshot!(decoded);
}