Skip to main content

tracexec_core/event/
id.rs

1use std::ops::{
2  Add,
3  Sub,
4};
5
6use nutype::nutype;
7
8#[nutype(derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash, Serialize))]
9pub struct EventId(u64);
10
11impl Add<u64> for EventId {
12  type Output = Self;
13
14  fn add(self, rhs: u64) -> Self::Output {
15    Self::new(self.into_inner() + rhs)
16  }
17}
18
19impl Sub<u64> for EventId {
20  type Output = Self;
21
22  fn sub(self, rhs: u64) -> Self::Output {
23    Self::new(self.into_inner().saturating_sub(rhs))
24  }
25}
26
27impl EventId {
28  pub fn zero() -> Self {
29    Self::new(0)
30  }
31}
32
33#[cfg(test)]
34mod tests {
35  use test_that::prelude::*;
36
37  use super::EventId;
38
39  #[test]
40  fn test_zero() {
41    let zero = EventId::zero();
42    assert_eq!(zero.into_inner(), 0);
43  }
44
45  #[test]
46  fn test_add() {
47    let id = EventId::new(10);
48    let new_id = id + 5;
49    assert_eq!(new_id.into_inner(), 15);
50
51    // Original should not change
52    assert_eq!(id.into_inner(), 10);
53  }
54
55  #[test]
56  fn test_sub() {
57    let id = EventId::new(10);
58    let new_id = id - 3;
59    assert_eq!(new_id.into_inner(), 7);
60
61    // Original should not change
62    assert_eq!(id.into_inner(), 10);
63  }
64
65  #[test]
66  fn test_sub_saturating() {
67    let id = EventId::new(5);
68    let new_id = id - 10; // Should saturate to 0
69    assert_eq!(new_id.into_inner(), 0);
70  }
71
72  #[test]
73  fn test_equality_and_ordering() {
74    let a = EventId::new(1);
75    let b = EventId::new(2);
76    assert_that!(a, lt(b));
77    assert_that!(b, gt(a));
78    assert_eq!(a, EventId::new(1));
79  }
80
81  #[test]
82  #[allow(clippy::clone_on_copy)]
83  fn test_clone_copy() {
84    let id = EventId::new(42);
85    let c1 = id;
86    let c2 = id.clone();
87    assert_eq!(c1, c2);
88  }
89}