]> git.lizzy.rs Git - rust.git/blob - compiler/rustc_serialize/tests/leb128.rs
Rollup merge of #98174 - Kixunil:rename_ptr_as_mut_const_to_cast, r=scottmcm
[rust.git] / compiler / rustc_serialize / tests / leb128.rs
1 #![feature(maybe_uninit_slice)]
2 #![feature(maybe_uninit_uninit_array)]
3
4 use rustc_serialize::leb128::*;
5 use std::mem::MaybeUninit;
6
7 macro_rules! impl_test_unsigned_leb128 {
8     ($test_name:ident, $write_fn_name:ident, $read_fn_name:ident, $int_ty:ident) => {
9         #[test]
10         fn $test_name() {
11             // Test 256 evenly spaced values of integer range,
12             // integer max value, and some "random" numbers.
13             let mut values = Vec::new();
14
15             let increment = (1 as $int_ty) << ($int_ty::BITS - 8);
16             values.extend((0..256).map(|i| $int_ty::MIN + i * increment));
17
18             values.push($int_ty::MAX);
19
20             values.extend(
21                 (-500..500).map(|i| (i as $int_ty).wrapping_mul(0x12345789ABCDEFu64 as $int_ty)),
22             );
23
24             let mut stream = Vec::new();
25
26             for &x in &values {
27                 let mut buf = MaybeUninit::uninit_array();
28                 stream.extend($write_fn_name(&mut buf, x));
29             }
30
31             let mut position = 0;
32             for &expected in &values {
33                 let actual = $read_fn_name(&stream, &mut position);
34                 assert_eq!(expected, actual);
35             }
36             assert_eq!(stream.len(), position);
37         }
38     };
39 }
40
41 impl_test_unsigned_leb128!(test_u16_leb128, write_u16_leb128, read_u16_leb128, u16);
42 impl_test_unsigned_leb128!(test_u32_leb128, write_u32_leb128, read_u32_leb128, u32);
43 impl_test_unsigned_leb128!(test_u64_leb128, write_u64_leb128, read_u64_leb128, u64);
44 impl_test_unsigned_leb128!(test_u128_leb128, write_u128_leb128, read_u128_leb128, u128);
45 impl_test_unsigned_leb128!(test_usize_leb128, write_usize_leb128, read_usize_leb128, usize);
46
47 macro_rules! impl_test_signed_leb128 {
48     ($test_name:ident, $write_fn_name:ident, $read_fn_name:ident, $int_ty:ident) => {
49         #[test]
50         fn $test_name() {
51             // Test 256 evenly spaced values of integer range,
52             // integer max value, and some "random" numbers.
53             let mut values = Vec::new();
54
55             let mut value = $int_ty::MIN;
56             let increment = (1 as $int_ty) << ($int_ty::BITS - 8);
57
58             for _ in 0..256 {
59                 values.push(value);
60                 // The addition in the last loop iteration overflows.
61                 value = value.wrapping_add(increment);
62             }
63
64             values.push($int_ty::MAX);
65
66             values.extend(
67                 (-500..500).map(|i| (i as $int_ty).wrapping_mul(0x12345789ABCDEFi64 as $int_ty)),
68             );
69
70             let mut stream = Vec::new();
71
72             for &x in &values {
73                 let mut buf = MaybeUninit::uninit_array();
74                 stream.extend($write_fn_name(&mut buf, x));
75             }
76
77             let mut position = 0;
78             for &expected in &values {
79                 let actual = $read_fn_name(&stream, &mut position);
80                 assert_eq!(expected, actual);
81             }
82             assert_eq!(stream.len(), position);
83         }
84     };
85 }
86
87 impl_test_signed_leb128!(test_i16_leb128, write_i16_leb128, read_i16_leb128, i16);
88 impl_test_signed_leb128!(test_i32_leb128, write_i32_leb128, read_i32_leb128, i32);
89 impl_test_signed_leb128!(test_i64_leb128, write_i64_leb128, read_i64_leb128, i64);
90 impl_test_signed_leb128!(test_i128_leb128, write_i128_leb128, read_i128_leb128, i128);
91 impl_test_signed_leb128!(test_isize_leb128, write_isize_leb128, read_isize_leb128, isize);