1#![no_std]
2#![doc = "Core identifiers and validation primitives for BCX."]
3
4#[cfg(test)]
5extern crate std;
6
7mod error;
8mod ids;
9
10pub use error::ValidationError;
11pub use ids::{CapabilityRef, Digest, EventId, Nonce, OperationSequence, PolicyEpoch};
12
13#[cfg(test)]
14mod tests {
15 use super::*;
16 use std::format;
17
18 #[test]
19 fn zero_digest_is_detected() {
20 let digest = Digest::new([0; Digest::LEN]);
21 assert!(digest.is_zero());
22 }
23
24 #[test]
25 fn digest_constant_shape_equality_matches_structural_equality() {
26 let left = Digest::new([7; Digest::LEN]);
27 let same = Digest::new([7; Digest::LEN]);
28 let different = Digest::new([8; Digest::LEN]);
29
30 assert!(left.ct_eq(&same));
31 assert!(!left.ct_eq(&different));
32 }
33
34 #[test]
35 fn nonce_debug_is_redacted() {
36 let nonce = Nonce::new([3; Nonce::LEN]);
37
38 assert_eq!(format!("{nonce:?}"), "Nonce(..)");
39 }
40
41 #[test]
42 fn operation_sequence_rejects_zero() {
43 assert_eq!(OperationSequence::new(0), Err(ValidationError::ZeroValue));
44 assert_eq!(OperationSequence::new(7).map(OperationSequence::get), Ok(7));
45 }
46}