Skip to content

Commit fbdc177

Browse files
committed
Add new, dummy and Ord/PartialOrd to ChainPoint
1 parent 635ba54 commit fbdc177

File tree

1 file changed

+94
-0
lines changed

1 file changed

+94
-0
lines changed

mithril-common/src/entities/cardano_chain_point.rs

Lines changed: 94 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
use serde::{Deserialize, Serialize};
2+
use std::cmp::Ordering;
23
cfg_fs! {
34
use pallas_network::miniprotocols::{chainsync::Tip, Point};
45
}
@@ -26,10 +27,48 @@ pub struct ChainPoint {
2627
}
2728

2829
impl ChainPoint {
30+
/// [ChainPoint] factory
31+
pub fn new<T: Into<BlockHash>>(
32+
slot_number: SlotNumber,
33+
block_number: BlockNumber,
34+
block_hash: T,
35+
) -> ChainPoint {
36+
ChainPoint {
37+
slot_number,
38+
block_number,
39+
block_hash: block_hash.into(),
40+
}
41+
}
42+
2943
/// Check if origin chain point
3044
pub fn is_origin(&self) -> bool {
3145
self.slot_number == 0 && self.block_number == 0 && self.block_hash.is_empty()
3246
}
47+
48+
cfg_test_tools! {
49+
/// Create a dummy ChainPoint
50+
pub fn dummy() -> Self {
51+
Self {
52+
slot_number: 100,
53+
block_number: 50,
54+
block_hash: "block_hash-50".to_string(),
55+
}
56+
}
57+
}
58+
}
59+
60+
impl PartialOrd for ChainPoint {
61+
fn partial_cmp(&self, other: &Self) -> Option<Ordering> {
62+
Some(self.cmp(other))
63+
}
64+
}
65+
66+
impl Ord for ChainPoint {
67+
fn cmp(&self, other: &Self) -> Ordering {
68+
self.block_number
69+
.cmp(&other.block_number)
70+
.then(self.slot_number.cmp(&other.slot_number))
71+
}
3372
}
3473

3574
cfg_fs! {
@@ -81,3 +120,58 @@ cfg_fs! {
81120
}
82121
}
83122
}
123+
124+
#[cfg(test)]
125+
mod tests {
126+
use std::cmp::Ordering;
127+
128+
use super::*;
129+
130+
#[test]
131+
fn chain_point_ord_cmp_block_number_take_precedence_over_other_fields() {
132+
let chain_point1 = ChainPoint {
133+
slot_number: 15,
134+
block_number: 10,
135+
block_hash: "hash2".to_string(),
136+
};
137+
let chain_point2 = ChainPoint {
138+
slot_number: 5,
139+
block_number: 20,
140+
block_hash: "hash1".to_string(),
141+
};
142+
143+
assert_eq!(Ordering::Less, chain_point1.cmp(&chain_point2));
144+
}
145+
146+
#[test]
147+
fn chain_point_ord_cmp_if_block_number_equals_then_compare_slot_numbers() {
148+
let chain_point1 = ChainPoint {
149+
slot_number: 15,
150+
block_number: 0,
151+
block_hash: "hash2".to_string(),
152+
};
153+
let chain_point2 = ChainPoint {
154+
slot_number: 5,
155+
block_number: 0,
156+
block_hash: "hash1".to_string(),
157+
};
158+
159+
assert_eq!(Ordering::Greater, chain_point1.cmp(&chain_point2));
160+
}
161+
162+
#[test]
163+
fn chain_point_ord_cmp_block_hash_doesnt_matter() {
164+
let chain_point1 = ChainPoint {
165+
slot_number: 5,
166+
block_number: 10,
167+
block_hash: "hash1".to_string(),
168+
};
169+
let chain_point2 = ChainPoint {
170+
slot_number: 5,
171+
block_number: 10,
172+
block_hash: "hash2".to_string(),
173+
};
174+
175+
assert_eq!(Ordering::Equal, chain_point1.cmp(&chain_point2));
176+
}
177+
}

0 commit comments

Comments
 (0)