1#[cfg(feature = "codec")]
10use tetsy_impl_codec::impl_uint_codec;
11#[cfg(feature = "tetsy-rlp")]
12use tetsy_impl_rlp::impl_uint_rlp;
13#[cfg(feature = "serialize")]
14use tetsy_impl_serde::impl_uint_serde;
15use uint_crate::*;
16
17pub use uint_crate::{FromDecStrErr, FromStrRadixErr, FromStrRadixErrKind};
18
19construct_uint! {
20 pub struct U64(1);
22}
23#[cfg(feature = "tetsy-rlp")]
24impl_uint_rlp!(U64, 1);
25#[cfg(feature = "serialize")]
26impl_uint_serde!(U64, 1);
27#[cfg(feature = "codec")]
28impl_uint_codec!(U64, 1);
29
30pub use tetsy_primitive_types::{U128, U256, U512};
31
32#[cfg(test)]
33mod tests {
34 use super::{U256, U512};
35 use serde_json as ser;
36 use std::u64::MAX;
37
38 macro_rules! test_serialize {
39 ($name: ident, $test_name: ident) => {
40 #[test]
41 fn $test_name() {
42 let tests = vec![
43 ($name::from(0), "0x0"),
44 ($name::from(1), "0x1"),
45 ($name::from(2), "0x2"),
46 ($name::from(10), "0xa"),
47 ($name::from(15), "0xf"),
48 ($name::from(15), "0xf"),
49 ($name::from(16), "0x10"),
50 ($name::from(1_000), "0x3e8"),
51 ($name::from(100_000), "0x186a0"),
52 ($name::from(u64::max_value()), "0xffffffffffffffff"),
53 ($name::from(u64::max_value()) + 1, "0x10000000000000000"),
54 ];
55
56 for (number, expected) in tests {
57 assert_eq!(format!("{:?}", expected), ser::to_string_pretty(&number).unwrap());
58 assert_eq!(number, ser::from_str(&format!("{:?}", expected)).unwrap());
59 }
60
61 assert!(ser::from_str::<$name>("\"0x\"").unwrap_err().is_data());
63 assert!(ser::from_str::<$name>("\"0xg\"").unwrap_err().is_data());
64 assert!(ser::from_str::<$name>("\"\"").unwrap_err().is_data());
65 assert!(ser::from_str::<$name>("\"10\"").unwrap_err().is_data());
66 assert!(ser::from_str::<$name>("\"0\"").unwrap_err().is_data());
67 }
68 };
69 }
70
71 test_serialize!(U256, test_u256);
72 test_serialize!(U512, test_u512);
73
74 #[test]
75 fn test_serialize_large_values() {
76 assert_eq!(
77 ser::to_string_pretty(&!U256::zero()).unwrap(),
78 "\"0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\""
79 );
80 assert!(ser::from_str::<U256>("\"0x1ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\"")
81 .unwrap_err()
82 .is_data());
83 }
84
85 #[test]
86 fn fixed_arrays_roundtrip() {
87 let raw: U256 = "7094875209347850239487502394881".into();
88 let array: [u8; 32] = raw.into();
89 let new_raw = array.into();
90
91 assert_eq!(raw, new_raw);
92 }
93
94 #[test]
95 fn u256_multi_full_mul() {
96 let result = U256([0, 0, 0, 0]).full_mul(U256([0, 0, 0, 0]));
97 assert_eq!(U512([0, 0, 0, 0, 0, 0, 0, 0]), result);
98
99 let result = U256([1, 0, 0, 0]).full_mul(U256([1, 0, 0, 0]));
100 assert_eq!(U512([1, 0, 0, 0, 0, 0, 0, 0]), result);
101
102 let result = U256([5, 0, 0, 0]).full_mul(U256([5, 0, 0, 0]));
103 assert_eq!(U512([25, 0, 0, 0, 0, 0, 0, 0]), result);
104
105 let result = U256([0, 5, 0, 0]).full_mul(U256([0, 5, 0, 0]));
106 assert_eq!(U512([0, 0, 25, 0, 0, 0, 0, 0]), result);
107
108 let result = U256([0, 0, 0, 4]).full_mul(U256([4, 0, 0, 0]));
109 assert_eq!(U512([0, 0, 0, 16, 0, 0, 0, 0]), result);
110
111 let result = U256([0, 0, 0, 5]).full_mul(U256([2, 0, 0, 0]));
112 assert_eq!(U512([0, 0, 0, 10, 0, 0, 0, 0]), result);
113
114 let result = U256([0, 0, 2, 0]).full_mul(U256([0, 5, 0, 0]));
115 assert_eq!(U512([0, 0, 0, 10, 0, 0, 0, 0]), result);
116
117 let result = U256([0, 3, 0, 0]).full_mul(U256([0, 0, 3, 0]));
118 assert_eq!(U512([0, 0, 0, 9, 0, 0, 0, 0]), result);
119
120 let result = U256([0, 0, 8, 0]).full_mul(U256([0, 0, 6, 0]));
121 assert_eq!(U512([0, 0, 0, 0, 48, 0, 0, 0]), result);
122
123 let result = U256([9, 0, 0, 0]).full_mul(U256([0, 3, 0, 0]));
124 assert_eq!(U512([0, 27, 0, 0, 0, 0, 0, 0]), result);
125
126 let result = U256([MAX, 0, 0, 0]).full_mul(U256([MAX, 0, 0, 0]));
127 assert_eq!(U512([1, MAX - 1, 0, 0, 0, 0, 0, 0]), result);
128
129 let result = U256([0, MAX, 0, 0]).full_mul(U256([MAX, 0, 0, 0]));
130 assert_eq!(U512([0, 1, MAX - 1, 0, 0, 0, 0, 0]), result);
131
132 let result = U256([MAX, MAX, 0, 0]).full_mul(U256([MAX, 0, 0, 0]));
133 assert_eq!(U512([1, MAX, MAX - 1, 0, 0, 0, 0, 0]), result);
134
135 let result = U256([MAX, 0, 0, 0]).full_mul(U256([MAX, MAX, 0, 0]));
136 assert_eq!(U512([1, MAX, MAX - 1, 0, 0, 0, 0, 0]), result);
137
138 let result = U256([MAX, MAX, 0, 0]).full_mul(U256([MAX, MAX, 0, 0]));
139 assert_eq!(U512([1, 0, MAX - 1, MAX, 0, 0, 0, 0]), result);
140
141 let result = U256([MAX, 0, 0, 0]).full_mul(U256([MAX, MAX, MAX, 0]));
142 assert_eq!(U512([1, MAX, MAX, MAX - 1, 0, 0, 0, 0]), result);
143
144 let result = U256([MAX, MAX, MAX, 0]).full_mul(U256([MAX, 0, 0, 0]));
145 assert_eq!(U512([1, MAX, MAX, MAX - 1, 0, 0, 0, 0]), result);
146
147 let result = U256([MAX, 0, 0, 0]).full_mul(U256([MAX, MAX, MAX, MAX]));
148 assert_eq!(U512([1, MAX, MAX, MAX, MAX - 1, 0, 0, 0]), result);
149
150 let result = U256([MAX, MAX, MAX, MAX]).full_mul(U256([MAX, 0, 0, 0]));
151 assert_eq!(U512([1, MAX, MAX, MAX, MAX - 1, 0, 0, 0]), result);
152
153 let result = U256([MAX, MAX, MAX, 0]).full_mul(U256([MAX, MAX, 0, 0]));
154 assert_eq!(U512([1, 0, MAX, MAX - 1, MAX, 0, 0, 0]), result);
155
156 let result = U256([MAX, MAX, 0, 0]).full_mul(U256([MAX, MAX, MAX, 0]));
157 assert_eq!(U512([1, 0, MAX, MAX - 1, MAX, 0, 0, 0]), result);
158
159 let result = U256([MAX, MAX, MAX, MAX]).full_mul(U256([MAX, MAX, 0, 0]));
160 assert_eq!(U512([1, 0, MAX, MAX, MAX - 1, MAX, 0, 0]), result);
161
162 let result = U256([MAX, MAX, 0, 0]).full_mul(U256([MAX, MAX, MAX, MAX]));
163 assert_eq!(U512([1, 0, MAX, MAX, MAX - 1, MAX, 0, 0]), result);
164
165 let result = U256([MAX, MAX, MAX, 0]).full_mul(U256([MAX, MAX, MAX, 0]));
166 assert_eq!(U512([1, 0, 0, MAX - 1, MAX, MAX, 0, 0]), result);
167
168 let result = U256([MAX, MAX, MAX, 0]).full_mul(U256([MAX, MAX, MAX, MAX]));
169 assert_eq!(U512([1, 0, 0, MAX, MAX - 1, MAX, MAX, 0]), result);
170
171 let result = U256([MAX, MAX, MAX, MAX]).full_mul(U256([MAX, MAX, MAX, 0]));
172 assert_eq!(U512([1, 0, 0, MAX, MAX - 1, MAX, MAX, 0]), result);
173
174 let result = U256([MAX, MAX, MAX, MAX]).full_mul(U256([MAX, MAX, MAX, MAX]));
175 assert_eq!(U512([1, 0, 0, 0, MAX - 1, MAX, MAX, MAX]), result);
176
177 let result = U256([0, 0, 0, MAX]).full_mul(U256([0, 0, 0, MAX]));
178 assert_eq!(U512([0, 0, 0, 0, 0, 0, 1, MAX - 1]), result);
179
180 let result = U256([1, 0, 0, 0]).full_mul(U256([0, 0, 0, MAX]));
181 assert_eq!(U512([0, 0, 0, MAX, 0, 0, 0, 0]), result);
182
183 let result = U256([1, 2, 3, 4]).full_mul(U256([5, 0, 0, 0]));
184 assert_eq!(U512([5, 10, 15, 20, 0, 0, 0, 0]), result);
185
186 let result = U256([1, 2, 3, 4]).full_mul(U256([0, 6, 0, 0]));
187 assert_eq!(U512([0, 6, 12, 18, 24, 0, 0, 0]), result);
188
189 let result = U256([1, 2, 3, 4]).full_mul(U256([0, 0, 7, 0]));
190 assert_eq!(U512([0, 0, 7, 14, 21, 28, 0, 0]), result);
191
192 let result = U256([1, 2, 3, 4]).full_mul(U256([0, 0, 0, 8]));
193 assert_eq!(U512([0, 0, 0, 8, 16, 24, 32, 0]), result);
194
195 let result = U256([1, 2, 3, 4]).full_mul(U256([5, 6, 7, 8]));
196 assert_eq!(U512([5, 16, 34, 60, 61, 52, 32, 0]), result);
197 }
198}