#![warn(
missing_debug_implementations,
missing_docs,
rust_2018_idioms,
unreachable_pub,
clippy::cargo,
clippy::must_use_candidate,
clippy::cargo
)]
pub use tracker_macros::track;
#[cfg(test)]
mod test {
#[derive(Debug, PartialEq)]
enum NoCopy {
Do,
Not,
_Copy,
}
impl Default for NoCopy {
fn default() -> Self {
NoCopy::Do
}
}
#[crate::track]
struct TestDefaultParam<Config, Allocator = NoCopy>
where
Config: ?Sized + std::fmt::Debug,
{
_config: std::marker::PhantomData<Config>,
_allocator: std::marker::PhantomData<Allocator>,
}
const _TEST_WHERE: TestDefaultParam<[u8]> = TestDefaultParam {
_config: std::marker::PhantomData,
_allocator: std::marker::PhantomData,
tracker: 0,
};
#[crate::track]
struct Empty {}
#[crate::track]
#[derive(Default)]
struct Test {
x: u8,
y: u8,
_z: u8,
#[tracker::do_not_track]
a: u8,
b: u8,
#[tracker::no_eq]
c: u8,
_d: u8,
#[do_not_track]
_e: u8,
_o: Option<u128>,
#[no_eq]
no_copy: NoCopy,
}
#[crate::track]
struct Generic<T: std::fmt::Debug> {
#[no_eq]
test: T,
int: u8,
}
#[test]
fn remove_warnings() {
let _reset = Generic::<()>::reset;
let _reset = TestDefaultParam::<()>::reset;
let _changed = TestDefaultParam::<()>::changed;
}
#[test]
fn test_all() {
let mut empty = Empty { tracker: 1 };
assert!(empty.changed(Empty::track_all()));
assert!(empty.changed_any());
empty.reset();
let mut t = Test::default();
t.set_b(10);
assert_eq!(10, *t.get_b());
assert!(t.changed(8));
t.set_c(10);
assert!(t.changed(Test::c()));
assert!(t.changed_c());
t.reset();
t.set_b(10);
t.set_c(10);
assert!(!t.changed(Test::b()));
assert!(!t.changed_b());
assert!(t.changed(Test::c()));
assert!(t.changed_c());
assert!(t.changed(Test::track_all()));
assert!(t.changed_any());
t.reset();
t.update_no_copy(|no_copy| {
*no_copy = NoCopy::Not;
});
assert_eq!(*t.get_no_copy(), NoCopy::Not);
assert!(t.changed(Test::no_copy()));
assert!(t.changed_no_copy());
let _ = t.get_x();
assert!(!t.changed(Test::x()));
assert!(!t.changed_x());
let _ = t.get_mut_y();
assert!(t.changed(Test::y()));
assert!(t.changed_y());
t.reset();
t.a = 10;
assert!(!t.changed(Test::track_all()));
assert!(!t.changed_any());
let mut g = Generic {
test: 0u8,
int: 1,
tracker: 0,
};
g.set_test(1);
assert!(g.changed(Generic::<u8>::test()));
assert!(g.changed_test());
}
}