1#[cfg(feature = "codec")]
10use impl_codec::impl_uint_codec;
11#[cfg(feature = "rlp")]
12use impl_rlp::impl_uint_rlp;
13#[cfg(feature = "serialize")]
14use 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 = "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 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 let tests = vec![
62 ($name::from(0), "0"),
63 ($name::from(1), "1"),
64 ($name::from(2), "2"),
65 ($name::from(10), "a"),
66 ($name::from(15), "f"),
67 ($name::from(15), "f"),
68 ($name::from(16), "10"),
69 ($name::from(1_000), "3e8"),
70 ($name::from(100_000), "186a0"),
71 ($name::from(u64::max_value()), "ffffffffffffffff"),
72 ($name::from(u64::max_value()) + 1, "10000000000000000"),
73 ];
74
75 for (number, expected) in tests {
76 assert_eq!(format!("{:?}", "0x".to_string() + expected), ser::to_string_pretty(&number).unwrap());
77 assert_eq!(number, ser::from_str(&format!("{:?}", expected)).unwrap());
78 }
79
80 assert!(ser::from_str::<$name>("\"0x\"").unwrap_err().is_data());
82 assert!(ser::from_str::<$name>("\"0xg\"").unwrap_err().is_data());
83 assert!(ser::from_str::<$name>("\"\"").unwrap_err().is_data());
84 }
85 };
86 }
87
88 test_serialize!(U256, test_u256);
89 test_serialize!(U512, test_u512);
90
91 #[test]
92 fn test_serialize_large_values() {
93 assert_eq!(
94 ser::to_string_pretty(&!U256::zero()).unwrap(),
95 "\"0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\""
96 );
97 assert!(ser::from_str::<U256>("\"0x1ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\"")
98 .unwrap_err()
99 .is_data());
100 }
101
102 #[test]
103 fn fixed_arrays_roundtrip() {
104 let raw: U256 = "7094875209347850239487502394881".into();
105 let array: [u8; 32] = raw.into();
106 let new_raw = array.into();
107
108 assert_eq!(raw, new_raw);
109 }
110
111 #[test]
112 fn u256_multi_full_mul() {
113 let result = U256([0, 0, 0, 0]).full_mul(U256([0, 0, 0, 0]));
114 assert_eq!(U512([0, 0, 0, 0, 0, 0, 0, 0]), result);
115
116 let result = U256([1, 0, 0, 0]).full_mul(U256([1, 0, 0, 0]));
117 assert_eq!(U512([1, 0, 0, 0, 0, 0, 0, 0]), result);
118
119 let result = U256([5, 0, 0, 0]).full_mul(U256([5, 0, 0, 0]));
120 assert_eq!(U512([25, 0, 0, 0, 0, 0, 0, 0]), result);
121
122 let result = U256([0, 5, 0, 0]).full_mul(U256([0, 5, 0, 0]));
123 assert_eq!(U512([0, 0, 25, 0, 0, 0, 0, 0]), result);
124
125 let result = U256([0, 0, 0, 4]).full_mul(U256([4, 0, 0, 0]));
126 assert_eq!(U512([0, 0, 0, 16, 0, 0, 0, 0]), result);
127
128 let result = U256([0, 0, 0, 5]).full_mul(U256([2, 0, 0, 0]));
129 assert_eq!(U512([0, 0, 0, 10, 0, 0, 0, 0]), result);
130
131 let result = U256([0, 0, 2, 0]).full_mul(U256([0, 5, 0, 0]));
132 assert_eq!(U512([0, 0, 0, 10, 0, 0, 0, 0]), result);
133
134 let result = U256([0, 3, 0, 0]).full_mul(U256([0, 0, 3, 0]));
135 assert_eq!(U512([0, 0, 0, 9, 0, 0, 0, 0]), result);
136
137 let result = U256([0, 0, 8, 0]).full_mul(U256([0, 0, 6, 0]));
138 assert_eq!(U512([0, 0, 0, 0, 48, 0, 0, 0]), result);
139
140 let result = U256([9, 0, 0, 0]).full_mul(U256([0, 3, 0, 0]));
141 assert_eq!(U512([0, 27, 0, 0, 0, 0, 0, 0]), result);
142
143 let result = U256([MAX, 0, 0, 0]).full_mul(U256([MAX, 0, 0, 0]));
144 assert_eq!(U512([1, MAX - 1, 0, 0, 0, 0, 0, 0]), result);
145
146 let result = U256([0, MAX, 0, 0]).full_mul(U256([MAX, 0, 0, 0]));
147 assert_eq!(U512([0, 1, MAX - 1, 0, 0, 0, 0, 0]), result);
148
149 let result = U256([MAX, MAX, 0, 0]).full_mul(U256([MAX, 0, 0, 0]));
150 assert_eq!(U512([1, MAX, MAX - 1, 0, 0, 0, 0, 0]), result);
151
152 let result = U256([MAX, 0, 0, 0]).full_mul(U256([MAX, MAX, 0, 0]));
153 assert_eq!(U512([1, MAX, MAX - 1, 0, 0, 0, 0, 0]), result);
154
155 let result = U256([MAX, MAX, 0, 0]).full_mul(U256([MAX, MAX, 0, 0]));
156 assert_eq!(U512([1, 0, MAX - 1, MAX, 0, 0, 0, 0]), result);
157
158 let result = U256([MAX, 0, 0, 0]).full_mul(U256([MAX, MAX, MAX, 0]));
159 assert_eq!(U512([1, MAX, MAX, MAX - 1, 0, 0, 0, 0]), result);
160
161 let result = U256([MAX, MAX, MAX, 0]).full_mul(U256([MAX, 0, 0, 0]));
162 assert_eq!(U512([1, MAX, MAX, MAX - 1, 0, 0, 0, 0]), result);
163
164 let result = U256([MAX, 0, 0, 0]).full_mul(U256([MAX, MAX, MAX, MAX]));
165 assert_eq!(U512([1, MAX, MAX, MAX, MAX - 1, 0, 0, 0]), result);
166
167 let result = U256([MAX, MAX, MAX, MAX]).full_mul(U256([MAX, 0, 0, 0]));
168 assert_eq!(U512([1, MAX, MAX, MAX, MAX - 1, 0, 0, 0]), result);
169
170 let result = U256([MAX, MAX, MAX, 0]).full_mul(U256([MAX, MAX, 0, 0]));
171 assert_eq!(U512([1, 0, MAX, MAX - 1, MAX, 0, 0, 0]), result);
172
173 let result = U256([MAX, MAX, 0, 0]).full_mul(U256([MAX, MAX, MAX, 0]));
174 assert_eq!(U512([1, 0, MAX, MAX - 1, MAX, 0, 0, 0]), result);
175
176 let result = U256([MAX, MAX, MAX, MAX]).full_mul(U256([MAX, MAX, 0, 0]));
177 assert_eq!(U512([1, 0, MAX, MAX, MAX - 1, MAX, 0, 0]), result);
178
179 let result = U256([MAX, MAX, 0, 0]).full_mul(U256([MAX, MAX, MAX, MAX]));
180 assert_eq!(U512([1, 0, MAX, MAX, MAX - 1, MAX, 0, 0]), result);
181
182 let result = U256([MAX, MAX, MAX, 0]).full_mul(U256([MAX, MAX, MAX, 0]));
183 assert_eq!(U512([1, 0, 0, MAX - 1, MAX, MAX, 0, 0]), result);
184
185 let result = U256([MAX, MAX, MAX, 0]).full_mul(U256([MAX, MAX, MAX, MAX]));
186 assert_eq!(U512([1, 0, 0, MAX, MAX - 1, MAX, MAX, 0]), result);
187
188 let result = U256([MAX, MAX, MAX, MAX]).full_mul(U256([MAX, MAX, MAX, 0]));
189 assert_eq!(U512([1, 0, 0, MAX, MAX - 1, MAX, MAX, 0]), result);
190
191 let result = U256([MAX, MAX, MAX, MAX]).full_mul(U256([MAX, MAX, MAX, MAX]));
192 assert_eq!(U512([1, 0, 0, 0, MAX - 1, MAX, MAX, MAX]), result);
193
194 let result = U256([0, 0, 0, MAX]).full_mul(U256([0, 0, 0, MAX]));
195 assert_eq!(U512([0, 0, 0, 0, 0, 0, 1, MAX - 1]), result);
196
197 let result = U256([1, 0, 0, 0]).full_mul(U256([0, 0, 0, MAX]));
198 assert_eq!(U512([0, 0, 0, MAX, 0, 0, 0, 0]), result);
199
200 let result = U256([1, 2, 3, 4]).full_mul(U256([5, 0, 0, 0]));
201 assert_eq!(U512([5, 10, 15, 20, 0, 0, 0, 0]), result);
202
203 let result = U256([1, 2, 3, 4]).full_mul(U256([0, 6, 0, 0]));
204 assert_eq!(U512([0, 6, 12, 18, 24, 0, 0, 0]), result);
205
206 let result = U256([1, 2, 3, 4]).full_mul(U256([0, 0, 7, 0]));
207 assert_eq!(U512([0, 0, 7, 14, 21, 28, 0, 0]), result);
208
209 let result = U256([1, 2, 3, 4]).full_mul(U256([0, 0, 0, 8]));
210 assert_eq!(U512([0, 0, 0, 8, 16, 24, 32, 0]), result);
211
212 let result = U256([1, 2, 3, 4]).full_mul(U256([5, 6, 7, 8]));
213 assert_eq!(U512([5, 16, 34, 60, 61, 52, 32, 0]), result);
214 }
215}