use std::collections::{HashMap, HashSet};
pub type CapabilityName = String;
pub type CapabilityHexUnitValue = i32;
pub type CapabilityDescriptor = HashMap<CapabilityName, CapabilityHexUnitValue>;
pub type CapilityHexValue = i32;
pub type CapabilityHexUnitSet = HashSet<CapabilityHexUnitValue>;
pub type CapabilityNameSet = HashSet<CapabilityName>;
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_capability_descriptor_creation() {
let mut descriptor = CapabilityDescriptor::new();
assert!(descriptor.is_empty());
descriptor.insert("Read".to_string(), 0x1);
descriptor.insert("Write".to_string(), 0x2);
assert_eq!(descriptor.len(), 2);
assert_eq!(descriptor.get("Read"), Some(&0x1));
assert_eq!(descriptor.get("Write"), Some(&0x2));
assert_eq!(descriptor.get("NonExistent"), None);
}
#[test]
fn test_capability_hex_unit_set_operations() {
let mut hex_set = CapabilityHexUnitSet::new();
assert!(hex_set.is_empty());
hex_set.insert(0x1);
hex_set.insert(0x2);
hex_set.insert(0x4);
assert_eq!(hex_set.len(), 3);
assert!(hex_set.contains(&0x1));
assert!(hex_set.contains(&0x2));
assert!(hex_set.contains(&0x4));
assert!(!hex_set.contains(&0x8));
hex_set.insert(0x1); assert_eq!(hex_set.len(), 3); }
#[test]
fn test_capability_name_set_operations() {
let mut name_set = CapabilityNameSet::new();
assert!(name_set.is_empty());
name_set.insert("Read".to_string());
name_set.insert("Write".to_string());
name_set.insert("Execute".to_string());
assert_eq!(name_set.len(), 3);
assert!(name_set.contains("Read"));
assert!(name_set.contains("Write"));
assert!(name_set.contains("Execute"));
assert!(!name_set.contains("Admin"));
name_set.insert("Read".to_string()); assert_eq!(name_set.len(), 3); }
#[test]
fn test_capability_name_type() {
let capability: CapabilityName = "Administrator".to_string();
assert_eq!(capability, "Administrator");
let capability2: CapabilityName = String::from("ManageServer");
assert_eq!(capability2, "ManageServer");
assert_eq!(capability.len(), 13);
assert!(capability.starts_with("Admin"));
}
#[test]
fn test_capability_hex_unit_value_type() {
let value: CapabilityHexUnitValue = 0x1;
assert_eq!(value, 1);
let value2: CapabilityHexUnitValue = 0x10;
assert_eq!(value2, 16);
let combined = value | value2;
assert_eq!(combined, 0x11);
let max_value: CapabilityHexUnitValue = i32::MAX;
assert_eq!(max_value, 2147483647);
}
#[test]
fn test_capability_hex_value_type() {
let value: CapilityHexValue = 0x7; assert_eq!(value, 7);
let read: CapabilityHexUnitValue = 0x1;
let write: CapabilityHexUnitValue = 0x2;
let execute: CapabilityHexUnitValue = 0x4;
let combined: CapilityHexValue = read | write | execute;
assert_eq!(combined, 0x7);
assert_eq!(combined, value);
}
#[test]
fn test_descriptor_with_power_of_two_values() {
let mut descriptor = CapabilityDescriptor::new();
descriptor.insert("Permission0".to_string(), 0x1); descriptor.insert("Permission1".to_string(), 0x2); descriptor.insert("Permission2".to_string(), 0x4); descriptor.insert("Permission3".to_string(), 0x8); descriptor.insert("Permission4".to_string(), 0x10);
assert_eq!(descriptor.len(), 5);
let values: Vec<&CapabilityHexUnitValue> = descriptor.values().collect();
let mut sorted_values = values.clone();
sorted_values.sort();
assert_eq!(sorted_values, vec![&0x1, &0x2, &0x4, &0x8, &0x10]);
}
#[test]
fn test_descriptor_with_overlapping_values() {
let mut descriptor = CapabilityDescriptor::new();
descriptor.insert("Permission1".to_string(), 0x3); descriptor.insert("Permission2".to_string(), 0x1); descriptor.insert("Permission3".to_string(), 0x2);
assert_eq!(descriptor.len(), 3);
assert_eq!(descriptor.get("Permission1"), Some(&0x3));
assert_eq!(descriptor.get("Permission2"), Some(&0x1));
assert_eq!(descriptor.get("Permission3"), Some(&0x2));
}
#[test]
fn test_sets_with_real_world_data() {
let mut name_set = CapabilityNameSet::new();
name_set.insert("SendMessage".to_string());
name_set.insert("ManageChannel".to_string());
name_set.insert("ManageServer".to_string());
name_set.insert("Administrator".to_string());
name_set.insert("CreateInvitation".to_string());
name_set.insert("BanMembers".to_string());
assert_eq!(name_set.len(), 6);
let mut hex_set = CapabilityHexUnitSet::new();
hex_set.insert(0x1); hex_set.insert(0x2); hex_set.insert(0x4); hex_set.insert(0x8); hex_set.insert(0x10); hex_set.insert(0x20);
assert_eq!(hex_set.len(), 6);
let all_permissions: CapilityHexValue = 0x1 | 0x2 | 0x4 | 0x8 | 0x10 | 0x20;
assert_eq!(all_permissions, 0x3F); }
#[test]
fn test_type_aliases_are_correct_types() {
let name: CapabilityName = String::new();
let _: String = name;
let unit_value: CapabilityHexUnitValue = 0;
let _: i32 = unit_value;
let hex_value: CapilityHexValue = 0;
let _: i32 = hex_value;
let descriptor: CapabilityDescriptor = HashMap::new();
let _: HashMap<String, i32> = descriptor;
let hex_set: CapabilityHexUnitSet = HashSet::new();
let _: HashSet<i32> = hex_set;
let name_set: CapabilityNameSet = HashSet::new();
let _: HashSet<String> = name_set; }
}