canic_testkit/
lib.rs

1use canic::types::{Account, Principal, Ulid};
2
3pub mod pic;
4
5pub struct Fake;
6
7impl Fake {
8    #[must_use]
9    pub fn account(seed: u32) -> Account {
10        let mut sub = [0u8; 32];
11        let bytes = seed.to_be_bytes();
12        sub[..4].copy_from_slice(&bytes);
13
14        Account {
15            owner: Self::principal(seed),
16            subaccount: Some(sub),
17        }
18    }
19
20    #[must_use]
21    pub fn principal(seed: u32) -> Principal {
22        let mut buf = [0u8; 29];
23        buf[..4].copy_from_slice(&seed.to_be_bytes());
24
25        Principal::from_slice(&buf)
26    }
27
28    #[must_use]
29    pub fn ulid(seed: u32) -> Ulid {
30        let mut buf = [0u8; 16];
31        buf[..4].copy_from_slice(&seed.to_be_bytes());
32
33        Ulid::from_bytes(buf)
34    }
35}
36
37///
38/// TESTS
39///
40
41#[cfg(test)]
42mod tests {
43    use super::*;
44
45    #[test]
46    fn fake_account_is_deterministic_and_unique() {
47        let a1 = Fake::account(42);
48        let a2 = Fake::account(42);
49        let b = Fake::account(99);
50
51        // Deterministic: same seed => same account
52        assert_eq!(a1, a2, "Fake::account should be deterministic");
53
54        // Unique: different seeds => different account
55        assert_ne!(a1, b, "Fake::account should vary by seed");
56    }
57
58    #[test]
59    fn fake_principal_is_deterministic_and_unique() {
60        let p1 = Fake::principal(7);
61        let p2 = Fake::principal(7);
62        let q = Fake::principal(8);
63
64        assert_eq!(p1, p2, "Fake::principal should be deterministic");
65        assert_ne!(p1, q, "Fake::principal should differ for different seeds");
66
67        let bytes = p1.as_slice();
68        assert_eq!(bytes.len(), 29, "Principal must be 29 bytes");
69    }
70
71    #[test]
72    fn fake_ulid_is_deterministic_and_unique() {
73        let u1 = Fake::ulid(1234);
74        let u2 = Fake::ulid(1234);
75        let v = Fake::ulid(5678);
76
77        assert_eq!(u1, u2, "Fake::ulid should be deterministic");
78        assert_ne!(u1, v, "Fake::ulid should differ for different seeds");
79
80        let bytes = u1.to_bytes();
81        assert_eq!(bytes.len(), 16, "ULID must be 16 bytes");
82    }
83}