1 // This file is part of ICU4X. For terms of use, please see the file
2 // called LICENSE at the top level of the ICU4X source tree
3 // (online at: https://github.com/unicode-org/icu4x/blob/main/LICENSE ).
4
5 use std::fmt::Debug;
6 use ule::ULE;
7 use zerovec::*;
8
9 #[make_ule(StructULE)]
10 #[derive(Clone, Copy, Debug, PartialEq, Eq, PartialOrd, Ord)]
11 struct Struct {
12 a: u8,
13 b: u32,
14 c: Option<char>,
15 }
16
17 #[make_ule(HashedStructULE)]
18 #[derive(Clone, Copy, Debug, PartialEq, Eq, PartialOrd, Ord)]
19 #[zerovec::derive(Debug, Hash)]
20 struct HashedStruct {
21 a: u64,
22 b: i16,
23 c: Option<char>,
24 }
25
26 #[derive(Clone, Copy, Debug, PartialEq, Eq, PartialOrd, Ord)]
27 #[make_ule(TupleStructULE)]
28 struct TupleStruct(u8, char);
29
30 #[make_ule(EnumULE)]
31 #[repr(u8)]
32 #[derive(Copy, Clone, PartialEq, Eq, Ord, PartialOrd, Debug)]
33 #[zerovec::derive(Debug, Hash)]
34 enum Enum {
35 A = 0,
36 B = 1,
37 D = 2,
38 E = 3,
39 FooBar = 4,
40 F = 5,
41 }
42
43 #[make_ule(OutOfOrderMissingZeroEnumULE)]
44 #[repr(u8)]
45 #[derive(Copy, Clone, PartialEq, Eq, Ord, PartialOrd, Debug)]
46 #[allow(unused)]
47 enum OutOfOrderMissingZeroEnum {
48 E = 3,
49 B = 1,
50 FooBar = 4,
51 D = 2,
52 F = 5,
53 }
54
55 #[derive(Clone, Copy, Debug, PartialEq, Eq, Ord, PartialOrd)]
56 #[make_ule(NoKVULE)]
57 #[zerovec::skip_derive(ZeroMapKV)]
58 struct NoKV(u8, char);
59
60 #[derive(Clone, Copy, Debug, PartialEq, Eq)]
61 #[make_ule(NoOrdULE)]
62 #[zerovec::skip_derive(ZeroMapKV, Ord)]
63 struct NoOrd(u8, char);
64
test_zerovec<T: ule::AsULE + Debug + PartialEq>(slice: &[T])65 fn test_zerovec<T: ule::AsULE + Debug + PartialEq>(slice: &[T]) {
66 let zerovec: ZeroVec<T> = slice.iter().copied().collect();
67
68 assert_eq!(zerovec, slice);
69
70 let bytes = zerovec.as_bytes();
71 let name = std::any::type_name::<T>();
72 let reparsed: ZeroVec<T> =
73 ZeroVec::parse_bytes(bytes).unwrap_or_else(|_| panic!("Parsing {name} should succeed"));
74
75 assert_eq!(reparsed, slice);
76 }
77
main()78 fn main() {
79 test_zerovec(TEST_SLICE_STRUCT);
80 test_zerovec(TEST_SLICE_TUPLESTRUCT);
81 test_zerovec(TEST_SLICE_ENUM);
82
83 assert!(EnumULE::parse_bytes_to_slice(&[0]).is_ok());
84 assert!(EnumULE::parse_bytes_to_slice(&[1]).is_ok());
85 assert!(EnumULE::parse_bytes_to_slice(&[5]).is_ok());
86 assert!(EnumULE::parse_bytes_to_slice(&[6]).is_err());
87 assert!(OutOfOrderMissingZeroEnumULE::parse_bytes_to_slice(&[0]).is_err());
88 assert!(OutOfOrderMissingZeroEnumULE::parse_bytes_to_slice(&[1]).is_ok());
89 assert!(OutOfOrderMissingZeroEnumULE::parse_bytes_to_slice(&[5]).is_ok());
90 assert!(OutOfOrderMissingZeroEnumULE::parse_bytes_to_slice(&[6]).is_err());
91 }
92
93 const TEST_SLICE_STRUCT: &[Struct] = &[
94 Struct {
95 a: 101,
96 b: 924,
97 c: Some('⸘'),
98 },
99 Struct {
100 a: 217,
101 b: 4228,
102 c: Some('ə'),
103 },
104 Struct {
105 a: 117,
106 b: 9090,
107 c: Some('ø'),
108 },
109 ];
110
111 const TEST_SLICE_TUPLESTRUCT: &[TupleStruct] = &[
112 TupleStruct(101, 'ř'),
113 TupleStruct(76, '°'),
114 TupleStruct(15, 'a'),
115 ];
116
117 const TEST_SLICE_ENUM: &[Enum] = &[
118 Enum::A,
119 Enum::FooBar,
120 Enum::F,
121 Enum::D,
122 Enum::B,
123 Enum::FooBar,
124 Enum::E,
125 ];
126