snarkvm_console_program/id/
to_bits.rs1use super::*;
17
18impl<N: Network> ToBits for ProgramID<N> {
19    fn write_bits_le(&self, vec: &mut Vec<bool>) {
21        (&self).write_bits_le(vec);
22    }
23
24    fn write_bits_be(&self, vec: &mut Vec<bool>) {
26        (&self).write_bits_be(vec);
27    }
28}
29
30impl<N: Network> ToBits for &ProgramID<N> {
31    fn write_bits_le(&self, vec: &mut Vec<bool>) {
33        self.name().write_bits_le(vec);
34        self.network().write_bits_le(vec);
35    }
36
37    fn write_bits_be(&self, vec: &mut Vec<bool>) {
39        self.name().write_bits_be(vec);
40        self.network().write_bits_be(vec);
41    }
42}
43
44#[cfg(test)]
45mod tests {
46    use super::*;
47    use crate::data::identifier::tests::sample_lowercase_identifier_as_string;
48    use snarkvm_console_network::MainnetV0;
49
50    type CurrentNetwork = MainnetV0;
51
52    const ITERATIONS: usize = 100;
53
54    #[test]
55    fn test_to_bits_le() -> Result<()> {
56        let mut rng = TestRng::default();
57
58        for _ in 0..ITERATIONS {
59            let expected_name_string = sample_lowercase_identifier_as_string::<CurrentNetwork>(&mut rng)?;
61            let expected_name_field = Field::<CurrentNetwork>::from_bits_le(&expected_name_string.to_bits_le())?;
63            let expected_network_field = Field::<CurrentNetwork>::from_bits_le(&"aleo".to_string().to_bits_le())?;
64            let mut expected_bits = expected_name_field.to_bits_le()[..expected_name_string.len() * 8].to_vec();
66            expected_bits.extend(&expected_network_field.to_bits_le()[..4 * 8]);
67
68            let candidate = ProgramID::<CurrentNetwork>::from_str(&format!("{expected_name_string}.aleo"))?;
69            assert_eq!(
70                expected_name_field.to_bits_le()[..expected_name_string.len() * 8],
71                candidate.name().to_bits_le()
72            );
73            assert_eq!(expected_network_field.to_bits_le()[..4 * 8], candidate.network().to_bits_le());
74            assert_eq!(expected_bits, candidate.to_bits_le());
75        }
76        Ok(())
77    }
78
79    #[test]
80    fn test_to_bits_be() -> Result<()> {
81        let mut rng = TestRng::default();
82
83        for _ in 0..ITERATIONS {
84            let expected_name_string = sample_lowercase_identifier_as_string::<CurrentNetwork>(&mut rng)?;
86            let expected_name_field = Field::<CurrentNetwork>::from_bits_le(&expected_name_string.to_bits_le())?;
88            let expected_network_field = Field::<CurrentNetwork>::from_bits_le(&"aleo".to_string().to_bits_le())?;
89            let mut expected_bits = expected_name_field.to_bits_le()[..expected_name_string.len() * 8]
91                .iter()
92                .rev()
93                .copied()
94                .collect::<Vec<_>>();
95            expected_bits.extend(expected_network_field.to_bits_le()[..4 * 8].iter().rev().copied());
96
97            let candidate = ProgramID::<CurrentNetwork>::from_str(&format!("{expected_name_string}.aleo"))?;
98            assert_eq!(
99                expected_name_field.to_bits_le()[..expected_name_string.len() * 8]
100                    .iter()
101                    .rev()
102                    .copied()
103                    .collect::<Vec<_>>(),
104                candidate.name().to_bits_be()
105            );
106            assert_eq!(
107                expected_network_field.to_bits_le()[..4 * 8].iter().rev().copied().collect::<Vec<_>>(),
108                candidate.network().to_bits_be()
109            );
110            assert_eq!(expected_bits, candidate.to_bits_be());
111        }
112        Ok(())
113    }
114}