serde_assert/
token.rs

1//! Tokens representing a serialized object.
2//!
3//! This module provides a [`Token`] type for representing a serialized value, as well as a
4//! [`Tokens`] type containing a set of `Token`s. `Tokens` are returned by a [`Serializer`] and can
5//! be compared against a sequence of `Token`s to verify equality, which is useful for asserting
6//! whether serialized `Tokens` are as expected.
7//!
8//! [`Serializer`]: crate::Serializer
9
10use alloc::{
11    boxed::Box,
12    slice,
13    string::String,
14    vec,
15    vec::Vec,
16};
17use core::{
18    fmt,
19    fmt::Debug,
20    marker::PhantomData,
21    mem::ManuallyDrop,
22    ptr::NonNull,
23};
24use serde::de::Unexpected;
25
26/// A single serialized value.
27///
28/// A `Token` is a single serialization output produced by the [`Serializer`]. The one exception to
29/// this is the [`Unordered`] variant, which contains multiple sets of tokens that can be in any
30/// order. This is never produced by the `Serializer`, and is for use when comparing equality of
31/// sequences of [`Token`]s.
32///
33/// Normally, a sequence of `Token`s are used to either compare against the output of a
34/// [`Serializer`] or to be used as input to a [`Deserializer`].
35///
36/// [`Deserializer`]: crate::Deserializer
37/// [`Serializer`]: crate::Serializer
38/// [`Unordered`]: Token::Unordered
39#[derive(Clone, Debug)]
40pub enum Token {
41    /// A [`bool`].
42    ///
43    /// # Example
44    /// ``` rust
45    /// use claims::assert_ok_eq;
46    /// use serde::Serialize;
47    /// use serde_assert::{
48    ///     Serializer,
49    ///     Token,
50    /// };
51    ///
52    /// let serializer = Serializer::builder().build();
53    ///
54    /// assert_ok_eq!(true.serialize(&serializer), [Token::Bool(true)]);
55    /// ```
56    Bool(bool),
57
58    /// An [`i8`].
59    ///
60    /// # Example
61    /// ``` rust
62    /// use claims::assert_ok_eq;
63    /// use serde::Serialize;
64    /// use serde_assert::{
65    ///     Serializer,
66    ///     Token,
67    /// };
68    ///
69    /// let serializer = Serializer::builder().build();
70    ///
71    /// assert_ok_eq!(42i8.serialize(&serializer), [Token::I8(42)]);
72    /// ```
73    I8(i8),
74
75    /// An [`i16`].
76    ///
77    /// # Example
78    /// ``` rust
79    /// use claims::assert_ok_eq;
80    /// use serde::Serialize;
81    /// use serde_assert::{
82    ///     Serializer,
83    ///     Token,
84    /// };
85    ///
86    /// let serializer = Serializer::builder().build();
87    ///
88    /// assert_ok_eq!(42i16.serialize(&serializer), [Token::I16(42)]);
89    /// ```
90    I16(i16),
91
92    /// An [`i32`].
93    ///
94    /// # Example
95    /// ``` rust
96    /// use claims::assert_ok_eq;
97    /// use serde::Serialize;
98    /// use serde_assert::{
99    ///     Serializer,
100    ///     Token,
101    /// };
102    ///
103    /// let serializer = Serializer::builder().build();
104    ///
105    /// assert_ok_eq!(42i32.serialize(&serializer), [Token::I32(42)]);
106    /// ```
107    I32(i32),
108
109    /// An [`i64`].
110    ///
111    /// # Example
112    /// ``` rust
113    /// use claims::assert_ok_eq;
114    /// use serde::Serialize;
115    /// use serde_assert::{
116    ///     Serializer,
117    ///     Token,
118    /// };
119    ///
120    /// let serializer = Serializer::builder().build();
121    ///
122    /// assert_ok_eq!(42i64.serialize(&serializer), [Token::I64(42)]);
123    /// ```
124    I64(i64),
125
126    /// An [`i128`].
127    ///
128    /// # Example
129    /// ``` rust
130    /// use claims::assert_ok_eq;
131    /// use serde::Serialize;
132    /// use serde_assert::{
133    ///     Serializer,
134    ///     Token,
135    /// };
136    ///
137    /// let serializer = Serializer::builder().build();
138    ///
139    /// assert_ok_eq!(42i128.serialize(&serializer), [Token::I128(42)]);
140    /// ```
141    I128(i128),
142
143    /// A [`u8`].
144    ///
145    /// # Example
146    /// ``` rust
147    /// use claims::assert_ok_eq;
148    /// use serde::Serialize;
149    /// use serde_assert::{
150    ///     Serializer,
151    ///     Token,
152    /// };
153    ///
154    /// let serializer = Serializer::builder().build();
155    ///
156    /// assert_ok_eq!(42u8.serialize(&serializer), [Token::U8(42)]);
157    /// ```
158    U8(u8),
159
160    /// A [`u16`].
161    ///
162    /// # Example
163    /// ``` rust
164    /// use claims::assert_ok_eq;
165    /// use serde::Serialize;
166    /// use serde_assert::{
167    ///     Serializer,
168    ///     Token,
169    /// };
170    ///
171    /// let serializer = Serializer::builder().build();
172    ///
173    /// assert_ok_eq!(42u16.serialize(&serializer), [Token::U16(42)]);
174    /// ```
175    U16(u16),
176
177    /// A [`u32`].
178    ///
179    /// # Example
180    /// ``` rust
181    /// use claims::assert_ok_eq;
182    /// use serde::Serialize;
183    /// use serde_assert::{
184    ///     Serializer,
185    ///     Token,
186    /// };
187    ///
188    /// let serializer = Serializer::builder().build();
189    ///
190    /// assert_ok_eq!(42u32.serialize(&serializer), [Token::U32(42)]);
191    /// ```
192    U32(u32),
193
194    /// A [`u64`].
195    ///
196    /// # Example
197    /// ``` rust
198    /// use claims::assert_ok_eq;
199    /// use serde::Serialize;
200    /// use serde_assert::{
201    ///     Serializer,
202    ///     Token,
203    /// };
204    ///
205    /// let serializer = Serializer::builder().build();
206    ///
207    /// assert_ok_eq!(42u64.serialize(&serializer), [Token::U64(42)]);
208    /// ```
209    U64(u64),
210
211    /// A [`u128`].
212    ///
213    /// # Example
214    /// ``` rust
215    /// use claims::assert_ok_eq;
216    /// use serde::Serialize;
217    /// use serde_assert::{
218    ///     Serializer,
219    ///     Token,
220    /// };
221    ///
222    /// let serializer = Serializer::builder().build();
223    ///
224    /// assert_ok_eq!(42u128.serialize(&serializer), [Token::U128(42)]);
225    /// ```
226    U128(u128),
227
228    /// A [`f32`].
229    ///
230    /// # Example
231    /// ``` rust
232    /// use claims::assert_ok_eq;
233    /// use serde::Serialize;
234    /// use serde_assert::{
235    ///     Serializer,
236    ///     Token,
237    /// };
238    ///
239    /// let serializer = Serializer::builder().build();
240    ///
241    /// assert_ok_eq!(42.0f32.serialize(&serializer), [Token::F32(42.0)]);
242    /// ```
243    F32(f32),
244
245    /// A [`f64`].
246    ///
247    /// # Example
248    /// ``` rust
249    /// use claims::assert_ok_eq;
250    /// use serde::Serialize;
251    /// use serde_assert::{
252    ///     Serializer,
253    ///     Token,
254    /// };
255    ///
256    /// let serializer = Serializer::builder().build();
257    ///
258    /// assert_ok_eq!(42.0f64.serialize(&serializer), [Token::F64(42.0)]);
259    /// ```
260    F64(f64),
261
262    /// A [`char`].
263    ///
264    /// # Example
265    /// ``` rust
266    /// use claims::assert_ok_eq;
267    /// use serde::Serialize;
268    /// use serde_assert::{
269    ///     Serializer,
270    ///     Token,
271    /// };
272    ///
273    /// let serializer = Serializer::builder().build();
274    ///
275    /// assert_ok_eq!('a'.serialize(&serializer), [Token::Char('a')]);
276    /// ```
277    Char(char),
278
279    /// A string.
280    ///
281    /// # Example
282    /// ``` rust
283    /// use claims::assert_ok_eq;
284    /// use serde::Serialize;
285    /// use serde_assert::{
286    ///     Serializer,
287    ///     Token,
288    /// };
289    ///
290    /// let serializer = Serializer::builder().build();
291    ///
292    /// assert_ok_eq!("foo".serialize(&serializer), [Token::Str("foo".to_owned())]);
293    /// ```
294    Str(String),
295
296    /// Bytes.
297    ///
298    /// # Example
299    /// ``` rust
300    /// use claims::assert_ok_eq;
301    /// use serde::Serialize;
302    /// use serde_assert::{
303    ///     Serializer,
304    ///     Token,
305    /// };
306    /// use serde_bytes::Bytes;
307    ///
308    /// let serializer = Serializer::builder().build();
309    ///
310    /// assert_ok_eq!(
311    ///     Bytes::new(b"foo").serialize(&serializer),
312    ///     [Token::Bytes(b"foo".to_vec())]
313    /// );
314    /// ```
315    Bytes(Vec<u8>),
316
317    /// An [`Option::None`].
318    ///
319    /// # Example
320    /// ``` rust
321    /// use claims::assert_ok_eq;
322    /// use serde::Serialize;
323    /// use serde_assert::{
324    ///     Serializer,
325    ///     Token,
326    /// };
327    ///
328    /// let serializer = Serializer::builder().build();
329    ///
330    /// assert_ok_eq!(Option::<()>::None.serialize(&serializer), [Token::None]);
331    /// ```
332    None,
333
334    /// An [`Option::Some`].
335    ///
336    /// # Example
337    /// ``` rust
338    /// use claims::assert_ok_eq;
339    /// use serde::Serialize;
340    /// use serde_assert::{
341    ///     Serializer,
342    ///     Token,
343    /// };
344    ///
345    /// let serializer = Serializer::builder().build();
346    ///
347    /// assert_ok_eq!(Some(()).serialize(&serializer), [Token::Some, Token::Unit]);
348    /// ```
349    Some,
350
351    /// A unit.
352    ///
353    /// # Example
354    /// ``` rust
355    /// use claims::assert_ok_eq;
356    /// use serde::Serialize;
357    /// use serde_assert::{
358    ///     Serializer,
359    ///     Token,
360    /// };
361    ///
362    /// let serializer = Serializer::builder().build();
363    ///
364    /// assert_ok_eq!(().serialize(&serializer), [Token::Unit]);
365    /// ```
366    Unit,
367
368    /// A unit struct.
369    ///
370    /// # Example
371    /// ``` rust
372    /// use claims::assert_ok_eq;
373    /// use serde::Serialize;
374    /// use serde_assert::{
375    ///     Serializer,
376    ///     Token,
377    /// };
378    /// # use serde_derive::Serialize;
379    ///
380    /// #[derive(Serialize)]
381    /// struct UnitStruct;
382    ///
383    /// let serializer = Serializer::builder().build();
384    ///
385    /// assert_ok_eq!(
386    ///     UnitStruct.serialize(&serializer),
387    ///     [Token::UnitStruct { name: "UnitStruct" }]
388    /// );
389    /// ```
390    UnitStruct { name: &'static str },
391
392    /// A unit variant on an `enum`.
393    ///
394    /// # Example
395    /// ``` rust
396    /// use claims::assert_ok_eq;
397    /// use serde::Serialize;
398    /// use serde_assert::{
399    ///     Serializer,
400    ///     Token,
401    /// };
402    /// # use serde_derive::Serialize;
403    ///
404    /// #[derive(Serialize)]
405    /// enum Enum {
406    ///     Unit,
407    /// }
408    ///
409    /// let serializer = Serializer::builder().build();
410    ///
411    /// assert_ok_eq!(
412    ///     Enum::Unit.serialize(&serializer),
413    ///     [Token::UnitVariant {
414    ///         name: "Enum",
415    ///         variant_index: 0,
416    ///         variant: "Unit"
417    ///     }]
418    /// );
419    /// ```
420    UnitVariant {
421        name: &'static str,
422        variant_index: u32,
423        variant: &'static str,
424    },
425
426    /// A newtype struct.
427    ///
428    /// # Example
429    /// ``` rust
430    /// use claims::assert_ok_eq;
431    /// use serde::Serialize;
432    /// use serde_assert::{
433    ///     Serializer,
434    ///     Token,
435    /// };
436    /// # use serde_derive::Serialize;
437    ///
438    /// #[derive(Serialize)]
439    /// struct NewtypeStruct(u32);
440    ///
441    /// let serializer = Serializer::builder().build();
442    ///
443    /// assert_ok_eq!(
444    ///     NewtypeStruct(42).serialize(&serializer),
445    ///     [
446    ///         Token::NewtypeStruct {
447    ///             name: "NewtypeStruct"
448    ///         },
449    ///         Token::U32(42)
450    ///     ]
451    /// );
452    /// ```
453    NewtypeStruct { name: &'static str },
454
455    /// A newtype variant on an `enum`.
456    ///
457    /// # Example
458    /// ``` rust
459    /// use claims::assert_ok_eq;
460    /// use serde::Serialize;
461    /// use serde_assert::{
462    ///     Serializer,
463    ///     Token,
464    /// };
465    /// # use serde_derive::Serialize;
466    ///
467    /// #[derive(Serialize)]
468    /// enum Enum {
469    ///     Newtype(u32),
470    /// }
471    ///
472    /// let serializer = Serializer::builder().build();
473    ///
474    /// assert_ok_eq!(
475    ///     Enum::Newtype(42).serialize(&serializer),
476    ///     [
477    ///         Token::NewtypeVariant {
478    ///             name: "Enum",
479    ///             variant_index: 0,
480    ///             variant: "Newtype"
481    ///         },
482    ///         Token::U32(42)
483    ///     ]
484    /// );
485    /// ```
486    NewtypeVariant {
487        name: &'static str,
488        variant_index: u32,
489        variant: &'static str,
490    },
491
492    /// A sequence.
493    ///
494    /// Must be followed by a [`SeqEnd`] token.
495    ///
496    /// # Example
497    /// ``` rust
498    /// use claims::assert_ok_eq;
499    /// use serde::Serialize;
500    /// use serde_assert::{
501    ///     Serializer,
502    ///     Token,
503    /// };
504    ///
505    /// let serializer = Serializer::builder().build();
506    ///
507    /// assert_ok_eq!(
508    ///     vec![1u32, 2u32, 3u32].serialize(&serializer),
509    ///     [
510    ///         Token::Seq { len: Some(3) },
511    ///         Token::U32(1),
512    ///         Token::U32(2),
513    ///         Token::U32(3),
514    ///         Token::SeqEnd
515    ///     ]
516    /// );
517    /// ```
518    ///
519    /// [`SeqEnd`]: Token::SeqEnd
520    Seq { len: Option<usize> },
521
522    /// The end of a sequence.
523    ///
524    /// This token must follow a [`Seq`] token.
525    ///
526    /// [`Seq`]: Token::Seq
527    SeqEnd,
528
529    /// A tuple.
530    ///
531    /// Must be followed by a [`TupleEnd`] token.
532    ///
533    /// # Example
534    /// ``` rust
535    /// use claims::assert_ok_eq;
536    /// use serde::Serialize;
537    /// use serde_assert::{
538    ///     Serializer,
539    ///     Token,
540    /// };
541    ///
542    /// let serializer = Serializer::builder().build();
543    ///
544    /// assert_ok_eq!(
545    ///     (42u32, true).serialize(&serializer),
546    ///     [
547    ///         Token::Tuple { len: 2 },
548    ///         Token::U32(42),
549    ///         Token::Bool(true),
550    ///         Token::TupleEnd
551    ///     ]
552    /// );
553    /// ```
554    ///
555    /// [`TupleEnd`]: Token::TupleEnd
556    Tuple { len: usize },
557
558    /// The end of a tuple.
559    ///
560    /// This token must follow a [`Tuple`] token.
561    ///
562    /// [`Tuple`]: Token::Tuple
563    TupleEnd,
564
565    /// A tuple struct.
566    ///
567    /// Must be followed by a [`TupleStructEnd`] token.
568    ///
569    /// # Example
570    /// ``` rust
571    /// use claims::assert_ok_eq;
572    /// use serde::Serialize;
573    /// use serde_assert::{
574    ///     Serializer,
575    ///     Token,
576    /// };
577    /// # use serde_derive::Serialize;
578    ///
579    /// #[derive(Serialize)]
580    /// struct TupleStruct(u32, bool);
581    ///
582    /// let serializer = Serializer::builder().build();
583    ///
584    /// assert_ok_eq!(
585    ///     TupleStruct(42u32, true).serialize(&serializer),
586    ///     [
587    ///         Token::TupleStruct {
588    ///             name: "TupleStruct",
589    ///             len: 2
590    ///         },
591    ///         Token::U32(42),
592    ///         Token::Bool(true),
593    ///         Token::TupleStructEnd
594    ///     ]
595    /// );
596    /// ```
597    ///
598    /// [`TupleStructEnd`]: Token::TupleStructEnd
599    TupleStruct { name: &'static str, len: usize },
600
601    /// The end of a tuple struct.
602    ///
603    /// This token must follow a [`TupleStruct`] token.
604    ///
605    /// [`TupleStruct`]: Token::TupleStruct
606    TupleStructEnd,
607
608    /// A tuple variant on an `enum`.
609    ///
610    /// Must be followed by a [`TupleVariantEnd`] token.
611    ///
612    /// # Example
613    /// ``` rust
614    /// use claims::assert_ok_eq;
615    /// use serde::Serialize;
616    /// use serde_assert::{
617    ///     Serializer,
618    ///     Token,
619    /// };
620    /// # use serde_derive::Serialize;
621    ///
622    /// #[derive(Serialize)]
623    /// enum Enum {
624    ///     Tuple(u32, bool),
625    /// }
626    /// struct TupleStruct(u32, bool);
627    ///
628    /// let serializer = Serializer::builder().build();
629    ///
630    /// assert_ok_eq!(
631    ///     Enum::Tuple(42u32, true).serialize(&serializer),
632    ///     [
633    ///         Token::TupleVariant {
634    ///             name: "Enum",
635    ///             variant_index: 0,
636    ///             variant: "Tuple",
637    ///             len: 2
638    ///         },
639    ///         Token::U32(42),
640    ///         Token::Bool(true),
641    ///         Token::TupleVariantEnd
642    ///     ]
643    /// );
644    /// ```
645    ///
646    /// [`TupleVariantEnd`]: Token::TupleVariantEnd
647    TupleVariant {
648        name: &'static str,
649        variant_index: u32,
650        variant: &'static str,
651        len: usize,
652    },
653
654    /// The end of a tuple variant.
655    ///
656    /// This token must follow a [`TupleVariant`] token.
657    ///
658    /// [`TupleVariant`]: Token::TupleVariant
659    TupleVariantEnd,
660
661    /// A map.
662    ///
663    /// Must be followed by a [`MapEnd`] token.
664    ///
665    /// # Example
666    /// ``` rust
667    /// use claims::assert_ok_eq;
668    /// use serde::Serialize;
669    /// use serde_assert::{
670    ///     Serializer,
671    ///     Token,
672    /// };
673    /// use std::collections::HashMap;
674    ///
675    /// let serializer = Serializer::builder().build();
676    ///
677    /// let mut map = HashMap::new();
678    /// map.insert("foo", 42u32);
679    ///
680    /// assert_ok_eq!(
681    ///     map.serialize(&serializer),
682    ///     [
683    ///         Token::Map { len: Some(1) },
684    ///         Token::Str("foo".to_owned()),
685    ///         Token::U32(42),
686    ///         Token::MapEnd
687    ///     ]
688    /// );
689    /// ```
690    ///
691    /// [`MapEnd`]: Token::MapEnd
692    Map { len: Option<usize> },
693
694    /// The end of a map.
695    ///
696    /// This token must follow a [`Map`] token.
697    ///
698    /// [`Map`]: Token::Map
699    MapEnd,
700
701    /// A field within a [`Struct`].
702    ///
703    /// [`Struct`]: Token::Struct
704    Field(&'static str),
705
706    /// A field within a [`Struct`], skipped during serialization.
707    ///
708    /// This token is emitted when the [`SerializeStruct::skip_field()`] method is called during
709    /// serialization.
710    ///
711    /// [`SerializeStruct::skip_field()`]: serde::ser::SerializeStruct::skip_field()
712    /// [`Struct`]: Token::Struct
713    SkippedField(&'static str),
714
715    /// A struct.
716    ///
717    /// Must be followed by a [`StructEnd`] token.
718    ///
719    /// # Example
720    /// ``` rust
721    /// use claims::assert_ok_eq;
722    /// use serde::Serialize;
723    /// use serde_assert::{
724    ///     Serializer,
725    ///     Token,
726    /// };
727    /// # use serde_derive::Serialize;
728    ///
729    /// #[derive(Serialize)]
730    /// struct Struct {
731    ///     foo: u32,
732    ///     bar: bool,
733    /// }
734    ///
735    /// let serializer = Serializer::builder().build();
736    ///
737    /// assert_ok_eq!(
738    ///     Struct {
739    ///         foo: 42u32,
740    ///         bar: true
741    ///     }
742    ///     .serialize(&serializer),
743    ///     [
744    ///         Token::Struct {
745    ///             name: "Struct",
746    ///             len: 2
747    ///         },
748    ///         Token::Field("foo"),
749    ///         Token::U32(42),
750    ///         Token::Field("bar"),
751    ///         Token::Bool(true),
752    ///         Token::StructEnd
753    ///     ]
754    /// );
755    /// ```
756    ///
757    /// [`StructEnd`]: Token::StructEnd
758    Struct { name: &'static str, len: usize },
759
760    /// The end of a struct.
761    ///
762    /// This token must follow a [`Struct`] token.
763    ///
764    /// [`Struct`]: Token::Struct
765    StructEnd,
766
767    /// A struct variant on an `enum`.
768    ///
769    /// Must be followed by a [`StructVariantEnd`] token.
770    ///
771    /// # Example
772    /// ``` rust
773    /// use claims::assert_ok_eq;
774    /// use serde::Serialize;
775    /// use serde_assert::{
776    ///     Serializer,
777    ///     Token,
778    /// };
779    /// # use serde_derive::Serialize;
780    ///
781    /// #[derive(Serialize)]
782    /// enum Enum {
783    ///     Struct { foo: u32, bar: bool },
784    /// }
785    ///
786    /// let serializer = Serializer::builder().build();
787    ///
788    /// assert_ok_eq!(
789    ///     Enum::Struct {
790    ///         foo: 42u32,
791    ///         bar: true
792    ///     }
793    ///     .serialize(&serializer),
794    ///     [
795    ///         Token::StructVariant {
796    ///             name: "Enum",
797    ///             variant_index: 0,
798    ///             variant: "Struct",
799    ///             len: 2
800    ///         },
801    ///         Token::Field("foo"),
802    ///         Token::U32(42),
803    ///         Token::Field("bar"),
804    ///         Token::Bool(true),
805    ///         Token::StructVariantEnd
806    ///     ]
807    /// );
808    /// ```
809    ///
810    /// [`StructVariantEnd`]: Token::StructVariantEnd
811    StructVariant {
812        name: &'static str,
813        variant_index: u32,
814        variant: &'static str,
815        len: usize,
816    },
817
818    /// The end of a struct variant.
819    ///
820    /// This token must follow a [`StructVariant`] token.
821    ///
822    /// [`StructVariant`]: Token::StructVariant
823    StructVariantEnd,
824
825    /// Unordered sets of tokens.
826    ///
827    /// This token is primarily used for evaluating output from a [`Serializer`] for containers or
828    /// other types whose internal ordering is not defined (such as a [`HashSet`]).
829    ///
830    /// This is a set of groups of tokens, where the groups may appear in any order when comparing
831    /// equality of [`Tokens`]. In other words, the outer slice is unordered, while the inner
832    /// slices are all ordered.
833    ///
834    /// # Example
835    /// ``` rust
836    /// use claims::assert_ok_eq;
837    /// use serde::Serialize;
838    /// use serde_assert::{
839    ///     Serializer,
840    ///     Token,
841    /// };
842    /// use std::collections::HashMap;
843    ///
844    /// let serializer = Serializer::builder().build();
845    ///
846    /// let mut map = HashMap::<char, u32>::new();
847    /// map.insert('a', 1);
848    /// map.insert('b', 2);
849    /// map.insert('c', 3);
850    ///
851    /// assert_ok_eq!(
852    ///     map.serialize(&serializer),
853    ///     [
854    ///         Token::Map { len: Some(3) },
855    ///         Token::Unordered(&[
856    ///             &[Token::Char('a'), Token::U32(1)],
857    ///             &[Token::Char('b'), Token::U32(2)],
858    ///             &[Token::Char('c'), Token::U32(3)]
859    ///         ]),
860    ///         Token::MapEnd
861    ///     ]
862    /// );
863    /// ```
864    ///
865    /// [`HashSet`]: std::collections::HashSet
866    /// [`Serializer`]: crate::Serializer
867    Unordered(&'static [&'static [Token]]),
868}
869
870/// An enumeration of all tokens that can be emitted by the [`Serializer`].
871///
872/// [`Serializer`]: crate::Serializer
873#[derive(Clone, Debug, PartialEq)]
874pub(crate) enum CanonicalToken {
875    Bool(bool),
876    I8(i8),
877    I16(i16),
878    I32(i32),
879    I64(i64),
880    I128(i128),
881    U8(u8),
882    U16(u16),
883    U32(u32),
884    U64(u64),
885    U128(u128),
886    F32(f32),
887    F64(f64),
888    Char(char),
889    Str(String),
890    Bytes(Vec<u8>),
891    None,
892    Some,
893    Unit,
894    UnitStruct {
895        name: &'static str,
896    },
897    UnitVariant {
898        name: &'static str,
899        variant_index: u32,
900        variant: &'static str,
901    },
902    NewtypeStruct {
903        name: &'static str,
904    },
905    NewtypeVariant {
906        name: &'static str,
907        variant_index: u32,
908        variant: &'static str,
909    },
910    Seq {
911        len: Option<usize>,
912    },
913    SeqEnd,
914    Tuple {
915        len: usize,
916    },
917    TupleEnd,
918    TupleStruct {
919        name: &'static str,
920        len: usize,
921    },
922    TupleStructEnd,
923    TupleVariant {
924        name: &'static str,
925        variant_index: u32,
926        variant: &'static str,
927        len: usize,
928    },
929    TupleVariantEnd,
930    Map {
931        len: Option<usize>,
932    },
933    MapEnd,
934    Field(&'static str),
935    SkippedField(&'static str),
936    Struct {
937        name: &'static str,
938        len: usize,
939    },
940    StructEnd,
941    StructVariant {
942        name: &'static str,
943        variant_index: u32,
944        variant: &'static str,
945        len: usize,
946    },
947    StructVariantEnd,
948}
949
950pub(crate) struct UnorderedTokens(pub(crate) &'static [&'static [Token]]);
951
952impl TryFrom<Token> for CanonicalToken {
953    type Error = UnorderedTokens;
954
955    fn try_from(token: Token) -> Result<Self, Self::Error> {
956        match token {
957            Token::Bool(value) => Ok(CanonicalToken::Bool(value)),
958            Token::I8(value) => Ok(CanonicalToken::I8(value)),
959            Token::I16(value) => Ok(CanonicalToken::I16(value)),
960            Token::I32(value) => Ok(CanonicalToken::I32(value)),
961            Token::I64(value) => Ok(CanonicalToken::I64(value)),
962            Token::I128(value) => Ok(CanonicalToken::I128(value)),
963            Token::U8(value) => Ok(CanonicalToken::U8(value)),
964            Token::U16(value) => Ok(CanonicalToken::U16(value)),
965            Token::U32(value) => Ok(CanonicalToken::U32(value)),
966            Token::U64(value) => Ok(CanonicalToken::U64(value)),
967            Token::U128(value) => Ok(CanonicalToken::U128(value)),
968            Token::F32(value) => Ok(CanonicalToken::F32(value)),
969            Token::F64(value) => Ok(CanonicalToken::F64(value)),
970            Token::Char(value) => Ok(CanonicalToken::Char(value)),
971            Token::Str(value) => Ok(CanonicalToken::Str(value)),
972            Token::Bytes(value) => Ok(CanonicalToken::Bytes(value)),
973            Token::None => Ok(CanonicalToken::None),
974            Token::Some => Ok(CanonicalToken::Some),
975            Token::Unit => Ok(CanonicalToken::Unit),
976            Token::UnitStruct { name } => Ok(CanonicalToken::UnitStruct { name }),
977            Token::UnitVariant {
978                name,
979                variant_index,
980                variant,
981            } => Ok(CanonicalToken::UnitVariant {
982                name,
983                variant_index,
984                variant,
985            }),
986            Token::NewtypeStruct { name } => Ok(CanonicalToken::NewtypeStruct { name }),
987            Token::NewtypeVariant {
988                name,
989                variant_index,
990                variant,
991            } => Ok(CanonicalToken::NewtypeVariant {
992                name,
993                variant_index,
994                variant,
995            }),
996            Token::Seq { len } => Ok(CanonicalToken::Seq { len }),
997            Token::SeqEnd => Ok(CanonicalToken::SeqEnd),
998            Token::Tuple { len } => Ok(CanonicalToken::Tuple { len }),
999            Token::TupleEnd => Ok(CanonicalToken::TupleEnd),
1000            Token::TupleStruct { name, len } => Ok(CanonicalToken::TupleStruct { name, len }),
1001            Token::TupleStructEnd => Ok(CanonicalToken::TupleStructEnd),
1002            Token::TupleVariant {
1003                name,
1004                variant_index,
1005                variant,
1006                len,
1007            } => Ok(CanonicalToken::TupleVariant {
1008                name,
1009                variant_index,
1010                variant,
1011                len,
1012            }),
1013            Token::TupleVariantEnd => Ok(CanonicalToken::TupleVariantEnd),
1014            Token::Map { len } => Ok(CanonicalToken::Map { len }),
1015            Token::MapEnd => Ok(CanonicalToken::MapEnd),
1016            Token::Field(value) => Ok(CanonicalToken::Field(value)),
1017            Token::SkippedField(value) => Ok(CanonicalToken::SkippedField(value)),
1018            Token::Struct { name, len } => Ok(CanonicalToken::Struct { name, len }),
1019            Token::StructEnd => Ok(CanonicalToken::StructEnd),
1020            Token::StructVariant {
1021                name,
1022                variant_index,
1023                variant,
1024                len,
1025            } => Ok(CanonicalToken::StructVariant {
1026                name,
1027                variant_index,
1028                variant,
1029                len,
1030            }),
1031            Token::StructVariantEnd => Ok(CanonicalToken::StructVariantEnd),
1032            Token::Unordered(tokens) => Err(UnorderedTokens(tokens)),
1033        }
1034    }
1035}
1036
1037impl From<CanonicalToken> for Token {
1038    fn from(token: CanonicalToken) -> Self {
1039        match token {
1040            CanonicalToken::Bool(value) => Token::Bool(value),
1041            CanonicalToken::I8(value) => Token::I8(value),
1042            CanonicalToken::I16(value) => Token::I16(value),
1043            CanonicalToken::I32(value) => Token::I32(value),
1044            CanonicalToken::I64(value) => Token::I64(value),
1045            CanonicalToken::I128(value) => Token::I128(value),
1046            CanonicalToken::U8(value) => Token::U8(value),
1047            CanonicalToken::U16(value) => Token::U16(value),
1048            CanonicalToken::U32(value) => Token::U32(value),
1049            CanonicalToken::U64(value) => Token::U64(value),
1050            CanonicalToken::U128(value) => Token::U128(value),
1051            CanonicalToken::F32(value) => Token::F32(value),
1052            CanonicalToken::F64(value) => Token::F64(value),
1053            CanonicalToken::Char(value) => Token::Char(value),
1054            CanonicalToken::Str(value) => Token::Str(value),
1055            CanonicalToken::Bytes(value) => Token::Bytes(value),
1056            CanonicalToken::None => Token::None,
1057            CanonicalToken::Some => Token::Some,
1058            CanonicalToken::Unit => Token::Unit,
1059            CanonicalToken::UnitStruct { name } => Token::UnitStruct { name },
1060            CanonicalToken::UnitVariant {
1061                name,
1062                variant_index,
1063                variant,
1064            } => Token::UnitVariant {
1065                name,
1066                variant_index,
1067                variant,
1068            },
1069            CanonicalToken::NewtypeStruct { name } => Token::NewtypeStruct { name },
1070            CanonicalToken::NewtypeVariant {
1071                name,
1072                variant_index,
1073                variant,
1074            } => Token::NewtypeVariant {
1075                name,
1076                variant_index,
1077                variant,
1078            },
1079            CanonicalToken::Seq { len } => Token::Seq { len },
1080            CanonicalToken::SeqEnd => Token::SeqEnd,
1081            CanonicalToken::Tuple { len } => Token::Tuple { len },
1082            CanonicalToken::TupleEnd => Token::TupleEnd,
1083            CanonicalToken::TupleStruct { name, len } => Token::TupleStruct { name, len },
1084            CanonicalToken::TupleStructEnd => Token::TupleStructEnd,
1085            CanonicalToken::TupleVariant {
1086                name,
1087                variant_index,
1088                variant,
1089                len,
1090            } => Token::TupleVariant {
1091                name,
1092                variant_index,
1093                variant,
1094                len,
1095            },
1096            CanonicalToken::TupleVariantEnd => Token::TupleVariantEnd,
1097            CanonicalToken::Map { len } => Token::Map { len },
1098            CanonicalToken::MapEnd => Token::MapEnd,
1099            CanonicalToken::Field(value) => Token::Field(value),
1100            CanonicalToken::SkippedField(value) => Token::SkippedField(value),
1101            CanonicalToken::Struct { name, len } => Token::Struct { name, len },
1102            CanonicalToken::StructEnd => Token::StructEnd,
1103            CanonicalToken::StructVariant {
1104                name,
1105                variant_index,
1106                variant,
1107                len,
1108            } => Token::StructVariant {
1109                name,
1110                variant_index,
1111                variant,
1112                len,
1113            },
1114            CanonicalToken::StructVariantEnd => Token::StructVariantEnd,
1115        }
1116    }
1117}
1118
1119impl<'a> From<&'a mut CanonicalToken> for Unexpected<'a> {
1120    fn from(token: &'a mut CanonicalToken) -> Self {
1121        match token {
1122            CanonicalToken::Bool(v) => Unexpected::Bool(*v),
1123            CanonicalToken::I8(v) => Unexpected::Signed((*v).into()),
1124            CanonicalToken::I16(v) => Unexpected::Signed((*v).into()),
1125            CanonicalToken::I32(v) => Unexpected::Signed((*v).into()),
1126            CanonicalToken::I64(v) => Unexpected::Signed(*v),
1127            CanonicalToken::I128(..) => Unexpected::Other("i128"),
1128            CanonicalToken::U8(v) => Unexpected::Unsigned((*v).into()),
1129            CanonicalToken::U16(v) => Unexpected::Unsigned((*v).into()),
1130            CanonicalToken::U32(v) => Unexpected::Unsigned((*v).into()),
1131            CanonicalToken::U64(v) => Unexpected::Unsigned(*v),
1132            CanonicalToken::U128(..) => Unexpected::Other("u128"),
1133            CanonicalToken::F32(v) => Unexpected::Float((*v).into()),
1134            CanonicalToken::F64(v) => Unexpected::Float(*v),
1135            CanonicalToken::Char(v) => Unexpected::Char(*v),
1136            CanonicalToken::Str(v) => Unexpected::Str(v),
1137            CanonicalToken::Bytes(v) => Unexpected::Bytes(v),
1138            CanonicalToken::Some | CanonicalToken::None => Unexpected::Option,
1139            CanonicalToken::Unit | CanonicalToken::UnitStruct { .. } => Unexpected::Unit,
1140            CanonicalToken::UnitVariant { .. } => Unexpected::UnitVariant,
1141            CanonicalToken::NewtypeStruct { .. } => Unexpected::NewtypeStruct,
1142            CanonicalToken::NewtypeVariant { .. } => Unexpected::NewtypeVariant,
1143            CanonicalToken::Seq { .. } | CanonicalToken::Tuple { .. } => Unexpected::Seq,
1144            CanonicalToken::SeqEnd => Unexpected::Other("SeqEnd"),
1145            CanonicalToken::TupleEnd => Unexpected::Other("TupleEnd"),
1146            CanonicalToken::TupleStruct { .. } => Unexpected::Other("TupleStruct"),
1147            CanonicalToken::TupleStructEnd => Unexpected::Other("TupleStructEnd"),
1148            CanonicalToken::TupleVariant { .. } => Unexpected::TupleVariant,
1149            CanonicalToken::TupleVariantEnd => Unexpected::Other("TupleVariantEnd"),
1150            CanonicalToken::Map { .. } => Unexpected::Map,
1151            CanonicalToken::MapEnd => Unexpected::Other("MapEnd"),
1152            CanonicalToken::Field(..) => Unexpected::Other("Field"),
1153            CanonicalToken::SkippedField(..) => Unexpected::Other("SkippedField"),
1154            CanonicalToken::Struct { .. } => Unexpected::Other("Struct"),
1155            CanonicalToken::StructEnd => Unexpected::Other("StructEnd"),
1156            CanonicalToken::StructVariant { .. } => Unexpected::StructVariant,
1157            CanonicalToken::StructVariantEnd => Unexpected::Other("StructVariantEnd"),
1158        }
1159    }
1160}
1161
1162/// A sequence of [`Token`]s output by a [`Serializer`].
1163///
1164/// `Tokens` can be compared with any other sequence of `Token`s to assert that the serialized
1165/// values are as expected.
1166///
1167/// # Examples
1168///
1169/// `Tokens` are output from a [`Serializer`] and can be compared against a sequence of `Token`s.
1170///
1171/// ## Serialization
1172///
1173/// ``` rust
1174/// use claims::assert_ok_eq;
1175/// use serde::Serialize;
1176/// use serde_assert::{
1177///     Serializer,
1178///     Token,
1179/// };
1180///
1181/// let serializer = Serializer::builder().build();
1182///
1183/// assert_ok_eq!(true.serialize(&serializer), [Token::Bool(true)]);
1184/// ```
1185///
1186/// ## Deserialization
1187///
1188/// `Tokens` obtained from a [`Serializer`] can be used as input to a [`Deserializer`].
1189///
1190/// ``` rust
1191/// use claims::{
1192///     assert_ok,
1193///     assert_ok_eq,
1194/// };
1195/// use serde::{
1196///     Deserialize,
1197///     Serialize,
1198/// };
1199/// use serde_assert::{
1200///     Deserializer,
1201///     Serializer,
1202///     Token,
1203/// };
1204///
1205/// let serializer = Serializer::builder().build();
1206/// let mut deserializer = Deserializer::builder(assert_ok!(true.serialize(&serializer))).build();
1207///
1208/// assert_ok_eq!(bool::deserialize(&mut deserializer), true);
1209/// ```
1210///
1211/// [`Deserializer`]: crate::Deserializer
1212/// [`Serializer`]: crate::Serializer
1213#[derive(Clone, Debug)]
1214pub struct Tokens(pub(crate) Vec<CanonicalToken>);
1215
1216#[derive(Clone, Debug)]
1217struct Context {
1218    current: slice::Iter<'static, Token>,
1219    remaining: Vec<&'static [Token]>,
1220    #[allow(clippy::struct_field_names)] // Acceptable, as the name refers to the contained type.
1221    nested_context: Option<Box<Context>>,
1222}
1223
1224impl Context {
1225    /// Creates a new context from the given parts.
1226    fn new(current: slice::Iter<'static, Token>, remaining: Vec<&'static [Token]>) -> Self {
1227        Self {
1228            current,
1229            remaining,
1230            nested_context: None,
1231        }
1232    }
1233
1234    /// Nests this context within the contexts in the given split, returning those contexts.
1235    fn nest(self, mut split: Split) -> Vec<Self> {
1236        for context in &mut split.contexts {
1237            context.nested_context = Some(Box::new(self.clone()));
1238        }
1239        split.contexts
1240    }
1241}
1242
1243impl Iterator for Context {
1244    type Item = &'static Token;
1245
1246    fn next(&mut self) -> Option<Self::Item> {
1247        self.current.next()
1248    }
1249}
1250
1251#[derive(Debug)]
1252struct Split {
1253    contexts: Vec<Context>,
1254}
1255
1256impl Split {
1257    /// Returns whether a path exists through these split tokens using the given iterator.
1258    ///
1259    /// This will consume exactly the correct number of tokens from the given iterator.
1260    fn search<'a, I>(mut self, mut tokens: I) -> bool
1261    where
1262        I: Iterator<Item = &'a CanonicalToken>,
1263    {
1264        while let Some(canonical_tokens) = self.next() {
1265            if canonical_tokens.is_empty() {
1266                // All contexts have ended, and therefore no path could be found.
1267                return false;
1268            }
1269            if let Some(token) = tokens.next() {
1270                self.contexts = self
1271                    .contexts
1272                    .into_iter()
1273                    .zip(canonical_tokens)
1274                    .filter_map(|(context, canonical_token)| {
1275                        if *token == canonical_token {
1276                            Some(context)
1277                        } else {
1278                            None
1279                        }
1280                    })
1281                    .collect();
1282            } else {
1283                // Both sides had a different number of canonical tokens.
1284                return false;
1285            }
1286        }
1287
1288        // We have found the end of the split tokens without failing to find equality in tokens.
1289        // This means that at least one path was found, and therefore the search succeeded.
1290        true
1291    }
1292}
1293
1294impl Iterator for Split {
1295    /// Returns a token from each remaining context, removing contexts in-place if they split.
1296    ///
1297    /// If this returns an empty `Vec`, that means there were no contexts remaining when it was
1298    /// called. If this returns `None`, that means that all remaining contexts have hit the end of
1299    /// their tokens.
1300    type Item = Vec<CanonicalToken>;
1301
1302    fn next(&mut self) -> Option<Self::Item> {
1303        if self.contexts.is_empty() {
1304            return Some(Vec::new());
1305        }
1306
1307        let mut result = Vec::with_capacity(self.contexts.len());
1308
1309        let mut index = 0;
1310        while index < self.contexts.len() {
1311            match self.contexts[index]
1312                .next()
1313                .cloned()
1314                .map(CanonicalToken::try_from)
1315            {
1316                Some(Ok(canonical_token)) => {
1317                    result.push(canonical_token);
1318                    index += 1;
1319                }
1320                Some(Err(unordered_tokens)) => {
1321                    // Split and nest.
1322                    let context = self.contexts.swap_remove(index);
1323                    if let Ok(split) = unordered_tokens.try_into() {
1324                        self.contexts.extend(context.nest(split));
1325                    }
1326                }
1327                None => {
1328                    // Split from remaining.
1329                    let context = self.contexts.swap_remove(index);
1330                    if let Ok(split) = Split::try_from(context) {
1331                        self.contexts.extend(split.contexts);
1332                    }
1333                }
1334            }
1335        }
1336
1337        if result.is_empty() {
1338            // No tokens returned, which means we are done processing this split.
1339            None
1340        } else {
1341            Some(result)
1342        }
1343    }
1344}
1345
1346impl<'a> TryFrom<&'a [&'static [Token]]> for Split {
1347    type Error = ();
1348
1349    fn try_from(value: &'a [&'static [Token]]) -> Result<Self, Self::Error> {
1350        if value.is_empty() {
1351            Err(())
1352        } else {
1353            Ok(Self {
1354                contexts: (0..value.len())
1355                    .map(|index| {
1356                        Context::new(
1357                            value[index].iter(),
1358                            value
1359                                .iter()
1360                                .enumerate()
1361                                .filter_map(
1362                                    |(i, tokens)| if i == index { None } else { Some(*tokens) },
1363                                )
1364                                .collect(),
1365                        )
1366                    })
1367                    .collect(),
1368            })
1369        }
1370    }
1371}
1372
1373impl TryFrom<Context> for Split {
1374    type Error = ();
1375
1376    fn try_from(value: Context) -> Result<Self, Self::Error> {
1377        if let Ok(mut split) = Split::try_from(value.remaining.as_slice()) {
1378            for context in &mut split.contexts {
1379                context.nested_context.clone_from(&value.nested_context);
1380            }
1381            Ok(split)
1382        } else if let Some(nested_context) = value.nested_context {
1383            Ok(Split {
1384                contexts: vec![*nested_context],
1385            })
1386        } else {
1387            Err(())
1388        }
1389    }
1390}
1391
1392impl TryFrom<UnorderedTokens> for Split {
1393    type Error = ();
1394
1395    fn try_from(value: UnorderedTokens) -> Result<Self, Self::Error> {
1396        value.0.try_into()
1397    }
1398}
1399
1400impl<T> PartialEq<T> for Tokens
1401where
1402    for<'a> &'a T: IntoIterator<Item = &'a Token>,
1403{
1404    fn eq(&self, other: &T) -> bool {
1405        let mut self_iter = self.0.iter();
1406
1407        for token in other {
1408            if !match CanonicalToken::try_from(token.clone()) {
1409                Ok(canonical_token) => {
1410                    if let Some(self_token) = self_iter.next() {
1411                        canonical_token == *self_token
1412                    } else {
1413                        // Both sides had a different number of canonical tokens.
1414                        false
1415                    }
1416                }
1417                Err(unordered_tokens) => Split::try_from(unordered_tokens)
1418                    .map(|split| split.search(&mut self_iter))
1419                    .unwrap_or(true),
1420            } {
1421                return false;
1422            }
1423        }
1424
1425        if self_iter.next().is_some() {
1426            // Both sides had a different number of canonical tokens.
1427            return false;
1428        }
1429
1430        true
1431    }
1432}
1433
1434impl IntoIterator for Tokens {
1435    type Item = Token;
1436    type IntoIter = IntoIter;
1437
1438    fn into_iter(self) -> Self::IntoIter {
1439        IntoIter {
1440            token_iter: self.0.into_iter(),
1441        }
1442    }
1443}
1444
1445/// An iterator that moves [`Token`]s out of a [`Tokens`] `struct`.
1446///
1447/// This `struct` is created by the [`into_iter()`] method on `Tokens` (provided by the
1448/// [`IntoIterator`] trait).
1449///
1450/// [`into_iter()`]: IntoIterator::into_iter()
1451pub struct IntoIter {
1452    token_iter: vec::IntoIter<CanonicalToken>,
1453}
1454
1455impl Iterator for IntoIter {
1456    type Item = Token;
1457
1458    fn next(&mut self) -> Option<Self::Item> {
1459        self.token_iter.next().map(From::from)
1460    }
1461}
1462
1463/// An iterator over tokens.
1464///
1465/// This iterator owns the tokens, iterating over references to them.
1466pub(crate) struct OwningIter<'a> {
1467    /// A pointer to the entire buffer that is owned by this struct.
1468    ///
1469    /// Immutable references to the `Token`s in this buffer can exist within the lifetime `'a`.
1470    buf: NonNull<CanonicalToken>,
1471    /// A pointer to the current position in iteration.
1472    ptr: *mut CanonicalToken,
1473    /// A pointer to the end of the allocated buffer.
1474    end: *mut CanonicalToken,
1475    /// The capacity of the underlying allocation.
1476    ///
1477    /// This is only used for deallocating when the struct is dropped.
1478    cap: usize,
1479
1480    /// The lifetime of the underlying `Token`s.
1481    ///
1482    /// `Token`s can be borrowed for up to the lifetime `'a`, allowing for zero-copy
1483    /// deserialization.
1484    lifetime: PhantomData<&'a ()>,
1485}
1486
1487impl OwningIter<'_> {
1488    /// Creates a new `Iter` from a list of `Tokens`.
1489    ///
1490    /// Takes ownership of the `Tokens` and its underlying buffer.
1491    pub(crate) fn new(tokens: Tokens) -> Self {
1492        let mut tokens = ManuallyDrop::new(tokens);
1493
1494        Self {
1495            // SAFETY: The pointer used by the `Vec` in `Tokens` is guaranteed to not be null.
1496            buf: unsafe { NonNull::new_unchecked(tokens.0.as_mut_ptr()) },
1497            ptr: tokens.0.as_mut_ptr(),
1498            // SAFETY: The resulting pointer is one byte past the end of the allocated object.
1499            end: unsafe { tokens.0.as_mut_ptr().add(tokens.0.len()) },
1500            cap: tokens.0.capacity(),
1501
1502            lifetime: PhantomData,
1503        }
1504    }
1505
1506    /// Returns the remaining `Token`s as a slice.
1507    fn as_slice(&self) -> &[CanonicalToken] {
1508        // SAFETY: `self.ptr` is guaranteed to be less than `self.end`, and therefore a valid
1509        // pointer within the allocated object.
1510        unsafe {
1511            slice::from_raw_parts(
1512                self.ptr,
1513                #[allow(clippy::cast_sign_loss)]
1514                {
1515                    self.end.offset_from(self.ptr) as usize
1516                },
1517            )
1518        }
1519    }
1520}
1521
1522impl<'a> Iterator for OwningIter<'a> {
1523    type Item = &'a mut CanonicalToken;
1524
1525    fn next(&mut self) -> Option<Self::Item> {
1526        if self.ptr == self.end {
1527            None
1528        } else {
1529            let current = self.ptr;
1530            // SAFETY: Since `self.ptr` is not equal to `self.end`, it must be before it, and
1531            // therefore incrementing by 1 will also result in a valid pointer within the allocated
1532            // object, or 1 byte past the end if the iteration has completed.
1533            self.ptr = unsafe { self.ptr.add(1) };
1534            // SAFETY: The pointed-at object is guaranteed to be a valid `Token` that will live for
1535            // the lifetime `'a`.
1536            Some(unsafe { &mut *current })
1537        }
1538    }
1539}
1540
1541impl Debug for OwningIter<'_> {
1542    fn fmt(&self, formatter: &mut fmt::Formatter<'_>) -> fmt::Result {
1543        formatter
1544            .debug_tuple("OwningIter")
1545            .field(&self.as_slice())
1546            .finish()
1547    }
1548}
1549
1550impl Drop for OwningIter<'_> {
1551    fn drop(&mut self) {
1552        // SAFETY: The raw parts stored in this struct are guaranteed to correspond to the valid
1553        // parts of a `Vec`, since the parts were obtained directly from a `Vec` originally.
1554        unsafe {
1555            Vec::from_raw_parts(
1556                self.buf.as_ptr(),
1557                #[allow(clippy::cast_sign_loss)]
1558                {
1559                    self.end.offset_from(self.buf.as_ptr()) as usize
1560                },
1561                self.cap,
1562            )
1563        };
1564    }
1565}
1566
1567#[cfg(test)]
1568mod tests {
1569    use super::{
1570        CanonicalToken,
1571        OwningIter,
1572        Token,
1573        Tokens,
1574    };
1575    use alloc::{
1576        borrow::ToOwned,
1577        format,
1578        vec,
1579        vec::Vec,
1580    };
1581    use claims::{
1582        assert_matches,
1583        assert_none,
1584        assert_some,
1585        assert_some_eq,
1586    };
1587    use serde::de::Unexpected;
1588
1589    #[test]
1590    fn tokens_bool_eq() {
1591        assert_eq!(
1592            Tokens(vec![CanonicalToken::Bool(true)]),
1593            [Token::Bool(true)]
1594        );
1595    }
1596
1597    #[test]
1598    fn tokens_bool_ne() {
1599        assert_ne!(
1600            Tokens(vec![CanonicalToken::Bool(true)]),
1601            [Token::Bool(false)]
1602        );
1603    }
1604
1605    #[test]
1606    fn tokens_variant_ne() {
1607        assert_ne!(Tokens(vec![CanonicalToken::Bool(true)]), [Token::U16(42)]);
1608    }
1609
1610    #[test]
1611    fn tokens_empty_eq() {
1612        assert_eq!(Tokens(vec![]), []);
1613    }
1614
1615    #[test]
1616    fn tokens_multiple_eq() {
1617        assert_eq!(
1618            Tokens(vec![CanonicalToken::Bool(true), CanonicalToken::U8(42)]),
1619            [Token::Bool(true), Token::U8(42)]
1620        );
1621    }
1622
1623    #[test]
1624    fn tokens_multiple_ne_values() {
1625        assert_ne!(
1626            Tokens(vec![CanonicalToken::Bool(true), CanonicalToken::U8(42)]),
1627            [Token::Bool(false), Token::U8(42)]
1628        );
1629    }
1630
1631    #[test]
1632    fn tokens_multiple_ne_shorter() {
1633        assert_ne!(
1634            Tokens(vec![CanonicalToken::Bool(true), CanonicalToken::U8(42)]),
1635            [Token::Bool(true)]
1636        );
1637    }
1638
1639    #[test]
1640    fn tokens_multiple_ne_longer() {
1641        assert_ne!(
1642            Tokens(vec![CanonicalToken::Bool(true), CanonicalToken::U8(42)]),
1643            [Token::Bool(true), Token::U8(42), Token::U8(42)]
1644        );
1645    }
1646
1647    #[test]
1648    fn tokens_unordered_eq_same_order() {
1649        assert_eq!(
1650            Tokens(vec![CanonicalToken::Bool(true), CanonicalToken::U8(42)]),
1651            [Token::Unordered(&[&[Token::Bool(true)], &[Token::U8(42)]])],
1652        );
1653    }
1654
1655    #[test]
1656    fn tokens_unordered_eq_different_order() {
1657        assert_eq!(
1658            Tokens(vec![CanonicalToken::U8(42), CanonicalToken::Bool(true)]),
1659            [Token::Unordered(&[&[Token::Bool(true)], &[Token::U8(42)]])],
1660        );
1661    }
1662
1663    #[test]
1664    fn tokens_unordered_eq_within_other_tokens() {
1665        assert_eq!(
1666            Tokens(vec![
1667                CanonicalToken::Char('a'),
1668                CanonicalToken::U8(42),
1669                CanonicalToken::Bool(true),
1670                CanonicalToken::I16(-42)
1671            ]),
1672            [
1673                Token::Char('a'),
1674                Token::Unordered(&[&[Token::Bool(true)], &[Token::U8(42)]]),
1675                Token::I16(-42)
1676            ],
1677        );
1678    }
1679
1680    #[test]
1681    fn tokens_unordered_eq_multiple_tokens() {
1682        assert_eq!(
1683            Tokens(vec![
1684                CanonicalToken::U8(42),
1685                CanonicalToken::Bool(true),
1686                CanonicalToken::Char('a')
1687            ]),
1688            [Token::Unordered(&[
1689                &[Token::Bool(true), Token::Char('a')],
1690                &[Token::U8(42)]
1691            ])],
1692        );
1693    }
1694
1695    #[test]
1696    fn tokens_unordered_ne_empty() {
1697        assert_ne!(
1698            Tokens(vec![CanonicalToken::Bool(true)]),
1699            [Token::Unordered(&[])],
1700        );
1701    }
1702
1703    #[test]
1704    fn tokens_unordered_ne_variant() {
1705        assert_ne!(
1706            Tokens(vec![CanonicalToken::Bool(true)]),
1707            [Token::Unordered(&[&[Token::I8(42)]])],
1708        );
1709    }
1710
1711    #[test]
1712    fn tokens_unordered_ne_value() {
1713        assert_ne!(
1714            Tokens(vec![CanonicalToken::Bool(true)]),
1715            [Token::Unordered(&[&[Token::Bool(false)]])],
1716        );
1717    }
1718
1719    #[test]
1720    fn tokens_unordered_nested() {
1721        assert_eq!(
1722            Tokens(vec![
1723                CanonicalToken::Unit,
1724                CanonicalToken::U8(4),
1725                CanonicalToken::U8(3),
1726                CanonicalToken::U8(1),
1727                CanonicalToken::U8(2),
1728                CanonicalToken::Bool(true)
1729            ]),
1730            [Token::Unordered(&[
1731                &[Token::Bool(true)],
1732                &[Token::Unordered(&[
1733                    &[Token::U8(1), Token::U8(2)],
1734                    &[Token::U8(3)],
1735                ])],
1736                &[Token::Unit, Token::U8(4)],
1737            ])]
1738        );
1739    }
1740
1741    #[test]
1742    fn tokens_unordered_empty() {
1743        assert_eq!(
1744            Tokens(vec![CanonicalToken::Unit,]),
1745            [Token::Unordered(&[]), Token::Unit]
1746        );
1747    }
1748
1749    #[test]
1750    fn tokens_unordered_empty_nested() {
1751        assert_eq!(
1752            Tokens(vec![CanonicalToken::Unit,]),
1753            [Token::Unordered(&[&[Token::Unordered(&[])]]), Token::Unit]
1754        );
1755    }
1756
1757    #[test]
1758    fn tokens_unordered_empty_at_end() {
1759        assert_eq!(
1760            Tokens(vec![CanonicalToken::Unit,]),
1761            [Token::Unit, Token::Unordered(&[])]
1762        );
1763    }
1764
1765    #[test]
1766    fn tokens_unordered_nonempty_at_end() {
1767        assert_ne!(
1768            Tokens(vec![CanonicalToken::Unit,]),
1769            [Token::Unit, Token::Unordered(&[&[Token::Unit]])]
1770        );
1771    }
1772
1773    #[test]
1774    fn tokens_end_within_unordered() {
1775        assert_ne!(
1776            Tokens(vec![CanonicalToken::Unit,]),
1777            [Token::Unordered(&[&[Token::Unit,], &[Token::Unit]])]
1778        );
1779    }
1780
1781    #[test]
1782    fn tokens_end_within_unordered_more_tokens() {
1783        assert_ne!(
1784            Tokens(vec![CanonicalToken::Unit,]),
1785            [Token::Unordered(&[&[Token::Unit, Token::Unit]])]
1786        );
1787    }
1788
1789    #[test]
1790    fn tokens_end_within_unordered_nested_empty() {
1791        assert_eq!(
1792            Tokens(vec![CanonicalToken::Unit,]),
1793            [Token::Unordered(&[&[Token::Unit, Token::Unordered(&[])]])]
1794        );
1795    }
1796
1797    #[test]
1798    fn tokens_end_within_unordered_nested_nonempty() {
1799        assert_ne!(
1800            Tokens(vec![CanonicalToken::Unit,]),
1801            [Token::Unordered(&[&[
1802                Token::Unit,
1803                Token::Unordered(&[&[Token::Unit, Token::Unit], &[Token::Unit]])
1804            ]])]
1805        );
1806    }
1807
1808    #[test]
1809    fn token_from_canonical_token_bool() {
1810        assert_matches!(Token::from(CanonicalToken::Bool(true)), Token::Bool(true))
1811    }
1812
1813    #[test]
1814    fn token_from_canonical_token_i8() {
1815        assert_matches!(Token::from(CanonicalToken::I8(42)), Token::I8(42))
1816    }
1817
1818    #[test]
1819    fn token_from_canonical_token_i16() {
1820        assert_matches!(Token::from(CanonicalToken::I16(42)), Token::I16(42))
1821    }
1822
1823    #[test]
1824    fn token_from_canonical_token_i32() {
1825        assert_matches!(Token::from(CanonicalToken::I32(42)), Token::I32(42))
1826    }
1827
1828    #[test]
1829    fn token_from_canonical_token_i64() {
1830        assert_matches!(Token::from(CanonicalToken::I64(42)), Token::I64(42))
1831    }
1832
1833    #[test]
1834    fn token_from_canonical_token_i128() {
1835        assert_matches!(Token::from(CanonicalToken::I128(42)), Token::I128(42))
1836    }
1837
1838    #[test]
1839    fn token_from_canonical_token_u8() {
1840        assert_matches!(Token::from(CanonicalToken::U8(42)), Token::U8(42))
1841    }
1842
1843    #[test]
1844    fn token_from_canonical_token_u16() {
1845        assert_matches!(Token::from(CanonicalToken::U16(42)), Token::U16(42))
1846    }
1847
1848    #[test]
1849    fn token_from_canonical_token_u32() {
1850        assert_matches!(Token::from(CanonicalToken::U32(42)), Token::U32(42))
1851    }
1852
1853    #[test]
1854    fn token_from_canonical_token_u64() {
1855        assert_matches!(Token::from(CanonicalToken::U64(42)), Token::U64(42))
1856    }
1857
1858    #[test]
1859    fn token_from_canonical_token_u128() {
1860        assert_matches!(Token::from(CanonicalToken::U128(42)), Token::U128(42))
1861    }
1862
1863    #[test]
1864    fn token_from_canonical_token_f32() {
1865        assert_matches!(Token::from(CanonicalToken::F32(42.9)), Token::F32(_))
1866    }
1867
1868    #[test]
1869    fn token_from_canonical_token_f64() {
1870        assert_matches!(Token::from(CanonicalToken::F64(42.9)), Token::F64(_))
1871    }
1872
1873    #[test]
1874    fn token_from_canonical_token_char() {
1875        assert_matches!(Token::from(CanonicalToken::Char('a')), Token::Char('a'))
1876    }
1877
1878    #[test]
1879    fn token_from_canonical_token_str() {
1880        assert_matches!(
1881            Token::from(CanonicalToken::Str("foo".to_owned())),
1882            Token::Str(_)
1883        )
1884    }
1885
1886    #[test]
1887    fn token_from_canonical_token_bytes() {
1888        assert_matches!(
1889            Token::from(CanonicalToken::Bytes(b"foo".to_vec())),
1890            Token::Bytes(_)
1891        )
1892    }
1893
1894    #[test]
1895    fn token_from_canonical_token_none() {
1896        assert_matches!(Token::from(CanonicalToken::None), Token::None)
1897    }
1898
1899    #[test]
1900    fn token_from_canonical_token_some() {
1901        assert_matches!(Token::from(CanonicalToken::Some), Token::Some)
1902    }
1903
1904    #[test]
1905    fn token_from_canonical_token_unit() {
1906        assert_matches!(Token::from(CanonicalToken::Unit), Token::Unit)
1907    }
1908
1909    #[test]
1910    fn token_from_canonical_token_unit_struct() {
1911        assert_matches!(
1912            Token::from(CanonicalToken::UnitStruct { name: "foo" }),
1913            Token::UnitStruct { name: "foo" }
1914        )
1915    }
1916
1917    #[test]
1918    fn token_from_canonical_token_unit_variant() {
1919        assert_matches!(
1920            Token::from(CanonicalToken::UnitVariant {
1921                name: "foo",
1922                variant_index: 42,
1923                variant: "bar"
1924            }),
1925            Token::UnitVariant {
1926                name: "foo",
1927                variant_index: 42,
1928                variant: "bar"
1929            }
1930        )
1931    }
1932
1933    #[test]
1934    fn token_from_canonical_token_newtype_struct() {
1935        assert_matches!(
1936            Token::from(CanonicalToken::NewtypeStruct { name: "foo" }),
1937            Token::NewtypeStruct { name: "foo" }
1938        )
1939    }
1940
1941    #[test]
1942    fn token_from_canonical_token_newtype_variant() {
1943        assert_matches!(
1944            Token::from(CanonicalToken::NewtypeVariant {
1945                name: "foo",
1946                variant_index: 42,
1947                variant: "bar"
1948            }),
1949            Token::NewtypeVariant {
1950                name: "foo",
1951                variant_index: 42,
1952                variant: "bar"
1953            }
1954        )
1955    }
1956
1957    #[test]
1958    fn token_from_canonical_token_seq() {
1959        assert_matches!(
1960            Token::from(CanonicalToken::Seq { len: Some(42) }),
1961            Token::Seq { len: Some(42) }
1962        )
1963    }
1964
1965    #[test]
1966    fn token_from_canonical_token_seq_end() {
1967        assert_matches!(Token::from(CanonicalToken::SeqEnd), Token::SeqEnd)
1968    }
1969
1970    #[test]
1971    fn token_from_canonical_token_tuple() {
1972        assert_matches!(
1973            Token::from(CanonicalToken::Tuple { len: 42 }),
1974            Token::Tuple { len: 42 }
1975        )
1976    }
1977
1978    #[test]
1979    fn token_from_canonical_token_tuple_end() {
1980        assert_matches!(Token::from(CanonicalToken::TupleEnd), Token::TupleEnd)
1981    }
1982
1983    #[test]
1984    fn token_from_canonical_token_tuple_struct() {
1985        assert_matches!(
1986            Token::from(CanonicalToken::TupleStruct {
1987                name: "foo",
1988                len: 42
1989            }),
1990            Token::TupleStruct {
1991                name: "foo",
1992                len: 42
1993            }
1994        )
1995    }
1996
1997    #[test]
1998    fn token_from_canonical_token_tuple_struct_end() {
1999        assert_matches!(
2000            Token::from(CanonicalToken::TupleStructEnd),
2001            Token::TupleStructEnd
2002        )
2003    }
2004
2005    #[test]
2006    fn token_from_canonical_token_tuple_variant() {
2007        assert_matches!(
2008            Token::from(CanonicalToken::TupleVariant {
2009                name: "foo",
2010                variant_index: 42,
2011                variant: "bar",
2012                len: 42
2013            }),
2014            Token::TupleVariant {
2015                name: "foo",
2016                variant_index: 42,
2017                variant: "bar",
2018                len: 42
2019            }
2020        )
2021    }
2022
2023    #[test]
2024    fn token_from_canonical_token_tuple_variant_end() {
2025        assert_matches!(
2026            Token::from(CanonicalToken::TupleVariantEnd),
2027            Token::TupleVariantEnd
2028        )
2029    }
2030
2031    #[test]
2032    fn token_from_canonical_token_map() {
2033        assert_matches!(
2034            Token::from(CanonicalToken::Map { len: Some(42) }),
2035            Token::Map { len: Some(42) }
2036        )
2037    }
2038
2039    #[test]
2040    fn token_from_canonical_token_map_end() {
2041        assert_matches!(Token::from(CanonicalToken::MapEnd), Token::MapEnd)
2042    }
2043
2044    #[test]
2045    fn token_from_canonical_token_field() {
2046        assert_matches!(
2047            Token::from(CanonicalToken::Field("foo")),
2048            Token::Field("foo")
2049        )
2050    }
2051
2052    #[test]
2053    fn token_from_canonical_token_skipped_field() {
2054        assert_matches!(
2055            Token::from(CanonicalToken::SkippedField("foo")),
2056            Token::SkippedField("foo")
2057        )
2058    }
2059
2060    #[test]
2061    fn token_from_canonical_token_struct() {
2062        assert_matches!(
2063            Token::from(CanonicalToken::Struct {
2064                name: "foo",
2065                len: 42
2066            }),
2067            Token::Struct {
2068                name: "foo",
2069                len: 42
2070            }
2071        )
2072    }
2073
2074    #[test]
2075    fn token_from_canonical_token_struct_end() {
2076        assert_matches!(Token::from(CanonicalToken::StructEnd), Token::StructEnd)
2077    }
2078
2079    #[test]
2080    fn token_from_canonical_token_struct_variant() {
2081        assert_matches!(
2082            Token::from(CanonicalToken::StructVariant {
2083                name: "foo",
2084                variant_index: 42,
2085                variant: "bar",
2086                len: 42
2087            }),
2088            Token::StructVariant {
2089                name: "foo",
2090                variant_index: 42,
2091                variant: "bar",
2092                len: 42
2093            }
2094        )
2095    }
2096
2097    #[test]
2098    fn token_from_canonical_token_struct_variant_end() {
2099        assert_matches!(
2100            Token::from(CanonicalToken::StructVariantEnd),
2101            Token::StructVariantEnd
2102        )
2103    }
2104
2105    #[test]
2106    fn unexpected_from_canonical_token_bool() {
2107        assert_eq!(
2108            Unexpected::from(&mut CanonicalToken::Bool(true)),
2109            Unexpected::Bool(true)
2110        )
2111    }
2112
2113    #[test]
2114    fn unexpected_from_canonical_token_i8() {
2115        assert_eq!(
2116            Unexpected::from(&mut CanonicalToken::I8(42)),
2117            Unexpected::Signed(42)
2118        )
2119    }
2120
2121    #[test]
2122    fn unexpected_from_canonical_token_i16() {
2123        assert_eq!(
2124            Unexpected::from(&mut CanonicalToken::I16(42)),
2125            Unexpected::Signed(42)
2126        )
2127    }
2128
2129    #[test]
2130    fn unexpected_from_canonical_token_i32() {
2131        assert_eq!(
2132            Unexpected::from(&mut CanonicalToken::I32(42)),
2133            Unexpected::Signed(42)
2134        )
2135    }
2136
2137    #[test]
2138    fn unexpected_from_canonical_token_i64() {
2139        assert_eq!(
2140            Unexpected::from(&mut CanonicalToken::I64(42)),
2141            Unexpected::Signed(42)
2142        )
2143    }
2144
2145    #[test]
2146    fn unexpected_from_canonical_token_i128() {
2147        assert_eq!(
2148            Unexpected::from(&mut CanonicalToken::I128(42)),
2149            Unexpected::Other("i128")
2150        )
2151    }
2152
2153    #[test]
2154    fn unexpected_from_canonical_token_u8() {
2155        assert_eq!(
2156            Unexpected::from(&mut CanonicalToken::U8(42)),
2157            Unexpected::Unsigned(42)
2158        )
2159    }
2160
2161    #[test]
2162    fn unexpected_from_canonical_token_u16() {
2163        assert_eq!(
2164            Unexpected::from(&mut CanonicalToken::U16(42)),
2165            Unexpected::Unsigned(42)
2166        )
2167    }
2168
2169    #[test]
2170    fn unexpected_from_canonical_token_u32() {
2171        assert_eq!(
2172            Unexpected::from(&mut CanonicalToken::U32(42)),
2173            Unexpected::Unsigned(42)
2174        )
2175    }
2176
2177    #[test]
2178    fn unexpected_from_canonical_token_u64() {
2179        assert_eq!(
2180            Unexpected::from(&mut CanonicalToken::U64(42)),
2181            Unexpected::Unsigned(42)
2182        )
2183    }
2184
2185    #[test]
2186    fn unexpected_from_canonical_token_u128() {
2187        assert_eq!(
2188            Unexpected::from(&mut CanonicalToken::U128(42)),
2189            Unexpected::Other("u128")
2190        )
2191    }
2192
2193    #[test]
2194    fn unexpected_from_canonical_token_f32() {
2195        assert_eq!(
2196            Unexpected::from(&mut CanonicalToken::F32(42.)),
2197            Unexpected::Float(42.)
2198        )
2199    }
2200
2201    #[test]
2202    fn unexpected_from_canonical_token_f64() {
2203        assert_eq!(
2204            Unexpected::from(&mut CanonicalToken::F64(42.)),
2205            Unexpected::Float(42.)
2206        )
2207    }
2208
2209    #[test]
2210    fn unexpected_from_canonical_token_char() {
2211        assert_eq!(
2212            Unexpected::from(&mut CanonicalToken::Char('a')),
2213            Unexpected::Char('a')
2214        )
2215    }
2216
2217    #[test]
2218    fn unexpected_from_canonical_token_str() {
2219        assert_eq!(
2220            Unexpected::from(&mut CanonicalToken::Str("foo".to_owned())),
2221            Unexpected::Str("foo")
2222        )
2223    }
2224
2225    #[test]
2226    fn unexpected_from_canonical_token_bytes() {
2227        assert_eq!(
2228            Unexpected::from(&mut CanonicalToken::Bytes(b"foo".to_vec())),
2229            Unexpected::Bytes(b"foo")
2230        )
2231    }
2232
2233    #[test]
2234    fn unexpected_from_canonical_token_some() {
2235        assert_eq!(
2236            Unexpected::from(&mut CanonicalToken::Some),
2237            Unexpected::Option
2238        )
2239    }
2240
2241    #[test]
2242    fn unexpected_from_canonical_token_none() {
2243        assert_eq!(
2244            Unexpected::from(&mut CanonicalToken::None),
2245            Unexpected::Option
2246        )
2247    }
2248
2249    #[test]
2250    fn unexpected_from_canonical_token_unit() {
2251        assert_eq!(
2252            Unexpected::from(&mut CanonicalToken::Unit),
2253            Unexpected::Unit
2254        )
2255    }
2256
2257    #[test]
2258    fn unexpected_from_canonical_token_unit_struct() {
2259        assert_eq!(
2260            Unexpected::from(&mut CanonicalToken::UnitStruct { name: "foo" }),
2261            Unexpected::Unit
2262        )
2263    }
2264
2265    #[test]
2266    fn unexpected_from_canonical_token_unit_variant() {
2267        assert_eq!(
2268            Unexpected::from(&mut CanonicalToken::UnitVariant {
2269                name: "foo",
2270                variant_index: 0,
2271                variant: "bar"
2272            }),
2273            Unexpected::UnitVariant
2274        )
2275    }
2276
2277    #[test]
2278    fn unexpected_from_canonical_token_newtype_struct() {
2279        assert_eq!(
2280            Unexpected::from(&mut CanonicalToken::NewtypeStruct { name: "foo" }),
2281            Unexpected::NewtypeStruct
2282        )
2283    }
2284
2285    #[test]
2286    fn unexpected_from_canonical_token_newtype_variant() {
2287        assert_eq!(
2288            Unexpected::from(&mut CanonicalToken::NewtypeVariant {
2289                name: "foo",
2290                variant_index: 0,
2291                variant: "bar"
2292            }),
2293            Unexpected::NewtypeVariant
2294        )
2295    }
2296
2297    #[test]
2298    fn unexpected_from_canonical_token_seq() {
2299        assert_eq!(
2300            Unexpected::from(&mut CanonicalToken::Seq { len: None }),
2301            Unexpected::Seq
2302        )
2303    }
2304
2305    #[test]
2306    fn unexpected_from_canonical_token_tuple() {
2307        assert_eq!(
2308            Unexpected::from(&mut CanonicalToken::Tuple { len: 0 }),
2309            Unexpected::Seq
2310        )
2311    }
2312
2313    #[test]
2314    fn unexpected_from_canonical_token_seq_end() {
2315        assert_eq!(
2316            Unexpected::from(&mut CanonicalToken::SeqEnd),
2317            Unexpected::Other("SeqEnd")
2318        )
2319    }
2320
2321    #[test]
2322    fn unexpected_from_canonical_token_tuple_end() {
2323        assert_eq!(
2324            Unexpected::from(&mut CanonicalToken::TupleEnd),
2325            Unexpected::Other("TupleEnd")
2326        )
2327    }
2328
2329    #[test]
2330    fn unexpected_from_canonical_token_tuple_struct() {
2331        assert_eq!(
2332            Unexpected::from(&mut CanonicalToken::TupleStruct {
2333                name: "foo",
2334                len: 0
2335            }),
2336            Unexpected::Other("TupleStruct")
2337        )
2338    }
2339
2340    #[test]
2341    fn unexpected_from_canonical_token_tuple_struct_end() {
2342        assert_eq!(
2343            Unexpected::from(&mut CanonicalToken::TupleStructEnd),
2344            Unexpected::Other("TupleStructEnd")
2345        )
2346    }
2347
2348    #[test]
2349    fn unexpected_from_canonical_token_tuple_variant() {
2350        assert_eq!(
2351            Unexpected::from(&mut CanonicalToken::TupleVariant {
2352                name: "foo",
2353                variant_index: 0,
2354                variant: "bar",
2355                len: 0
2356            }),
2357            Unexpected::TupleVariant
2358        )
2359    }
2360
2361    #[test]
2362    fn unexpected_from_canonical_token_tuple_variant_end() {
2363        assert_eq!(
2364            Unexpected::from(&mut CanonicalToken::TupleVariantEnd),
2365            Unexpected::Other("TupleVariantEnd")
2366        )
2367    }
2368
2369    #[test]
2370    fn unexpected_from_canonical_token_map() {
2371        assert_eq!(
2372            Unexpected::from(&mut CanonicalToken::Map { len: None }),
2373            Unexpected::Map
2374        )
2375    }
2376
2377    #[test]
2378    fn unexpected_from_canonical_token_map_end() {
2379        assert_eq!(
2380            Unexpected::from(&mut CanonicalToken::MapEnd),
2381            Unexpected::Other("MapEnd")
2382        )
2383    }
2384
2385    #[test]
2386    fn unexpected_from_canonical_token_field() {
2387        assert_eq!(
2388            Unexpected::from(&mut CanonicalToken::Field("foo")),
2389            Unexpected::Other("Field")
2390        )
2391    }
2392
2393    #[test]
2394    fn unexpected_from_canonical_token_skipped_field() {
2395        assert_eq!(
2396            Unexpected::from(&mut CanonicalToken::SkippedField("foo")),
2397            Unexpected::Other("SkippedField")
2398        )
2399    }
2400
2401    #[test]
2402    fn unexpected_from_canonical_token_struct() {
2403        assert_eq!(
2404            Unexpected::from(&mut CanonicalToken::Struct {
2405                name: "foo",
2406                len: 0
2407            }),
2408            Unexpected::Other("Struct")
2409        )
2410    }
2411
2412    #[test]
2413    fn unexpected_from_canonical_token_struct_end() {
2414        assert_eq!(
2415            Unexpected::from(&mut CanonicalToken::StructEnd),
2416            Unexpected::Other("StructEnd")
2417        )
2418    }
2419
2420    #[test]
2421    fn unexpected_from_canonical_token_struct_variant() {
2422        assert_eq!(
2423            Unexpected::from(&mut CanonicalToken::StructVariant {
2424                name: "foo",
2425                variant_index: 0,
2426                variant: "bar",
2427                len: 0
2428            }),
2429            Unexpected::StructVariant
2430        )
2431    }
2432
2433    #[test]
2434    fn unexpected_from_canonical_token_struct_variant_end() {
2435        assert_eq!(
2436            Unexpected::from(&mut CanonicalToken::StructVariantEnd),
2437            Unexpected::Other("StructVariantEnd")
2438        )
2439    }
2440
2441    #[test]
2442    fn owning_iter_empty() {
2443        let mut iter = OwningIter::new(Tokens(Vec::new()));
2444
2445        assert_none!(iter.next());
2446    }
2447
2448    #[test]
2449    fn owning_iter_one_token() {
2450        let mut iter = OwningIter::new(Tokens(vec![CanonicalToken::Bool(true)]));
2451
2452        assert_some_eq!(iter.next(), &mut CanonicalToken::Bool(true));
2453        assert_none!(iter.next());
2454    }
2455
2456    #[test]
2457    fn owning_iter_multiple_tokens() {
2458        let mut iter = OwningIter::new(Tokens(vec![
2459            CanonicalToken::Bool(true),
2460            CanonicalToken::U64(42),
2461            CanonicalToken::Str("foo".to_owned()),
2462        ]));
2463
2464        assert_some_eq!(iter.next(), &mut CanonicalToken::Bool(true));
2465        assert_some_eq!(iter.next(), &mut CanonicalToken::U64(42));
2466        assert_some_eq!(iter.next(), &mut CanonicalToken::Str("foo".to_owned()));
2467        assert_none!(iter.next());
2468    }
2469
2470    #[test]
2471    fn owning_iter_empty_debug() {
2472        let iter = OwningIter::new(Tokens(Vec::new()));
2473
2474        assert_eq!(format!("{:?}", iter), "OwningIter([])")
2475    }
2476
2477    #[test]
2478    fn owning_iter_uniterated_debug() {
2479        let iter = OwningIter::new(Tokens(vec![
2480            CanonicalToken::Bool(true),
2481            CanonicalToken::U64(42),
2482            CanonicalToken::Str("foo".to_owned()),
2483        ]));
2484
2485        assert_eq!(
2486            format!("{:?}", iter),
2487            "OwningIter([Bool(true), U64(42), Str(\"foo\")])"
2488        )
2489    }
2490
2491    #[test]
2492    fn owning_iter_partially_iterated_debug() {
2493        let mut iter = OwningIter::new(Tokens(vec![
2494            CanonicalToken::Bool(true),
2495            CanonicalToken::U64(42),
2496            CanonicalToken::Str("foo".to_owned()),
2497        ]));
2498
2499        assert_some!(iter.next());
2500
2501        assert_eq!(format!("{:?}", iter), "OwningIter([U64(42), Str(\"foo\")])")
2502    }
2503
2504    #[test]
2505    fn owning_iter_fully_iterated_debug() {
2506        let mut iter = OwningIter::new(Tokens(vec![
2507            CanonicalToken::Bool(true),
2508            CanonicalToken::U64(42),
2509            CanonicalToken::Str("foo".to_owned()),
2510        ]));
2511
2512        assert_some!(iter.next());
2513        assert_some!(iter.next());
2514        assert_some!(iter.next());
2515
2516        assert_eq!(format!("{:?}", iter), "OwningIter([])")
2517    }
2518}