Nothing to see here, move along meow
1use lancer_core::cap_table::*;
2use lancer_core::object_tag::ObjectTag;
3use lancer_core::types::*;
4use proptest::prelude::*;
5
6fn gen0() -> Generation {
7 Generation::new(0)
8}
9
10fn make_cap(tag: ObjectTag, id: u64, rights: Rights) -> CapRef {
11 CapRef::new(tag, ObjPhys::new(id), rights, gen0())
12}
13
14#[test]
15fn rights_contains_subset() {
16 let all = Rights::ALL;
17 assert!(all.contains(Rights::READ));
18 assert!(all.contains(Rights::WRITE));
19 assert!(all.contains(Rights::GRANT));
20 assert!(all.contains(Rights::REVOKE));
21 assert!(all.contains(Rights::READ | Rights::WRITE));
22}
23
24#[test]
25fn rights_not_contains_superset() {
26 let read_only = Rights::READ;
27 assert!(!read_only.contains(Rights::WRITE));
28 assert!(!read_only.contains(Rights::ALL));
29}
30
31#[test]
32fn rights_bitor_combines() {
33 let combined = Rights::READ | Rights::WRITE;
34 assert!(combined.contains(Rights::READ));
35 assert!(combined.contains(Rights::WRITE));
36 assert!(!combined.contains(Rights::GRANT));
37}
38
39#[test]
40fn rights_bitand_intersects() {
41 let a = Rights::READ | Rights::WRITE;
42 let b = Rights::WRITE | Rights::GRANT;
43 let intersection = a & b;
44 assert!(intersection.contains(Rights::WRITE));
45 assert!(!intersection.contains(Rights::READ));
46 assert!(!intersection.contains(Rights::GRANT));
47}
48
49#[test]
50fn rights_not_inverts() {
51 let r = Rights::READ;
52 let inverted = !r;
53 assert!(!inverted.contains(Rights::READ));
54 assert!(inverted.contains(Rights::WRITE));
55 assert!(inverted.contains(Rights::GRANT));
56 assert!(inverted.contains(Rights::REVOKE));
57}
58
59#[test]
60fn rights_from_bits_masks_to_all() {
61 let r = Rights::from_bits(0xFFFF);
62 assert_eq!(r.bits(), Rights::ALL.bits());
63}
64
65#[test]
66fn rights_none_contains_nothing() {
67 assert!(!Rights::NONE.contains(Rights::READ));
68 assert!(!Rights::NONE.contains(Rights::WRITE));
69 assert!(!Rights::NONE.contains(Rights::GRANT));
70 assert!(!Rights::NONE.contains(Rights::REVOKE));
71 assert!(Rights::NONE.contains(Rights::NONE));
72}
73
74proptest! {
75 #[test]
76 fn rights_bitor_commutative(a in 0u16..16, b in 0u16..16) {
77 let ra = Rights::from_bits(a);
78 let rb = Rights::from_bits(b);
79 prop_assert_eq!((ra | rb).bits(), (rb | ra).bits());
80 }
81}
82
83#[test]
84fn with_rights_attenuates() {
85 let cap = make_cap(ObjectTag::Endpoint, 0, Rights::ALL);
86 let attenuated = cap.with_rights(Rights::READ);
87 assert!(attenuated.rights().contains(Rights::READ));
88 assert!(!attenuated.rights().contains(Rights::WRITE));
89 assert_eq!(attenuated.tag(), ObjectTag::Endpoint);
90 assert_eq!(attenuated.phys(), cap.phys());
91}