Skip to main content

vapory_types/
uint.rs

1// Copyright 2020 Parity Technologies
2//
3// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
4// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
5// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
6// option. This file may not be copied, modified, or distributed
7// except according to those terms.
8
9#[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	/// Unsigned 64-bit integer.
21	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				// Invalid examples
62				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}