98 lines
2.6 KiB
Rust
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);
|
|
}
|