dlt_parse/verbose/values/
array_bool.rs

1use crate::verbose::{ArrayDimensions, VariableInfoUnit};
2
3use arrayvec::{ArrayVec, CapacityError};
4#[cfg(feature = "serde")]
5use serde::ser::{Serialize, SerializeSeq, SerializeStruct, Serializer};
6
7#[cfg(feature = "serde")]
8use super::ArrayItDimension;
9
10#[derive(Debug, PartialEq, Clone)]
11pub struct ArrayBool<'a> {
12    pub dimensions: ArrayDimensions<'a>,
13    pub variable_info: Option<VariableInfoUnit<'a>>,
14    pub(crate) data: &'a [u8],
15}
16
17#[derive(Clone, Debug)]
18pub struct ArrayBoolIterator<'a> {
19    pub(crate) rest: &'a [u8],
20}
21
22#[cfg(feature = "serde")]
23impl<'a> Serialize for ArrayBool<'a> {
24    fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
25    where
26        S: Serializer,
27    {
28        let mut state = serializer.serialize_struct("ArrayBool", 3)?;
29        state.serialize_field("variable_info", &self.variable_info)?;
30
31        let iter = ArrayItDimension::<bool> {
32            is_big_endian: self.dimensions.is_big_endian,
33            dimensions: self.dimensions.dimensions,
34            data: self.data,
35            phantom: Default::default(),
36        };
37        state.serialize_field("data", &iter)?;
38        state.end()
39    }
40}
41
42#[cfg(feature = "serde")]
43impl<'a> Serialize for ArrayBoolIterator<'a> {
44    fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
45    where
46        S: Serializer,
47    {
48        let mut seq = serializer.serialize_seq(Some(self.rest.len()))?;
49        for e in self.clone() {
50            seq.serialize_element(&e)?;
51        }
52        seq.end()
53    }
54}
55
56impl<'a> ArrayBool<'a> {
57    pub fn data(&self) -> &'a [u8] {
58        self.data
59    }
60    pub fn iter(&'a self) -> ArrayBoolIterator<'a> {
61        ArrayBoolIterator { rest: self.data }
62    }
63    /// Adds the verbose value to the given dlt mesage buffer.
64    pub fn add_to_msg<const CAP: usize>(
65        &self,
66        buf: &mut ArrayVec<u8, CAP>,
67        is_big_endian: bool,
68    ) -> Result<(), CapacityError> {
69        if let Some(var_info) = &self.variable_info {
70            let type_info: [u8; 4] = [0b0001_0001, 0b0000_1001, 0b0000_0000, 0b0000_0000];
71            buf.try_extend_from_slice(&type_info)?;
72
73            let (name_len, unit_len, number_of_dimensions) = if is_big_endian {
74                (
75                    (var_info.name.len() as u16 + 1).to_be_bytes(),
76                    (var_info.unit.len() as u16 + 1).to_be_bytes(),
77                    (self.dimensions.dimensions.len() as u16 / 2).to_be_bytes(),
78                )
79            } else {
80                (
81                    (var_info.name.len() as u16 + 1).to_le_bytes(),
82                    (var_info.unit.len() as u16 + 1).to_le_bytes(),
83                    (self.dimensions.dimensions.len() as u16 / 2).to_le_bytes(),
84                )
85            };
86
87            buf.try_extend_from_slice(&number_of_dimensions)?;
88            buf.try_extend_from_slice(self.dimensions.dimensions)?;
89            buf.try_extend_from_slice(&[name_len[0], name_len[1], unit_len[0], unit_len[1]])?;
90            buf.try_extend_from_slice(var_info.name.as_bytes())?;
91            if buf.remaining_capacity() > var_info.unit.len() + 2 {
92                // Safe as capacity is checked earlier
93                unsafe { buf.push_unchecked(0) };
94                let _ = buf.try_extend_from_slice(var_info.unit.as_bytes());
95                unsafe { buf.push_unchecked(0) };
96                buf.try_extend_from_slice(self.data)?;
97                Ok(())
98            } else {
99                Err(CapacityError::new(()))
100            }
101        } else {
102            let number_of_dimensions = if is_big_endian {
103                (self.dimensions.dimensions.len() as u16 / 2).to_be_bytes()
104            } else {
105                (self.dimensions.dimensions.len() as u16 / 2).to_le_bytes()
106            };
107            let type_info: [u8; 4] = [0b0001_0001, 0b0000_0001, 0b0000_0000, 0b0000_0000];
108            buf.try_extend_from_slice(&type_info)?;
109            buf.try_extend_from_slice(&number_of_dimensions)?;
110            buf.try_extend_from_slice(self.dimensions.dimensions)?;
111            buf.try_extend_from_slice(self.data)?;
112
113            Ok(())
114        }
115    }
116}
117
118impl Iterator for ArrayBoolIterator<'_> {
119    type Item = bool;
120
121    #[inline]
122    fn next(&mut self) -> Option<Self::Item> {
123        if self.rest.is_empty() {
124            None
125        } else {
126            let result = unsafe {
127                // SAFETY: Safe as len at least 1.
128                0 != *self.rest.get_unchecked(0)
129            };
130            self.rest = unsafe {
131                // SAFETY: Safe as len at least 1.
132                core::slice::from_raw_parts(self.rest.as_ptr().add(1), self.rest.len() - 1)
133            };
134            Some(result)
135        }
136    }
137
138    #[inline]
139    fn size_hint(&self) -> (usize, Option<usize>) {
140        (self.rest.len(), Some(self.rest.len()))
141    }
142
143    #[inline]
144    fn count(self) -> usize {
145        self.rest.len()
146    }
147
148    #[inline]
149    fn last(self) -> Option<Self::Item> {
150        self.rest.last().map(|v| *v != 0)
151    }
152
153    #[inline]
154    fn nth(&mut self, n: usize) -> Option<Self::Item> {
155        if n < self.rest.len() {
156            let result = unsafe {
157                // SAFETY: Safe as len at least n + 1.
158                0 != *self.rest.get_unchecked(n)
159            };
160            self.rest = unsafe {
161                // SAFETY: Safe as len at least n + 1.
162                core::slice::from_raw_parts(self.rest.as_ptr().add(n + 1), self.rest.len() - n - 1)
163            };
164            Some(result)
165        } else {
166            self.rest = unsafe {
167                // SAFETY: Safe as reduced to len 0.
168                core::slice::from_raw_parts(self.rest.as_ptr().add(self.rest.len()), 0)
169            };
170            None
171        }
172    }
173}
174
175impl ExactSizeIterator for ArrayBoolIterator<'_> {
176    #[inline]
177    fn len(&self) -> usize {
178        self.rest.len()
179    }
180}
181
182impl<'a> IntoIterator for &'a ArrayBool<'a> {
183    type Item = bool;
184    type IntoIter = ArrayBoolIterator<'a>;
185
186    fn into_iter(self) -> Self::IntoIter {
187        self.iter()
188    }
189}
190
191#[cfg(test)]
192mod test {
193    use super::*;
194    #[cfg(feature = "serde")]
195    use crate::alloc::string::ToString;
196    use crate::error::UnexpectedEndOfSliceError;
197    use crate::error::VerboseDecodeError::UnexpectedEndOfSlice;
198    use crate::verbose::VerboseValue;
199    use crate::verbose::VerboseValue::ArrBool;
200    use alloc::vec::Vec;
201    use proptest::prelude::*;
202    use std::format;
203
204    proptest! {
205        #[test]
206        fn write_read(ref name in "\\pc{0,20}", ref unit in "\\pc{0,20}", dim_count in 0u16..5) {
207            const BUFFER_SIZE: usize = 400;
208
209            // test big endian with name
210            {
211            let mut msg_buff: ArrayVec<u8, BUFFER_SIZE> = ArrayVec::new();
212            let is_big_endian = true;
213
214            let variable_info = Some(VariableInfoUnit { name , unit });
215
216            let mut dimensions = Vec::with_capacity(dim_count as usize);
217            let mut content = Vec::with_capacity(dim_count as usize);
218
219            for i in 0..dim_count {
220                    dimensions.extend_from_slice(&(i+1).to_be_bytes());
221                for x in 0..=i {
222                    content.push(u8::from(x % 2 == 0));       // Sample booleans
223                }
224            }
225
226            let arr_dim = ArrayDimensions { is_big_endian, dimensions: &dimensions };
227
228            let arr_bool = ArrayBool {variable_info, dimensions: arr_dim, data: &content };
229            arr_bool.add_to_msg(&mut msg_buff, is_big_endian)?;
230
231            let len_name_be = (name.len() as u16 + 1).to_be_bytes();
232            let len_unit_be = (unit.len() as u16 + 1).to_be_bytes();
233
234            let mut content_buff = Vec::new();
235
236            content_buff.extend_from_slice(&[0b0001_0001, 0b0000_1001, 0b0000_0000, 0b0000_0000]);
237            content_buff.extend_from_slice(&dim_count.to_be_bytes());
238            content_buff.extend_from_slice(&dimensions);
239            content_buff.extend_from_slice(&[len_name_be[0], len_name_be[1], len_unit_be[0], len_unit_be[1]]);
240            content_buff.extend_from_slice(name.as_bytes());
241            content_buff.push(0);
242            content_buff.extend_from_slice(unit.as_bytes());
243            content_buff.push(0);
244            content_buff.extend_from_slice(&content);
245
246            prop_assert_eq!(&msg_buff[..], &content_buff[..]);
247
248            // Now wrap back
249            let parsed_back = VerboseValue::from_slice(&msg_buff, is_big_endian);
250            prop_assert_eq!(parsed_back, Ok((ArrBool(arr_bool),&[] as &[u8])));
251
252            }
253
254            // test little endian with name
255            {
256                let mut msg_buff: ArrayVec<u8, BUFFER_SIZE> = ArrayVec::new();
257                let is_big_endian = false;
258
259                let variable_info = Some(VariableInfoUnit { name , unit });
260
261                let mut dimensions = Vec::with_capacity(dim_count as usize);
262                let mut content = Vec::with_capacity(dim_count as usize);
263
264                for i in 0..dim_count {
265                    dimensions.extend_from_slice(&(i + 1).to_le_bytes());
266                    for x in 0..=i {
267                        content.push(u8::from(x % 2 == 0));       // Sample booleans
268                    }
269                }
270
271                let arr_dim = ArrayDimensions { is_big_endian, dimensions: &dimensions };
272
273                let arr_bool = ArrayBool {variable_info, dimensions: arr_dim, data: &content };
274                arr_bool.add_to_msg(&mut msg_buff, is_big_endian)?;
275
276                let len_name_le = (name.len() as u16 + 1).to_le_bytes();
277                let len_unit_le = (unit.len() as u16 + 1).to_le_bytes();
278
279                let mut content_buff = Vec::new();
280
281                content_buff.extend_from_slice(&[0b0001_0001, 0b0000_1001, 0b0000_0000, 0b0000_0000]);
282                content_buff.extend_from_slice(&dim_count.to_le_bytes());
283                content_buff.extend_from_slice(&dimensions);
284                content_buff.extend_from_slice(&[len_name_le[0], len_name_le[1], len_unit_le[0], len_unit_le[1]]);
285                content_buff.extend_from_slice(name.as_bytes());
286                content_buff.push(0);
287                content_buff.extend_from_slice(unit.as_bytes());
288                content_buff.push(0);
289                content_buff.extend_from_slice(&content);
290
291                prop_assert_eq!(&msg_buff[..], &content_buff[..]);
292
293                // Now wrap back
294                let parsed_back = VerboseValue::from_slice(&msg_buff, is_big_endian);
295                prop_assert_eq!(parsed_back, Ok((ArrBool(arr_bool),&[] as &[u8])));
296
297                }
298
299            // test big endian without name
300            {
301                let mut msg_buff: ArrayVec<u8, BUFFER_SIZE> = ArrayVec::new();
302                let is_big_endian = true;
303
304                let variable_info = None;
305
306                let mut dimensions = Vec::with_capacity(dim_count as usize);
307                let mut content = Vec::with_capacity(dim_count as usize);
308
309                for i in 0..dim_count {
310                    dimensions.extend_from_slice(&(i+1).to_be_bytes());
311                    for x in 0..=i {
312                        content.push(u8::from(x % 2 == 0));       // Sample booleans
313                    }
314                }
315
316                let arr_dim = ArrayDimensions { is_big_endian, dimensions: &dimensions };
317
318                let arr_bool = ArrayBool {variable_info, dimensions: arr_dim, data: &content };
319                arr_bool.add_to_msg(&mut msg_buff, is_big_endian)?;
320
321                let mut content_buff = Vec::new();
322
323                content_buff.extend_from_slice(&[0b0001_0001, 0b0000_0001, 0b0000_0000, 0b0000_0000]);
324                content_buff.extend_from_slice(&dim_count.to_be_bytes());
325                content_buff.extend_from_slice(&dimensions);
326                content_buff.extend_from_slice(&content);
327
328                prop_assert_eq!(&msg_buff[..], &content_buff[..]);
329
330                // Now wrap back
331                let parsed_back = VerboseValue::from_slice(&msg_buff, is_big_endian);
332                prop_assert_eq!(parsed_back, Ok((ArrBool(arr_bool),&[] as &[u8])));
333
334                }
335
336        // test little endian without name
337        {
338            let mut msg_buff: ArrayVec<u8, BUFFER_SIZE> = ArrayVec::new();
339            let is_big_endian = false;
340
341            let variable_info = None;
342
343            let mut dimensions = Vec::with_capacity(dim_count as usize);
344            let mut content = Vec::with_capacity(dim_count as usize);
345
346            for i in 0..dim_count {
347                    dimensions.extend_from_slice(&(i + 1).to_le_bytes());
348                for x in 0..=i {
349                    content.push(u8::from(x % 2 == 0));       // Sample booleans
350                }
351            }
352
353            let arr_dim = ArrayDimensions { is_big_endian, dimensions: &dimensions };
354
355            let arr_bool = ArrayBool {variable_info, dimensions: arr_dim, data: &content };
356            arr_bool.add_to_msg(&mut msg_buff, is_big_endian)?;
357
358            let mut content_buff = Vec::new();
359
360            content_buff.extend_from_slice(&[0b0001_0001, 0b0000_0001, 0b0000_0000, 0b0000_0000]);
361            content_buff.extend_from_slice(&dim_count.to_le_bytes());
362            content_buff.extend_from_slice(&dimensions);
363            content_buff.extend_from_slice(&content);
364
365            prop_assert_eq!(&msg_buff[..], &content_buff[..]);
366
367            // Now wrap back
368            let parsed_back = VerboseValue::from_slice(&msg_buff, is_big_endian);
369            prop_assert_eq!(parsed_back, Ok((ArrBool(arr_bool),&[] as &[u8])));
370
371            }
372
373            // Capacity error big endian with name
374            {
375                let dim_count = dim_count + 1;
376                let mut msg_buff: ArrayVec<u8, BUFFER_SIZE> = ArrayVec::new();
377                let is_big_endian = true;
378
379                let variable_info = Some(VariableInfoUnit { name , unit });
380
381                let mut dimensions = Vec::with_capacity(dim_count as usize);
382                let mut content = Vec::with_capacity(dim_count as usize);
383
384
385                for i in 0..dim_count {
386                    dimensions.extend_from_slice(&(i+1).to_be_bytes());
387                    for x in 0..i {
388                        content.push(u8::from(x % 2 == 0));       // Sample booleans
389                    }
390                }
391
392
393                let arr_dim = ArrayDimensions { is_big_endian, dimensions: &dimensions };
394
395                let arr_bool = ArrayBool {variable_info, dimensions: arr_dim, data: &content };
396                arr_bool.add_to_msg(&mut msg_buff, is_big_endian)?;
397
398                // Now wrap back
399                let parsed_back = VerboseValue::from_slice(&msg_buff, is_big_endian);
400                prop_assert_eq!(parsed_back, Err(UnexpectedEndOfSlice(UnexpectedEndOfSliceError { layer: crate::error::Layer::VerboseValue, minimum_size: msg_buff.len()+dim_count as usize, actual_size: msg_buff.len() })));
401
402            }
403
404            // Capacity error little endian with name
405            {
406                let dim_count = dim_count + 1;
407                let mut msg_buff: ArrayVec<u8, BUFFER_SIZE> = ArrayVec::new();
408                let is_big_endian = false;
409
410                let variable_info = Some(VariableInfoUnit { name , unit });
411
412                let mut dimensions = Vec::with_capacity(dim_count as usize);
413                let mut content = Vec::with_capacity(dim_count as usize);
414
415
416                for i in 0..dim_count {
417
418                    dimensions.extend_from_slice(&(i + 1).to_le_bytes());
419                    for x in 0..i {
420                        content.push(u8::from(x % 2 == 0));       // Sample booleans
421                    }
422                }
423
424
425                let arr_dim = ArrayDimensions { is_big_endian, dimensions: &dimensions };
426
427                let arr_bool = ArrayBool {variable_info, dimensions: arr_dim, data: &content };
428                arr_bool.add_to_msg(&mut msg_buff, is_big_endian)?;
429
430                // Now wrap back
431                let parsed_back = VerboseValue::from_slice(&msg_buff, is_big_endian);
432                prop_assert_eq!(parsed_back, Err(UnexpectedEndOfSlice(UnexpectedEndOfSliceError { layer: crate::error::Layer::VerboseValue, minimum_size: msg_buff.len()+dim_count as usize, actual_size: msg_buff.len() })));
433
434            }
435
436            // Capacity error big endian without name
437            {
438                let dim_count = dim_count + 1;
439                let mut msg_buff: ArrayVec<u8, BUFFER_SIZE> = ArrayVec::new();
440                let is_big_endian = true;
441
442                let variable_info = None;
443
444                let mut dimensions = Vec::with_capacity(dim_count as usize);
445                let mut content = Vec::with_capacity(dim_count as usize);
446
447
448                for i in 0..dim_count {
449                        dimensions.extend_from_slice(&(i+1).to_be_bytes());
450
451                    for x in 0..i {
452                        content.push(u8::from(x % 2 == 0));       // Sample booleans
453                    }
454                }
455
456
457                let arr_dim = ArrayDimensions { is_big_endian, dimensions: &dimensions };
458
459                let arr_bool = ArrayBool {variable_info, dimensions: arr_dim, data: &content };
460                arr_bool.add_to_msg(&mut msg_buff, is_big_endian)?;
461
462                // Now wrap back
463                let parsed_back = VerboseValue::from_slice(&msg_buff, is_big_endian);
464                prop_assert_eq!(parsed_back, Err(UnexpectedEndOfSlice(UnexpectedEndOfSliceError { layer: crate::error::Layer::VerboseValue, minimum_size: msg_buff.len()+dim_count as usize, actual_size: msg_buff.len() })));
465
466            }
467
468            // Capacity error little endian without name
469            {
470                let dim_count = dim_count + 1;
471                let mut msg_buff: ArrayVec<u8, BUFFER_SIZE> = ArrayVec::new();
472                let is_big_endian = false;
473
474                let variable_info = None;
475
476                let mut dimensions = Vec::with_capacity(dim_count as usize);
477                let mut content = Vec::with_capacity(dim_count as usize);
478
479
480                for i in 0..dim_count {
481
482                        dimensions.extend_from_slice(&(i + 1).to_le_bytes());
483
484                    for x in 0..i {
485                        content.push(u8::from(x % 2 == 0));       // Sample booleans
486                    }
487                }
488
489
490                let arr_dim = ArrayDimensions { is_big_endian, dimensions: &dimensions };
491
492                let arr_bool = ArrayBool {variable_info, dimensions: arr_dim, data: &content };
493                arr_bool.add_to_msg(&mut msg_buff, is_big_endian)?;
494
495                // Now wrap back
496                let parsed_back = VerboseValue::from_slice(&msg_buff, is_big_endian);
497                prop_assert_eq!(parsed_back, Err(UnexpectedEndOfSlice(UnexpectedEndOfSliceError { layer: crate::error::Layer::VerboseValue, minimum_size: msg_buff.len()+dim_count as usize, actual_size: msg_buff.len() })));
498
499            }
500
501
502             // capacity error big endian with name
503             {
504                let name = "Abc";
505                let unit = "Xyz";
506                const DIM_COUNT: u16 = 5;
507                const BUFFER_SIZE: usize = DIM_COUNT as usize * 2 + 14;
508                let mut msg_buff: ArrayVec<u8, BUFFER_SIZE> = ArrayVec::new();
509                let is_big_endian = true;
510
511                let variable_info = Some(VariableInfoUnit { name , unit });
512
513                let mut dimensions = Vec::with_capacity(DIM_COUNT as usize);
514                let mut content = Vec::with_capacity(DIM_COUNT as usize);
515
516                for i in 0..DIM_COUNT {
517                        dimensions.extend_from_slice(&(1 as u16).to_be_bytes());
518                        content.push(u8::from(i % 2 == 0));       // Sample booleans
519
520                }
521
522                let arr_dim = ArrayDimensions { is_big_endian, dimensions: &dimensions };
523
524                let arr_bool = ArrayBool {variable_info, dimensions: arr_dim, data: &content };
525                let err = arr_bool.add_to_msg(&mut msg_buff, is_big_endian);
526
527                prop_assert_eq!(err, Err(CapacityError::new(())));
528
529                }
530
531
532
533        }
534    }
535
536    proptest! {
537        #[test]
538        fn data(ref data in "\\pc{0,100}", ref dimensions in "\\pc{0,100}") {
539
540            let arr_dim = ArrayDimensions {dimensions: dimensions.as_bytes(), is_big_endian: true };
541            let arr_bool = ArrayBool { dimensions: arr_dim, variable_info: None, data: data.as_bytes()};
542            prop_assert_eq!(arr_bool.data(), data.as_bytes());
543        }
544    }
545
546    proptest! {
547        #[test]
548        fn iterator(dim_count in 0u16..5) {
549
550            let is_big_endian = true;
551            let variable_info = None;
552
553            let mut dimensions = Vec::with_capacity(dim_count as usize);
554            let mut content = Vec::with_capacity(dim_count as usize);
555
556            for i in 0..dim_count {
557                dimensions.extend_from_slice(&(i+1).to_be_bytes());
558                for x in 0..=i {
559                    content.push((x as u8) % 2);
560                }
561            }
562
563            let arr_dim = ArrayDimensions { is_big_endian, dimensions: &dimensions };
564            let arr = ArrayBool {variable_info, dimensions: arr_dim,data: &content };
565
566            // normal iteration
567            {
568                let mut cnt = 0;
569                for item in arr.iter() {
570                    prop_assert_eq!(item, content[cnt] != 0);
571                    cnt += 1;
572                }
573            }
574
575            // size_hint
576            assert_eq!(arr.into_iter().size_hint(), (content.len(), Some(content.len())));
577
578            // count
579            assert_eq!(arr.into_iter().count(), content.len());
580
581            // test last
582            assert_eq!(arr.into_iter().last(), content.last().map(|v| *v != 0));
583
584            // test nth
585            for i in 0..content.len() {
586                let mut it = arr.into_iter();
587                assert_eq!(it.nth(i), Some(content[i] != 0));
588                assert_eq!(it.rest.len(), content.len() - i - 1);
589            }
590            assert_eq!(arr.into_iter().nth(content.len()), None);
591
592            // test len
593            assert_eq!(arr.into_iter().len(), content.len());
594        }
595    }
596
597    #[cfg(feature = "serde")]
598    #[test]
599    fn serialization() {
600        // test dim_count 0
601        {
602            let dim_count: u16 = 0;
603            let is_big_endian = true;
604
605            let variable_info = None;
606
607            let mut dimensions = Vec::with_capacity(dim_count as usize);
608            let mut content = Vec::with_capacity(dim_count as usize);
609
610            let mut elems: u8 = 1;
611
612            for i in 0..dim_count {
613                dimensions.extend_from_slice(&(i + 1).to_be_bytes());
614                elems *= (i + 1) as u8;
615            }
616
617            for x in 0u8..elems as u8 {
618                content.push(x % 2);
619            }
620
621            let arr_dim = ArrayDimensions {
622                is_big_endian,
623                dimensions: &dimensions,
624            };
625            let arr_u8 = ArrayBool {
626                variable_info,
627                dimensions: arr_dim,
628                data: &content,
629            };
630
631            let mut cnt = 0;
632            for item in arr_u8.iter() {
633                assert_eq!(item, content[cnt] != 0);
634                cnt += 1;
635            }
636
637            let convert_content = "{\"variable_info\":null,\"data\":[]}".to_string();
638
639            assert_eq!(convert_content, serde_json::to_string(&arr_u8).unwrap());
640        }
641
642        // test dim_count 1
643        {
644            let dim_count: u16 = 1;
645            let is_big_endian = true;
646
647            let variable_info = None;
648
649            let mut dimensions = Vec::with_capacity(dim_count as usize);
650            let mut content = Vec::with_capacity(dim_count as usize);
651
652            let mut elems: u8 = 1;
653
654            for i in 0..dim_count {
655                dimensions.extend_from_slice(&(i + 1).to_be_bytes());
656                elems *= (i + 1) as u8;
657            }
658
659            for x in 0u8..elems as u8 {
660                content.push(x % 2);
661            }
662
663            let arr_dim = ArrayDimensions {
664                is_big_endian,
665                dimensions: &dimensions,
666            };
667            let arr_u8 = ArrayBool {
668                variable_info,
669                dimensions: arr_dim,
670                data: &content,
671            };
672
673            let mut cnt = 0;
674            for item in arr_u8.iter() {
675                assert_eq!(item, content[cnt] != 0);
676                cnt += 1;
677            }
678
679            let convert_content = "{\"variable_info\":null,\"data\":[false]}".to_string();
680
681            assert_eq!(convert_content, serde_json::to_string(&arr_u8).unwrap());
682        }
683
684        // test dim_count 2
685        {
686            let dim_count: u16 = 2;
687            let is_big_endian = true;
688
689            let variable_info = None;
690
691            let mut dimensions = Vec::with_capacity(dim_count as usize);
692            let mut content = Vec::with_capacity(dim_count as usize);
693            let mut elems: u8 = 1;
694
695            for i in 0..dim_count {
696                dimensions.extend_from_slice(&(i + 1).to_be_bytes());
697                elems *= (i + 1) as u8;
698            }
699
700            for x in 0u8..elems as u8 {
701                content.push(x % 2);
702            }
703
704            let arr_dim = ArrayDimensions {
705                is_big_endian,
706                dimensions: &dimensions,
707            };
708            let arr_u8 = ArrayBool {
709                variable_info,
710                dimensions: arr_dim,
711                data: &content,
712            };
713
714            let mut cnt = 0;
715            for item in arr_u8.iter() {
716                assert_eq!(item, content[cnt] != 0);
717                cnt += 1;
718            }
719
720            let convert_content = "{\"variable_info\":null,\"data\":[[false,true]]}".to_string();
721
722            assert_eq!(convert_content, serde_json::to_string(&arr_u8).unwrap());
723        }
724
725        // test dim_count 3
726        {
727            let dim_count: u16 = 3;
728            let is_big_endian = true;
729
730            let variable_info = None;
731
732            let mut dimensions = Vec::with_capacity(dim_count as usize);
733            let mut content = Vec::with_capacity(dim_count as usize);
734
735            let mut elems: u8 = 1;
736
737            for i in 0..dim_count {
738                dimensions.extend_from_slice(&(i + 1).to_be_bytes());
739                elems *= (i + 1) as u8;
740            }
741
742            for x in 0u8..elems as u8 {
743                content.push(x % 2);
744            }
745
746            let arr_dim = ArrayDimensions {
747                is_big_endian,
748                dimensions: &dimensions,
749            };
750            let arr_u8 = ArrayBool {
751                variable_info,
752                dimensions: arr_dim,
753                data: &content,
754            };
755
756            let mut cnt = 0;
757            for item in arr_u8.iter() {
758                assert_eq!(item, content[cnt] != 0);
759                cnt += 1;
760            }
761
762            let convert_content =
763                "{\"variable_info\":null,\"data\":[[[false,true,false],[true,false,true]]]}"
764                    .to_string();
765            assert_eq!(convert_content, serde_json::to_string(&arr_u8).unwrap());
766        }
767
768        // test dim_count 4
769        {
770            let dim_count: u16 = 4;
771            let is_big_endian = true;
772
773            let variable_info = None;
774
775            let mut dimensions = Vec::with_capacity(dim_count as usize);
776            let mut content = Vec::with_capacity(dim_count as usize);
777            let mut elems: u8 = 1;
778
779            for i in 0..dim_count {
780                dimensions.extend_from_slice(&(i + 1).to_be_bytes());
781                elems *= (i + 1) as u8;
782            }
783
784            for x in 0u8..elems as u8 {
785                content.push(x % 2);
786            }
787
788            let arr_dim = ArrayDimensions {
789                is_big_endian,
790                dimensions: &dimensions,
791            };
792            let arr_u8 = ArrayBool {
793                variable_info,
794                dimensions: arr_dim,
795                data: &content,
796            };
797
798            let mut cnt = 0;
799            for item in arr_u8.iter() {
800                assert_eq!(item, content[cnt] != 0);
801                cnt += 1;
802            }
803
804            let convert_content = "{\"variable_info\":null,\"data\":[[[[false,true,false,true],[false,true,false,true],[false,true,false,true]],[[false,true,false,true],[false,true,false,true],[false,true,false,true]]]]}".to_string();
805            assert_eq!(convert_content, serde_json::to_string(&arr_u8).unwrap());
806        }
807
808        // test dim_count 5
809        {
810            let dim_count: u16 = 5;
811            let is_big_endian = true;
812
813            let variable_info = None;
814
815            let mut dimensions = Vec::with_capacity(dim_count as usize);
816            let mut content = Vec::with_capacity(dim_count as usize);
817            let mut elems: u8 = 1;
818
819            for i in 0..dim_count {
820                dimensions.extend_from_slice(&(i + 1).to_be_bytes());
821                elems *= (i + 1) as u8;
822            }
823
824            for x in 0u8..elems as u8 {
825                content.push(x % 2);
826            }
827
828            let arr_dim = ArrayDimensions {
829                is_big_endian,
830                dimensions: &dimensions,
831            };
832            let arr_u8 = ArrayBool {
833                variable_info,
834                dimensions: arr_dim,
835                data: &content,
836            };
837
838            let mut cnt = 0;
839            for item in arr_u8.iter() {
840                assert_eq!(item, content[cnt] != 0);
841                cnt += 1;
842            }
843
844            let convert_content = "{\"variable_info\":null,\"data\":[[[[[false,true,false,true,false],[true,false,true,false,true],[false,true,false,true,false],[true,false,true,false,true]],[[false,true,false,true,false],[true,false,true,false,true],[false,true,false,true,false],[true,false,true,false,true]],[[false,true,false,true,false],[true,false,true,false,true],[false,true,false,true,false],[true,false,true,false,true]]],[[[false,true,false,true,false],[true,false,true,false,true],[false,true,false,true,false],[true,false,true,false,true]],[[false,true,false,true,false],[true,false,true,false,true],[false,true,false,true,false],[true,false,true,false,true]],[[false,true,false,true,false],[true,false,true,false,true],[false,true,false,true,false],[true,false,true,false,true]]]]]}".to_string();
845            assert_eq!(convert_content, serde_json::to_string(&arr_u8).unwrap());
846        }
847    }
848}