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 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 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 0 != *self.rest.get_unchecked(0)
129 };
130 self.rest = unsafe {
131 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 0 != *self.rest.get_unchecked(n)
159 };
160 self.rest = unsafe {
161 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 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 {
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)); }
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 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 {
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)); }
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 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 {
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)); }
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 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 {
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)); }
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 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 {
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)); }
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 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 {
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)); }
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 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 {
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)); }
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 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 {
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)); }
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 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 {
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)); }
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 {
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 assert_eq!(arr.into_iter().size_hint(), (content.len(), Some(content.len())));
577
578 assert_eq!(arr.into_iter().count(), content.len());
580
581 assert_eq!(arr.into_iter().last(), content.last().map(|v| *v != 0));
583
584 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 assert_eq!(arr.into_iter().len(), content.len());
594 }
595 }
596
597 #[cfg(feature = "serde")]
598 #[test]
599 fn serialization() {
600 {
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 {
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 {
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 {
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 {
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 {
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}