makepad/platform/script/tests/reload_defaults.rs
2026-03-11 10:19:58 +01:00

98 lines
2.6 KiB
Rust

use makepad_script::*;
#[derive(Clone, Copy, Debug, PartialEq, Script, ScriptHook)]
enum ReloadEnumTest {
#[pick]
Fill,
Fixed,
}
#[derive(Debug, Script, ScriptHook)]
struct ReloadEnumHolderTest {
#[live]
value: ReloadEnumTest,
}
#[derive(Debug, Script, ScriptHook)]
struct ReloadObjectInnerTest {
#[live(1.0)]
value: f64,
#[rust(7u32)]
rust_value: u32,
}
#[derive(Debug, Script, ScriptHook)]
struct ReloadObjectOuterTest {
#[live]
inner: ReloadObjectInnerTest,
}
fn test_vm() -> ScriptVm<'static> {
let host = Box::leak(Box::new(0i32));
let std = Box::leak(Box::new(0i32));
ScriptVm {
host,
std,
bx: Box::new(ScriptVmBase::new()),
}
}
#[test]
fn reload_missing_live_field_without_type_default_keeps_existing_value() {
let vm = &mut test_vm();
let holder_api = ReloadEnumHolderTest::script_api(vm);
let holder_value = vm.bx.heap.new_with_proto(holder_api);
let mut holder = ReloadEnumHolderTest {
value: ReloadEnumTest::Fixed,
};
holder.script_apply(vm, &Apply::Reload, &mut Scope::empty(), holder_value.into());
assert_eq!(holder.value, ReloadEnumTest::Fixed);
}
#[test]
fn reload_missing_enum_field_with_type_default_uses_pick_variant() {
let vm = &mut test_vm();
let enum_api = ReloadEnumTest::script_api(vm);
let enum_default = vm.bx.heap.new_with_proto(enum_api);
assert!(vm.bx.heap.set_type_default(enum_default));
let holder_api = ReloadEnumHolderTest::script_api(vm);
let holder_value = vm.bx.heap.new_with_proto(holder_api);
let mut holder = ReloadEnumHolderTest {
value: ReloadEnumTest::Fixed,
};
holder.script_apply(vm, &Apply::Reload, &mut Scope::empty(), holder_value.into());
assert_eq!(holder.value, ReloadEnumTest::Fill);
}
#[test]
fn reload_missing_object_field_with_type_default_refreshes_from_type_default() {
let vm = &mut test_vm();
let inner_api = ReloadObjectInnerTest::script_api(vm);
let inner_default = vm.bx.heap.new_with_proto(inner_api);
vm.bx.heap.set_value(
inner_default,
id!(value).into(),
42.0.into(),
vm.bx.threads.cur().trap.pass(),
);
assert!(vm.bx.heap.set_type_default(inner_default));
let outer_api = ReloadObjectOuterTest::script_api(vm);
let outer_value = vm.bx.heap.new_with_proto(outer_api);
let mut outer = ReloadObjectOuterTest {
inner: ReloadObjectInnerTest {
value: 1.0,
rust_value: 99,
},
};
outer.script_apply(vm, &Apply::Reload, &mut Scope::empty(), outer_value.into());
assert_eq!(outer.inner.value, 42.0);
assert_eq!(outer.inner.rust_value, 99);
}