mirror of
https://github.com/salsa-rs/salsa.git
synced 2025-07-07 13:25:17 +00:00

Some checks failed
Release-plz / Release-plz PR (push) Has been cancelled
Book / Book (push) Has been cancelled
Release-plz / Release-plz release (push) Has been cancelled
Test / Test (push) Has been cancelled
Test / Miri (push) Has been cancelled
Test / Shuttle (push) Has been cancelled
Test / Benchmarks (push) Has been cancelled
Book / Deploy (push) Has been cancelled
* `Update` derive field overwrite support * Allow overwriting tracked struct field update functions
61 lines
1.6 KiB
Rust
61 lines
1.6 KiB
Rust
//! Test that the `Update` derive works as expected
|
|
|
|
#[derive(salsa::Update)]
|
|
struct MyInput {
|
|
field: &'static str,
|
|
}
|
|
|
|
#[derive(salsa::Update)]
|
|
struct MyInput2 {
|
|
#[update(unsafe(with(custom_update)))]
|
|
field: &'static str,
|
|
#[update(unsafe(with(|dest, data| { *dest = data; true })))]
|
|
field2: &'static str,
|
|
}
|
|
|
|
unsafe fn custom_update(dest: *mut &'static str, _data: &'static str) -> bool {
|
|
unsafe { *dest = "ill-behaved for testing purposes" };
|
|
true
|
|
}
|
|
|
|
#[test]
|
|
fn derived() {
|
|
let mut m = MyInput { field: "foo" };
|
|
assert_eq!(m.field, "foo");
|
|
assert!(unsafe { salsa::Update::maybe_update(&mut m, MyInput { field: "bar" }) });
|
|
assert_eq!(m.field, "bar");
|
|
assert!(!unsafe { salsa::Update::maybe_update(&mut m, MyInput { field: "bar" }) });
|
|
assert_eq!(m.field, "bar");
|
|
}
|
|
|
|
#[test]
|
|
fn derived_with() {
|
|
let mut m = MyInput2 {
|
|
field: "foo",
|
|
field2: "foo",
|
|
};
|
|
assert_eq!(m.field, "foo");
|
|
assert_eq!(m.field2, "foo");
|
|
assert!(unsafe {
|
|
salsa::Update::maybe_update(
|
|
&mut m,
|
|
MyInput2 {
|
|
field: "bar",
|
|
field2: "bar",
|
|
},
|
|
)
|
|
});
|
|
assert_eq!(m.field, "ill-behaved for testing purposes");
|
|
assert_eq!(m.field2, "bar");
|
|
assert!(unsafe {
|
|
salsa::Update::maybe_update(
|
|
&mut m,
|
|
MyInput2 {
|
|
field: "ill-behaved for testing purposes",
|
|
field2: "foo",
|
|
},
|
|
)
|
|
});
|
|
assert_eq!(m.field, "ill-behaved for testing purposes");
|
|
assert_eq!(m.field2, "foo");
|
|
}
|