17e2e9c0cSopenharmony_ci#![allow(
27e2e9c0cSopenharmony_ci    clippy::cast_lossless,
37e2e9c0cSopenharmony_ci    clippy::decimal_literal_representation,
47e2e9c0cSopenharmony_ci    clippy::derive_partial_eq_without_eq,
57e2e9c0cSopenharmony_ci    clippy::empty_enum,
67e2e9c0cSopenharmony_ci    clippy::manual_assert,
77e2e9c0cSopenharmony_ci    clippy::needless_pass_by_value,
87e2e9c0cSopenharmony_ci    clippy::uninlined_format_args,
97e2e9c0cSopenharmony_ci    clippy::unreadable_literal
107e2e9c0cSopenharmony_ci)]
117e2e9c0cSopenharmony_ci#![cfg_attr(feature = "unstable", feature(never_type))]
127e2e9c0cSopenharmony_ci
137e2e9c0cSopenharmony_ciuse fnv::FnvHasher;
147e2e9c0cSopenharmony_ciuse serde::de::value::{F32Deserializer, F64Deserializer};
157e2e9c0cSopenharmony_ciuse serde::de::{Deserialize, DeserializeOwned, Deserializer, IntoDeserializer};
167e2e9c0cSopenharmony_ciuse serde_derive::Deserialize;
177e2e9c0cSopenharmony_ciuse serde_test::{assert_de_tokens, Configure, Token};
187e2e9c0cSopenharmony_ciuse std::collections::{BTreeMap, BTreeSet, HashMap, HashSet};
197e2e9c0cSopenharmony_ciuse std::default::Default;
207e2e9c0cSopenharmony_ciuse std::ffi::{CStr, CString, OsString};
217e2e9c0cSopenharmony_ciuse std::fmt::Debug;
227e2e9c0cSopenharmony_ciuse std::iter;
237e2e9c0cSopenharmony_ciuse std::net;
247e2e9c0cSopenharmony_ciuse std::num::{
257e2e9c0cSopenharmony_ci    NonZeroI128, NonZeroI16, NonZeroI32, NonZeroI64, NonZeroI8, NonZeroIsize, NonZeroU128,
267e2e9c0cSopenharmony_ci    NonZeroU16, NonZeroU32, NonZeroU64, NonZeroU8, NonZeroUsize, Wrapping,
277e2e9c0cSopenharmony_ci};
287e2e9c0cSopenharmony_ciuse std::ops::Bound;
297e2e9c0cSopenharmony_ciuse std::path::{Path, PathBuf};
307e2e9c0cSopenharmony_ciuse std::rc::{Rc, Weak as RcWeak};
317e2e9c0cSopenharmony_ciuse std::sync::atomic::{
327e2e9c0cSopenharmony_ci    AtomicBool, AtomicI16, AtomicI32, AtomicI8, AtomicIsize, AtomicU16, AtomicU32, AtomicU8,
337e2e9c0cSopenharmony_ci    AtomicUsize, Ordering,
347e2e9c0cSopenharmony_ci};
357e2e9c0cSopenharmony_ci#[cfg(target_arch = "x86_64")]
367e2e9c0cSopenharmony_ciuse std::sync::atomic::{AtomicI64, AtomicU64};
377e2e9c0cSopenharmony_ciuse std::sync::{Arc, Weak as ArcWeak};
387e2e9c0cSopenharmony_ciuse std::time::{Duration, UNIX_EPOCH};
397e2e9c0cSopenharmony_ci
407e2e9c0cSopenharmony_ci#[macro_use]
417e2e9c0cSopenharmony_cimod macros;
427e2e9c0cSopenharmony_ci
437e2e9c0cSopenharmony_ci//////////////////////////////////////////////////////////////////////////
447e2e9c0cSopenharmony_ci
457e2e9c0cSopenharmony_ci#[derive(Copy, Clone, PartialEq, Debug, Deserialize)]
467e2e9c0cSopenharmony_cistruct UnitStruct;
477e2e9c0cSopenharmony_ci
487e2e9c0cSopenharmony_ci#[derive(Copy, Clone, PartialEq, Debug, Deserialize)]
497e2e9c0cSopenharmony_cistruct GenericUnitStruct<const N: u8>;
507e2e9c0cSopenharmony_ci
517e2e9c0cSopenharmony_ci#[derive(PartialEq, Debug, Deserialize)]
527e2e9c0cSopenharmony_cistruct NewtypeStruct(i32);
537e2e9c0cSopenharmony_ci
547e2e9c0cSopenharmony_ci#[derive(PartialEq, Debug, Deserialize)]
557e2e9c0cSopenharmony_cistruct TupleStruct(i32, i32, i32);
567e2e9c0cSopenharmony_ci
577e2e9c0cSopenharmony_ci#[derive(PartialEq, Debug, Deserialize)]
587e2e9c0cSopenharmony_cistruct Struct {
597e2e9c0cSopenharmony_ci    a: i32,
607e2e9c0cSopenharmony_ci    b: i32,
617e2e9c0cSopenharmony_ci    #[serde(skip_deserializing)]
627e2e9c0cSopenharmony_ci    c: i32,
637e2e9c0cSopenharmony_ci}
647e2e9c0cSopenharmony_ci
657e2e9c0cSopenharmony_ci#[derive(PartialEq, Debug, Deserialize)]
667e2e9c0cSopenharmony_ci#[serde(default)]
677e2e9c0cSopenharmony_cistruct StructDefault<T> {
687e2e9c0cSopenharmony_ci    a: i32,
697e2e9c0cSopenharmony_ci    b: T,
707e2e9c0cSopenharmony_ci}
717e2e9c0cSopenharmony_ci
727e2e9c0cSopenharmony_ciimpl Default for StructDefault<String> {
737e2e9c0cSopenharmony_ci    fn default() -> Self {
747e2e9c0cSopenharmony_ci        StructDefault {
757e2e9c0cSopenharmony_ci            a: 100,
767e2e9c0cSopenharmony_ci            b: "default".to_string(),
777e2e9c0cSopenharmony_ci        }
787e2e9c0cSopenharmony_ci    }
797e2e9c0cSopenharmony_ci}
807e2e9c0cSopenharmony_ci
817e2e9c0cSopenharmony_ci#[derive(PartialEq, Debug, Deserialize)]
827e2e9c0cSopenharmony_cistruct StructSkipAll {
837e2e9c0cSopenharmony_ci    #[serde(skip_deserializing)]
847e2e9c0cSopenharmony_ci    a: i32,
857e2e9c0cSopenharmony_ci}
867e2e9c0cSopenharmony_ci
877e2e9c0cSopenharmony_ci#[derive(PartialEq, Debug, Deserialize)]
887e2e9c0cSopenharmony_ci#[serde(default)]
897e2e9c0cSopenharmony_cistruct StructSkipDefault {
907e2e9c0cSopenharmony_ci    #[serde(skip_deserializing)]
917e2e9c0cSopenharmony_ci    a: i32,
927e2e9c0cSopenharmony_ci}
937e2e9c0cSopenharmony_ci
947e2e9c0cSopenharmony_ci#[derive(PartialEq, Debug, Deserialize)]
957e2e9c0cSopenharmony_ci#[serde(default)]
967e2e9c0cSopenharmony_cistruct StructSkipDefaultGeneric<T> {
977e2e9c0cSopenharmony_ci    #[serde(skip_deserializing)]
987e2e9c0cSopenharmony_ci    t: T,
997e2e9c0cSopenharmony_ci}
1007e2e9c0cSopenharmony_ci
1017e2e9c0cSopenharmony_ciimpl Default for StructSkipDefault {
1027e2e9c0cSopenharmony_ci    fn default() -> Self {
1037e2e9c0cSopenharmony_ci        StructSkipDefault { a: 16 }
1047e2e9c0cSopenharmony_ci    }
1057e2e9c0cSopenharmony_ci}
1067e2e9c0cSopenharmony_ci
1077e2e9c0cSopenharmony_ci#[derive(PartialEq, Debug, Deserialize)]
1087e2e9c0cSopenharmony_ci#[serde(deny_unknown_fields)]
1097e2e9c0cSopenharmony_cistruct StructSkipAllDenyUnknown {
1107e2e9c0cSopenharmony_ci    #[serde(skip_deserializing)]
1117e2e9c0cSopenharmony_ci    a: i32,
1127e2e9c0cSopenharmony_ci}
1137e2e9c0cSopenharmony_ci
1147e2e9c0cSopenharmony_ci#[derive(Default, PartialEq, Debug)]
1157e2e9c0cSopenharmony_cistruct NotDeserializable;
1167e2e9c0cSopenharmony_ci
1177e2e9c0cSopenharmony_ci#[derive(PartialEq, Debug, Deserialize)]
1187e2e9c0cSopenharmony_cienum Enum {
1197e2e9c0cSopenharmony_ci    #[allow(dead_code)]
1207e2e9c0cSopenharmony_ci    #[serde(skip_deserializing)]
1217e2e9c0cSopenharmony_ci    Skipped,
1227e2e9c0cSopenharmony_ci    Unit,
1237e2e9c0cSopenharmony_ci    Simple(i32),
1247e2e9c0cSopenharmony_ci    Seq(i32, i32, i32),
1257e2e9c0cSopenharmony_ci    Map {
1267e2e9c0cSopenharmony_ci        a: i32,
1277e2e9c0cSopenharmony_ci        b: i32,
1287e2e9c0cSopenharmony_ci        c: i32,
1297e2e9c0cSopenharmony_ci    },
1307e2e9c0cSopenharmony_ci    SimpleWithSkipped(#[serde(skip_deserializing)] NotDeserializable),
1317e2e9c0cSopenharmony_ci}
1327e2e9c0cSopenharmony_ci
1337e2e9c0cSopenharmony_ci#[derive(PartialEq, Debug, Deserialize)]
1347e2e9c0cSopenharmony_cienum EnumOther {
1357e2e9c0cSopenharmony_ci    Unit,
1367e2e9c0cSopenharmony_ci    #[serde(other)]
1377e2e9c0cSopenharmony_ci    Other,
1387e2e9c0cSopenharmony_ci}
1397e2e9c0cSopenharmony_ci
1407e2e9c0cSopenharmony_ci#[derive(PartialEq, Debug)]
1417e2e9c0cSopenharmony_cistruct IgnoredAny;
1427e2e9c0cSopenharmony_ci
1437e2e9c0cSopenharmony_ciimpl<'de> Deserialize<'de> for IgnoredAny {
1447e2e9c0cSopenharmony_ci    fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
1457e2e9c0cSopenharmony_ci    where
1467e2e9c0cSopenharmony_ci        D: Deserializer<'de>,
1477e2e9c0cSopenharmony_ci    {
1487e2e9c0cSopenharmony_ci        serde::de::IgnoredAny::deserialize(deserializer)?;
1497e2e9c0cSopenharmony_ci        Ok(IgnoredAny)
1507e2e9c0cSopenharmony_ci    }
1517e2e9c0cSopenharmony_ci}
1527e2e9c0cSopenharmony_ci
1537e2e9c0cSopenharmony_ci//////////////////////////////////////////////////////////////////////////
1547e2e9c0cSopenharmony_ci
1557e2e9c0cSopenharmony_ci#[track_caller]
1567e2e9c0cSopenharmony_cifn test<'de, T>(value: T, tokens: &'de [Token])
1577e2e9c0cSopenharmony_ciwhere
1587e2e9c0cSopenharmony_ci    T: Deserialize<'de> + PartialEq + Debug,
1597e2e9c0cSopenharmony_ci{
1607e2e9c0cSopenharmony_ci    // Test ser/de roundtripping
1617e2e9c0cSopenharmony_ci    assert_de_tokens(&value, tokens);
1627e2e9c0cSopenharmony_ci
1637e2e9c0cSopenharmony_ci    // Test that the tokens are ignorable
1647e2e9c0cSopenharmony_ci    assert_de_tokens_ignore(tokens);
1657e2e9c0cSopenharmony_ci}
1667e2e9c0cSopenharmony_ci
1677e2e9c0cSopenharmony_ci#[derive(Debug)]
1687e2e9c0cSopenharmony_cistruct SkipPartialEq<T>(T);
1697e2e9c0cSopenharmony_ci
1707e2e9c0cSopenharmony_ciimpl<'de, T> Deserialize<'de> for SkipPartialEq<T>
1717e2e9c0cSopenharmony_ciwhere
1727e2e9c0cSopenharmony_ci    T: Deserialize<'de>,
1737e2e9c0cSopenharmony_ci{
1747e2e9c0cSopenharmony_ci    fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
1757e2e9c0cSopenharmony_ci    where
1767e2e9c0cSopenharmony_ci        D: Deserializer<'de>,
1777e2e9c0cSopenharmony_ci    {
1787e2e9c0cSopenharmony_ci        T::deserialize(deserializer).map(SkipPartialEq)
1797e2e9c0cSopenharmony_ci    }
1807e2e9c0cSopenharmony_ci}
1817e2e9c0cSopenharmony_ci
1827e2e9c0cSopenharmony_ciimpl<T> PartialEq for SkipPartialEq<T> {
1837e2e9c0cSopenharmony_ci    fn eq(&self, _other: &Self) -> bool {
1847e2e9c0cSopenharmony_ci        true
1857e2e9c0cSopenharmony_ci    }
1867e2e9c0cSopenharmony_ci}
1877e2e9c0cSopenharmony_ci
1887e2e9c0cSopenharmony_ci#[track_caller]
1897e2e9c0cSopenharmony_cifn assert_de_tokens_ignore(ignorable_tokens: &[Token]) {
1907e2e9c0cSopenharmony_ci    #[derive(PartialEq, Debug, Deserialize)]
1917e2e9c0cSopenharmony_ci    struct IgnoreBase {
1927e2e9c0cSopenharmony_ci        a: i32,
1937e2e9c0cSopenharmony_ci    }
1947e2e9c0cSopenharmony_ci
1957e2e9c0cSopenharmony_ci    // Embed the tokens to be ignored in the normal token
1967e2e9c0cSopenharmony_ci    // stream for an IgnoreBase type
1977e2e9c0cSopenharmony_ci    let concated_tokens: Vec<Token> = vec![
1987e2e9c0cSopenharmony_ci        Token::Map { len: Some(2) },
1997e2e9c0cSopenharmony_ci        Token::Str("a"),
2007e2e9c0cSopenharmony_ci        Token::I32(1),
2017e2e9c0cSopenharmony_ci        Token::Str("ignored"),
2027e2e9c0cSopenharmony_ci    ]
2037e2e9c0cSopenharmony_ci    .into_iter()
2047e2e9c0cSopenharmony_ci    .chain(ignorable_tokens.iter().copied())
2057e2e9c0cSopenharmony_ci    .chain(iter::once(Token::MapEnd))
2067e2e9c0cSopenharmony_ci    .collect();
2077e2e9c0cSopenharmony_ci
2087e2e9c0cSopenharmony_ci    let expected = IgnoreBase { a: 1 };
2097e2e9c0cSopenharmony_ci    assert_de_tokens(&expected, &concated_tokens);
2107e2e9c0cSopenharmony_ci}
2117e2e9c0cSopenharmony_ci
2127e2e9c0cSopenharmony_ci//////////////////////////////////////////////////////////////////////////
2137e2e9c0cSopenharmony_ci
2147e2e9c0cSopenharmony_ci#[test]
2157e2e9c0cSopenharmony_cifn test_bool() {
2167e2e9c0cSopenharmony_ci    test(true, &[Token::Bool(true)]);
2177e2e9c0cSopenharmony_ci    test(false, &[Token::Bool(false)]);
2187e2e9c0cSopenharmony_ci}
2197e2e9c0cSopenharmony_ci
2207e2e9c0cSopenharmony_ci#[test]
2217e2e9c0cSopenharmony_cifn test_i8() {
2227e2e9c0cSopenharmony_ci    let test = test::<i8>;
2237e2e9c0cSopenharmony_ci
2247e2e9c0cSopenharmony_ci    // from signed
2257e2e9c0cSopenharmony_ci    test(-128, &[Token::I8(-128)]);
2267e2e9c0cSopenharmony_ci    test(-128, &[Token::I16(-128)]);
2277e2e9c0cSopenharmony_ci    test(-128, &[Token::I32(-128)]);
2287e2e9c0cSopenharmony_ci    test(-128, &[Token::I64(-128)]);
2297e2e9c0cSopenharmony_ci    test(127, &[Token::I8(127)]);
2307e2e9c0cSopenharmony_ci    test(127, &[Token::I16(127)]);
2317e2e9c0cSopenharmony_ci    test(127, &[Token::I32(127)]);
2327e2e9c0cSopenharmony_ci    test(127, &[Token::I64(127)]);
2337e2e9c0cSopenharmony_ci
2347e2e9c0cSopenharmony_ci    // from unsigned
2357e2e9c0cSopenharmony_ci    test(0, &[Token::U8(0)]);
2367e2e9c0cSopenharmony_ci    test(0, &[Token::U16(0)]);
2377e2e9c0cSopenharmony_ci    test(0, &[Token::U32(0)]);
2387e2e9c0cSopenharmony_ci    test(0, &[Token::U64(0)]);
2397e2e9c0cSopenharmony_ci    test(127, &[Token::U8(127)]);
2407e2e9c0cSopenharmony_ci    test(127, &[Token::U16(127)]);
2417e2e9c0cSopenharmony_ci    test(127, &[Token::U32(127)]);
2427e2e9c0cSopenharmony_ci    test(127, &[Token::U64(127)]);
2437e2e9c0cSopenharmony_ci}
2447e2e9c0cSopenharmony_ci
2457e2e9c0cSopenharmony_ci#[test]
2467e2e9c0cSopenharmony_cifn test_i16() {
2477e2e9c0cSopenharmony_ci    let test = test::<i16>;
2487e2e9c0cSopenharmony_ci
2497e2e9c0cSopenharmony_ci    // from signed
2507e2e9c0cSopenharmony_ci    test(-128, &[Token::I8(-128)]);
2517e2e9c0cSopenharmony_ci    test(-32768, &[Token::I16(-32768)]);
2527e2e9c0cSopenharmony_ci    test(-32768, &[Token::I32(-32768)]);
2537e2e9c0cSopenharmony_ci    test(-32768, &[Token::I64(-32768)]);
2547e2e9c0cSopenharmony_ci    test(127, &[Token::I8(127)]);
2557e2e9c0cSopenharmony_ci    test(32767, &[Token::I16(32767)]);
2567e2e9c0cSopenharmony_ci    test(32767, &[Token::I32(32767)]);
2577e2e9c0cSopenharmony_ci    test(32767, &[Token::I64(32767)]);
2587e2e9c0cSopenharmony_ci
2597e2e9c0cSopenharmony_ci    // from unsigned
2607e2e9c0cSopenharmony_ci    test(0, &[Token::U8(0)]);
2617e2e9c0cSopenharmony_ci    test(0, &[Token::U16(0)]);
2627e2e9c0cSopenharmony_ci    test(0, &[Token::U32(0)]);
2637e2e9c0cSopenharmony_ci    test(0, &[Token::U64(0)]);
2647e2e9c0cSopenharmony_ci    test(255, &[Token::U8(255)]);
2657e2e9c0cSopenharmony_ci    test(32767, &[Token::U16(32767)]);
2667e2e9c0cSopenharmony_ci    test(32767, &[Token::U32(32767)]);
2677e2e9c0cSopenharmony_ci    test(32767, &[Token::U64(32767)]);
2687e2e9c0cSopenharmony_ci}
2697e2e9c0cSopenharmony_ci
2707e2e9c0cSopenharmony_ci#[test]
2717e2e9c0cSopenharmony_cifn test_i32() {
2727e2e9c0cSopenharmony_ci    let test = test::<i32>;
2737e2e9c0cSopenharmony_ci
2747e2e9c0cSopenharmony_ci    // from signed
2757e2e9c0cSopenharmony_ci    test(-128, &[Token::I8(-128)]);
2767e2e9c0cSopenharmony_ci    test(-32768, &[Token::I16(-32768)]);
2777e2e9c0cSopenharmony_ci    test(-2147483648, &[Token::I32(-2147483648)]);
2787e2e9c0cSopenharmony_ci    test(-2147483648, &[Token::I64(-2147483648)]);
2797e2e9c0cSopenharmony_ci    test(127, &[Token::I8(127)]);
2807e2e9c0cSopenharmony_ci    test(32767, &[Token::I16(32767)]);
2817e2e9c0cSopenharmony_ci    test(2147483647, &[Token::I32(2147483647)]);
2827e2e9c0cSopenharmony_ci    test(2147483647, &[Token::I64(2147483647)]);
2837e2e9c0cSopenharmony_ci
2847e2e9c0cSopenharmony_ci    // from unsigned
2857e2e9c0cSopenharmony_ci    test(0, &[Token::U8(0)]);
2867e2e9c0cSopenharmony_ci    test(0, &[Token::U16(0)]);
2877e2e9c0cSopenharmony_ci    test(0, &[Token::U32(0)]);
2887e2e9c0cSopenharmony_ci    test(0, &[Token::U64(0)]);
2897e2e9c0cSopenharmony_ci    test(255, &[Token::U8(255)]);
2907e2e9c0cSopenharmony_ci    test(65535, &[Token::U16(65535)]);
2917e2e9c0cSopenharmony_ci    test(2147483647, &[Token::U32(2147483647)]);
2927e2e9c0cSopenharmony_ci    test(2147483647, &[Token::U64(2147483647)]);
2937e2e9c0cSopenharmony_ci}
2947e2e9c0cSopenharmony_ci
2957e2e9c0cSopenharmony_ci#[test]
2967e2e9c0cSopenharmony_cifn test_i64() {
2977e2e9c0cSopenharmony_ci    let test = test::<i64>;
2987e2e9c0cSopenharmony_ci
2997e2e9c0cSopenharmony_ci    // from signed
3007e2e9c0cSopenharmony_ci    test(-128, &[Token::I8(-128)]);
3017e2e9c0cSopenharmony_ci    test(-32768, &[Token::I16(-32768)]);
3027e2e9c0cSopenharmony_ci    test(-2147483648, &[Token::I32(-2147483648)]);
3037e2e9c0cSopenharmony_ci    test(-9223372036854775808, &[Token::I64(-9223372036854775808)]);
3047e2e9c0cSopenharmony_ci    test(127, &[Token::I8(127)]);
3057e2e9c0cSopenharmony_ci    test(32767, &[Token::I16(32767)]);
3067e2e9c0cSopenharmony_ci    test(2147483647, &[Token::I32(2147483647)]);
3077e2e9c0cSopenharmony_ci    test(9223372036854775807, &[Token::I64(9223372036854775807)]);
3087e2e9c0cSopenharmony_ci
3097e2e9c0cSopenharmony_ci    // from unsigned
3107e2e9c0cSopenharmony_ci    test(0, &[Token::U8(0)]);
3117e2e9c0cSopenharmony_ci    test(0, &[Token::U16(0)]);
3127e2e9c0cSopenharmony_ci    test(0, &[Token::U32(0)]);
3137e2e9c0cSopenharmony_ci    test(0, &[Token::U64(0)]);
3147e2e9c0cSopenharmony_ci    test(255, &[Token::U8(255)]);
3157e2e9c0cSopenharmony_ci    test(65535, &[Token::U16(65535)]);
3167e2e9c0cSopenharmony_ci    test(4294967295, &[Token::U32(4294967295)]);
3177e2e9c0cSopenharmony_ci    test(9223372036854775807, &[Token::U64(9223372036854775807)]);
3187e2e9c0cSopenharmony_ci}
3197e2e9c0cSopenharmony_ci
3207e2e9c0cSopenharmony_ci#[test]
3217e2e9c0cSopenharmony_cifn test_i128() {
3227e2e9c0cSopenharmony_ci    let test = test::<i128>;
3237e2e9c0cSopenharmony_ci
3247e2e9c0cSopenharmony_ci    // from signed
3257e2e9c0cSopenharmony_ci    test(-128, &[Token::I8(-128)]);
3267e2e9c0cSopenharmony_ci    test(-32768, &[Token::I16(-32768)]);
3277e2e9c0cSopenharmony_ci    test(-2147483648, &[Token::I32(-2147483648)]);
3287e2e9c0cSopenharmony_ci    test(-9223372036854775808, &[Token::I64(-9223372036854775808)]);
3297e2e9c0cSopenharmony_ci    test(127, &[Token::I8(127)]);
3307e2e9c0cSopenharmony_ci    test(32767, &[Token::I16(32767)]);
3317e2e9c0cSopenharmony_ci    test(2147483647, &[Token::I32(2147483647)]);
3327e2e9c0cSopenharmony_ci    test(9223372036854775807, &[Token::I64(9223372036854775807)]);
3337e2e9c0cSopenharmony_ci
3347e2e9c0cSopenharmony_ci    // from unsigned
3357e2e9c0cSopenharmony_ci    test(0, &[Token::U8(0)]);
3367e2e9c0cSopenharmony_ci    test(0, &[Token::U16(0)]);
3377e2e9c0cSopenharmony_ci    test(0, &[Token::U32(0)]);
3387e2e9c0cSopenharmony_ci    test(0, &[Token::U64(0)]);
3397e2e9c0cSopenharmony_ci    test(255, &[Token::U8(255)]);
3407e2e9c0cSopenharmony_ci    test(65535, &[Token::U16(65535)]);
3417e2e9c0cSopenharmony_ci    test(4294967295, &[Token::U32(4294967295)]);
3427e2e9c0cSopenharmony_ci    test(18446744073709551615, &[Token::U64(18446744073709551615)]);
3437e2e9c0cSopenharmony_ci}
3447e2e9c0cSopenharmony_ci
3457e2e9c0cSopenharmony_ci#[test]
3467e2e9c0cSopenharmony_cifn test_isize() {
3477e2e9c0cSopenharmony_ci    let test = test::<isize>;
3487e2e9c0cSopenharmony_ci
3497e2e9c0cSopenharmony_ci    // from signed
3507e2e9c0cSopenharmony_ci    test(-10, &[Token::I8(-10)]);
3517e2e9c0cSopenharmony_ci    test(-10, &[Token::I16(-10)]);
3527e2e9c0cSopenharmony_ci    test(-10, &[Token::I32(-10)]);
3537e2e9c0cSopenharmony_ci    test(-10, &[Token::I64(-10)]);
3547e2e9c0cSopenharmony_ci    test(10, &[Token::I8(10)]);
3557e2e9c0cSopenharmony_ci    test(10, &[Token::I16(10)]);
3567e2e9c0cSopenharmony_ci    test(10, &[Token::I32(10)]);
3577e2e9c0cSopenharmony_ci    test(10, &[Token::I64(10)]);
3587e2e9c0cSopenharmony_ci
3597e2e9c0cSopenharmony_ci    // from unsigned
3607e2e9c0cSopenharmony_ci    test(0, &[Token::U8(0)]);
3617e2e9c0cSopenharmony_ci    test(0, &[Token::U16(0)]);
3627e2e9c0cSopenharmony_ci    test(0, &[Token::U32(0)]);
3637e2e9c0cSopenharmony_ci    test(0, &[Token::U64(0)]);
3647e2e9c0cSopenharmony_ci    test(10, &[Token::U8(10)]);
3657e2e9c0cSopenharmony_ci    test(10, &[Token::U16(10)]);
3667e2e9c0cSopenharmony_ci    test(10, &[Token::U32(10)]);
3677e2e9c0cSopenharmony_ci    test(10, &[Token::U64(10)]);
3687e2e9c0cSopenharmony_ci}
3697e2e9c0cSopenharmony_ci
3707e2e9c0cSopenharmony_ci#[test]
3717e2e9c0cSopenharmony_cifn test_u8() {
3727e2e9c0cSopenharmony_ci    let test = test::<u8>;
3737e2e9c0cSopenharmony_ci
3747e2e9c0cSopenharmony_ci    // from signed
3757e2e9c0cSopenharmony_ci    test(0, &[Token::I8(0)]);
3767e2e9c0cSopenharmony_ci    test(0, &[Token::I16(0)]);
3777e2e9c0cSopenharmony_ci    test(0, &[Token::I32(0)]);
3787e2e9c0cSopenharmony_ci    test(0, &[Token::I64(0)]);
3797e2e9c0cSopenharmony_ci    test(127, &[Token::I8(127)]);
3807e2e9c0cSopenharmony_ci    test(255, &[Token::I16(255)]);
3817e2e9c0cSopenharmony_ci    test(255, &[Token::I32(255)]);
3827e2e9c0cSopenharmony_ci    test(255, &[Token::I64(255)]);
3837e2e9c0cSopenharmony_ci
3847e2e9c0cSopenharmony_ci    // from unsigned
3857e2e9c0cSopenharmony_ci    test(0, &[Token::U8(0)]);
3867e2e9c0cSopenharmony_ci    test(0, &[Token::U16(0)]);
3877e2e9c0cSopenharmony_ci    test(0, &[Token::U32(0)]);
3887e2e9c0cSopenharmony_ci    test(0, &[Token::U64(0)]);
3897e2e9c0cSopenharmony_ci    test(255, &[Token::U8(255)]);
3907e2e9c0cSopenharmony_ci    test(255, &[Token::U16(255)]);
3917e2e9c0cSopenharmony_ci    test(255, &[Token::U32(255)]);
3927e2e9c0cSopenharmony_ci    test(255, &[Token::U64(255)]);
3937e2e9c0cSopenharmony_ci}
3947e2e9c0cSopenharmony_ci
3957e2e9c0cSopenharmony_ci#[test]
3967e2e9c0cSopenharmony_cifn test_u16() {
3977e2e9c0cSopenharmony_ci    let test = test::<u16>;
3987e2e9c0cSopenharmony_ci
3997e2e9c0cSopenharmony_ci    // from signed
4007e2e9c0cSopenharmony_ci    test(0, &[Token::I8(0)]);
4017e2e9c0cSopenharmony_ci    test(0, &[Token::I16(0)]);
4027e2e9c0cSopenharmony_ci    test(0, &[Token::I32(0)]);
4037e2e9c0cSopenharmony_ci    test(0, &[Token::I64(0)]);
4047e2e9c0cSopenharmony_ci    test(127, &[Token::I8(127)]);
4057e2e9c0cSopenharmony_ci    test(32767, &[Token::I16(32767)]);
4067e2e9c0cSopenharmony_ci    test(65535, &[Token::I32(65535)]);
4077e2e9c0cSopenharmony_ci    test(65535, &[Token::I64(65535)]);
4087e2e9c0cSopenharmony_ci
4097e2e9c0cSopenharmony_ci    // from unsigned
4107e2e9c0cSopenharmony_ci    test(0, &[Token::U8(0)]);
4117e2e9c0cSopenharmony_ci    test(0, &[Token::U16(0)]);
4127e2e9c0cSopenharmony_ci    test(0, &[Token::U32(0)]);
4137e2e9c0cSopenharmony_ci    test(0, &[Token::U64(0)]);
4147e2e9c0cSopenharmony_ci    test(255, &[Token::U8(255)]);
4157e2e9c0cSopenharmony_ci    test(65535, &[Token::U16(65535)]);
4167e2e9c0cSopenharmony_ci    test(65535, &[Token::U32(65535)]);
4177e2e9c0cSopenharmony_ci    test(65535, &[Token::U64(65535)]);
4187e2e9c0cSopenharmony_ci}
4197e2e9c0cSopenharmony_ci
4207e2e9c0cSopenharmony_ci#[test]
4217e2e9c0cSopenharmony_cifn test_u32() {
4227e2e9c0cSopenharmony_ci    let test = test::<u32>;
4237e2e9c0cSopenharmony_ci
4247e2e9c0cSopenharmony_ci    // from signed
4257e2e9c0cSopenharmony_ci    test(0, &[Token::I8(0)]);
4267e2e9c0cSopenharmony_ci    test(0, &[Token::I16(0)]);
4277e2e9c0cSopenharmony_ci    test(0, &[Token::I32(0)]);
4287e2e9c0cSopenharmony_ci    test(0, &[Token::I64(0)]);
4297e2e9c0cSopenharmony_ci    test(127, &[Token::I8(127)]);
4307e2e9c0cSopenharmony_ci    test(32767, &[Token::I16(32767)]);
4317e2e9c0cSopenharmony_ci    test(2147483647, &[Token::I32(2147483647)]);
4327e2e9c0cSopenharmony_ci    test(4294967295, &[Token::I64(4294967295)]);
4337e2e9c0cSopenharmony_ci
4347e2e9c0cSopenharmony_ci    // from unsigned
4357e2e9c0cSopenharmony_ci    test(0, &[Token::U8(0)]);
4367e2e9c0cSopenharmony_ci    test(0, &[Token::U16(0)]);
4377e2e9c0cSopenharmony_ci    test(0, &[Token::U32(0)]);
4387e2e9c0cSopenharmony_ci    test(0, &[Token::U64(0)]);
4397e2e9c0cSopenharmony_ci    test(255, &[Token::U8(255)]);
4407e2e9c0cSopenharmony_ci    test(65535, &[Token::U16(65535)]);
4417e2e9c0cSopenharmony_ci    test(4294967295, &[Token::U32(4294967295)]);
4427e2e9c0cSopenharmony_ci    test(4294967295, &[Token::U64(4294967295)]);
4437e2e9c0cSopenharmony_ci}
4447e2e9c0cSopenharmony_ci
4457e2e9c0cSopenharmony_ci#[test]
4467e2e9c0cSopenharmony_cifn test_u64() {
4477e2e9c0cSopenharmony_ci    let test = test::<u64>;
4487e2e9c0cSopenharmony_ci
4497e2e9c0cSopenharmony_ci    // from signed
4507e2e9c0cSopenharmony_ci    test(0, &[Token::I8(0)]);
4517e2e9c0cSopenharmony_ci    test(0, &[Token::I16(0)]);
4527e2e9c0cSopenharmony_ci    test(0, &[Token::I32(0)]);
4537e2e9c0cSopenharmony_ci    test(0, &[Token::I64(0)]);
4547e2e9c0cSopenharmony_ci    test(127, &[Token::I8(127)]);
4557e2e9c0cSopenharmony_ci    test(32767, &[Token::I16(32767)]);
4567e2e9c0cSopenharmony_ci    test(2147483647, &[Token::I32(2147483647)]);
4577e2e9c0cSopenharmony_ci    test(9223372036854775807, &[Token::I64(9223372036854775807)]);
4587e2e9c0cSopenharmony_ci
4597e2e9c0cSopenharmony_ci    // from unsigned
4607e2e9c0cSopenharmony_ci    test(0, &[Token::U8(0)]);
4617e2e9c0cSopenharmony_ci    test(0, &[Token::U16(0)]);
4627e2e9c0cSopenharmony_ci    test(0, &[Token::U32(0)]);
4637e2e9c0cSopenharmony_ci    test(0, &[Token::U64(0)]);
4647e2e9c0cSopenharmony_ci    test(255, &[Token::U8(255)]);
4657e2e9c0cSopenharmony_ci    test(65535, &[Token::U16(65535)]);
4667e2e9c0cSopenharmony_ci    test(4294967295, &[Token::U32(4294967295)]);
4677e2e9c0cSopenharmony_ci    test(18446744073709551615, &[Token::U64(18446744073709551615)]);
4687e2e9c0cSopenharmony_ci}
4697e2e9c0cSopenharmony_ci
4707e2e9c0cSopenharmony_ci#[test]
4717e2e9c0cSopenharmony_cifn test_u128() {
4727e2e9c0cSopenharmony_ci    let test = test::<u128>;
4737e2e9c0cSopenharmony_ci
4747e2e9c0cSopenharmony_ci    // from signed
4757e2e9c0cSopenharmony_ci    test(0, &[Token::I8(0)]);
4767e2e9c0cSopenharmony_ci    test(0, &[Token::I16(0)]);
4777e2e9c0cSopenharmony_ci    test(0, &[Token::I32(0)]);
4787e2e9c0cSopenharmony_ci    test(0, &[Token::I64(0)]);
4797e2e9c0cSopenharmony_ci    test(127, &[Token::I8(127)]);
4807e2e9c0cSopenharmony_ci    test(32767, &[Token::I16(32767)]);
4817e2e9c0cSopenharmony_ci    test(2147483647, &[Token::I32(2147483647)]);
4827e2e9c0cSopenharmony_ci    test(9223372036854775807, &[Token::I64(9223372036854775807)]);
4837e2e9c0cSopenharmony_ci
4847e2e9c0cSopenharmony_ci    // from unsigned
4857e2e9c0cSopenharmony_ci    test(0, &[Token::U8(0)]);
4867e2e9c0cSopenharmony_ci    test(0, &[Token::U16(0)]);
4877e2e9c0cSopenharmony_ci    test(0, &[Token::U32(0)]);
4887e2e9c0cSopenharmony_ci    test(0, &[Token::U64(0)]);
4897e2e9c0cSopenharmony_ci    test(255, &[Token::U8(255)]);
4907e2e9c0cSopenharmony_ci    test(65535, &[Token::U16(65535)]);
4917e2e9c0cSopenharmony_ci    test(4294967295, &[Token::U32(4294967295)]);
4927e2e9c0cSopenharmony_ci    test(18446744073709551615, &[Token::U64(18446744073709551615)]);
4937e2e9c0cSopenharmony_ci}
4947e2e9c0cSopenharmony_ci
4957e2e9c0cSopenharmony_ci#[test]
4967e2e9c0cSopenharmony_cifn test_usize() {
4977e2e9c0cSopenharmony_ci    let test = test::<usize>;
4987e2e9c0cSopenharmony_ci
4997e2e9c0cSopenharmony_ci    // from signed
5007e2e9c0cSopenharmony_ci    test(0, &[Token::I8(0)]);
5017e2e9c0cSopenharmony_ci    test(0, &[Token::I16(0)]);
5027e2e9c0cSopenharmony_ci    test(0, &[Token::I32(0)]);
5037e2e9c0cSopenharmony_ci    test(0, &[Token::I64(0)]);
5047e2e9c0cSopenharmony_ci    test(10, &[Token::I8(10)]);
5057e2e9c0cSopenharmony_ci    test(10, &[Token::I16(10)]);
5067e2e9c0cSopenharmony_ci    test(10, &[Token::I32(10)]);
5077e2e9c0cSopenharmony_ci    test(10, &[Token::I64(10)]);
5087e2e9c0cSopenharmony_ci
5097e2e9c0cSopenharmony_ci    // from unsigned
5107e2e9c0cSopenharmony_ci    test(0, &[Token::U8(0)]);
5117e2e9c0cSopenharmony_ci    test(0, &[Token::U16(0)]);
5127e2e9c0cSopenharmony_ci    test(0, &[Token::U32(0)]);
5137e2e9c0cSopenharmony_ci    test(0, &[Token::U64(0)]);
5147e2e9c0cSopenharmony_ci    test(10, &[Token::U8(10)]);
5157e2e9c0cSopenharmony_ci    test(10, &[Token::U16(10)]);
5167e2e9c0cSopenharmony_ci    test(10, &[Token::U32(10)]);
5177e2e9c0cSopenharmony_ci    test(10, &[Token::U64(10)]);
5187e2e9c0cSopenharmony_ci}
5197e2e9c0cSopenharmony_ci
5207e2e9c0cSopenharmony_ci#[test]
5217e2e9c0cSopenharmony_cifn test_nonzero_i8() {
5227e2e9c0cSopenharmony_ci    let test = |value, tokens| test(NonZeroI8::new(value).unwrap(), tokens);
5237e2e9c0cSopenharmony_ci
5247e2e9c0cSopenharmony_ci    // from signed
5257e2e9c0cSopenharmony_ci    test(-128, &[Token::I8(-128)]);
5267e2e9c0cSopenharmony_ci    test(-128, &[Token::I16(-128)]);
5277e2e9c0cSopenharmony_ci    test(-128, &[Token::I32(-128)]);
5287e2e9c0cSopenharmony_ci    test(-128, &[Token::I64(-128)]);
5297e2e9c0cSopenharmony_ci    test(127, &[Token::I8(127)]);
5307e2e9c0cSopenharmony_ci    test(127, &[Token::I16(127)]);
5317e2e9c0cSopenharmony_ci    test(127, &[Token::I32(127)]);
5327e2e9c0cSopenharmony_ci    test(127, &[Token::I64(127)]);
5337e2e9c0cSopenharmony_ci
5347e2e9c0cSopenharmony_ci    // from unsigned
5357e2e9c0cSopenharmony_ci    test(1, &[Token::U8(1)]);
5367e2e9c0cSopenharmony_ci    test(1, &[Token::U16(1)]);
5377e2e9c0cSopenharmony_ci    test(1, &[Token::U32(1)]);
5387e2e9c0cSopenharmony_ci    test(1, &[Token::U64(1)]);
5397e2e9c0cSopenharmony_ci    test(127, &[Token::U8(127)]);
5407e2e9c0cSopenharmony_ci    test(127, &[Token::U16(127)]);
5417e2e9c0cSopenharmony_ci    test(127, &[Token::U32(127)]);
5427e2e9c0cSopenharmony_ci    test(127, &[Token::U64(127)]);
5437e2e9c0cSopenharmony_ci}
5447e2e9c0cSopenharmony_ci
5457e2e9c0cSopenharmony_ci#[test]
5467e2e9c0cSopenharmony_cifn test_nonzero_i16() {
5477e2e9c0cSopenharmony_ci    let test = |value, tokens| test(NonZeroI16::new(value).unwrap(), tokens);
5487e2e9c0cSopenharmony_ci
5497e2e9c0cSopenharmony_ci    // from signed
5507e2e9c0cSopenharmony_ci    test(-128, &[Token::I8(-128)]);
5517e2e9c0cSopenharmony_ci    test(-32768, &[Token::I16(-32768)]);
5527e2e9c0cSopenharmony_ci    test(-32768, &[Token::I32(-32768)]);
5537e2e9c0cSopenharmony_ci    test(-32768, &[Token::I64(-32768)]);
5547e2e9c0cSopenharmony_ci    test(127, &[Token::I8(127)]);
5557e2e9c0cSopenharmony_ci    test(32767, &[Token::I16(32767)]);
5567e2e9c0cSopenharmony_ci    test(32767, &[Token::I32(32767)]);
5577e2e9c0cSopenharmony_ci    test(32767, &[Token::I64(32767)]);
5587e2e9c0cSopenharmony_ci
5597e2e9c0cSopenharmony_ci    // from unsigned
5607e2e9c0cSopenharmony_ci    test(1, &[Token::U8(1)]);
5617e2e9c0cSopenharmony_ci    test(1, &[Token::U16(1)]);
5627e2e9c0cSopenharmony_ci    test(1, &[Token::U32(1)]);
5637e2e9c0cSopenharmony_ci    test(1, &[Token::U64(1)]);
5647e2e9c0cSopenharmony_ci    test(255, &[Token::U8(255)]);
5657e2e9c0cSopenharmony_ci    test(32767, &[Token::U16(32767)]);
5667e2e9c0cSopenharmony_ci    test(32767, &[Token::U32(32767)]);
5677e2e9c0cSopenharmony_ci    test(32767, &[Token::U64(32767)]);
5687e2e9c0cSopenharmony_ci}
5697e2e9c0cSopenharmony_ci
5707e2e9c0cSopenharmony_ci#[test]
5717e2e9c0cSopenharmony_cifn test_nonzero_i32() {
5727e2e9c0cSopenharmony_ci    let test = |value, tokens| test(NonZeroI32::new(value).unwrap(), tokens);
5737e2e9c0cSopenharmony_ci
5747e2e9c0cSopenharmony_ci    // from signed
5757e2e9c0cSopenharmony_ci    test(-128, &[Token::I8(-128)]);
5767e2e9c0cSopenharmony_ci    test(-32768, &[Token::I16(-32768)]);
5777e2e9c0cSopenharmony_ci    test(-2147483648, &[Token::I32(-2147483648)]);
5787e2e9c0cSopenharmony_ci    test(-2147483648, &[Token::I64(-2147483648)]);
5797e2e9c0cSopenharmony_ci    test(127, &[Token::I8(127)]);
5807e2e9c0cSopenharmony_ci    test(32767, &[Token::I16(32767)]);
5817e2e9c0cSopenharmony_ci    test(2147483647, &[Token::I32(2147483647)]);
5827e2e9c0cSopenharmony_ci    test(2147483647, &[Token::I64(2147483647)]);
5837e2e9c0cSopenharmony_ci
5847e2e9c0cSopenharmony_ci    // from unsigned
5857e2e9c0cSopenharmony_ci    test(1, &[Token::U8(1)]);
5867e2e9c0cSopenharmony_ci    test(1, &[Token::U16(1)]);
5877e2e9c0cSopenharmony_ci    test(1, &[Token::U32(1)]);
5887e2e9c0cSopenharmony_ci    test(1, &[Token::U64(1)]);
5897e2e9c0cSopenharmony_ci    test(255, &[Token::U8(255)]);
5907e2e9c0cSopenharmony_ci    test(65535, &[Token::U16(65535)]);
5917e2e9c0cSopenharmony_ci    test(2147483647, &[Token::U32(2147483647)]);
5927e2e9c0cSopenharmony_ci    test(2147483647, &[Token::U64(2147483647)]);
5937e2e9c0cSopenharmony_ci}
5947e2e9c0cSopenharmony_ci
5957e2e9c0cSopenharmony_ci#[test]
5967e2e9c0cSopenharmony_cifn test_nonzero_i64() {
5977e2e9c0cSopenharmony_ci    let test = |value, tokens| test(NonZeroI64::new(value).unwrap(), tokens);
5987e2e9c0cSopenharmony_ci
5997e2e9c0cSopenharmony_ci    // from signed
6007e2e9c0cSopenharmony_ci    test(-128, &[Token::I8(-128)]);
6017e2e9c0cSopenharmony_ci    test(-32768, &[Token::I16(-32768)]);
6027e2e9c0cSopenharmony_ci    test(-2147483648, &[Token::I32(-2147483648)]);
6037e2e9c0cSopenharmony_ci    test(-9223372036854775808, &[Token::I64(-9223372036854775808)]);
6047e2e9c0cSopenharmony_ci    test(127, &[Token::I8(127)]);
6057e2e9c0cSopenharmony_ci    test(32767, &[Token::I16(32767)]);
6067e2e9c0cSopenharmony_ci    test(2147483647, &[Token::I32(2147483647)]);
6077e2e9c0cSopenharmony_ci    test(9223372036854775807, &[Token::I64(9223372036854775807)]);
6087e2e9c0cSopenharmony_ci
6097e2e9c0cSopenharmony_ci    // from unsigned
6107e2e9c0cSopenharmony_ci    test(1, &[Token::U8(1)]);
6117e2e9c0cSopenharmony_ci    test(1, &[Token::U16(1)]);
6127e2e9c0cSopenharmony_ci    test(1, &[Token::U32(1)]);
6137e2e9c0cSopenharmony_ci    test(1, &[Token::U64(1)]);
6147e2e9c0cSopenharmony_ci    test(255, &[Token::U8(255)]);
6157e2e9c0cSopenharmony_ci    test(65535, &[Token::U16(65535)]);
6167e2e9c0cSopenharmony_ci    test(4294967295, &[Token::U32(4294967295)]);
6177e2e9c0cSopenharmony_ci    test(9223372036854775807, &[Token::U64(9223372036854775807)]);
6187e2e9c0cSopenharmony_ci}
6197e2e9c0cSopenharmony_ci
6207e2e9c0cSopenharmony_ci#[test]
6217e2e9c0cSopenharmony_cifn test_nonzero_i128() {
6227e2e9c0cSopenharmony_ci    let test = |value, tokens| test(NonZeroI128::new(value).unwrap(), tokens);
6237e2e9c0cSopenharmony_ci
6247e2e9c0cSopenharmony_ci    // from signed
6257e2e9c0cSopenharmony_ci    test(-128, &[Token::I8(-128)]);
6267e2e9c0cSopenharmony_ci    test(-32768, &[Token::I16(-32768)]);
6277e2e9c0cSopenharmony_ci    test(-2147483648, &[Token::I32(-2147483648)]);
6287e2e9c0cSopenharmony_ci    test(-9223372036854775808, &[Token::I64(-9223372036854775808)]);
6297e2e9c0cSopenharmony_ci    test(127, &[Token::I8(127)]);
6307e2e9c0cSopenharmony_ci    test(32767, &[Token::I16(32767)]);
6317e2e9c0cSopenharmony_ci    test(2147483647, &[Token::I32(2147483647)]);
6327e2e9c0cSopenharmony_ci    test(9223372036854775807, &[Token::I64(9223372036854775807)]);
6337e2e9c0cSopenharmony_ci
6347e2e9c0cSopenharmony_ci    // from unsigned
6357e2e9c0cSopenharmony_ci    test(1, &[Token::U8(1)]);
6367e2e9c0cSopenharmony_ci    test(1, &[Token::U16(1)]);
6377e2e9c0cSopenharmony_ci    test(1, &[Token::U32(1)]);
6387e2e9c0cSopenharmony_ci    test(1, &[Token::U64(1)]);
6397e2e9c0cSopenharmony_ci    test(255, &[Token::U8(255)]);
6407e2e9c0cSopenharmony_ci    test(65535, &[Token::U16(65535)]);
6417e2e9c0cSopenharmony_ci    test(4294967295, &[Token::U32(4294967295)]);
6427e2e9c0cSopenharmony_ci    test(18446744073709551615, &[Token::U64(18446744073709551615)]);
6437e2e9c0cSopenharmony_ci}
6447e2e9c0cSopenharmony_ci
6457e2e9c0cSopenharmony_ci#[test]
6467e2e9c0cSopenharmony_cifn test_nonzero_isize() {
6477e2e9c0cSopenharmony_ci    let test = |value, tokens| test(NonZeroIsize::new(value).unwrap(), tokens);
6487e2e9c0cSopenharmony_ci
6497e2e9c0cSopenharmony_ci    // from signed
6507e2e9c0cSopenharmony_ci    test(-10, &[Token::I8(-10)]);
6517e2e9c0cSopenharmony_ci    test(-10, &[Token::I16(-10)]);
6527e2e9c0cSopenharmony_ci    test(-10, &[Token::I32(-10)]);
6537e2e9c0cSopenharmony_ci    test(-10, &[Token::I64(-10)]);
6547e2e9c0cSopenharmony_ci    test(10, &[Token::I8(10)]);
6557e2e9c0cSopenharmony_ci    test(10, &[Token::I16(10)]);
6567e2e9c0cSopenharmony_ci    test(10, &[Token::I32(10)]);
6577e2e9c0cSopenharmony_ci    test(10, &[Token::I64(10)]);
6587e2e9c0cSopenharmony_ci
6597e2e9c0cSopenharmony_ci    // from unsigned
6607e2e9c0cSopenharmony_ci    test(1, &[Token::U8(1)]);
6617e2e9c0cSopenharmony_ci    test(1, &[Token::U16(1)]);
6627e2e9c0cSopenharmony_ci    test(1, &[Token::U32(1)]);
6637e2e9c0cSopenharmony_ci    test(1, &[Token::U64(1)]);
6647e2e9c0cSopenharmony_ci    test(10, &[Token::U8(10)]);
6657e2e9c0cSopenharmony_ci    test(10, &[Token::U16(10)]);
6667e2e9c0cSopenharmony_ci    test(10, &[Token::U32(10)]);
6677e2e9c0cSopenharmony_ci    test(10, &[Token::U64(10)]);
6687e2e9c0cSopenharmony_ci}
6697e2e9c0cSopenharmony_ci
6707e2e9c0cSopenharmony_ci#[test]
6717e2e9c0cSopenharmony_cifn test_nonzero_u8() {
6727e2e9c0cSopenharmony_ci    let test = |value, tokens| test(NonZeroU8::new(value).unwrap(), tokens);
6737e2e9c0cSopenharmony_ci
6747e2e9c0cSopenharmony_ci    // from signed
6757e2e9c0cSopenharmony_ci    test(1, &[Token::I8(1)]);
6767e2e9c0cSopenharmony_ci    test(1, &[Token::I16(1)]);
6777e2e9c0cSopenharmony_ci    test(1, &[Token::I32(1)]);
6787e2e9c0cSopenharmony_ci    test(1, &[Token::I64(1)]);
6797e2e9c0cSopenharmony_ci    test(127, &[Token::I8(127)]);
6807e2e9c0cSopenharmony_ci    test(255, &[Token::I16(255)]);
6817e2e9c0cSopenharmony_ci    test(255, &[Token::I32(255)]);
6827e2e9c0cSopenharmony_ci    test(255, &[Token::I64(255)]);
6837e2e9c0cSopenharmony_ci
6847e2e9c0cSopenharmony_ci    // from unsigned
6857e2e9c0cSopenharmony_ci    test(1, &[Token::U8(1)]);
6867e2e9c0cSopenharmony_ci    test(1, &[Token::U16(1)]);
6877e2e9c0cSopenharmony_ci    test(1, &[Token::U32(1)]);
6887e2e9c0cSopenharmony_ci    test(1, &[Token::U64(1)]);
6897e2e9c0cSopenharmony_ci    test(255, &[Token::U8(255)]);
6907e2e9c0cSopenharmony_ci    test(255, &[Token::U16(255)]);
6917e2e9c0cSopenharmony_ci    test(255, &[Token::U32(255)]);
6927e2e9c0cSopenharmony_ci    test(255, &[Token::U64(255)]);
6937e2e9c0cSopenharmony_ci}
6947e2e9c0cSopenharmony_ci
6957e2e9c0cSopenharmony_ci#[test]
6967e2e9c0cSopenharmony_cifn test_nonzero_u16() {
6977e2e9c0cSopenharmony_ci    let test = |value, tokens| test(NonZeroU16::new(value).unwrap(), tokens);
6987e2e9c0cSopenharmony_ci
6997e2e9c0cSopenharmony_ci    // from signed
7007e2e9c0cSopenharmony_ci    test(1, &[Token::I8(1)]);
7017e2e9c0cSopenharmony_ci    test(1, &[Token::I16(1)]);
7027e2e9c0cSopenharmony_ci    test(1, &[Token::I32(1)]);
7037e2e9c0cSopenharmony_ci    test(1, &[Token::I64(1)]);
7047e2e9c0cSopenharmony_ci    test(127, &[Token::I8(127)]);
7057e2e9c0cSopenharmony_ci    test(32767, &[Token::I16(32767)]);
7067e2e9c0cSopenharmony_ci    test(65535, &[Token::I32(65535)]);
7077e2e9c0cSopenharmony_ci    test(65535, &[Token::I64(65535)]);
7087e2e9c0cSopenharmony_ci
7097e2e9c0cSopenharmony_ci    // from unsigned
7107e2e9c0cSopenharmony_ci    test(1, &[Token::U8(1)]);
7117e2e9c0cSopenharmony_ci    test(1, &[Token::U16(1)]);
7127e2e9c0cSopenharmony_ci    test(1, &[Token::U32(1)]);
7137e2e9c0cSopenharmony_ci    test(1, &[Token::U64(1)]);
7147e2e9c0cSopenharmony_ci    test(255, &[Token::U8(255)]);
7157e2e9c0cSopenharmony_ci    test(65535, &[Token::U16(65535)]);
7167e2e9c0cSopenharmony_ci    test(65535, &[Token::U32(65535)]);
7177e2e9c0cSopenharmony_ci    test(65535, &[Token::U64(65535)]);
7187e2e9c0cSopenharmony_ci}
7197e2e9c0cSopenharmony_ci
7207e2e9c0cSopenharmony_ci#[test]
7217e2e9c0cSopenharmony_cifn test_nonzero_u32() {
7227e2e9c0cSopenharmony_ci    let test = |value, tokens| test(NonZeroU32::new(value).unwrap(), tokens);
7237e2e9c0cSopenharmony_ci
7247e2e9c0cSopenharmony_ci    // from signed
7257e2e9c0cSopenharmony_ci    test(1, &[Token::I8(1)]);
7267e2e9c0cSopenharmony_ci    test(1, &[Token::I16(1)]);
7277e2e9c0cSopenharmony_ci    test(1, &[Token::I32(1)]);
7287e2e9c0cSopenharmony_ci    test(1, &[Token::I64(1)]);
7297e2e9c0cSopenharmony_ci    test(127, &[Token::I8(127)]);
7307e2e9c0cSopenharmony_ci    test(32767, &[Token::I16(32767)]);
7317e2e9c0cSopenharmony_ci    test(2147483647, &[Token::I32(2147483647)]);
7327e2e9c0cSopenharmony_ci    test(4294967295, &[Token::I64(4294967295)]);
7337e2e9c0cSopenharmony_ci
7347e2e9c0cSopenharmony_ci    // from unsigned
7357e2e9c0cSopenharmony_ci    test(1, &[Token::U8(1)]);
7367e2e9c0cSopenharmony_ci    test(1, &[Token::U16(1)]);
7377e2e9c0cSopenharmony_ci    test(1, &[Token::U32(1)]);
7387e2e9c0cSopenharmony_ci    test(1, &[Token::U64(1)]);
7397e2e9c0cSopenharmony_ci    test(255, &[Token::U8(255)]);
7407e2e9c0cSopenharmony_ci    test(65535, &[Token::U16(65535)]);
7417e2e9c0cSopenharmony_ci    test(4294967295, &[Token::U32(4294967295)]);
7427e2e9c0cSopenharmony_ci    test(4294967295, &[Token::U64(4294967295)]);
7437e2e9c0cSopenharmony_ci}
7447e2e9c0cSopenharmony_ci
7457e2e9c0cSopenharmony_ci#[test]
7467e2e9c0cSopenharmony_cifn test_nonzero_u64() {
7477e2e9c0cSopenharmony_ci    let test = |value, tokens| test(NonZeroU64::new(value).unwrap(), tokens);
7487e2e9c0cSopenharmony_ci
7497e2e9c0cSopenharmony_ci    // from signed
7507e2e9c0cSopenharmony_ci    test(1, &[Token::I8(1)]);
7517e2e9c0cSopenharmony_ci    test(1, &[Token::I16(1)]);
7527e2e9c0cSopenharmony_ci    test(1, &[Token::I32(1)]);
7537e2e9c0cSopenharmony_ci    test(1, &[Token::I64(1)]);
7547e2e9c0cSopenharmony_ci    test(127, &[Token::I8(127)]);
7557e2e9c0cSopenharmony_ci    test(32767, &[Token::I16(32767)]);
7567e2e9c0cSopenharmony_ci    test(2147483647, &[Token::I32(2147483647)]);
7577e2e9c0cSopenharmony_ci    test(9223372036854775807, &[Token::I64(9223372036854775807)]);
7587e2e9c0cSopenharmony_ci
7597e2e9c0cSopenharmony_ci    // from unsigned
7607e2e9c0cSopenharmony_ci    test(1, &[Token::U8(1)]);
7617e2e9c0cSopenharmony_ci    test(1, &[Token::U16(1)]);
7627e2e9c0cSopenharmony_ci    test(1, &[Token::U32(1)]);
7637e2e9c0cSopenharmony_ci    test(1, &[Token::U64(1)]);
7647e2e9c0cSopenharmony_ci    test(255, &[Token::U8(255)]);
7657e2e9c0cSopenharmony_ci    test(65535, &[Token::U16(65535)]);
7667e2e9c0cSopenharmony_ci    test(4294967295, &[Token::U32(4294967295)]);
7677e2e9c0cSopenharmony_ci    test(18446744073709551615, &[Token::U64(18446744073709551615)]);
7687e2e9c0cSopenharmony_ci}
7697e2e9c0cSopenharmony_ci
7707e2e9c0cSopenharmony_ci#[test]
7717e2e9c0cSopenharmony_cifn test_nonzero_u128() {
7727e2e9c0cSopenharmony_ci    let test = |value, tokens| test(NonZeroU128::new(value).unwrap(), tokens);
7737e2e9c0cSopenharmony_ci
7747e2e9c0cSopenharmony_ci    // from signed
7757e2e9c0cSopenharmony_ci    test(1, &[Token::I8(1)]);
7767e2e9c0cSopenharmony_ci    test(1, &[Token::I16(1)]);
7777e2e9c0cSopenharmony_ci    test(1, &[Token::I32(1)]);
7787e2e9c0cSopenharmony_ci    test(1, &[Token::I64(1)]);
7797e2e9c0cSopenharmony_ci    test(127, &[Token::I8(127)]);
7807e2e9c0cSopenharmony_ci    test(32767, &[Token::I16(32767)]);
7817e2e9c0cSopenharmony_ci    test(2147483647, &[Token::I32(2147483647)]);
7827e2e9c0cSopenharmony_ci    test(9223372036854775807, &[Token::I64(9223372036854775807)]);
7837e2e9c0cSopenharmony_ci
7847e2e9c0cSopenharmony_ci    // from unsigned
7857e2e9c0cSopenharmony_ci    test(1, &[Token::U8(1)]);
7867e2e9c0cSopenharmony_ci    test(1, &[Token::U16(1)]);
7877e2e9c0cSopenharmony_ci    test(1, &[Token::U32(1)]);
7887e2e9c0cSopenharmony_ci    test(1, &[Token::U64(1)]);
7897e2e9c0cSopenharmony_ci    test(255, &[Token::U8(255)]);
7907e2e9c0cSopenharmony_ci    test(65535, &[Token::U16(65535)]);
7917e2e9c0cSopenharmony_ci    test(4294967295, &[Token::U32(4294967295)]);
7927e2e9c0cSopenharmony_ci    test(18446744073709551615, &[Token::U64(18446744073709551615)]);
7937e2e9c0cSopenharmony_ci}
7947e2e9c0cSopenharmony_ci
7957e2e9c0cSopenharmony_ci#[test]
7967e2e9c0cSopenharmony_cifn test_nonzero_usize() {
7977e2e9c0cSopenharmony_ci    let test = |value, tokens| test(NonZeroUsize::new(value).unwrap(), tokens);
7987e2e9c0cSopenharmony_ci
7997e2e9c0cSopenharmony_ci    // from signed
8007e2e9c0cSopenharmony_ci    test(1, &[Token::I8(1)]);
8017e2e9c0cSopenharmony_ci    test(1, &[Token::I16(1)]);
8027e2e9c0cSopenharmony_ci    test(1, &[Token::I32(1)]);
8037e2e9c0cSopenharmony_ci    test(1, &[Token::I64(1)]);
8047e2e9c0cSopenharmony_ci    test(10, &[Token::I8(10)]);
8057e2e9c0cSopenharmony_ci    test(10, &[Token::I16(10)]);
8067e2e9c0cSopenharmony_ci    test(10, &[Token::I32(10)]);
8077e2e9c0cSopenharmony_ci    test(10, &[Token::I64(10)]);
8087e2e9c0cSopenharmony_ci
8097e2e9c0cSopenharmony_ci    // from unsigned
8107e2e9c0cSopenharmony_ci    test(1, &[Token::U8(1)]);
8117e2e9c0cSopenharmony_ci    test(1, &[Token::U16(1)]);
8127e2e9c0cSopenharmony_ci    test(1, &[Token::U32(1)]);
8137e2e9c0cSopenharmony_ci    test(1, &[Token::U64(1)]);
8147e2e9c0cSopenharmony_ci    test(10, &[Token::U8(10)]);
8157e2e9c0cSopenharmony_ci    test(10, &[Token::U16(10)]);
8167e2e9c0cSopenharmony_ci    test(10, &[Token::U32(10)]);
8177e2e9c0cSopenharmony_ci    test(10, &[Token::U64(10)]);
8187e2e9c0cSopenharmony_ci}
8197e2e9c0cSopenharmony_ci
8207e2e9c0cSopenharmony_ci#[test]
8217e2e9c0cSopenharmony_cifn test_f32() {
8227e2e9c0cSopenharmony_ci    let test = test::<f32>;
8237e2e9c0cSopenharmony_ci
8247e2e9c0cSopenharmony_ci    test(1.11, &[Token::F32(1.11)]);
8257e2e9c0cSopenharmony_ci    test(1.11, &[Token::F64(1.11)]);
8267e2e9c0cSopenharmony_ci}
8277e2e9c0cSopenharmony_ci
8287e2e9c0cSopenharmony_ci#[test]
8297e2e9c0cSopenharmony_cifn test_f64() {
8307e2e9c0cSopenharmony_ci    let test = test::<f64>;
8317e2e9c0cSopenharmony_ci
8327e2e9c0cSopenharmony_ci    test(1.11f32 as f64, &[Token::F32(1.11)]);
8337e2e9c0cSopenharmony_ci    test(1.11, &[Token::F64(1.11)]);
8347e2e9c0cSopenharmony_ci}
8357e2e9c0cSopenharmony_ci
8367e2e9c0cSopenharmony_ci#[test]
8377e2e9c0cSopenharmony_cifn test_nan() {
8387e2e9c0cSopenharmony_ci    let f32_deserializer = F32Deserializer::<serde::de::value::Error>::new;
8397e2e9c0cSopenharmony_ci    let f64_deserializer = F64Deserializer::<serde::de::value::Error>::new;
8407e2e9c0cSopenharmony_ci
8417e2e9c0cSopenharmony_ci    let pos_f32_nan = f32_deserializer(f32::NAN.copysign(1.0));
8427e2e9c0cSopenharmony_ci    let pos_f64_nan = f64_deserializer(f64::NAN.copysign(1.0));
8437e2e9c0cSopenharmony_ci    assert!(f32::deserialize(pos_f32_nan).unwrap().is_sign_positive());
8447e2e9c0cSopenharmony_ci    assert!(f32::deserialize(pos_f64_nan).unwrap().is_sign_positive());
8457e2e9c0cSopenharmony_ci    assert!(f64::deserialize(pos_f32_nan).unwrap().is_sign_positive());
8467e2e9c0cSopenharmony_ci    assert!(f64::deserialize(pos_f64_nan).unwrap().is_sign_positive());
8477e2e9c0cSopenharmony_ci
8487e2e9c0cSopenharmony_ci    let neg_f32_nan = f32_deserializer(f32::NAN.copysign(-1.0));
8497e2e9c0cSopenharmony_ci    let neg_f64_nan = f64_deserializer(f64::NAN.copysign(-1.0));
8507e2e9c0cSopenharmony_ci    assert!(f32::deserialize(neg_f32_nan).unwrap().is_sign_negative());
8517e2e9c0cSopenharmony_ci    assert!(f32::deserialize(neg_f64_nan).unwrap().is_sign_negative());
8527e2e9c0cSopenharmony_ci    assert!(f64::deserialize(neg_f32_nan).unwrap().is_sign_negative());
8537e2e9c0cSopenharmony_ci    assert!(f64::deserialize(neg_f64_nan).unwrap().is_sign_negative());
8547e2e9c0cSopenharmony_ci}
8557e2e9c0cSopenharmony_ci
8567e2e9c0cSopenharmony_ci#[test]
8577e2e9c0cSopenharmony_cifn test_char() {
8587e2e9c0cSopenharmony_ci    test('a', &[Token::Char('a')]);
8597e2e9c0cSopenharmony_ci    test('a', &[Token::Str("a")]);
8607e2e9c0cSopenharmony_ci    test('a', &[Token::String("a")]);
8617e2e9c0cSopenharmony_ci}
8627e2e9c0cSopenharmony_ci
8637e2e9c0cSopenharmony_ci#[test]
8647e2e9c0cSopenharmony_cifn test_string() {
8657e2e9c0cSopenharmony_ci    test("abc".to_owned(), &[Token::Str("abc")]);
8667e2e9c0cSopenharmony_ci    test("abc".to_owned(), &[Token::String("abc")]);
8677e2e9c0cSopenharmony_ci    test("a".to_owned(), &[Token::Char('a')]);
8687e2e9c0cSopenharmony_ci}
8697e2e9c0cSopenharmony_ci
8707e2e9c0cSopenharmony_ci#[test]
8717e2e9c0cSopenharmony_cifn test_option() {
8727e2e9c0cSopenharmony_ci    test(None::<i32>, &[Token::Unit]);
8737e2e9c0cSopenharmony_ci    test(None::<i32>, &[Token::None]);
8747e2e9c0cSopenharmony_ci    test(Some(1), &[Token::Some, Token::I32(1)]);
8757e2e9c0cSopenharmony_ci}
8767e2e9c0cSopenharmony_ci
8777e2e9c0cSopenharmony_ci#[test]
8787e2e9c0cSopenharmony_cifn test_result() {
8797e2e9c0cSopenharmony_ci    test(
8807e2e9c0cSopenharmony_ci        Ok::<i32, i32>(0),
8817e2e9c0cSopenharmony_ci        &[
8827e2e9c0cSopenharmony_ci            Token::Enum { name: "Result" },
8837e2e9c0cSopenharmony_ci            Token::Str("Ok"),
8847e2e9c0cSopenharmony_ci            Token::I32(0),
8857e2e9c0cSopenharmony_ci        ],
8867e2e9c0cSopenharmony_ci    );
8877e2e9c0cSopenharmony_ci    test(
8887e2e9c0cSopenharmony_ci        Err::<i32, i32>(1),
8897e2e9c0cSopenharmony_ci        &[
8907e2e9c0cSopenharmony_ci            Token::Enum { name: "Result" },
8917e2e9c0cSopenharmony_ci            Token::Str("Err"),
8927e2e9c0cSopenharmony_ci            Token::I32(1),
8937e2e9c0cSopenharmony_ci        ],
8947e2e9c0cSopenharmony_ci    );
8957e2e9c0cSopenharmony_ci}
8967e2e9c0cSopenharmony_ci
8977e2e9c0cSopenharmony_ci#[test]
8987e2e9c0cSopenharmony_cifn test_unit() {
8997e2e9c0cSopenharmony_ci    test((), &[Token::Unit]);
9007e2e9c0cSopenharmony_ci}
9017e2e9c0cSopenharmony_ci
9027e2e9c0cSopenharmony_ci#[test]
9037e2e9c0cSopenharmony_cifn test_unit_struct() {
9047e2e9c0cSopenharmony_ci    test(UnitStruct, &[Token::Unit]);
9057e2e9c0cSopenharmony_ci    test(UnitStruct, &[Token::UnitStruct { name: "UnitStruct" }]);
9067e2e9c0cSopenharmony_ci}
9077e2e9c0cSopenharmony_ci
9087e2e9c0cSopenharmony_ci#[test]
9097e2e9c0cSopenharmony_cifn test_generic_unit_struct() {
9107e2e9c0cSopenharmony_ci    test(GenericUnitStruct::<8>, &[Token::Unit]);
9117e2e9c0cSopenharmony_ci    test(
9127e2e9c0cSopenharmony_ci        GenericUnitStruct::<8>,
9137e2e9c0cSopenharmony_ci        &[Token::UnitStruct {
9147e2e9c0cSopenharmony_ci            name: "GenericUnitStruct",
9157e2e9c0cSopenharmony_ci        }],
9167e2e9c0cSopenharmony_ci    );
9177e2e9c0cSopenharmony_ci}
9187e2e9c0cSopenharmony_ci
9197e2e9c0cSopenharmony_ci#[test]
9207e2e9c0cSopenharmony_cifn test_newtype_struct() {
9217e2e9c0cSopenharmony_ci    test(
9227e2e9c0cSopenharmony_ci        NewtypeStruct(1),
9237e2e9c0cSopenharmony_ci        &[
9247e2e9c0cSopenharmony_ci            Token::NewtypeStruct {
9257e2e9c0cSopenharmony_ci                name: "NewtypeStruct",
9267e2e9c0cSopenharmony_ci            },
9277e2e9c0cSopenharmony_ci            Token::I32(1),
9287e2e9c0cSopenharmony_ci        ],
9297e2e9c0cSopenharmony_ci    );
9307e2e9c0cSopenharmony_ci}
9317e2e9c0cSopenharmony_ci
9327e2e9c0cSopenharmony_ci#[test]
9337e2e9c0cSopenharmony_cifn test_tuple_struct() {
9347e2e9c0cSopenharmony_ci    test(
9357e2e9c0cSopenharmony_ci        TupleStruct(1, 2, 3),
9367e2e9c0cSopenharmony_ci        &[
9377e2e9c0cSopenharmony_ci            Token::Seq { len: Some(3) },
9387e2e9c0cSopenharmony_ci            Token::I32(1),
9397e2e9c0cSopenharmony_ci            Token::I32(2),
9407e2e9c0cSopenharmony_ci            Token::I32(3),
9417e2e9c0cSopenharmony_ci            Token::SeqEnd,
9427e2e9c0cSopenharmony_ci        ],
9437e2e9c0cSopenharmony_ci    );
9447e2e9c0cSopenharmony_ci    test(
9457e2e9c0cSopenharmony_ci        TupleStruct(1, 2, 3),
9467e2e9c0cSopenharmony_ci        &[
9477e2e9c0cSopenharmony_ci            Token::Seq { len: None },
9487e2e9c0cSopenharmony_ci            Token::I32(1),
9497e2e9c0cSopenharmony_ci            Token::I32(2),
9507e2e9c0cSopenharmony_ci            Token::I32(3),
9517e2e9c0cSopenharmony_ci            Token::SeqEnd,
9527e2e9c0cSopenharmony_ci        ],
9537e2e9c0cSopenharmony_ci    );
9547e2e9c0cSopenharmony_ci    test(
9557e2e9c0cSopenharmony_ci        TupleStruct(1, 2, 3),
9567e2e9c0cSopenharmony_ci        &[
9577e2e9c0cSopenharmony_ci            Token::TupleStruct {
9587e2e9c0cSopenharmony_ci                name: "TupleStruct",
9597e2e9c0cSopenharmony_ci                len: 3,
9607e2e9c0cSopenharmony_ci            },
9617e2e9c0cSopenharmony_ci            Token::I32(1),
9627e2e9c0cSopenharmony_ci            Token::I32(2),
9637e2e9c0cSopenharmony_ci            Token::I32(3),
9647e2e9c0cSopenharmony_ci            Token::TupleStructEnd,
9657e2e9c0cSopenharmony_ci        ],
9667e2e9c0cSopenharmony_ci    );
9677e2e9c0cSopenharmony_ci    test(
9687e2e9c0cSopenharmony_ci        TupleStruct(1, 2, 3),
9697e2e9c0cSopenharmony_ci        &[
9707e2e9c0cSopenharmony_ci            Token::TupleStruct {
9717e2e9c0cSopenharmony_ci                name: "TupleStruct",
9727e2e9c0cSopenharmony_ci                len: 3,
9737e2e9c0cSopenharmony_ci            },
9747e2e9c0cSopenharmony_ci            Token::I32(1),
9757e2e9c0cSopenharmony_ci            Token::I32(2),
9767e2e9c0cSopenharmony_ci            Token::I32(3),
9777e2e9c0cSopenharmony_ci            Token::TupleStructEnd,
9787e2e9c0cSopenharmony_ci        ],
9797e2e9c0cSopenharmony_ci    );
9807e2e9c0cSopenharmony_ci}
9817e2e9c0cSopenharmony_ci
9827e2e9c0cSopenharmony_ci#[test]
9837e2e9c0cSopenharmony_cifn test_btreeset() {
9847e2e9c0cSopenharmony_ci    test(
9857e2e9c0cSopenharmony_ci        BTreeSet::<isize>::new(),
9867e2e9c0cSopenharmony_ci        &[Token::Seq { len: Some(0) }, Token::SeqEnd],
9877e2e9c0cSopenharmony_ci    );
9887e2e9c0cSopenharmony_ci    test(
9897e2e9c0cSopenharmony_ci        btreeset![btreeset![], btreeset![1], btreeset![2, 3]],
9907e2e9c0cSopenharmony_ci        &[
9917e2e9c0cSopenharmony_ci            Token::Seq { len: Some(3) },
9927e2e9c0cSopenharmony_ci            Token::Seq { len: Some(0) },
9937e2e9c0cSopenharmony_ci            Token::SeqEnd,
9947e2e9c0cSopenharmony_ci            Token::Seq { len: Some(1) },
9957e2e9c0cSopenharmony_ci            Token::I32(1),
9967e2e9c0cSopenharmony_ci            Token::SeqEnd,
9977e2e9c0cSopenharmony_ci            Token::Seq { len: Some(2) },
9987e2e9c0cSopenharmony_ci            Token::I32(2),
9997e2e9c0cSopenharmony_ci            Token::I32(3),
10007e2e9c0cSopenharmony_ci            Token::SeqEnd,
10017e2e9c0cSopenharmony_ci            Token::SeqEnd,
10027e2e9c0cSopenharmony_ci        ],
10037e2e9c0cSopenharmony_ci    );
10047e2e9c0cSopenharmony_ci    test(
10057e2e9c0cSopenharmony_ci        BTreeSet::<isize>::new(),
10067e2e9c0cSopenharmony_ci        &[
10077e2e9c0cSopenharmony_ci            Token::TupleStruct {
10087e2e9c0cSopenharmony_ci                name: "Anything",
10097e2e9c0cSopenharmony_ci                len: 0,
10107e2e9c0cSopenharmony_ci            },
10117e2e9c0cSopenharmony_ci            Token::TupleStructEnd,
10127e2e9c0cSopenharmony_ci        ],
10137e2e9c0cSopenharmony_ci    );
10147e2e9c0cSopenharmony_ci}
10157e2e9c0cSopenharmony_ci
10167e2e9c0cSopenharmony_ci#[test]
10177e2e9c0cSopenharmony_cifn test_hashset() {
10187e2e9c0cSopenharmony_ci    test(
10197e2e9c0cSopenharmony_ci        HashSet::<isize>::new(),
10207e2e9c0cSopenharmony_ci        &[Token::Seq { len: Some(0) }, Token::SeqEnd],
10217e2e9c0cSopenharmony_ci    );
10227e2e9c0cSopenharmony_ci    test(
10237e2e9c0cSopenharmony_ci        hashset![1, 2, 3],
10247e2e9c0cSopenharmony_ci        &[
10257e2e9c0cSopenharmony_ci            Token::Seq { len: Some(3) },
10267e2e9c0cSopenharmony_ci            Token::I32(1),
10277e2e9c0cSopenharmony_ci            Token::I32(2),
10287e2e9c0cSopenharmony_ci            Token::I32(3),
10297e2e9c0cSopenharmony_ci            Token::SeqEnd,
10307e2e9c0cSopenharmony_ci        ],
10317e2e9c0cSopenharmony_ci    );
10327e2e9c0cSopenharmony_ci    test(
10337e2e9c0cSopenharmony_ci        HashSet::<isize>::new(),
10347e2e9c0cSopenharmony_ci        &[
10357e2e9c0cSopenharmony_ci            Token::TupleStruct {
10367e2e9c0cSopenharmony_ci                name: "Anything",
10377e2e9c0cSopenharmony_ci                len: 0,
10387e2e9c0cSopenharmony_ci            },
10397e2e9c0cSopenharmony_ci            Token::TupleStructEnd,
10407e2e9c0cSopenharmony_ci        ],
10417e2e9c0cSopenharmony_ci    );
10427e2e9c0cSopenharmony_ci    test(
10437e2e9c0cSopenharmony_ci        hashset![FnvHasher @ 1, 2, 3],
10447e2e9c0cSopenharmony_ci        &[
10457e2e9c0cSopenharmony_ci            Token::Seq { len: Some(3) },
10467e2e9c0cSopenharmony_ci            Token::I32(1),
10477e2e9c0cSopenharmony_ci            Token::I32(2),
10487e2e9c0cSopenharmony_ci            Token::I32(3),
10497e2e9c0cSopenharmony_ci            Token::SeqEnd,
10507e2e9c0cSopenharmony_ci        ],
10517e2e9c0cSopenharmony_ci    );
10527e2e9c0cSopenharmony_ci}
10537e2e9c0cSopenharmony_ci
10547e2e9c0cSopenharmony_ci#[test]
10557e2e9c0cSopenharmony_cifn test_vec() {
10567e2e9c0cSopenharmony_ci    test(
10577e2e9c0cSopenharmony_ci        Vec::<isize>::new(),
10587e2e9c0cSopenharmony_ci        &[Token::Seq { len: Some(0) }, Token::SeqEnd],
10597e2e9c0cSopenharmony_ci    );
10607e2e9c0cSopenharmony_ci
10617e2e9c0cSopenharmony_ci    test(
10627e2e9c0cSopenharmony_ci        vec![vec![], vec![1], vec![2, 3]],
10637e2e9c0cSopenharmony_ci        &[
10647e2e9c0cSopenharmony_ci            Token::Seq { len: Some(3) },
10657e2e9c0cSopenharmony_ci            Token::Seq { len: Some(0) },
10667e2e9c0cSopenharmony_ci            Token::SeqEnd,
10677e2e9c0cSopenharmony_ci            Token::Seq { len: Some(1) },
10687e2e9c0cSopenharmony_ci            Token::I32(1),
10697e2e9c0cSopenharmony_ci            Token::SeqEnd,
10707e2e9c0cSopenharmony_ci            Token::Seq { len: Some(2) },
10717e2e9c0cSopenharmony_ci            Token::I32(2),
10727e2e9c0cSopenharmony_ci            Token::I32(3),
10737e2e9c0cSopenharmony_ci            Token::SeqEnd,
10747e2e9c0cSopenharmony_ci            Token::SeqEnd,
10757e2e9c0cSopenharmony_ci        ],
10767e2e9c0cSopenharmony_ci    );
10777e2e9c0cSopenharmony_ci    test(
10787e2e9c0cSopenharmony_ci        Vec::<isize>::new(),
10797e2e9c0cSopenharmony_ci        &[
10807e2e9c0cSopenharmony_ci            Token::TupleStruct {
10817e2e9c0cSopenharmony_ci                name: "Anything",
10827e2e9c0cSopenharmony_ci                len: 0,
10837e2e9c0cSopenharmony_ci            },
10847e2e9c0cSopenharmony_ci            Token::TupleStructEnd,
10857e2e9c0cSopenharmony_ci        ],
10867e2e9c0cSopenharmony_ci    );
10877e2e9c0cSopenharmony_ci}
10887e2e9c0cSopenharmony_ci
10897e2e9c0cSopenharmony_ci#[test]
10907e2e9c0cSopenharmony_cifn test_array() {
10917e2e9c0cSopenharmony_ci    test([0; 0], &[Token::Seq { len: Some(0) }, Token::SeqEnd]);
10927e2e9c0cSopenharmony_ci    test([0; 0], &[Token::Tuple { len: 0 }, Token::TupleEnd]);
10937e2e9c0cSopenharmony_ci    test(
10947e2e9c0cSopenharmony_ci        ([0; 0], [1], [2, 3]),
10957e2e9c0cSopenharmony_ci        &[
10967e2e9c0cSopenharmony_ci            Token::Seq { len: Some(3) },
10977e2e9c0cSopenharmony_ci            Token::Seq { len: Some(0) },
10987e2e9c0cSopenharmony_ci            Token::SeqEnd,
10997e2e9c0cSopenharmony_ci            Token::Seq { len: Some(1) },
11007e2e9c0cSopenharmony_ci            Token::I32(1),
11017e2e9c0cSopenharmony_ci            Token::SeqEnd,
11027e2e9c0cSopenharmony_ci            Token::Seq { len: Some(2) },
11037e2e9c0cSopenharmony_ci            Token::I32(2),
11047e2e9c0cSopenharmony_ci            Token::I32(3),
11057e2e9c0cSopenharmony_ci            Token::SeqEnd,
11067e2e9c0cSopenharmony_ci            Token::SeqEnd,
11077e2e9c0cSopenharmony_ci        ],
11087e2e9c0cSopenharmony_ci    );
11097e2e9c0cSopenharmony_ci    test(
11107e2e9c0cSopenharmony_ci        ([0; 0], [1], [2, 3]),
11117e2e9c0cSopenharmony_ci        &[
11127e2e9c0cSopenharmony_ci            Token::Tuple { len: 3 },
11137e2e9c0cSopenharmony_ci            Token::Tuple { len: 0 },
11147e2e9c0cSopenharmony_ci            Token::TupleEnd,
11157e2e9c0cSopenharmony_ci            Token::Tuple { len: 1 },
11167e2e9c0cSopenharmony_ci            Token::I32(1),
11177e2e9c0cSopenharmony_ci            Token::TupleEnd,
11187e2e9c0cSopenharmony_ci            Token::Tuple { len: 2 },
11197e2e9c0cSopenharmony_ci            Token::I32(2),
11207e2e9c0cSopenharmony_ci            Token::I32(3),
11217e2e9c0cSopenharmony_ci            Token::TupleEnd,
11227e2e9c0cSopenharmony_ci            Token::TupleEnd,
11237e2e9c0cSopenharmony_ci        ],
11247e2e9c0cSopenharmony_ci    );
11257e2e9c0cSopenharmony_ci    test(
11267e2e9c0cSopenharmony_ci        [0; 0],
11277e2e9c0cSopenharmony_ci        &[
11287e2e9c0cSopenharmony_ci            Token::TupleStruct {
11297e2e9c0cSopenharmony_ci                name: "Anything",
11307e2e9c0cSopenharmony_ci                len: 0,
11317e2e9c0cSopenharmony_ci            },
11327e2e9c0cSopenharmony_ci            Token::TupleStructEnd,
11337e2e9c0cSopenharmony_ci        ],
11347e2e9c0cSopenharmony_ci    );
11357e2e9c0cSopenharmony_ci}
11367e2e9c0cSopenharmony_ci
11377e2e9c0cSopenharmony_ci#[test]
11387e2e9c0cSopenharmony_cifn test_tuple() {
11397e2e9c0cSopenharmony_ci    test(
11407e2e9c0cSopenharmony_ci        (1,),
11417e2e9c0cSopenharmony_ci        &[Token::Seq { len: Some(1) }, Token::I32(1), Token::SeqEnd],
11427e2e9c0cSopenharmony_ci    );
11437e2e9c0cSopenharmony_ci    test(
11447e2e9c0cSopenharmony_ci        (1, 2, 3),
11457e2e9c0cSopenharmony_ci        &[
11467e2e9c0cSopenharmony_ci            Token::Seq { len: Some(3) },
11477e2e9c0cSopenharmony_ci            Token::I32(1),
11487e2e9c0cSopenharmony_ci            Token::I32(2),
11497e2e9c0cSopenharmony_ci            Token::I32(3),
11507e2e9c0cSopenharmony_ci            Token::SeqEnd,
11517e2e9c0cSopenharmony_ci        ],
11527e2e9c0cSopenharmony_ci    );
11537e2e9c0cSopenharmony_ci    test(
11547e2e9c0cSopenharmony_ci        (1,),
11557e2e9c0cSopenharmony_ci        &[Token::Tuple { len: 1 }, Token::I32(1), Token::TupleEnd],
11567e2e9c0cSopenharmony_ci    );
11577e2e9c0cSopenharmony_ci    test(
11587e2e9c0cSopenharmony_ci        (1, 2, 3),
11597e2e9c0cSopenharmony_ci        &[
11607e2e9c0cSopenharmony_ci            Token::Tuple { len: 3 },
11617e2e9c0cSopenharmony_ci            Token::I32(1),
11627e2e9c0cSopenharmony_ci            Token::I32(2),
11637e2e9c0cSopenharmony_ci            Token::I32(3),
11647e2e9c0cSopenharmony_ci            Token::TupleEnd,
11657e2e9c0cSopenharmony_ci        ],
11667e2e9c0cSopenharmony_ci    );
11677e2e9c0cSopenharmony_ci}
11687e2e9c0cSopenharmony_ci
11697e2e9c0cSopenharmony_ci#[test]
11707e2e9c0cSopenharmony_cifn test_btreemap() {
11717e2e9c0cSopenharmony_ci    test(
11727e2e9c0cSopenharmony_ci        BTreeMap::<isize, isize>::new(),
11737e2e9c0cSopenharmony_ci        &[Token::Map { len: Some(0) }, Token::MapEnd],
11747e2e9c0cSopenharmony_ci    );
11757e2e9c0cSopenharmony_ci    test(
11767e2e9c0cSopenharmony_ci        btreemap![1 => 2],
11777e2e9c0cSopenharmony_ci        &[
11787e2e9c0cSopenharmony_ci            Token::Map { len: Some(1) },
11797e2e9c0cSopenharmony_ci            Token::I32(1),
11807e2e9c0cSopenharmony_ci            Token::I32(2),
11817e2e9c0cSopenharmony_ci            Token::MapEnd,
11827e2e9c0cSopenharmony_ci        ],
11837e2e9c0cSopenharmony_ci    );
11847e2e9c0cSopenharmony_ci    test(
11857e2e9c0cSopenharmony_ci        btreemap![1 => 2, 3 => 4],
11867e2e9c0cSopenharmony_ci        &[
11877e2e9c0cSopenharmony_ci            Token::Map { len: Some(2) },
11887e2e9c0cSopenharmony_ci            Token::I32(1),
11897e2e9c0cSopenharmony_ci            Token::I32(2),
11907e2e9c0cSopenharmony_ci            Token::I32(3),
11917e2e9c0cSopenharmony_ci            Token::I32(4),
11927e2e9c0cSopenharmony_ci            Token::MapEnd,
11937e2e9c0cSopenharmony_ci        ],
11947e2e9c0cSopenharmony_ci    );
11957e2e9c0cSopenharmony_ci    test(
11967e2e9c0cSopenharmony_ci        btreemap![1 => btreemap![], 2 => btreemap![3 => 4, 5 => 6]],
11977e2e9c0cSopenharmony_ci        &[
11987e2e9c0cSopenharmony_ci            Token::Map { len: Some(2) },
11997e2e9c0cSopenharmony_ci            Token::I32(1),
12007e2e9c0cSopenharmony_ci            Token::Map { len: Some(0) },
12017e2e9c0cSopenharmony_ci            Token::MapEnd,
12027e2e9c0cSopenharmony_ci            Token::I32(2),
12037e2e9c0cSopenharmony_ci            Token::Map { len: Some(2) },
12047e2e9c0cSopenharmony_ci            Token::I32(3),
12057e2e9c0cSopenharmony_ci            Token::I32(4),
12067e2e9c0cSopenharmony_ci            Token::I32(5),
12077e2e9c0cSopenharmony_ci            Token::I32(6),
12087e2e9c0cSopenharmony_ci            Token::MapEnd,
12097e2e9c0cSopenharmony_ci            Token::MapEnd,
12107e2e9c0cSopenharmony_ci        ],
12117e2e9c0cSopenharmony_ci    );
12127e2e9c0cSopenharmony_ci    test(
12137e2e9c0cSopenharmony_ci        BTreeMap::<isize, isize>::new(),
12147e2e9c0cSopenharmony_ci        &[
12157e2e9c0cSopenharmony_ci            Token::Struct {
12167e2e9c0cSopenharmony_ci                name: "Anything",
12177e2e9c0cSopenharmony_ci                len: 0,
12187e2e9c0cSopenharmony_ci            },
12197e2e9c0cSopenharmony_ci            Token::StructEnd,
12207e2e9c0cSopenharmony_ci        ],
12217e2e9c0cSopenharmony_ci    );
12227e2e9c0cSopenharmony_ci}
12237e2e9c0cSopenharmony_ci
12247e2e9c0cSopenharmony_ci#[test]
12257e2e9c0cSopenharmony_cifn test_hashmap() {
12267e2e9c0cSopenharmony_ci    test(
12277e2e9c0cSopenharmony_ci        HashMap::<isize, isize>::new(),
12287e2e9c0cSopenharmony_ci        &[Token::Map { len: Some(0) }, Token::MapEnd],
12297e2e9c0cSopenharmony_ci    );
12307e2e9c0cSopenharmony_ci    test(
12317e2e9c0cSopenharmony_ci        hashmap![1 => 2],
12327e2e9c0cSopenharmony_ci        &[
12337e2e9c0cSopenharmony_ci            Token::Map { len: Some(1) },
12347e2e9c0cSopenharmony_ci            Token::I32(1),
12357e2e9c0cSopenharmony_ci            Token::I32(2),
12367e2e9c0cSopenharmony_ci            Token::MapEnd,
12377e2e9c0cSopenharmony_ci        ],
12387e2e9c0cSopenharmony_ci    );
12397e2e9c0cSopenharmony_ci    test(
12407e2e9c0cSopenharmony_ci        hashmap![1 => 2, 3 => 4],
12417e2e9c0cSopenharmony_ci        &[
12427e2e9c0cSopenharmony_ci            Token::Map { len: Some(2) },
12437e2e9c0cSopenharmony_ci            Token::I32(1),
12447e2e9c0cSopenharmony_ci            Token::I32(2),
12457e2e9c0cSopenharmony_ci            Token::I32(3),
12467e2e9c0cSopenharmony_ci            Token::I32(4),
12477e2e9c0cSopenharmony_ci            Token::MapEnd,
12487e2e9c0cSopenharmony_ci        ],
12497e2e9c0cSopenharmony_ci    );
12507e2e9c0cSopenharmony_ci    test(
12517e2e9c0cSopenharmony_ci        hashmap![1 => hashmap![], 2 => hashmap![3 => 4, 5 => 6]],
12527e2e9c0cSopenharmony_ci        &[
12537e2e9c0cSopenharmony_ci            Token::Map { len: Some(2) },
12547e2e9c0cSopenharmony_ci            Token::I32(1),
12557e2e9c0cSopenharmony_ci            Token::Map { len: Some(0) },
12567e2e9c0cSopenharmony_ci            Token::MapEnd,
12577e2e9c0cSopenharmony_ci            Token::I32(2),
12587e2e9c0cSopenharmony_ci            Token::Map { len: Some(2) },
12597e2e9c0cSopenharmony_ci            Token::I32(3),
12607e2e9c0cSopenharmony_ci            Token::I32(4),
12617e2e9c0cSopenharmony_ci            Token::I32(5),
12627e2e9c0cSopenharmony_ci            Token::I32(6),
12637e2e9c0cSopenharmony_ci            Token::MapEnd,
12647e2e9c0cSopenharmony_ci            Token::MapEnd,
12657e2e9c0cSopenharmony_ci        ],
12667e2e9c0cSopenharmony_ci    );
12677e2e9c0cSopenharmony_ci    test(
12687e2e9c0cSopenharmony_ci        HashMap::<isize, isize>::new(),
12697e2e9c0cSopenharmony_ci        &[
12707e2e9c0cSopenharmony_ci            Token::Struct {
12717e2e9c0cSopenharmony_ci                name: "Anything",
12727e2e9c0cSopenharmony_ci                len: 0,
12737e2e9c0cSopenharmony_ci            },
12747e2e9c0cSopenharmony_ci            Token::StructEnd,
12757e2e9c0cSopenharmony_ci        ],
12767e2e9c0cSopenharmony_ci    );
12777e2e9c0cSopenharmony_ci    test(
12787e2e9c0cSopenharmony_ci        hashmap![FnvHasher @ 1 => 2, 3 => 4],
12797e2e9c0cSopenharmony_ci        &[
12807e2e9c0cSopenharmony_ci            Token::Map { len: Some(2) },
12817e2e9c0cSopenharmony_ci            Token::I32(1),
12827e2e9c0cSopenharmony_ci            Token::I32(2),
12837e2e9c0cSopenharmony_ci            Token::I32(3),
12847e2e9c0cSopenharmony_ci            Token::I32(4),
12857e2e9c0cSopenharmony_ci            Token::MapEnd,
12867e2e9c0cSopenharmony_ci        ],
12877e2e9c0cSopenharmony_ci    );
12887e2e9c0cSopenharmony_ci}
12897e2e9c0cSopenharmony_ci
12907e2e9c0cSopenharmony_ci#[test]
12917e2e9c0cSopenharmony_cifn test_struct() {
12927e2e9c0cSopenharmony_ci    test(
12937e2e9c0cSopenharmony_ci        Struct { a: 1, b: 2, c: 0 },
12947e2e9c0cSopenharmony_ci        &[
12957e2e9c0cSopenharmony_ci            Token::Map { len: Some(3) },
12967e2e9c0cSopenharmony_ci            Token::Str("a"),
12977e2e9c0cSopenharmony_ci            Token::I32(1),
12987e2e9c0cSopenharmony_ci            Token::Str("b"),
12997e2e9c0cSopenharmony_ci            Token::I32(2),
13007e2e9c0cSopenharmony_ci            Token::MapEnd,
13017e2e9c0cSopenharmony_ci        ],
13027e2e9c0cSopenharmony_ci    );
13037e2e9c0cSopenharmony_ci    test(
13047e2e9c0cSopenharmony_ci        Struct { a: 1, b: 2, c: 0 },
13057e2e9c0cSopenharmony_ci        &[
13067e2e9c0cSopenharmony_ci            Token::Map { len: Some(3) },
13077e2e9c0cSopenharmony_ci            Token::U8(0),
13087e2e9c0cSopenharmony_ci            Token::I32(1),
13097e2e9c0cSopenharmony_ci            Token::U8(1),
13107e2e9c0cSopenharmony_ci            Token::I32(2),
13117e2e9c0cSopenharmony_ci            Token::MapEnd,
13127e2e9c0cSopenharmony_ci        ],
13137e2e9c0cSopenharmony_ci    );
13147e2e9c0cSopenharmony_ci    test(
13157e2e9c0cSopenharmony_ci        Struct { a: 1, b: 2, c: 0 },
13167e2e9c0cSopenharmony_ci        &[
13177e2e9c0cSopenharmony_ci            Token::Map { len: Some(3) },
13187e2e9c0cSopenharmony_ci            Token::U16(0),
13197e2e9c0cSopenharmony_ci            Token::I32(1),
13207e2e9c0cSopenharmony_ci            Token::U16(1),
13217e2e9c0cSopenharmony_ci            Token::I32(2),
13227e2e9c0cSopenharmony_ci            Token::MapEnd,
13237e2e9c0cSopenharmony_ci        ],
13247e2e9c0cSopenharmony_ci    );
13257e2e9c0cSopenharmony_ci    test(
13267e2e9c0cSopenharmony_ci        Struct { a: 1, b: 2, c: 0 },
13277e2e9c0cSopenharmony_ci        &[
13287e2e9c0cSopenharmony_ci            Token::Map { len: Some(3) },
13297e2e9c0cSopenharmony_ci            Token::U32(0),
13307e2e9c0cSopenharmony_ci            Token::I32(1),
13317e2e9c0cSopenharmony_ci            Token::U32(1),
13327e2e9c0cSopenharmony_ci            Token::I32(2),
13337e2e9c0cSopenharmony_ci            Token::MapEnd,
13347e2e9c0cSopenharmony_ci        ],
13357e2e9c0cSopenharmony_ci    );
13367e2e9c0cSopenharmony_ci    test(
13377e2e9c0cSopenharmony_ci        Struct { a: 1, b: 2, c: 0 },
13387e2e9c0cSopenharmony_ci        &[
13397e2e9c0cSopenharmony_ci            Token::Map { len: Some(3) },
13407e2e9c0cSopenharmony_ci            Token::U64(0),
13417e2e9c0cSopenharmony_ci            Token::I32(1),
13427e2e9c0cSopenharmony_ci            Token::U64(1),
13437e2e9c0cSopenharmony_ci            Token::I32(2),
13447e2e9c0cSopenharmony_ci            Token::MapEnd,
13457e2e9c0cSopenharmony_ci        ],
13467e2e9c0cSopenharmony_ci    );
13477e2e9c0cSopenharmony_ci    // Mixed key types
13487e2e9c0cSopenharmony_ci    test(
13497e2e9c0cSopenharmony_ci        Struct { a: 1, b: 2, c: 0 },
13507e2e9c0cSopenharmony_ci        &[
13517e2e9c0cSopenharmony_ci            Token::Map { len: Some(3) },
13527e2e9c0cSopenharmony_ci            Token::U8(0),
13537e2e9c0cSopenharmony_ci            Token::I32(1),
13547e2e9c0cSopenharmony_ci            Token::U64(1),
13557e2e9c0cSopenharmony_ci            Token::I32(2),
13567e2e9c0cSopenharmony_ci            Token::MapEnd,
13577e2e9c0cSopenharmony_ci        ],
13587e2e9c0cSopenharmony_ci    );
13597e2e9c0cSopenharmony_ci    test(
13607e2e9c0cSopenharmony_ci        Struct { a: 1, b: 2, c: 0 },
13617e2e9c0cSopenharmony_ci        &[
13627e2e9c0cSopenharmony_ci            Token::Map { len: Some(3) },
13637e2e9c0cSopenharmony_ci            Token::U8(0),
13647e2e9c0cSopenharmony_ci            Token::I32(1),
13657e2e9c0cSopenharmony_ci            Token::Str("b"),
13667e2e9c0cSopenharmony_ci            Token::I32(2),
13677e2e9c0cSopenharmony_ci            Token::MapEnd,
13687e2e9c0cSopenharmony_ci        ],
13697e2e9c0cSopenharmony_ci    );
13707e2e9c0cSopenharmony_ci    test(
13717e2e9c0cSopenharmony_ci        Struct { a: 1, b: 2, c: 0 },
13727e2e9c0cSopenharmony_ci        &[
13737e2e9c0cSopenharmony_ci            Token::Struct {
13747e2e9c0cSopenharmony_ci                name: "Struct",
13757e2e9c0cSopenharmony_ci                len: 2,
13767e2e9c0cSopenharmony_ci            },
13777e2e9c0cSopenharmony_ci            Token::Str("a"),
13787e2e9c0cSopenharmony_ci            Token::I32(1),
13797e2e9c0cSopenharmony_ci            Token::Str("b"),
13807e2e9c0cSopenharmony_ci            Token::I32(2),
13817e2e9c0cSopenharmony_ci            Token::StructEnd,
13827e2e9c0cSopenharmony_ci        ],
13837e2e9c0cSopenharmony_ci    );
13847e2e9c0cSopenharmony_ci    test(
13857e2e9c0cSopenharmony_ci        Struct { a: 1, b: 2, c: 0 },
13867e2e9c0cSopenharmony_ci        &[
13877e2e9c0cSopenharmony_ci            Token::Seq { len: Some(3) },
13887e2e9c0cSopenharmony_ci            Token::I32(1),
13897e2e9c0cSopenharmony_ci            Token::I32(2),
13907e2e9c0cSopenharmony_ci            Token::SeqEnd,
13917e2e9c0cSopenharmony_ci        ],
13927e2e9c0cSopenharmony_ci    );
13937e2e9c0cSopenharmony_ci}
13947e2e9c0cSopenharmony_ci
13957e2e9c0cSopenharmony_ci#[test]
13967e2e9c0cSopenharmony_cifn test_struct_borrowed_keys() {
13977e2e9c0cSopenharmony_ci    test(
13987e2e9c0cSopenharmony_ci        Struct { a: 1, b: 2, c: 0 },
13997e2e9c0cSopenharmony_ci        &[
14007e2e9c0cSopenharmony_ci            Token::Map { len: Some(3) },
14017e2e9c0cSopenharmony_ci            Token::BorrowedStr("a"),
14027e2e9c0cSopenharmony_ci            Token::I32(1),
14037e2e9c0cSopenharmony_ci            Token::BorrowedStr("b"),
14047e2e9c0cSopenharmony_ci            Token::I32(2),
14057e2e9c0cSopenharmony_ci            Token::MapEnd,
14067e2e9c0cSopenharmony_ci        ],
14077e2e9c0cSopenharmony_ci    );
14087e2e9c0cSopenharmony_ci    test(
14097e2e9c0cSopenharmony_ci        Struct { a: 1, b: 2, c: 0 },
14107e2e9c0cSopenharmony_ci        &[
14117e2e9c0cSopenharmony_ci            Token::Struct {
14127e2e9c0cSopenharmony_ci                name: "Struct",
14137e2e9c0cSopenharmony_ci                len: 2,
14147e2e9c0cSopenharmony_ci            },
14157e2e9c0cSopenharmony_ci            Token::BorrowedStr("a"),
14167e2e9c0cSopenharmony_ci            Token::I32(1),
14177e2e9c0cSopenharmony_ci            Token::BorrowedStr("b"),
14187e2e9c0cSopenharmony_ci            Token::I32(2),
14197e2e9c0cSopenharmony_ci            Token::StructEnd,
14207e2e9c0cSopenharmony_ci        ],
14217e2e9c0cSopenharmony_ci    );
14227e2e9c0cSopenharmony_ci}
14237e2e9c0cSopenharmony_ci
14247e2e9c0cSopenharmony_ci#[test]
14257e2e9c0cSopenharmony_cifn test_struct_owned_keys() {
14267e2e9c0cSopenharmony_ci    test(
14277e2e9c0cSopenharmony_ci        Struct { a: 1, b: 2, c: 0 },
14287e2e9c0cSopenharmony_ci        &[
14297e2e9c0cSopenharmony_ci            Token::Map { len: Some(3) },
14307e2e9c0cSopenharmony_ci            Token::String("a"),
14317e2e9c0cSopenharmony_ci            Token::I32(1),
14327e2e9c0cSopenharmony_ci            Token::String("b"),
14337e2e9c0cSopenharmony_ci            Token::I32(2),
14347e2e9c0cSopenharmony_ci            Token::MapEnd,
14357e2e9c0cSopenharmony_ci        ],
14367e2e9c0cSopenharmony_ci    );
14377e2e9c0cSopenharmony_ci    test(
14387e2e9c0cSopenharmony_ci        Struct { a: 1, b: 2, c: 0 },
14397e2e9c0cSopenharmony_ci        &[
14407e2e9c0cSopenharmony_ci            Token::Struct {
14417e2e9c0cSopenharmony_ci                name: "Struct",
14427e2e9c0cSopenharmony_ci                len: 2,
14437e2e9c0cSopenharmony_ci            },
14447e2e9c0cSopenharmony_ci            Token::String("a"),
14457e2e9c0cSopenharmony_ci            Token::I32(1),
14467e2e9c0cSopenharmony_ci            Token::String("b"),
14477e2e9c0cSopenharmony_ci            Token::I32(2),
14487e2e9c0cSopenharmony_ci            Token::StructEnd,
14497e2e9c0cSopenharmony_ci        ],
14507e2e9c0cSopenharmony_ci    );
14517e2e9c0cSopenharmony_ci}
14527e2e9c0cSopenharmony_ci
14537e2e9c0cSopenharmony_ci#[test]
14547e2e9c0cSopenharmony_cifn test_struct_with_skip() {
14557e2e9c0cSopenharmony_ci    test(
14567e2e9c0cSopenharmony_ci        Struct { a: 1, b: 2, c: 0 },
14577e2e9c0cSopenharmony_ci        &[
14587e2e9c0cSopenharmony_ci            Token::Map { len: Some(3) },
14597e2e9c0cSopenharmony_ci            Token::Str("a"),
14607e2e9c0cSopenharmony_ci            Token::I32(1),
14617e2e9c0cSopenharmony_ci            Token::Str("b"),
14627e2e9c0cSopenharmony_ci            Token::I32(2),
14637e2e9c0cSopenharmony_ci            Token::Str("c"),
14647e2e9c0cSopenharmony_ci            Token::I32(3),
14657e2e9c0cSopenharmony_ci            Token::Str("d"),
14667e2e9c0cSopenharmony_ci            Token::I32(4),
14677e2e9c0cSopenharmony_ci            Token::MapEnd,
14687e2e9c0cSopenharmony_ci        ],
14697e2e9c0cSopenharmony_ci    );
14707e2e9c0cSopenharmony_ci    test(
14717e2e9c0cSopenharmony_ci        Struct { a: 1, b: 2, c: 0 },
14727e2e9c0cSopenharmony_ci        &[
14737e2e9c0cSopenharmony_ci            Token::Map { len: Some(3) },
14747e2e9c0cSopenharmony_ci            Token::U8(0),
14757e2e9c0cSopenharmony_ci            Token::I32(1),
14767e2e9c0cSopenharmony_ci            Token::U16(1),
14777e2e9c0cSopenharmony_ci            Token::I32(2),
14787e2e9c0cSopenharmony_ci            Token::U32(2),
14797e2e9c0cSopenharmony_ci            Token::I32(3),
14807e2e9c0cSopenharmony_ci            Token::U64(3),
14817e2e9c0cSopenharmony_ci            Token::I32(4),
14827e2e9c0cSopenharmony_ci            Token::MapEnd,
14837e2e9c0cSopenharmony_ci        ],
14847e2e9c0cSopenharmony_ci    );
14857e2e9c0cSopenharmony_ci    test(
14867e2e9c0cSopenharmony_ci        Struct { a: 1, b: 2, c: 0 },
14877e2e9c0cSopenharmony_ci        &[
14887e2e9c0cSopenharmony_ci            Token::Struct {
14897e2e9c0cSopenharmony_ci                name: "Struct",
14907e2e9c0cSopenharmony_ci                len: 2,
14917e2e9c0cSopenharmony_ci            },
14927e2e9c0cSopenharmony_ci            Token::Str("a"),
14937e2e9c0cSopenharmony_ci            Token::I32(1),
14947e2e9c0cSopenharmony_ci            Token::Str("b"),
14957e2e9c0cSopenharmony_ci            Token::I32(2),
14967e2e9c0cSopenharmony_ci            Token::Str("c"),
14977e2e9c0cSopenharmony_ci            Token::I32(3),
14987e2e9c0cSopenharmony_ci            Token::Str("d"),
14997e2e9c0cSopenharmony_ci            Token::I32(4),
15007e2e9c0cSopenharmony_ci            Token::StructEnd,
15017e2e9c0cSopenharmony_ci        ],
15027e2e9c0cSopenharmony_ci    );
15037e2e9c0cSopenharmony_ci}
15047e2e9c0cSopenharmony_ci
15057e2e9c0cSopenharmony_ci#[test]
15067e2e9c0cSopenharmony_cifn test_struct_skip_all() {
15077e2e9c0cSopenharmony_ci    test(
15087e2e9c0cSopenharmony_ci        StructSkipAll { a: 0 },
15097e2e9c0cSopenharmony_ci        &[
15107e2e9c0cSopenharmony_ci            Token::Struct {
15117e2e9c0cSopenharmony_ci                name: "StructSkipAll",
15127e2e9c0cSopenharmony_ci                len: 0,
15137e2e9c0cSopenharmony_ci            },
15147e2e9c0cSopenharmony_ci            Token::StructEnd,
15157e2e9c0cSopenharmony_ci        ],
15167e2e9c0cSopenharmony_ci    );
15177e2e9c0cSopenharmony_ci    test(
15187e2e9c0cSopenharmony_ci        StructSkipAll { a: 0 },
15197e2e9c0cSopenharmony_ci        &[
15207e2e9c0cSopenharmony_ci            Token::Struct {
15217e2e9c0cSopenharmony_ci                name: "StructSkipAll",
15227e2e9c0cSopenharmony_ci                len: 0,
15237e2e9c0cSopenharmony_ci            },
15247e2e9c0cSopenharmony_ci            Token::Str("a"),
15257e2e9c0cSopenharmony_ci            Token::I32(1),
15267e2e9c0cSopenharmony_ci            Token::Str("b"),
15277e2e9c0cSopenharmony_ci            Token::I32(2),
15287e2e9c0cSopenharmony_ci            Token::StructEnd,
15297e2e9c0cSopenharmony_ci        ],
15307e2e9c0cSopenharmony_ci    );
15317e2e9c0cSopenharmony_ci}
15327e2e9c0cSopenharmony_ci
15337e2e9c0cSopenharmony_ci#[test]
15347e2e9c0cSopenharmony_cifn test_struct_skip_default() {
15357e2e9c0cSopenharmony_ci    test(
15367e2e9c0cSopenharmony_ci        StructSkipDefault { a: 16 },
15377e2e9c0cSopenharmony_ci        &[
15387e2e9c0cSopenharmony_ci            Token::Struct {
15397e2e9c0cSopenharmony_ci                name: "StructSkipDefault",
15407e2e9c0cSopenharmony_ci                len: 0,
15417e2e9c0cSopenharmony_ci            },
15427e2e9c0cSopenharmony_ci            Token::StructEnd,
15437e2e9c0cSopenharmony_ci        ],
15447e2e9c0cSopenharmony_ci    );
15457e2e9c0cSopenharmony_ci}
15467e2e9c0cSopenharmony_ci
15477e2e9c0cSopenharmony_ci#[test]
15487e2e9c0cSopenharmony_cifn test_struct_skip_all_deny_unknown() {
15497e2e9c0cSopenharmony_ci    test(
15507e2e9c0cSopenharmony_ci        StructSkipAllDenyUnknown { a: 0 },
15517e2e9c0cSopenharmony_ci        &[
15527e2e9c0cSopenharmony_ci            Token::Struct {
15537e2e9c0cSopenharmony_ci                name: "StructSkipAllDenyUnknown",
15547e2e9c0cSopenharmony_ci                len: 0,
15557e2e9c0cSopenharmony_ci            },
15567e2e9c0cSopenharmony_ci            Token::StructEnd,
15577e2e9c0cSopenharmony_ci        ],
15587e2e9c0cSopenharmony_ci    );
15597e2e9c0cSopenharmony_ci}
15607e2e9c0cSopenharmony_ci
15617e2e9c0cSopenharmony_ci#[test]
15627e2e9c0cSopenharmony_cifn test_struct_default() {
15637e2e9c0cSopenharmony_ci    test(
15647e2e9c0cSopenharmony_ci        StructDefault {
15657e2e9c0cSopenharmony_ci            a: 50,
15667e2e9c0cSopenharmony_ci            b: "overwritten".to_string(),
15677e2e9c0cSopenharmony_ci        },
15687e2e9c0cSopenharmony_ci        &[
15697e2e9c0cSopenharmony_ci            Token::Struct {
15707e2e9c0cSopenharmony_ci                name: "StructDefault",
15717e2e9c0cSopenharmony_ci                len: 2,
15727e2e9c0cSopenharmony_ci            },
15737e2e9c0cSopenharmony_ci            Token::Str("a"),
15747e2e9c0cSopenharmony_ci            Token::I32(50),
15757e2e9c0cSopenharmony_ci            Token::Str("b"),
15767e2e9c0cSopenharmony_ci            Token::String("overwritten"),
15777e2e9c0cSopenharmony_ci            Token::StructEnd,
15787e2e9c0cSopenharmony_ci        ],
15797e2e9c0cSopenharmony_ci    );
15807e2e9c0cSopenharmony_ci    test(
15817e2e9c0cSopenharmony_ci        StructDefault {
15827e2e9c0cSopenharmony_ci            a: 100,
15837e2e9c0cSopenharmony_ci            b: "default".to_string(),
15847e2e9c0cSopenharmony_ci        },
15857e2e9c0cSopenharmony_ci        &[
15867e2e9c0cSopenharmony_ci            Token::Struct {
15877e2e9c0cSopenharmony_ci                name: "StructDefault",
15887e2e9c0cSopenharmony_ci                len: 2,
15897e2e9c0cSopenharmony_ci            },
15907e2e9c0cSopenharmony_ci            Token::StructEnd,
15917e2e9c0cSopenharmony_ci        ],
15927e2e9c0cSopenharmony_ci    );
15937e2e9c0cSopenharmony_ci}
15947e2e9c0cSopenharmony_ci
15957e2e9c0cSopenharmony_ci#[test]
15967e2e9c0cSopenharmony_cifn test_enum_unit() {
15977e2e9c0cSopenharmony_ci    test(
15987e2e9c0cSopenharmony_ci        Enum::Unit,
15997e2e9c0cSopenharmony_ci        &[Token::UnitVariant {
16007e2e9c0cSopenharmony_ci            name: "Enum",
16017e2e9c0cSopenharmony_ci            variant: "Unit",
16027e2e9c0cSopenharmony_ci        }],
16037e2e9c0cSopenharmony_ci    );
16047e2e9c0cSopenharmony_ci}
16057e2e9c0cSopenharmony_ci
16067e2e9c0cSopenharmony_ci#[test]
16077e2e9c0cSopenharmony_cifn test_enum_simple() {
16087e2e9c0cSopenharmony_ci    test(
16097e2e9c0cSopenharmony_ci        Enum::Simple(1),
16107e2e9c0cSopenharmony_ci        &[
16117e2e9c0cSopenharmony_ci            Token::NewtypeVariant {
16127e2e9c0cSopenharmony_ci                name: "Enum",
16137e2e9c0cSopenharmony_ci                variant: "Simple",
16147e2e9c0cSopenharmony_ci            },
16157e2e9c0cSopenharmony_ci            Token::I32(1),
16167e2e9c0cSopenharmony_ci        ],
16177e2e9c0cSopenharmony_ci    );
16187e2e9c0cSopenharmony_ci}
16197e2e9c0cSopenharmony_ci
16207e2e9c0cSopenharmony_ci#[test]
16217e2e9c0cSopenharmony_cifn test_enum_simple_with_skipped() {
16227e2e9c0cSopenharmony_ci    test(
16237e2e9c0cSopenharmony_ci        Enum::SimpleWithSkipped(NotDeserializable),
16247e2e9c0cSopenharmony_ci        &[Token::UnitVariant {
16257e2e9c0cSopenharmony_ci            name: "Enum",
16267e2e9c0cSopenharmony_ci            variant: "SimpleWithSkipped",
16277e2e9c0cSopenharmony_ci        }],
16287e2e9c0cSopenharmony_ci    );
16297e2e9c0cSopenharmony_ci}
16307e2e9c0cSopenharmony_ci
16317e2e9c0cSopenharmony_ci#[test]
16327e2e9c0cSopenharmony_cifn test_enum_seq() {
16337e2e9c0cSopenharmony_ci    test(
16347e2e9c0cSopenharmony_ci        Enum::Seq(1, 2, 3),
16357e2e9c0cSopenharmony_ci        &[
16367e2e9c0cSopenharmony_ci            Token::TupleVariant {
16377e2e9c0cSopenharmony_ci                name: "Enum",
16387e2e9c0cSopenharmony_ci                variant: "Seq",
16397e2e9c0cSopenharmony_ci                len: 3,
16407e2e9c0cSopenharmony_ci            },
16417e2e9c0cSopenharmony_ci            Token::I32(1),
16427e2e9c0cSopenharmony_ci            Token::I32(2),
16437e2e9c0cSopenharmony_ci            Token::I32(3),
16447e2e9c0cSopenharmony_ci            Token::TupleVariantEnd,
16457e2e9c0cSopenharmony_ci        ],
16467e2e9c0cSopenharmony_ci    );
16477e2e9c0cSopenharmony_ci}
16487e2e9c0cSopenharmony_ci
16497e2e9c0cSopenharmony_ci#[test]
16507e2e9c0cSopenharmony_cifn test_enum_map() {
16517e2e9c0cSopenharmony_ci    test(
16527e2e9c0cSopenharmony_ci        Enum::Map { a: 1, b: 2, c: 3 },
16537e2e9c0cSopenharmony_ci        &[
16547e2e9c0cSopenharmony_ci            Token::StructVariant {
16557e2e9c0cSopenharmony_ci                name: "Enum",
16567e2e9c0cSopenharmony_ci                variant: "Map",
16577e2e9c0cSopenharmony_ci                len: 3,
16587e2e9c0cSopenharmony_ci            },
16597e2e9c0cSopenharmony_ci            Token::Str("a"),
16607e2e9c0cSopenharmony_ci            Token::I32(1),
16617e2e9c0cSopenharmony_ci            Token::Str("b"),
16627e2e9c0cSopenharmony_ci            Token::I32(2),
16637e2e9c0cSopenharmony_ci            Token::Str("c"),
16647e2e9c0cSopenharmony_ci            Token::I32(3),
16657e2e9c0cSopenharmony_ci            Token::StructVariantEnd,
16667e2e9c0cSopenharmony_ci        ],
16677e2e9c0cSopenharmony_ci    );
16687e2e9c0cSopenharmony_ci}
16697e2e9c0cSopenharmony_ci
16707e2e9c0cSopenharmony_ci#[test]
16717e2e9c0cSopenharmony_cifn test_enum_unit_usize() {
16727e2e9c0cSopenharmony_ci    test(
16737e2e9c0cSopenharmony_ci        Enum::Unit,
16747e2e9c0cSopenharmony_ci        &[Token::Enum { name: "Enum" }, Token::U32(0), Token::Unit],
16757e2e9c0cSopenharmony_ci    );
16767e2e9c0cSopenharmony_ci}
16777e2e9c0cSopenharmony_ci
16787e2e9c0cSopenharmony_ci#[test]
16797e2e9c0cSopenharmony_cifn test_enum_unit_bytes() {
16807e2e9c0cSopenharmony_ci    test(
16817e2e9c0cSopenharmony_ci        Enum::Unit,
16827e2e9c0cSopenharmony_ci        &[
16837e2e9c0cSopenharmony_ci            Token::Enum { name: "Enum" },
16847e2e9c0cSopenharmony_ci            Token::Bytes(b"Unit"),
16857e2e9c0cSopenharmony_ci            Token::Unit,
16867e2e9c0cSopenharmony_ci        ],
16877e2e9c0cSopenharmony_ci    );
16887e2e9c0cSopenharmony_ci}
16897e2e9c0cSopenharmony_ci
16907e2e9c0cSopenharmony_ci#[test]
16917e2e9c0cSopenharmony_cifn test_enum_other_unit() {
16927e2e9c0cSopenharmony_ci    test(
16937e2e9c0cSopenharmony_ci        EnumOther::Unit,
16947e2e9c0cSopenharmony_ci        &[
16957e2e9c0cSopenharmony_ci            Token::Enum { name: "EnumOther" },
16967e2e9c0cSopenharmony_ci            Token::Str("Unit"),
16977e2e9c0cSopenharmony_ci            Token::Unit,
16987e2e9c0cSopenharmony_ci        ],
16997e2e9c0cSopenharmony_ci    );
17007e2e9c0cSopenharmony_ci    test(
17017e2e9c0cSopenharmony_ci        EnumOther::Unit,
17027e2e9c0cSopenharmony_ci        &[Token::Enum { name: "EnumOther" }, Token::U8(0), Token::Unit],
17037e2e9c0cSopenharmony_ci    );
17047e2e9c0cSopenharmony_ci    test(
17057e2e9c0cSopenharmony_ci        EnumOther::Unit,
17067e2e9c0cSopenharmony_ci        &[
17077e2e9c0cSopenharmony_ci            Token::Enum { name: "EnumOther" },
17087e2e9c0cSopenharmony_ci            Token::U16(0),
17097e2e9c0cSopenharmony_ci            Token::Unit,
17107e2e9c0cSopenharmony_ci        ],
17117e2e9c0cSopenharmony_ci    );
17127e2e9c0cSopenharmony_ci    test(
17137e2e9c0cSopenharmony_ci        EnumOther::Unit,
17147e2e9c0cSopenharmony_ci        &[
17157e2e9c0cSopenharmony_ci            Token::Enum { name: "EnumOther" },
17167e2e9c0cSopenharmony_ci            Token::U32(0),
17177e2e9c0cSopenharmony_ci            Token::Unit,
17187e2e9c0cSopenharmony_ci        ],
17197e2e9c0cSopenharmony_ci    );
17207e2e9c0cSopenharmony_ci    test(
17217e2e9c0cSopenharmony_ci        EnumOther::Unit,
17227e2e9c0cSopenharmony_ci        &[
17237e2e9c0cSopenharmony_ci            Token::Enum { name: "EnumOther" },
17247e2e9c0cSopenharmony_ci            Token::U64(0),
17257e2e9c0cSopenharmony_ci            Token::Unit,
17267e2e9c0cSopenharmony_ci        ],
17277e2e9c0cSopenharmony_ci    );
17287e2e9c0cSopenharmony_ci}
17297e2e9c0cSopenharmony_ci
17307e2e9c0cSopenharmony_ci#[test]
17317e2e9c0cSopenharmony_cifn test_enum_other() {
17327e2e9c0cSopenharmony_ci    test(
17337e2e9c0cSopenharmony_ci        EnumOther::Other,
17347e2e9c0cSopenharmony_ci        &[
17357e2e9c0cSopenharmony_ci            Token::Enum { name: "EnumOther" },
17367e2e9c0cSopenharmony_ci            Token::Str("Foo"),
17377e2e9c0cSopenharmony_ci            Token::Unit,
17387e2e9c0cSopenharmony_ci        ],
17397e2e9c0cSopenharmony_ci    );
17407e2e9c0cSopenharmony_ci    test(
17417e2e9c0cSopenharmony_ci        EnumOther::Other,
17427e2e9c0cSopenharmony_ci        &[
17437e2e9c0cSopenharmony_ci            Token::Enum { name: "EnumOther" },
17447e2e9c0cSopenharmony_ci            Token::U8(42),
17457e2e9c0cSopenharmony_ci            Token::Unit,
17467e2e9c0cSopenharmony_ci        ],
17477e2e9c0cSopenharmony_ci    );
17487e2e9c0cSopenharmony_ci    test(
17497e2e9c0cSopenharmony_ci        EnumOther::Other,
17507e2e9c0cSopenharmony_ci        &[
17517e2e9c0cSopenharmony_ci            Token::Enum { name: "EnumOther" },
17527e2e9c0cSopenharmony_ci            Token::U16(42),
17537e2e9c0cSopenharmony_ci            Token::Unit,
17547e2e9c0cSopenharmony_ci        ],
17557e2e9c0cSopenharmony_ci    );
17567e2e9c0cSopenharmony_ci    test(
17577e2e9c0cSopenharmony_ci        EnumOther::Other,
17587e2e9c0cSopenharmony_ci        &[
17597e2e9c0cSopenharmony_ci            Token::Enum { name: "EnumOther" },
17607e2e9c0cSopenharmony_ci            Token::U32(42),
17617e2e9c0cSopenharmony_ci            Token::Unit,
17627e2e9c0cSopenharmony_ci        ],
17637e2e9c0cSopenharmony_ci    );
17647e2e9c0cSopenharmony_ci    test(
17657e2e9c0cSopenharmony_ci        EnumOther::Other,
17667e2e9c0cSopenharmony_ci        &[
17677e2e9c0cSopenharmony_ci            Token::Enum { name: "EnumOther" },
17687e2e9c0cSopenharmony_ci            Token::U64(42),
17697e2e9c0cSopenharmony_ci            Token::Unit,
17707e2e9c0cSopenharmony_ci        ],
17717e2e9c0cSopenharmony_ci    );
17727e2e9c0cSopenharmony_ci}
17737e2e9c0cSopenharmony_ci
17747e2e9c0cSopenharmony_ci#[test]
17757e2e9c0cSopenharmony_cifn test_box() {
17767e2e9c0cSopenharmony_ci    test(Box::new(0i32), &[Token::I32(0)]);
17777e2e9c0cSopenharmony_ci}
17787e2e9c0cSopenharmony_ci
17797e2e9c0cSopenharmony_ci#[test]
17807e2e9c0cSopenharmony_cifn test_boxed_slice() {
17817e2e9c0cSopenharmony_ci    test(
17827e2e9c0cSopenharmony_ci        Box::new([0, 1, 2]),
17837e2e9c0cSopenharmony_ci        &[
17847e2e9c0cSopenharmony_ci            Token::Seq { len: Some(3) },
17857e2e9c0cSopenharmony_ci            Token::I32(0),
17867e2e9c0cSopenharmony_ci            Token::I32(1),
17877e2e9c0cSopenharmony_ci            Token::I32(2),
17887e2e9c0cSopenharmony_ci            Token::SeqEnd,
17897e2e9c0cSopenharmony_ci        ],
17907e2e9c0cSopenharmony_ci    );
17917e2e9c0cSopenharmony_ci}
17927e2e9c0cSopenharmony_ci
17937e2e9c0cSopenharmony_ci#[test]
17947e2e9c0cSopenharmony_cifn test_duration() {
17957e2e9c0cSopenharmony_ci    test(
17967e2e9c0cSopenharmony_ci        Duration::new(1, 2),
17977e2e9c0cSopenharmony_ci        &[
17987e2e9c0cSopenharmony_ci            Token::Struct {
17997e2e9c0cSopenharmony_ci                name: "Duration",
18007e2e9c0cSopenharmony_ci                len: 2,
18017e2e9c0cSopenharmony_ci            },
18027e2e9c0cSopenharmony_ci            Token::Str("secs"),
18037e2e9c0cSopenharmony_ci            Token::U64(1),
18047e2e9c0cSopenharmony_ci            Token::Str("nanos"),
18057e2e9c0cSopenharmony_ci            Token::U32(2),
18067e2e9c0cSopenharmony_ci            Token::StructEnd,
18077e2e9c0cSopenharmony_ci        ],
18087e2e9c0cSopenharmony_ci    );
18097e2e9c0cSopenharmony_ci    test(
18107e2e9c0cSopenharmony_ci        Duration::new(1, 2),
18117e2e9c0cSopenharmony_ci        &[
18127e2e9c0cSopenharmony_ci            Token::Seq { len: Some(2) },
18137e2e9c0cSopenharmony_ci            Token::I64(1),
18147e2e9c0cSopenharmony_ci            Token::I64(2),
18157e2e9c0cSopenharmony_ci            Token::SeqEnd,
18167e2e9c0cSopenharmony_ci        ],
18177e2e9c0cSopenharmony_ci    );
18187e2e9c0cSopenharmony_ci}
18197e2e9c0cSopenharmony_ci
18207e2e9c0cSopenharmony_ci#[test]
18217e2e9c0cSopenharmony_cifn test_system_time() {
18227e2e9c0cSopenharmony_ci    test(
18237e2e9c0cSopenharmony_ci        UNIX_EPOCH + Duration::new(1, 2),
18247e2e9c0cSopenharmony_ci        &[
18257e2e9c0cSopenharmony_ci            Token::Struct {
18267e2e9c0cSopenharmony_ci                name: "SystemTime",
18277e2e9c0cSopenharmony_ci                len: 2,
18287e2e9c0cSopenharmony_ci            },
18297e2e9c0cSopenharmony_ci            Token::Str("secs_since_epoch"),
18307e2e9c0cSopenharmony_ci            Token::U64(1),
18317e2e9c0cSopenharmony_ci            Token::Str("nanos_since_epoch"),
18327e2e9c0cSopenharmony_ci            Token::U32(2),
18337e2e9c0cSopenharmony_ci            Token::StructEnd,
18347e2e9c0cSopenharmony_ci        ],
18357e2e9c0cSopenharmony_ci    );
18367e2e9c0cSopenharmony_ci    test(
18377e2e9c0cSopenharmony_ci        UNIX_EPOCH + Duration::new(1, 2),
18387e2e9c0cSopenharmony_ci        &[
18397e2e9c0cSopenharmony_ci            Token::Seq { len: Some(2) },
18407e2e9c0cSopenharmony_ci            Token::I64(1),
18417e2e9c0cSopenharmony_ci            Token::I64(2),
18427e2e9c0cSopenharmony_ci            Token::SeqEnd,
18437e2e9c0cSopenharmony_ci        ],
18447e2e9c0cSopenharmony_ci    );
18457e2e9c0cSopenharmony_ci}
18467e2e9c0cSopenharmony_ci
18477e2e9c0cSopenharmony_ci#[test]
18487e2e9c0cSopenharmony_cifn test_range() {
18497e2e9c0cSopenharmony_ci    test(
18507e2e9c0cSopenharmony_ci        1u32..2u32,
18517e2e9c0cSopenharmony_ci        &[
18527e2e9c0cSopenharmony_ci            Token::Struct {
18537e2e9c0cSopenharmony_ci                name: "Range",
18547e2e9c0cSopenharmony_ci                len: 2,
18557e2e9c0cSopenharmony_ci            },
18567e2e9c0cSopenharmony_ci            Token::Str("start"),
18577e2e9c0cSopenharmony_ci            Token::U32(1),
18587e2e9c0cSopenharmony_ci            Token::Str("end"),
18597e2e9c0cSopenharmony_ci            Token::U32(2),
18607e2e9c0cSopenharmony_ci            Token::StructEnd,
18617e2e9c0cSopenharmony_ci        ],
18627e2e9c0cSopenharmony_ci    );
18637e2e9c0cSopenharmony_ci    test(
18647e2e9c0cSopenharmony_ci        1u32..2u32,
18657e2e9c0cSopenharmony_ci        &[
18667e2e9c0cSopenharmony_ci            Token::Seq { len: Some(2) },
18677e2e9c0cSopenharmony_ci            Token::U64(1),
18687e2e9c0cSopenharmony_ci            Token::U64(2),
18697e2e9c0cSopenharmony_ci            Token::SeqEnd,
18707e2e9c0cSopenharmony_ci        ],
18717e2e9c0cSopenharmony_ci    );
18727e2e9c0cSopenharmony_ci}
18737e2e9c0cSopenharmony_ci
18747e2e9c0cSopenharmony_ci#[test]
18757e2e9c0cSopenharmony_cifn test_range_inclusive() {
18767e2e9c0cSopenharmony_ci    test(
18777e2e9c0cSopenharmony_ci        1u32..=2u32,
18787e2e9c0cSopenharmony_ci        &[
18797e2e9c0cSopenharmony_ci            Token::Struct {
18807e2e9c0cSopenharmony_ci                name: "RangeInclusive",
18817e2e9c0cSopenharmony_ci                len: 2,
18827e2e9c0cSopenharmony_ci            },
18837e2e9c0cSopenharmony_ci            Token::Str("start"),
18847e2e9c0cSopenharmony_ci            Token::U32(1),
18857e2e9c0cSopenharmony_ci            Token::Str("end"),
18867e2e9c0cSopenharmony_ci            Token::U32(2),
18877e2e9c0cSopenharmony_ci            Token::StructEnd,
18887e2e9c0cSopenharmony_ci        ],
18897e2e9c0cSopenharmony_ci    );
18907e2e9c0cSopenharmony_ci    test(
18917e2e9c0cSopenharmony_ci        1u32..=2u32,
18927e2e9c0cSopenharmony_ci        &[
18937e2e9c0cSopenharmony_ci            Token::Seq { len: Some(2) },
18947e2e9c0cSopenharmony_ci            Token::U64(1),
18957e2e9c0cSopenharmony_ci            Token::U64(2),
18967e2e9c0cSopenharmony_ci            Token::SeqEnd,
18977e2e9c0cSopenharmony_ci        ],
18987e2e9c0cSopenharmony_ci    );
18997e2e9c0cSopenharmony_ci}
19007e2e9c0cSopenharmony_ci
19017e2e9c0cSopenharmony_ci#[test]
19027e2e9c0cSopenharmony_cifn test_range_from() {
19037e2e9c0cSopenharmony_ci    test(
19047e2e9c0cSopenharmony_ci        1u32..,
19057e2e9c0cSopenharmony_ci        &[
19067e2e9c0cSopenharmony_ci            Token::Struct {
19077e2e9c0cSopenharmony_ci                name: "RangeFrom",
19087e2e9c0cSopenharmony_ci                len: 1,
19097e2e9c0cSopenharmony_ci            },
19107e2e9c0cSopenharmony_ci            Token::Str("start"),
19117e2e9c0cSopenharmony_ci            Token::U32(1),
19127e2e9c0cSopenharmony_ci            Token::StructEnd,
19137e2e9c0cSopenharmony_ci        ],
19147e2e9c0cSopenharmony_ci    );
19157e2e9c0cSopenharmony_ci    test(
19167e2e9c0cSopenharmony_ci        1u32..,
19177e2e9c0cSopenharmony_ci        &[Token::Seq { len: Some(1) }, Token::U32(1), Token::SeqEnd],
19187e2e9c0cSopenharmony_ci    );
19197e2e9c0cSopenharmony_ci}
19207e2e9c0cSopenharmony_ci
19217e2e9c0cSopenharmony_ci#[test]
19227e2e9c0cSopenharmony_cifn test_range_to() {
19237e2e9c0cSopenharmony_ci    test(
19247e2e9c0cSopenharmony_ci        ..2u32,
19257e2e9c0cSopenharmony_ci        &[
19267e2e9c0cSopenharmony_ci            Token::Struct {
19277e2e9c0cSopenharmony_ci                name: "RangeTo",
19287e2e9c0cSopenharmony_ci                len: 1,
19297e2e9c0cSopenharmony_ci            },
19307e2e9c0cSopenharmony_ci            Token::Str("end"),
19317e2e9c0cSopenharmony_ci            Token::U32(2),
19327e2e9c0cSopenharmony_ci            Token::StructEnd,
19337e2e9c0cSopenharmony_ci        ],
19347e2e9c0cSopenharmony_ci    );
19357e2e9c0cSopenharmony_ci    test(
19367e2e9c0cSopenharmony_ci        ..2u32,
19377e2e9c0cSopenharmony_ci        &[Token::Seq { len: Some(1) }, Token::U32(2), Token::SeqEnd],
19387e2e9c0cSopenharmony_ci    );
19397e2e9c0cSopenharmony_ci}
19407e2e9c0cSopenharmony_ci
19417e2e9c0cSopenharmony_ci#[test]
19427e2e9c0cSopenharmony_cifn test_bound() {
19437e2e9c0cSopenharmony_ci    test(
19447e2e9c0cSopenharmony_ci        Bound::Unbounded::<()>,
19457e2e9c0cSopenharmony_ci        &[
19467e2e9c0cSopenharmony_ci            Token::Enum { name: "Bound" },
19477e2e9c0cSopenharmony_ci            Token::Str("Unbounded"),
19487e2e9c0cSopenharmony_ci            Token::Unit,
19497e2e9c0cSopenharmony_ci        ],
19507e2e9c0cSopenharmony_ci    );
19517e2e9c0cSopenharmony_ci    test(
19527e2e9c0cSopenharmony_ci        Bound::Included(0),
19537e2e9c0cSopenharmony_ci        &[
19547e2e9c0cSopenharmony_ci            Token::Enum { name: "Bound" },
19557e2e9c0cSopenharmony_ci            Token::Str("Included"),
19567e2e9c0cSopenharmony_ci            Token::U8(0),
19577e2e9c0cSopenharmony_ci        ],
19587e2e9c0cSopenharmony_ci    );
19597e2e9c0cSopenharmony_ci    test(
19607e2e9c0cSopenharmony_ci        Bound::Excluded(0),
19617e2e9c0cSopenharmony_ci        &[
19627e2e9c0cSopenharmony_ci            Token::Enum { name: "Bound" },
19637e2e9c0cSopenharmony_ci            Token::Str("Excluded"),
19647e2e9c0cSopenharmony_ci            Token::U8(0),
19657e2e9c0cSopenharmony_ci        ],
19667e2e9c0cSopenharmony_ci    );
19677e2e9c0cSopenharmony_ci}
19687e2e9c0cSopenharmony_ci
19697e2e9c0cSopenharmony_ci#[test]
19707e2e9c0cSopenharmony_cifn test_path() {
19717e2e9c0cSopenharmony_ci    test(
19727e2e9c0cSopenharmony_ci        Path::new("/usr/local/lib"),
19737e2e9c0cSopenharmony_ci        &[Token::BorrowedStr("/usr/local/lib")],
19747e2e9c0cSopenharmony_ci    );
19757e2e9c0cSopenharmony_ci    test(
19767e2e9c0cSopenharmony_ci        Path::new("/usr/local/lib"),
19777e2e9c0cSopenharmony_ci        &[Token::BorrowedBytes(b"/usr/local/lib")],
19787e2e9c0cSopenharmony_ci    );
19797e2e9c0cSopenharmony_ci}
19807e2e9c0cSopenharmony_ci
19817e2e9c0cSopenharmony_ci#[test]
19827e2e9c0cSopenharmony_cifn test_path_buf() {
19837e2e9c0cSopenharmony_ci    test(
19847e2e9c0cSopenharmony_ci        PathBuf::from("/usr/local/lib"),
19857e2e9c0cSopenharmony_ci        &[Token::Str("/usr/local/lib")],
19867e2e9c0cSopenharmony_ci    );
19877e2e9c0cSopenharmony_ci    test(
19887e2e9c0cSopenharmony_ci        PathBuf::from("/usr/local/lib"),
19897e2e9c0cSopenharmony_ci        &[Token::String("/usr/local/lib")],
19907e2e9c0cSopenharmony_ci    );
19917e2e9c0cSopenharmony_ci    test(
19927e2e9c0cSopenharmony_ci        PathBuf::from("/usr/local/lib"),
19937e2e9c0cSopenharmony_ci        &[Token::Bytes(b"/usr/local/lib")],
19947e2e9c0cSopenharmony_ci    );
19957e2e9c0cSopenharmony_ci    test(
19967e2e9c0cSopenharmony_ci        PathBuf::from("/usr/local/lib"),
19977e2e9c0cSopenharmony_ci        &[Token::ByteBuf(b"/usr/local/lib")],
19987e2e9c0cSopenharmony_ci    );
19997e2e9c0cSopenharmony_ci}
20007e2e9c0cSopenharmony_ci
20017e2e9c0cSopenharmony_ci#[test]
20027e2e9c0cSopenharmony_cifn test_boxed_path() {
20037e2e9c0cSopenharmony_ci    test(
20047e2e9c0cSopenharmony_ci        PathBuf::from("/usr/local/lib").into_boxed_path(),
20057e2e9c0cSopenharmony_ci        &[Token::Str("/usr/local/lib")],
20067e2e9c0cSopenharmony_ci    );
20077e2e9c0cSopenharmony_ci    test(
20087e2e9c0cSopenharmony_ci        PathBuf::from("/usr/local/lib").into_boxed_path(),
20097e2e9c0cSopenharmony_ci        &[Token::String("/usr/local/lib")],
20107e2e9c0cSopenharmony_ci    );
20117e2e9c0cSopenharmony_ci    test(
20127e2e9c0cSopenharmony_ci        PathBuf::from("/usr/local/lib").into_boxed_path(),
20137e2e9c0cSopenharmony_ci        &[Token::Bytes(b"/usr/local/lib")],
20147e2e9c0cSopenharmony_ci    );
20157e2e9c0cSopenharmony_ci    test(
20167e2e9c0cSopenharmony_ci        PathBuf::from("/usr/local/lib").into_boxed_path(),
20177e2e9c0cSopenharmony_ci        &[Token::ByteBuf(b"/usr/local/lib")],
20187e2e9c0cSopenharmony_ci    );
20197e2e9c0cSopenharmony_ci}
20207e2e9c0cSopenharmony_ci
20217e2e9c0cSopenharmony_ci#[test]
20227e2e9c0cSopenharmony_cifn test_cstring() {
20237e2e9c0cSopenharmony_ci    test(CString::new("abc").unwrap(), &[Token::Bytes(b"abc")]);
20247e2e9c0cSopenharmony_ci}
20257e2e9c0cSopenharmony_ci
20267e2e9c0cSopenharmony_ci#[test]
20277e2e9c0cSopenharmony_cifn test_rc() {
20287e2e9c0cSopenharmony_ci    test(Rc::new(true), &[Token::Bool(true)]);
20297e2e9c0cSopenharmony_ci}
20307e2e9c0cSopenharmony_ci
20317e2e9c0cSopenharmony_ci#[test]
20327e2e9c0cSopenharmony_cifn test_rc_weak_some() {
20337e2e9c0cSopenharmony_ci    test(
20347e2e9c0cSopenharmony_ci        SkipPartialEq(RcWeak::<bool>::new()),
20357e2e9c0cSopenharmony_ci        &[Token::Some, Token::Bool(true)],
20367e2e9c0cSopenharmony_ci    );
20377e2e9c0cSopenharmony_ci}
20387e2e9c0cSopenharmony_ci
20397e2e9c0cSopenharmony_ci#[test]
20407e2e9c0cSopenharmony_cifn test_rc_weak_none() {
20417e2e9c0cSopenharmony_ci    test(SkipPartialEq(RcWeak::<bool>::new()), &[Token::None]);
20427e2e9c0cSopenharmony_ci}
20437e2e9c0cSopenharmony_ci
20447e2e9c0cSopenharmony_ci#[test]
20457e2e9c0cSopenharmony_cifn test_arc() {
20467e2e9c0cSopenharmony_ci    test(Arc::new(true), &[Token::Bool(true)]);
20477e2e9c0cSopenharmony_ci}
20487e2e9c0cSopenharmony_ci
20497e2e9c0cSopenharmony_ci#[test]
20507e2e9c0cSopenharmony_cifn test_arc_weak_some() {
20517e2e9c0cSopenharmony_ci    test(
20527e2e9c0cSopenharmony_ci        SkipPartialEq(ArcWeak::<bool>::new()),
20537e2e9c0cSopenharmony_ci        &[Token::Some, Token::Bool(true)],
20547e2e9c0cSopenharmony_ci    );
20557e2e9c0cSopenharmony_ci}
20567e2e9c0cSopenharmony_ci
20577e2e9c0cSopenharmony_ci#[test]
20587e2e9c0cSopenharmony_cifn test_arc_weak_none() {
20597e2e9c0cSopenharmony_ci    test(SkipPartialEq(ArcWeak::<bool>::new()), &[Token::None]);
20607e2e9c0cSopenharmony_ci}
20617e2e9c0cSopenharmony_ci
20627e2e9c0cSopenharmony_ci#[test]
20637e2e9c0cSopenharmony_cifn test_wrapping() {
20647e2e9c0cSopenharmony_ci    test(Wrapping(1usize), &[Token::U32(1)]);
20657e2e9c0cSopenharmony_ci    test(Wrapping(1usize), &[Token::U64(1)]);
20667e2e9c0cSopenharmony_ci}
20677e2e9c0cSopenharmony_ci
20687e2e9c0cSopenharmony_ci#[test]
20697e2e9c0cSopenharmony_cifn test_rc_dst() {
20707e2e9c0cSopenharmony_ci    test(Rc::<str>::from("s"), &[Token::Str("s")]);
20717e2e9c0cSopenharmony_ci    test(
20727e2e9c0cSopenharmony_ci        Rc::<[bool]>::from(&[true][..]),
20737e2e9c0cSopenharmony_ci        &[
20747e2e9c0cSopenharmony_ci            Token::Seq { len: Some(1) },
20757e2e9c0cSopenharmony_ci            Token::Bool(true),
20767e2e9c0cSopenharmony_ci            Token::SeqEnd,
20777e2e9c0cSopenharmony_ci        ],
20787e2e9c0cSopenharmony_ci    );
20797e2e9c0cSopenharmony_ci}
20807e2e9c0cSopenharmony_ci
20817e2e9c0cSopenharmony_ci#[test]
20827e2e9c0cSopenharmony_cifn test_arc_dst() {
20837e2e9c0cSopenharmony_ci    test(Arc::<str>::from("s"), &[Token::Str("s")]);
20847e2e9c0cSopenharmony_ci    test(
20857e2e9c0cSopenharmony_ci        Arc::<[bool]>::from(&[true][..]),
20867e2e9c0cSopenharmony_ci        &[
20877e2e9c0cSopenharmony_ci            Token::Seq { len: Some(1) },
20887e2e9c0cSopenharmony_ci            Token::Bool(true),
20897e2e9c0cSopenharmony_ci            Token::SeqEnd,
20907e2e9c0cSopenharmony_ci        ],
20917e2e9c0cSopenharmony_ci    );
20927e2e9c0cSopenharmony_ci}
20937e2e9c0cSopenharmony_ci
20947e2e9c0cSopenharmony_ci#[test]
20957e2e9c0cSopenharmony_cifn test_ignored_any() {
20967e2e9c0cSopenharmony_ci    test(IgnoredAny, &[Token::Str("s")]);
20977e2e9c0cSopenharmony_ci    test(
20987e2e9c0cSopenharmony_ci        IgnoredAny,
20997e2e9c0cSopenharmony_ci        &[
21007e2e9c0cSopenharmony_ci            Token::Seq { len: Some(1) },
21017e2e9c0cSopenharmony_ci            Token::Bool(true),
21027e2e9c0cSopenharmony_ci            Token::SeqEnd,
21037e2e9c0cSopenharmony_ci        ],
21047e2e9c0cSopenharmony_ci    );
21057e2e9c0cSopenharmony_ci    test(
21067e2e9c0cSopenharmony_ci        IgnoredAny,
21077e2e9c0cSopenharmony_ci        &[Token::Enum { name: "E" }, Token::Str("Rust"), Token::Unit],
21087e2e9c0cSopenharmony_ci    );
21097e2e9c0cSopenharmony_ci}
21107e2e9c0cSopenharmony_ci
21117e2e9c0cSopenharmony_ci#[test]
21127e2e9c0cSopenharmony_cifn test_net_ipv4addr_readable() {
21137e2e9c0cSopenharmony_ci    test(
21147e2e9c0cSopenharmony_ci        "1.2.3.4".parse::<net::Ipv4Addr>().unwrap().readable(),
21157e2e9c0cSopenharmony_ci        &[Token::Str("1.2.3.4")],
21167e2e9c0cSopenharmony_ci    );
21177e2e9c0cSopenharmony_ci}
21187e2e9c0cSopenharmony_ci
21197e2e9c0cSopenharmony_ci#[test]
21207e2e9c0cSopenharmony_cifn test_net_ipv6addr_readable() {
21217e2e9c0cSopenharmony_ci    test(
21227e2e9c0cSopenharmony_ci        "::1".parse::<net::Ipv6Addr>().unwrap().readable(),
21237e2e9c0cSopenharmony_ci        &[Token::Str("::1")],
21247e2e9c0cSopenharmony_ci    );
21257e2e9c0cSopenharmony_ci}
21267e2e9c0cSopenharmony_ci
21277e2e9c0cSopenharmony_ci#[test]
21287e2e9c0cSopenharmony_cifn test_net_ipaddr_readable() {
21297e2e9c0cSopenharmony_ci    test(
21307e2e9c0cSopenharmony_ci        "1.2.3.4".parse::<net::IpAddr>().unwrap().readable(),
21317e2e9c0cSopenharmony_ci        &[Token::Str("1.2.3.4")],
21327e2e9c0cSopenharmony_ci    );
21337e2e9c0cSopenharmony_ci}
21347e2e9c0cSopenharmony_ci
21357e2e9c0cSopenharmony_ci#[test]
21367e2e9c0cSopenharmony_cifn test_net_socketaddr_readable() {
21377e2e9c0cSopenharmony_ci    test(
21387e2e9c0cSopenharmony_ci        "1.2.3.4:1234"
21397e2e9c0cSopenharmony_ci            .parse::<net::SocketAddr>()
21407e2e9c0cSopenharmony_ci            .unwrap()
21417e2e9c0cSopenharmony_ci            .readable(),
21427e2e9c0cSopenharmony_ci        &[Token::Str("1.2.3.4:1234")],
21437e2e9c0cSopenharmony_ci    );
21447e2e9c0cSopenharmony_ci    test(
21457e2e9c0cSopenharmony_ci        "1.2.3.4:1234"
21467e2e9c0cSopenharmony_ci            .parse::<net::SocketAddrV4>()
21477e2e9c0cSopenharmony_ci            .unwrap()
21487e2e9c0cSopenharmony_ci            .readable(),
21497e2e9c0cSopenharmony_ci        &[Token::Str("1.2.3.4:1234")],
21507e2e9c0cSopenharmony_ci    );
21517e2e9c0cSopenharmony_ci    test(
21527e2e9c0cSopenharmony_ci        "[::1]:1234"
21537e2e9c0cSopenharmony_ci            .parse::<net::SocketAddrV6>()
21547e2e9c0cSopenharmony_ci            .unwrap()
21557e2e9c0cSopenharmony_ci            .readable(),
21567e2e9c0cSopenharmony_ci        &[Token::Str("[::1]:1234")],
21577e2e9c0cSopenharmony_ci    );
21587e2e9c0cSopenharmony_ci}
21597e2e9c0cSopenharmony_ci
21607e2e9c0cSopenharmony_ci#[test]
21617e2e9c0cSopenharmony_cifn test_net_ipv4addr_compact() {
21627e2e9c0cSopenharmony_ci    test(
21637e2e9c0cSopenharmony_ci        net::Ipv4Addr::from(*b"1234").compact(),
21647e2e9c0cSopenharmony_ci        &seq![
21657e2e9c0cSopenharmony_ci            Token::Tuple { len: 4 },
21667e2e9c0cSopenharmony_ci            b"1234".iter().copied().map(Token::U8),
21677e2e9c0cSopenharmony_ci            Token::TupleEnd
21687e2e9c0cSopenharmony_ci        ],
21697e2e9c0cSopenharmony_ci    );
21707e2e9c0cSopenharmony_ci}
21717e2e9c0cSopenharmony_ci
21727e2e9c0cSopenharmony_ci#[test]
21737e2e9c0cSopenharmony_cifn test_net_ipv6addr_compact() {
21747e2e9c0cSopenharmony_ci    test(
21757e2e9c0cSopenharmony_ci        net::Ipv6Addr::from(*b"1234567890123456").compact(),
21767e2e9c0cSopenharmony_ci        &seq![
21777e2e9c0cSopenharmony_ci            Token::Tuple { len: 4 },
21787e2e9c0cSopenharmony_ci            b"1234567890123456".iter().copied().map(Token::U8),
21797e2e9c0cSopenharmony_ci            Token::TupleEnd
21807e2e9c0cSopenharmony_ci        ],
21817e2e9c0cSopenharmony_ci    );
21827e2e9c0cSopenharmony_ci}
21837e2e9c0cSopenharmony_ci
21847e2e9c0cSopenharmony_ci#[test]
21857e2e9c0cSopenharmony_cifn test_net_ipaddr_compact() {
21867e2e9c0cSopenharmony_ci    test(
21877e2e9c0cSopenharmony_ci        net::IpAddr::from(*b"1234").compact(),
21887e2e9c0cSopenharmony_ci        &seq![
21897e2e9c0cSopenharmony_ci            Token::NewtypeVariant {
21907e2e9c0cSopenharmony_ci                name: "IpAddr",
21917e2e9c0cSopenharmony_ci                variant: "V4"
21927e2e9c0cSopenharmony_ci            },
21937e2e9c0cSopenharmony_ci            Token::Tuple { len: 4 },
21947e2e9c0cSopenharmony_ci            b"1234".iter().copied().map(Token::U8),
21957e2e9c0cSopenharmony_ci            Token::TupleEnd
21967e2e9c0cSopenharmony_ci        ],
21977e2e9c0cSopenharmony_ci    );
21987e2e9c0cSopenharmony_ci}
21997e2e9c0cSopenharmony_ci
22007e2e9c0cSopenharmony_ci#[test]
22017e2e9c0cSopenharmony_cifn test_net_socketaddr_compact() {
22027e2e9c0cSopenharmony_ci    test(
22037e2e9c0cSopenharmony_ci        net::SocketAddr::from((*b"1234567890123456", 1234)).compact(),
22047e2e9c0cSopenharmony_ci        &seq![
22057e2e9c0cSopenharmony_ci            Token::NewtypeVariant {
22067e2e9c0cSopenharmony_ci                name: "SocketAddr",
22077e2e9c0cSopenharmony_ci                variant: "V6"
22087e2e9c0cSopenharmony_ci            },
22097e2e9c0cSopenharmony_ci            Token::Tuple { len: 2 },
22107e2e9c0cSopenharmony_ci            Token::Tuple { len: 16 },
22117e2e9c0cSopenharmony_ci            b"1234567890123456".iter().copied().map(Token::U8),
22127e2e9c0cSopenharmony_ci            Token::TupleEnd,
22137e2e9c0cSopenharmony_ci            Token::U16(1234),
22147e2e9c0cSopenharmony_ci            Token::TupleEnd
22157e2e9c0cSopenharmony_ci        ],
22167e2e9c0cSopenharmony_ci    );
22177e2e9c0cSopenharmony_ci    test(
22187e2e9c0cSopenharmony_ci        net::SocketAddr::from((*b"1234", 1234)).compact(),
22197e2e9c0cSopenharmony_ci        &seq![
22207e2e9c0cSopenharmony_ci            Token::NewtypeVariant {
22217e2e9c0cSopenharmony_ci                name: "SocketAddr",
22227e2e9c0cSopenharmony_ci                variant: "V4"
22237e2e9c0cSopenharmony_ci            },
22247e2e9c0cSopenharmony_ci            Token::Tuple { len: 2 },
22257e2e9c0cSopenharmony_ci            Token::Tuple { len: 4 },
22267e2e9c0cSopenharmony_ci            b"1234".iter().copied().map(Token::U8),
22277e2e9c0cSopenharmony_ci            Token::TupleEnd,
22287e2e9c0cSopenharmony_ci            Token::U16(1234),
22297e2e9c0cSopenharmony_ci            Token::TupleEnd
22307e2e9c0cSopenharmony_ci        ],
22317e2e9c0cSopenharmony_ci    );
22327e2e9c0cSopenharmony_ci    test(
22337e2e9c0cSopenharmony_ci        net::SocketAddrV4::new(net::Ipv4Addr::from(*b"1234"), 1234).compact(),
22347e2e9c0cSopenharmony_ci        &seq![
22357e2e9c0cSopenharmony_ci            Token::Tuple { len: 2 },
22367e2e9c0cSopenharmony_ci            Token::Tuple { len: 4 },
22377e2e9c0cSopenharmony_ci            b"1234".iter().copied().map(Token::U8),
22387e2e9c0cSopenharmony_ci            Token::TupleEnd,
22397e2e9c0cSopenharmony_ci            Token::U16(1234),
22407e2e9c0cSopenharmony_ci            Token::TupleEnd
22417e2e9c0cSopenharmony_ci        ],
22427e2e9c0cSopenharmony_ci    );
22437e2e9c0cSopenharmony_ci    test(
22447e2e9c0cSopenharmony_ci        net::SocketAddrV6::new(net::Ipv6Addr::from(*b"1234567890123456"), 1234, 0, 0).compact(),
22457e2e9c0cSopenharmony_ci        &seq![
22467e2e9c0cSopenharmony_ci            Token::Tuple { len: 2 },
22477e2e9c0cSopenharmony_ci            Token::Tuple { len: 16 },
22487e2e9c0cSopenharmony_ci            b"1234567890123456".iter().copied().map(Token::U8),
22497e2e9c0cSopenharmony_ci            Token::TupleEnd,
22507e2e9c0cSopenharmony_ci            Token::U16(1234),
22517e2e9c0cSopenharmony_ci            Token::TupleEnd
22527e2e9c0cSopenharmony_ci        ],
22537e2e9c0cSopenharmony_ci    );
22547e2e9c0cSopenharmony_ci}
22557e2e9c0cSopenharmony_ci
22567e2e9c0cSopenharmony_ci#[cfg(feature = "unstable")]
22577e2e9c0cSopenharmony_ci#[test]
22587e2e9c0cSopenharmony_cifn test_never_result() {
22597e2e9c0cSopenharmony_ci    test(
22607e2e9c0cSopenharmony_ci        Ok::<u8, !>(0),
22617e2e9c0cSopenharmony_ci        &[
22627e2e9c0cSopenharmony_ci            Token::NewtypeVariant {
22637e2e9c0cSopenharmony_ci                name: "Result",
22647e2e9c0cSopenharmony_ci                variant: "Ok",
22657e2e9c0cSopenharmony_ci            },
22667e2e9c0cSopenharmony_ci            Token::U8(0),
22677e2e9c0cSopenharmony_ci        ],
22687e2e9c0cSopenharmony_ci    );
22697e2e9c0cSopenharmony_ci}
22707e2e9c0cSopenharmony_ci
22717e2e9c0cSopenharmony_ci#[cfg(unix)]
22727e2e9c0cSopenharmony_ci#[test]
22737e2e9c0cSopenharmony_cifn test_osstring() {
22747e2e9c0cSopenharmony_ci    use std::os::unix::ffi::OsStringExt;
22757e2e9c0cSopenharmony_ci
22767e2e9c0cSopenharmony_ci    let value = OsString::from_vec(vec![1, 2, 3]);
22777e2e9c0cSopenharmony_ci    let tokens = [
22787e2e9c0cSopenharmony_ci        Token::Enum { name: "OsString" },
22797e2e9c0cSopenharmony_ci        Token::Str("Unix"),
22807e2e9c0cSopenharmony_ci        Token::Seq { len: Some(2) },
22817e2e9c0cSopenharmony_ci        Token::U8(1),
22827e2e9c0cSopenharmony_ci        Token::U8(2),
22837e2e9c0cSopenharmony_ci        Token::U8(3),
22847e2e9c0cSopenharmony_ci        Token::SeqEnd,
22857e2e9c0cSopenharmony_ci    ];
22867e2e9c0cSopenharmony_ci
22877e2e9c0cSopenharmony_ci    assert_de_tokens(&value, &tokens);
22887e2e9c0cSopenharmony_ci    assert_de_tokens_ignore(&tokens);
22897e2e9c0cSopenharmony_ci}
22907e2e9c0cSopenharmony_ci
22917e2e9c0cSopenharmony_ci#[cfg(windows)]
22927e2e9c0cSopenharmony_ci#[test]
22937e2e9c0cSopenharmony_cifn test_osstring() {
22947e2e9c0cSopenharmony_ci    use std::os::windows::ffi::OsStringExt;
22957e2e9c0cSopenharmony_ci
22967e2e9c0cSopenharmony_ci    let value = OsString::from_wide(&[1, 2, 3]);
22977e2e9c0cSopenharmony_ci    let tokens = [
22987e2e9c0cSopenharmony_ci        Token::Enum { name: "OsString" },
22997e2e9c0cSopenharmony_ci        Token::Str("Windows"),
23007e2e9c0cSopenharmony_ci        Token::Seq { len: Some(2) },
23017e2e9c0cSopenharmony_ci        Token::U16(1),
23027e2e9c0cSopenharmony_ci        Token::U16(2),
23037e2e9c0cSopenharmony_ci        Token::U16(3),
23047e2e9c0cSopenharmony_ci        Token::SeqEnd,
23057e2e9c0cSopenharmony_ci    ];
23067e2e9c0cSopenharmony_ci
23077e2e9c0cSopenharmony_ci    assert_de_tokens(&value, &tokens);
23087e2e9c0cSopenharmony_ci    assert_de_tokens_ignore(&tokens);
23097e2e9c0cSopenharmony_ci}
23107e2e9c0cSopenharmony_ci
23117e2e9c0cSopenharmony_ci#[test]
23127e2e9c0cSopenharmony_cifn test_cstr() {
23137e2e9c0cSopenharmony_ci    assert_de_tokens::<Box<CStr>>(
23147e2e9c0cSopenharmony_ci        &CString::new("abc").unwrap().into_boxed_c_str(),
23157e2e9c0cSopenharmony_ci        &[Token::Bytes(b"abc")],
23167e2e9c0cSopenharmony_ci    );
23177e2e9c0cSopenharmony_ci}
23187e2e9c0cSopenharmony_ci
23197e2e9c0cSopenharmony_ci#[test]
23207e2e9c0cSopenharmony_cifn test_atomics() {
23217e2e9c0cSopenharmony_ci    fn test<L, A, T>(load: L, val: T)
23227e2e9c0cSopenharmony_ci    where
23237e2e9c0cSopenharmony_ci        L: Fn(&A, Ordering) -> T,
23247e2e9c0cSopenharmony_ci        A: DeserializeOwned,
23257e2e9c0cSopenharmony_ci        T: PartialEq + Debug + Copy + for<'de> IntoDeserializer<'de>,
23267e2e9c0cSopenharmony_ci    {
23277e2e9c0cSopenharmony_ci        match A::deserialize(val.into_deserializer()) {
23287e2e9c0cSopenharmony_ci            Ok(v) => {
23297e2e9c0cSopenharmony_ci                let loaded = load(&v, Ordering::Relaxed);
23307e2e9c0cSopenharmony_ci                assert_eq!(val, loaded);
23317e2e9c0cSopenharmony_ci            }
23327e2e9c0cSopenharmony_ci            Err(e) => panic!("tokens failed to deserialize: {}", e),
23337e2e9c0cSopenharmony_ci        }
23347e2e9c0cSopenharmony_ci    }
23357e2e9c0cSopenharmony_ci
23367e2e9c0cSopenharmony_ci    test(AtomicBool::load, true);
23377e2e9c0cSopenharmony_ci    test(AtomicI8::load, -127i8);
23387e2e9c0cSopenharmony_ci    test(AtomicI16::load, -510i16);
23397e2e9c0cSopenharmony_ci    test(AtomicI32::load, -131072i32);
23407e2e9c0cSopenharmony_ci    test(AtomicIsize::load, -131072isize);
23417e2e9c0cSopenharmony_ci    test(AtomicU8::load, 127u8);
23427e2e9c0cSopenharmony_ci    test(AtomicU16::load, 510u16);
23437e2e9c0cSopenharmony_ci    test(AtomicU32::load, 131072u32);
23447e2e9c0cSopenharmony_ci    test(AtomicUsize::load, 131072usize);
23457e2e9c0cSopenharmony_ci
23467e2e9c0cSopenharmony_ci    #[cfg(target_arch = "x86_64")]
23477e2e9c0cSopenharmony_ci    {
23487e2e9c0cSopenharmony_ci        test(AtomicI64::load, -8589934592i64);
23497e2e9c0cSopenharmony_ci        test(AtomicU64::load, 8589934592u64);
23507e2e9c0cSopenharmony_ci    }
23517e2e9c0cSopenharmony_ci}
2352