17e2e9c0cSopenharmony_ci#![allow(clippy::derive_partial_eq_without_eq, clippy::unreadable_literal)]
27e2e9c0cSopenharmony_ci#![cfg_attr(feature = "unstable", feature(never_type))]
37e2e9c0cSopenharmony_ci
47e2e9c0cSopenharmony_ciuse fnv::FnvHasher;
57e2e9c0cSopenharmony_ciuse serde_derive::Serialize;
67e2e9c0cSopenharmony_ciuse serde_test::{assert_ser_tokens, assert_ser_tokens_error, Configure, Token};
77e2e9c0cSopenharmony_ciuse std::cell::RefCell;
87e2e9c0cSopenharmony_ciuse std::collections::{BTreeMap, BTreeSet, HashMap, HashSet};
97e2e9c0cSopenharmony_ciuse std::ffi::CString;
107e2e9c0cSopenharmony_ciuse std::net;
117e2e9c0cSopenharmony_ciuse std::num::Wrapping;
127e2e9c0cSopenharmony_ciuse std::ops::Bound;
137e2e9c0cSopenharmony_ciuse std::path::{Path, PathBuf};
147e2e9c0cSopenharmony_ciuse std::rc::{Rc, Weak as RcWeak};
157e2e9c0cSopenharmony_ci#[cfg(unix)]
167e2e9c0cSopenharmony_ciuse std::str;
177e2e9c0cSopenharmony_ciuse std::sync::atomic::{
187e2e9c0cSopenharmony_ci    AtomicBool, AtomicI16, AtomicI32, AtomicI8, AtomicIsize, AtomicU16, AtomicU32, AtomicU8,
197e2e9c0cSopenharmony_ci    AtomicUsize,
207e2e9c0cSopenharmony_ci};
217e2e9c0cSopenharmony_ci#[cfg(target_arch = "x86_64")]
227e2e9c0cSopenharmony_ciuse std::sync::atomic::{AtomicI64, AtomicU64};
237e2e9c0cSopenharmony_ciuse std::sync::{Arc, Mutex, RwLock, Weak as ArcWeak};
247e2e9c0cSopenharmony_ciuse std::time::{Duration, UNIX_EPOCH};
257e2e9c0cSopenharmony_ci
267e2e9c0cSopenharmony_ci#[macro_use]
277e2e9c0cSopenharmony_cimod macros;
287e2e9c0cSopenharmony_ci
297e2e9c0cSopenharmony_ci//////////////////////////////////////////////////////////////////////////
307e2e9c0cSopenharmony_ci
317e2e9c0cSopenharmony_ci#[derive(Serialize)]
327e2e9c0cSopenharmony_cistruct UnitStruct;
337e2e9c0cSopenharmony_ci
347e2e9c0cSopenharmony_ci#[derive(Serialize)]
357e2e9c0cSopenharmony_cistruct TupleStruct(i32, i32, i32);
367e2e9c0cSopenharmony_ci
377e2e9c0cSopenharmony_ci#[derive(Serialize)]
387e2e9c0cSopenharmony_cistruct Struct {
397e2e9c0cSopenharmony_ci    a: i32,
407e2e9c0cSopenharmony_ci    b: i32,
417e2e9c0cSopenharmony_ci    c: i32,
427e2e9c0cSopenharmony_ci}
437e2e9c0cSopenharmony_ci
447e2e9c0cSopenharmony_ci#[derive(PartialEq, Debug)]
457e2e9c0cSopenharmony_cistruct NotSerializable;
467e2e9c0cSopenharmony_ci
477e2e9c0cSopenharmony_ci#[derive(Serialize, PartialEq, Debug)]
487e2e9c0cSopenharmony_cienum Enum {
497e2e9c0cSopenharmony_ci    Unit,
507e2e9c0cSopenharmony_ci    One(i32),
517e2e9c0cSopenharmony_ci    Seq(i32, i32),
527e2e9c0cSopenharmony_ci    Map {
537e2e9c0cSopenharmony_ci        a: i32,
547e2e9c0cSopenharmony_ci        b: i32,
557e2e9c0cSopenharmony_ci    },
567e2e9c0cSopenharmony_ci    #[serde(skip_serializing)]
577e2e9c0cSopenharmony_ci    SkippedUnit,
587e2e9c0cSopenharmony_ci    #[serde(skip_serializing)]
597e2e9c0cSopenharmony_ci    SkippedOne(i32),
607e2e9c0cSopenharmony_ci    #[serde(skip_serializing)]
617e2e9c0cSopenharmony_ci    SkippedSeq(i32, i32),
627e2e9c0cSopenharmony_ci    #[serde(skip_serializing)]
637e2e9c0cSopenharmony_ci    SkippedMap {
647e2e9c0cSopenharmony_ci        _a: i32,
657e2e9c0cSopenharmony_ci        _b: i32,
667e2e9c0cSopenharmony_ci    },
677e2e9c0cSopenharmony_ci    OneWithSkipped(#[serde(skip_serializing)] NotSerializable),
687e2e9c0cSopenharmony_ci}
697e2e9c0cSopenharmony_ci
707e2e9c0cSopenharmony_ci//////////////////////////////////////////////////////////////////////////
717e2e9c0cSopenharmony_ci
727e2e9c0cSopenharmony_ci#[test]
737e2e9c0cSopenharmony_cifn test_unit() {
747e2e9c0cSopenharmony_ci    assert_ser_tokens(&(), &[Token::Unit]);
757e2e9c0cSopenharmony_ci}
767e2e9c0cSopenharmony_ci
777e2e9c0cSopenharmony_ci#[test]
787e2e9c0cSopenharmony_cifn test_bool() {
797e2e9c0cSopenharmony_ci    assert_ser_tokens(&true, &[Token::Bool(true)]);
807e2e9c0cSopenharmony_ci    assert_ser_tokens(&false, &[Token::Bool(false)]);
817e2e9c0cSopenharmony_ci}
827e2e9c0cSopenharmony_ci
837e2e9c0cSopenharmony_ci#[test]
847e2e9c0cSopenharmony_cifn test_isizes() {
857e2e9c0cSopenharmony_ci    assert_ser_tokens(&0i8, &[Token::I8(0)]);
867e2e9c0cSopenharmony_ci    assert_ser_tokens(&0i16, &[Token::I16(0)]);
877e2e9c0cSopenharmony_ci    assert_ser_tokens(&0i32, &[Token::I32(0)]);
887e2e9c0cSopenharmony_ci    assert_ser_tokens(&0i64, &[Token::I64(0)]);
897e2e9c0cSopenharmony_ci}
907e2e9c0cSopenharmony_ci
917e2e9c0cSopenharmony_ci#[test]
927e2e9c0cSopenharmony_cifn test_usizes() {
937e2e9c0cSopenharmony_ci    assert_ser_tokens(&0u8, &[Token::U8(0)]);
947e2e9c0cSopenharmony_ci    assert_ser_tokens(&0u16, &[Token::U16(0)]);
957e2e9c0cSopenharmony_ci    assert_ser_tokens(&0u32, &[Token::U32(0)]);
967e2e9c0cSopenharmony_ci    assert_ser_tokens(&0u64, &[Token::U64(0)]);
977e2e9c0cSopenharmony_ci}
987e2e9c0cSopenharmony_ci
997e2e9c0cSopenharmony_ci#[test]
1007e2e9c0cSopenharmony_cifn test_floats() {
1017e2e9c0cSopenharmony_ci    assert_ser_tokens(&0f32, &[Token::F32(0.)]);
1027e2e9c0cSopenharmony_ci    assert_ser_tokens(&0f64, &[Token::F64(0.)]);
1037e2e9c0cSopenharmony_ci}
1047e2e9c0cSopenharmony_ci
1057e2e9c0cSopenharmony_ci#[test]
1067e2e9c0cSopenharmony_cifn test_char() {
1077e2e9c0cSopenharmony_ci    assert_ser_tokens(&'a', &[Token::Char('a')]);
1087e2e9c0cSopenharmony_ci}
1097e2e9c0cSopenharmony_ci
1107e2e9c0cSopenharmony_ci#[test]
1117e2e9c0cSopenharmony_cifn test_str() {
1127e2e9c0cSopenharmony_ci    assert_ser_tokens(&"abc", &[Token::Str("abc")]);
1137e2e9c0cSopenharmony_ci    assert_ser_tokens(&"abc".to_owned(), &[Token::Str("abc")]);
1147e2e9c0cSopenharmony_ci}
1157e2e9c0cSopenharmony_ci
1167e2e9c0cSopenharmony_ci#[test]
1177e2e9c0cSopenharmony_cifn test_option() {
1187e2e9c0cSopenharmony_ci    assert_ser_tokens(&None::<i32>, &[Token::None]);
1197e2e9c0cSopenharmony_ci    assert_ser_tokens(&Some(1), &[Token::Some, Token::I32(1)]);
1207e2e9c0cSopenharmony_ci}
1217e2e9c0cSopenharmony_ci
1227e2e9c0cSopenharmony_ci#[test]
1237e2e9c0cSopenharmony_cifn test_result() {
1247e2e9c0cSopenharmony_ci    assert_ser_tokens(
1257e2e9c0cSopenharmony_ci        &Ok::<i32, i32>(0),
1267e2e9c0cSopenharmony_ci        &[
1277e2e9c0cSopenharmony_ci            Token::NewtypeVariant {
1287e2e9c0cSopenharmony_ci                name: "Result",
1297e2e9c0cSopenharmony_ci                variant: "Ok",
1307e2e9c0cSopenharmony_ci            },
1317e2e9c0cSopenharmony_ci            Token::I32(0),
1327e2e9c0cSopenharmony_ci        ],
1337e2e9c0cSopenharmony_ci    );
1347e2e9c0cSopenharmony_ci    assert_ser_tokens(
1357e2e9c0cSopenharmony_ci        &Err::<i32, i32>(1),
1367e2e9c0cSopenharmony_ci        &[
1377e2e9c0cSopenharmony_ci            Token::NewtypeVariant {
1387e2e9c0cSopenharmony_ci                name: "Result",
1397e2e9c0cSopenharmony_ci                variant: "Err",
1407e2e9c0cSopenharmony_ci            },
1417e2e9c0cSopenharmony_ci            Token::I32(1),
1427e2e9c0cSopenharmony_ci        ],
1437e2e9c0cSopenharmony_ci    );
1447e2e9c0cSopenharmony_ci}
1457e2e9c0cSopenharmony_ci
1467e2e9c0cSopenharmony_ci#[test]
1477e2e9c0cSopenharmony_cifn test_slice() {
1487e2e9c0cSopenharmony_ci    assert_ser_tokens(&[0][..0], &[Token::Seq { len: Some(0) }, Token::SeqEnd]);
1497e2e9c0cSopenharmony_ci    assert_ser_tokens(
1507e2e9c0cSopenharmony_ci        &[1, 2, 3][..],
1517e2e9c0cSopenharmony_ci        &[
1527e2e9c0cSopenharmony_ci            Token::Seq { len: Some(3) },
1537e2e9c0cSopenharmony_ci            Token::I32(1),
1547e2e9c0cSopenharmony_ci            Token::I32(2),
1557e2e9c0cSopenharmony_ci            Token::I32(3),
1567e2e9c0cSopenharmony_ci            Token::SeqEnd,
1577e2e9c0cSopenharmony_ci        ],
1587e2e9c0cSopenharmony_ci    );
1597e2e9c0cSopenharmony_ci}
1607e2e9c0cSopenharmony_ci
1617e2e9c0cSopenharmony_ci#[test]
1627e2e9c0cSopenharmony_cifn test_array() {
1637e2e9c0cSopenharmony_ci    assert_ser_tokens(&[0; 0], &[Token::Tuple { len: 0 }, Token::TupleEnd]);
1647e2e9c0cSopenharmony_ci    assert_ser_tokens(
1657e2e9c0cSopenharmony_ci        &[1, 2, 3],
1667e2e9c0cSopenharmony_ci        &[
1677e2e9c0cSopenharmony_ci            Token::Tuple { len: 3 },
1687e2e9c0cSopenharmony_ci            Token::I32(1),
1697e2e9c0cSopenharmony_ci            Token::I32(2),
1707e2e9c0cSopenharmony_ci            Token::I32(3),
1717e2e9c0cSopenharmony_ci            Token::TupleEnd,
1727e2e9c0cSopenharmony_ci        ],
1737e2e9c0cSopenharmony_ci    );
1747e2e9c0cSopenharmony_ci}
1757e2e9c0cSopenharmony_ci
1767e2e9c0cSopenharmony_ci#[test]
1777e2e9c0cSopenharmony_cifn test_vec() {
1787e2e9c0cSopenharmony_ci    assert_ser_tokens(
1797e2e9c0cSopenharmony_ci        &Vec::<isize>::new(),
1807e2e9c0cSopenharmony_ci        &[Token::Seq { len: Some(0) }, Token::SeqEnd],
1817e2e9c0cSopenharmony_ci    );
1827e2e9c0cSopenharmony_ci    assert_ser_tokens(
1837e2e9c0cSopenharmony_ci        &vec![vec![], vec![1], vec![2, 3]],
1847e2e9c0cSopenharmony_ci        &[
1857e2e9c0cSopenharmony_ci            Token::Seq { len: Some(3) },
1867e2e9c0cSopenharmony_ci            Token::Seq { len: Some(0) },
1877e2e9c0cSopenharmony_ci            Token::SeqEnd,
1887e2e9c0cSopenharmony_ci            Token::Seq { len: Some(1) },
1897e2e9c0cSopenharmony_ci            Token::I32(1),
1907e2e9c0cSopenharmony_ci            Token::SeqEnd,
1917e2e9c0cSopenharmony_ci            Token::Seq { len: Some(2) },
1927e2e9c0cSopenharmony_ci            Token::I32(2),
1937e2e9c0cSopenharmony_ci            Token::I32(3),
1947e2e9c0cSopenharmony_ci            Token::SeqEnd,
1957e2e9c0cSopenharmony_ci            Token::SeqEnd,
1967e2e9c0cSopenharmony_ci        ],
1977e2e9c0cSopenharmony_ci    );
1987e2e9c0cSopenharmony_ci}
1997e2e9c0cSopenharmony_ci
2007e2e9c0cSopenharmony_ci#[test]
2017e2e9c0cSopenharmony_cifn test_btreeset() {
2027e2e9c0cSopenharmony_ci    assert_ser_tokens(
2037e2e9c0cSopenharmony_ci        &BTreeSet::<isize>::new(),
2047e2e9c0cSopenharmony_ci        &[Token::Seq { len: Some(0) }, Token::SeqEnd],
2057e2e9c0cSopenharmony_ci    );
2067e2e9c0cSopenharmony_ci    assert_ser_tokens(
2077e2e9c0cSopenharmony_ci        &btreeset![1],
2087e2e9c0cSopenharmony_ci        &[Token::Seq { len: Some(1) }, Token::I32(1), Token::SeqEnd],
2097e2e9c0cSopenharmony_ci    );
2107e2e9c0cSopenharmony_ci}
2117e2e9c0cSopenharmony_ci
2127e2e9c0cSopenharmony_ci#[test]
2137e2e9c0cSopenharmony_cifn test_hashset() {
2147e2e9c0cSopenharmony_ci    assert_ser_tokens(
2157e2e9c0cSopenharmony_ci        &HashSet::<isize>::new(),
2167e2e9c0cSopenharmony_ci        &[Token::Seq { len: Some(0) }, Token::SeqEnd],
2177e2e9c0cSopenharmony_ci    );
2187e2e9c0cSopenharmony_ci    assert_ser_tokens(
2197e2e9c0cSopenharmony_ci        &hashset![1],
2207e2e9c0cSopenharmony_ci        &[Token::Seq { len: Some(1) }, Token::I32(1), Token::SeqEnd],
2217e2e9c0cSopenharmony_ci    );
2227e2e9c0cSopenharmony_ci    assert_ser_tokens(
2237e2e9c0cSopenharmony_ci        &hashset![FnvHasher @ 1],
2247e2e9c0cSopenharmony_ci        &[Token::Seq { len: Some(1) }, Token::I32(1), Token::SeqEnd],
2257e2e9c0cSopenharmony_ci    );
2267e2e9c0cSopenharmony_ci}
2277e2e9c0cSopenharmony_ci
2287e2e9c0cSopenharmony_ci#[test]
2297e2e9c0cSopenharmony_cifn test_tuple() {
2307e2e9c0cSopenharmony_ci    assert_ser_tokens(
2317e2e9c0cSopenharmony_ci        &(1,),
2327e2e9c0cSopenharmony_ci        &[Token::Tuple { len: 1 }, Token::I32(1), Token::TupleEnd],
2337e2e9c0cSopenharmony_ci    );
2347e2e9c0cSopenharmony_ci    assert_ser_tokens(
2357e2e9c0cSopenharmony_ci        &(1, 2, 3),
2367e2e9c0cSopenharmony_ci        &[
2377e2e9c0cSopenharmony_ci            Token::Tuple { len: 3 },
2387e2e9c0cSopenharmony_ci            Token::I32(1),
2397e2e9c0cSopenharmony_ci            Token::I32(2),
2407e2e9c0cSopenharmony_ci            Token::I32(3),
2417e2e9c0cSopenharmony_ci            Token::TupleEnd,
2427e2e9c0cSopenharmony_ci        ],
2437e2e9c0cSopenharmony_ci    );
2447e2e9c0cSopenharmony_ci}
2457e2e9c0cSopenharmony_ci
2467e2e9c0cSopenharmony_ci#[test]
2477e2e9c0cSopenharmony_cifn test_btreemap() {
2487e2e9c0cSopenharmony_ci    assert_ser_tokens(
2497e2e9c0cSopenharmony_ci        &btreemap![1 => 2],
2507e2e9c0cSopenharmony_ci        &[
2517e2e9c0cSopenharmony_ci            Token::Map { len: Some(1) },
2527e2e9c0cSopenharmony_ci            Token::I32(1),
2537e2e9c0cSopenharmony_ci            Token::I32(2),
2547e2e9c0cSopenharmony_ci            Token::MapEnd,
2557e2e9c0cSopenharmony_ci        ],
2567e2e9c0cSopenharmony_ci    );
2577e2e9c0cSopenharmony_ci    assert_ser_tokens(
2587e2e9c0cSopenharmony_ci        &btreemap![1 => 2, 3 => 4],
2597e2e9c0cSopenharmony_ci        &[
2607e2e9c0cSopenharmony_ci            Token::Map { len: Some(2) },
2617e2e9c0cSopenharmony_ci            Token::I32(1),
2627e2e9c0cSopenharmony_ci            Token::I32(2),
2637e2e9c0cSopenharmony_ci            Token::I32(3),
2647e2e9c0cSopenharmony_ci            Token::I32(4),
2657e2e9c0cSopenharmony_ci            Token::MapEnd,
2667e2e9c0cSopenharmony_ci        ],
2677e2e9c0cSopenharmony_ci    );
2687e2e9c0cSopenharmony_ci    assert_ser_tokens(
2697e2e9c0cSopenharmony_ci        &btreemap![1 => btreemap![], 2 => btreemap![3 => 4, 5 => 6]],
2707e2e9c0cSopenharmony_ci        &[
2717e2e9c0cSopenharmony_ci            Token::Map { len: Some(2) },
2727e2e9c0cSopenharmony_ci            Token::I32(1),
2737e2e9c0cSopenharmony_ci            Token::Map { len: Some(0) },
2747e2e9c0cSopenharmony_ci            Token::MapEnd,
2757e2e9c0cSopenharmony_ci            Token::I32(2),
2767e2e9c0cSopenharmony_ci            Token::Map { len: Some(2) },
2777e2e9c0cSopenharmony_ci            Token::I32(3),
2787e2e9c0cSopenharmony_ci            Token::I32(4),
2797e2e9c0cSopenharmony_ci            Token::I32(5),
2807e2e9c0cSopenharmony_ci            Token::I32(6),
2817e2e9c0cSopenharmony_ci            Token::MapEnd,
2827e2e9c0cSopenharmony_ci            Token::MapEnd,
2837e2e9c0cSopenharmony_ci        ],
2847e2e9c0cSopenharmony_ci    );
2857e2e9c0cSopenharmony_ci}
2867e2e9c0cSopenharmony_ci
2877e2e9c0cSopenharmony_ci#[test]
2887e2e9c0cSopenharmony_cifn test_hashmap() {
2897e2e9c0cSopenharmony_ci    assert_ser_tokens(
2907e2e9c0cSopenharmony_ci        &HashMap::<isize, isize>::new(),
2917e2e9c0cSopenharmony_ci        &[Token::Map { len: Some(0) }, Token::MapEnd],
2927e2e9c0cSopenharmony_ci    );
2937e2e9c0cSopenharmony_ci    assert_ser_tokens(
2947e2e9c0cSopenharmony_ci        &hashmap![1 => 2],
2957e2e9c0cSopenharmony_ci        &[
2967e2e9c0cSopenharmony_ci            Token::Map { len: Some(1) },
2977e2e9c0cSopenharmony_ci            Token::I32(1),
2987e2e9c0cSopenharmony_ci            Token::I32(2),
2997e2e9c0cSopenharmony_ci            Token::MapEnd,
3007e2e9c0cSopenharmony_ci        ],
3017e2e9c0cSopenharmony_ci    );
3027e2e9c0cSopenharmony_ci    assert_ser_tokens(
3037e2e9c0cSopenharmony_ci        &hashmap![FnvHasher @ 1 => 2],
3047e2e9c0cSopenharmony_ci        &[
3057e2e9c0cSopenharmony_ci            Token::Map { len: Some(1) },
3067e2e9c0cSopenharmony_ci            Token::I32(1),
3077e2e9c0cSopenharmony_ci            Token::I32(2),
3087e2e9c0cSopenharmony_ci            Token::MapEnd,
3097e2e9c0cSopenharmony_ci        ],
3107e2e9c0cSopenharmony_ci    );
3117e2e9c0cSopenharmony_ci}
3127e2e9c0cSopenharmony_ci
3137e2e9c0cSopenharmony_ci#[test]
3147e2e9c0cSopenharmony_cifn test_unit_struct() {
3157e2e9c0cSopenharmony_ci    assert_ser_tokens(&UnitStruct, &[Token::UnitStruct { name: "UnitStruct" }]);
3167e2e9c0cSopenharmony_ci}
3177e2e9c0cSopenharmony_ci
3187e2e9c0cSopenharmony_ci#[test]
3197e2e9c0cSopenharmony_cifn test_tuple_struct() {
3207e2e9c0cSopenharmony_ci    assert_ser_tokens(
3217e2e9c0cSopenharmony_ci        &TupleStruct(1, 2, 3),
3227e2e9c0cSopenharmony_ci        &[
3237e2e9c0cSopenharmony_ci            Token::TupleStruct {
3247e2e9c0cSopenharmony_ci                name: "TupleStruct",
3257e2e9c0cSopenharmony_ci                len: 3,
3267e2e9c0cSopenharmony_ci            },
3277e2e9c0cSopenharmony_ci            Token::I32(1),
3287e2e9c0cSopenharmony_ci            Token::I32(2),
3297e2e9c0cSopenharmony_ci            Token::I32(3),
3307e2e9c0cSopenharmony_ci            Token::TupleStructEnd,
3317e2e9c0cSopenharmony_ci        ],
3327e2e9c0cSopenharmony_ci    );
3337e2e9c0cSopenharmony_ci}
3347e2e9c0cSopenharmony_ci
3357e2e9c0cSopenharmony_ci#[test]
3367e2e9c0cSopenharmony_cifn test_struct() {
3377e2e9c0cSopenharmony_ci    assert_ser_tokens(
3387e2e9c0cSopenharmony_ci        &Struct { a: 1, b: 2, c: 3 },
3397e2e9c0cSopenharmony_ci        &[
3407e2e9c0cSopenharmony_ci            Token::Struct {
3417e2e9c0cSopenharmony_ci                name: "Struct",
3427e2e9c0cSopenharmony_ci                len: 3,
3437e2e9c0cSopenharmony_ci            },
3447e2e9c0cSopenharmony_ci            Token::Str("a"),
3457e2e9c0cSopenharmony_ci            Token::I32(1),
3467e2e9c0cSopenharmony_ci            Token::Str("b"),
3477e2e9c0cSopenharmony_ci            Token::I32(2),
3487e2e9c0cSopenharmony_ci            Token::Str("c"),
3497e2e9c0cSopenharmony_ci            Token::I32(3),
3507e2e9c0cSopenharmony_ci            Token::StructEnd,
3517e2e9c0cSopenharmony_ci        ],
3527e2e9c0cSopenharmony_ci    );
3537e2e9c0cSopenharmony_ci}
3547e2e9c0cSopenharmony_ci
3557e2e9c0cSopenharmony_ci#[test]
3567e2e9c0cSopenharmony_cifn test_enum() {
3577e2e9c0cSopenharmony_ci    assert_ser_tokens(
3587e2e9c0cSopenharmony_ci        &Enum::Unit,
3597e2e9c0cSopenharmony_ci        &[Token::UnitVariant {
3607e2e9c0cSopenharmony_ci            name: "Enum",
3617e2e9c0cSopenharmony_ci            variant: "Unit",
3627e2e9c0cSopenharmony_ci        }],
3637e2e9c0cSopenharmony_ci    );
3647e2e9c0cSopenharmony_ci    assert_ser_tokens(
3657e2e9c0cSopenharmony_ci        &Enum::One(42),
3667e2e9c0cSopenharmony_ci        &[
3677e2e9c0cSopenharmony_ci            Token::NewtypeVariant {
3687e2e9c0cSopenharmony_ci                name: "Enum",
3697e2e9c0cSopenharmony_ci                variant: "One",
3707e2e9c0cSopenharmony_ci            },
3717e2e9c0cSopenharmony_ci            Token::I32(42),
3727e2e9c0cSopenharmony_ci        ],
3737e2e9c0cSopenharmony_ci    );
3747e2e9c0cSopenharmony_ci    assert_ser_tokens(
3757e2e9c0cSopenharmony_ci        &Enum::Seq(1, 2),
3767e2e9c0cSopenharmony_ci        &[
3777e2e9c0cSopenharmony_ci            Token::TupleVariant {
3787e2e9c0cSopenharmony_ci                name: "Enum",
3797e2e9c0cSopenharmony_ci                variant: "Seq",
3807e2e9c0cSopenharmony_ci                len: 2,
3817e2e9c0cSopenharmony_ci            },
3827e2e9c0cSopenharmony_ci            Token::I32(1),
3837e2e9c0cSopenharmony_ci            Token::I32(2),
3847e2e9c0cSopenharmony_ci            Token::TupleVariantEnd,
3857e2e9c0cSopenharmony_ci        ],
3867e2e9c0cSopenharmony_ci    );
3877e2e9c0cSopenharmony_ci    assert_ser_tokens(
3887e2e9c0cSopenharmony_ci        &Enum::Map { a: 1, b: 2 },
3897e2e9c0cSopenharmony_ci        &[
3907e2e9c0cSopenharmony_ci            Token::StructVariant {
3917e2e9c0cSopenharmony_ci                name: "Enum",
3927e2e9c0cSopenharmony_ci                variant: "Map",
3937e2e9c0cSopenharmony_ci                len: 2,
3947e2e9c0cSopenharmony_ci            },
3957e2e9c0cSopenharmony_ci            Token::Str("a"),
3967e2e9c0cSopenharmony_ci            Token::I32(1),
3977e2e9c0cSopenharmony_ci            Token::Str("b"),
3987e2e9c0cSopenharmony_ci            Token::I32(2),
3997e2e9c0cSopenharmony_ci            Token::StructVariantEnd,
4007e2e9c0cSopenharmony_ci        ],
4017e2e9c0cSopenharmony_ci    );
4027e2e9c0cSopenharmony_ci    assert_ser_tokens(
4037e2e9c0cSopenharmony_ci        &Enum::OneWithSkipped(NotSerializable),
4047e2e9c0cSopenharmony_ci        &[Token::UnitVariant {
4057e2e9c0cSopenharmony_ci            name: "Enum",
4067e2e9c0cSopenharmony_ci            variant: "OneWithSkipped",
4077e2e9c0cSopenharmony_ci        }],
4087e2e9c0cSopenharmony_ci    );
4097e2e9c0cSopenharmony_ci}
4107e2e9c0cSopenharmony_ci
4117e2e9c0cSopenharmony_ci#[test]
4127e2e9c0cSopenharmony_cifn test_box() {
4137e2e9c0cSopenharmony_ci    assert_ser_tokens(&Box::new(0i32), &[Token::I32(0)]);
4147e2e9c0cSopenharmony_ci}
4157e2e9c0cSopenharmony_ci
4167e2e9c0cSopenharmony_ci#[test]
4177e2e9c0cSopenharmony_cifn test_boxed_slice() {
4187e2e9c0cSopenharmony_ci    assert_ser_tokens(
4197e2e9c0cSopenharmony_ci        &Box::new([0, 1, 2]),
4207e2e9c0cSopenharmony_ci        &[
4217e2e9c0cSopenharmony_ci            Token::Tuple { len: 3 },
4227e2e9c0cSopenharmony_ci            Token::I32(0),
4237e2e9c0cSopenharmony_ci            Token::I32(1),
4247e2e9c0cSopenharmony_ci            Token::I32(2),
4257e2e9c0cSopenharmony_ci            Token::TupleEnd,
4267e2e9c0cSopenharmony_ci        ],
4277e2e9c0cSopenharmony_ci    );
4287e2e9c0cSopenharmony_ci}
4297e2e9c0cSopenharmony_ci
4307e2e9c0cSopenharmony_ci#[test]
4317e2e9c0cSopenharmony_cifn test_duration() {
4327e2e9c0cSopenharmony_ci    assert_ser_tokens(
4337e2e9c0cSopenharmony_ci        &Duration::new(1, 2),
4347e2e9c0cSopenharmony_ci        &[
4357e2e9c0cSopenharmony_ci            Token::Struct {
4367e2e9c0cSopenharmony_ci                name: "Duration",
4377e2e9c0cSopenharmony_ci                len: 2,
4387e2e9c0cSopenharmony_ci            },
4397e2e9c0cSopenharmony_ci            Token::Str("secs"),
4407e2e9c0cSopenharmony_ci            Token::U64(1),
4417e2e9c0cSopenharmony_ci            Token::Str("nanos"),
4427e2e9c0cSopenharmony_ci            Token::U32(2),
4437e2e9c0cSopenharmony_ci            Token::StructEnd,
4447e2e9c0cSopenharmony_ci        ],
4457e2e9c0cSopenharmony_ci    );
4467e2e9c0cSopenharmony_ci}
4477e2e9c0cSopenharmony_ci
4487e2e9c0cSopenharmony_ci#[test]
4497e2e9c0cSopenharmony_cifn test_system_time() {
4507e2e9c0cSopenharmony_ci    let system_time = UNIX_EPOCH + Duration::new(1, 200);
4517e2e9c0cSopenharmony_ci    assert_ser_tokens(
4527e2e9c0cSopenharmony_ci        &system_time,
4537e2e9c0cSopenharmony_ci        &[
4547e2e9c0cSopenharmony_ci            Token::Struct {
4557e2e9c0cSopenharmony_ci                name: "SystemTime",
4567e2e9c0cSopenharmony_ci                len: 2,
4577e2e9c0cSopenharmony_ci            },
4587e2e9c0cSopenharmony_ci            Token::Str("secs_since_epoch"),
4597e2e9c0cSopenharmony_ci            Token::U64(1),
4607e2e9c0cSopenharmony_ci            Token::Str("nanos_since_epoch"),
4617e2e9c0cSopenharmony_ci            Token::U32(200),
4627e2e9c0cSopenharmony_ci            Token::StructEnd,
4637e2e9c0cSopenharmony_ci        ],
4647e2e9c0cSopenharmony_ci    );
4657e2e9c0cSopenharmony_ci}
4667e2e9c0cSopenharmony_ci
4677e2e9c0cSopenharmony_ci#[test]
4687e2e9c0cSopenharmony_cifn test_range() {
4697e2e9c0cSopenharmony_ci    assert_ser_tokens(
4707e2e9c0cSopenharmony_ci        &(1u32..2u32),
4717e2e9c0cSopenharmony_ci        &[
4727e2e9c0cSopenharmony_ci            Token::Struct {
4737e2e9c0cSopenharmony_ci                name: "Range",
4747e2e9c0cSopenharmony_ci                len: 2,
4757e2e9c0cSopenharmony_ci            },
4767e2e9c0cSopenharmony_ci            Token::Str("start"),
4777e2e9c0cSopenharmony_ci            Token::U32(1),
4787e2e9c0cSopenharmony_ci            Token::Str("end"),
4797e2e9c0cSopenharmony_ci            Token::U32(2),
4807e2e9c0cSopenharmony_ci            Token::StructEnd,
4817e2e9c0cSopenharmony_ci        ],
4827e2e9c0cSopenharmony_ci    );
4837e2e9c0cSopenharmony_ci}
4847e2e9c0cSopenharmony_ci
4857e2e9c0cSopenharmony_ci#[test]
4867e2e9c0cSopenharmony_cifn test_range_inclusive() {
4877e2e9c0cSopenharmony_ci    assert_ser_tokens(
4887e2e9c0cSopenharmony_ci        &(1u32..=2u32),
4897e2e9c0cSopenharmony_ci        &[
4907e2e9c0cSopenharmony_ci            Token::Struct {
4917e2e9c0cSopenharmony_ci                name: "RangeInclusive",
4927e2e9c0cSopenharmony_ci                len: 2,
4937e2e9c0cSopenharmony_ci            },
4947e2e9c0cSopenharmony_ci            Token::Str("start"),
4957e2e9c0cSopenharmony_ci            Token::U32(1),
4967e2e9c0cSopenharmony_ci            Token::Str("end"),
4977e2e9c0cSopenharmony_ci            Token::U32(2),
4987e2e9c0cSopenharmony_ci            Token::StructEnd,
4997e2e9c0cSopenharmony_ci        ],
5007e2e9c0cSopenharmony_ci    );
5017e2e9c0cSopenharmony_ci}
5027e2e9c0cSopenharmony_ci
5037e2e9c0cSopenharmony_ci#[test]
5047e2e9c0cSopenharmony_cifn test_range_from() {
5057e2e9c0cSopenharmony_ci    assert_ser_tokens(
5067e2e9c0cSopenharmony_ci        &(1u32..),
5077e2e9c0cSopenharmony_ci        &[
5087e2e9c0cSopenharmony_ci            Token::Struct {
5097e2e9c0cSopenharmony_ci                name: "RangeFrom",
5107e2e9c0cSopenharmony_ci                len: 1,
5117e2e9c0cSopenharmony_ci            },
5127e2e9c0cSopenharmony_ci            Token::Str("start"),
5137e2e9c0cSopenharmony_ci            Token::U32(1),
5147e2e9c0cSopenharmony_ci            Token::StructEnd,
5157e2e9c0cSopenharmony_ci        ],
5167e2e9c0cSopenharmony_ci    );
5177e2e9c0cSopenharmony_ci}
5187e2e9c0cSopenharmony_ci
5197e2e9c0cSopenharmony_ci#[test]
5207e2e9c0cSopenharmony_cifn test_range_to() {
5217e2e9c0cSopenharmony_ci    assert_ser_tokens(
5227e2e9c0cSopenharmony_ci        &(..2u32),
5237e2e9c0cSopenharmony_ci        &[
5247e2e9c0cSopenharmony_ci            Token::Struct {
5257e2e9c0cSopenharmony_ci                name: "RangeTo",
5267e2e9c0cSopenharmony_ci                len: 1,
5277e2e9c0cSopenharmony_ci            },
5287e2e9c0cSopenharmony_ci            Token::Str("end"),
5297e2e9c0cSopenharmony_ci            Token::U32(2),
5307e2e9c0cSopenharmony_ci            Token::StructEnd,
5317e2e9c0cSopenharmony_ci        ],
5327e2e9c0cSopenharmony_ci    );
5337e2e9c0cSopenharmony_ci}
5347e2e9c0cSopenharmony_ci
5357e2e9c0cSopenharmony_ci#[test]
5367e2e9c0cSopenharmony_cifn test_bound() {
5377e2e9c0cSopenharmony_ci    assert_ser_tokens(
5387e2e9c0cSopenharmony_ci        &Bound::Unbounded::<()>,
5397e2e9c0cSopenharmony_ci        &[
5407e2e9c0cSopenharmony_ci            Token::Enum { name: "Bound" },
5417e2e9c0cSopenharmony_ci            Token::Str("Unbounded"),
5427e2e9c0cSopenharmony_ci            Token::Unit,
5437e2e9c0cSopenharmony_ci        ],
5447e2e9c0cSopenharmony_ci    );
5457e2e9c0cSopenharmony_ci    assert_ser_tokens(
5467e2e9c0cSopenharmony_ci        &Bound::Included(0u8),
5477e2e9c0cSopenharmony_ci        &[
5487e2e9c0cSopenharmony_ci            Token::Enum { name: "Bound" },
5497e2e9c0cSopenharmony_ci            Token::Str("Included"),
5507e2e9c0cSopenharmony_ci            Token::U8(0),
5517e2e9c0cSopenharmony_ci        ],
5527e2e9c0cSopenharmony_ci    );
5537e2e9c0cSopenharmony_ci    assert_ser_tokens(
5547e2e9c0cSopenharmony_ci        &Bound::Excluded(0u8),
5557e2e9c0cSopenharmony_ci        &[
5567e2e9c0cSopenharmony_ci            Token::Enum { name: "Bound" },
5577e2e9c0cSopenharmony_ci            Token::Str("Excluded"),
5587e2e9c0cSopenharmony_ci            Token::U8(0),
5597e2e9c0cSopenharmony_ci        ],
5607e2e9c0cSopenharmony_ci    );
5617e2e9c0cSopenharmony_ci}
5627e2e9c0cSopenharmony_ci
5637e2e9c0cSopenharmony_ci#[test]
5647e2e9c0cSopenharmony_cifn test_path() {
5657e2e9c0cSopenharmony_ci    assert_ser_tokens(
5667e2e9c0cSopenharmony_ci        &Path::new("/usr/local/lib"),
5677e2e9c0cSopenharmony_ci        &[Token::Str("/usr/local/lib")],
5687e2e9c0cSopenharmony_ci    );
5697e2e9c0cSopenharmony_ci}
5707e2e9c0cSopenharmony_ci
5717e2e9c0cSopenharmony_ci#[test]
5727e2e9c0cSopenharmony_cifn test_path_buf() {
5737e2e9c0cSopenharmony_ci    assert_ser_tokens(
5747e2e9c0cSopenharmony_ci        &PathBuf::from("/usr/local/lib"),
5757e2e9c0cSopenharmony_ci        &[Token::Str("/usr/local/lib")],
5767e2e9c0cSopenharmony_ci    );
5777e2e9c0cSopenharmony_ci}
5787e2e9c0cSopenharmony_ci
5797e2e9c0cSopenharmony_ci#[test]
5807e2e9c0cSopenharmony_cifn test_cstring() {
5817e2e9c0cSopenharmony_ci    assert_ser_tokens(&CString::new("abc").unwrap(), &[Token::Bytes(b"abc")]);
5827e2e9c0cSopenharmony_ci}
5837e2e9c0cSopenharmony_ci
5847e2e9c0cSopenharmony_ci#[test]
5857e2e9c0cSopenharmony_cifn test_cstr() {
5867e2e9c0cSopenharmony_ci    let cstring = CString::new("abc").unwrap();
5877e2e9c0cSopenharmony_ci    assert_ser_tokens(cstring.as_c_str(), &[Token::Bytes(b"abc")]);
5887e2e9c0cSopenharmony_ci}
5897e2e9c0cSopenharmony_ci
5907e2e9c0cSopenharmony_ci#[test]
5917e2e9c0cSopenharmony_cifn test_rc() {
5927e2e9c0cSopenharmony_ci    assert_ser_tokens(&Rc::new(true), &[Token::Bool(true)]);
5937e2e9c0cSopenharmony_ci}
5947e2e9c0cSopenharmony_ci
5957e2e9c0cSopenharmony_ci#[test]
5967e2e9c0cSopenharmony_cifn test_rc_weak_some() {
5977e2e9c0cSopenharmony_ci    let rc = Rc::new(true);
5987e2e9c0cSopenharmony_ci    assert_ser_tokens(&Rc::downgrade(&rc), &[Token::Some, Token::Bool(true)]);
5997e2e9c0cSopenharmony_ci}
6007e2e9c0cSopenharmony_ci
6017e2e9c0cSopenharmony_ci#[test]
6027e2e9c0cSopenharmony_cifn test_rc_weak_none() {
6037e2e9c0cSopenharmony_ci    assert_ser_tokens(&RcWeak::<bool>::new(), &[Token::None]);
6047e2e9c0cSopenharmony_ci}
6057e2e9c0cSopenharmony_ci
6067e2e9c0cSopenharmony_ci#[test]
6077e2e9c0cSopenharmony_cifn test_arc() {
6087e2e9c0cSopenharmony_ci    assert_ser_tokens(&Arc::new(true), &[Token::Bool(true)]);
6097e2e9c0cSopenharmony_ci}
6107e2e9c0cSopenharmony_ci
6117e2e9c0cSopenharmony_ci#[test]
6127e2e9c0cSopenharmony_cifn test_arc_weak_some() {
6137e2e9c0cSopenharmony_ci    let arc = Arc::new(true);
6147e2e9c0cSopenharmony_ci    assert_ser_tokens(&Arc::downgrade(&arc), &[Token::Some, Token::Bool(true)]);
6157e2e9c0cSopenharmony_ci}
6167e2e9c0cSopenharmony_ci
6177e2e9c0cSopenharmony_ci#[test]
6187e2e9c0cSopenharmony_cifn test_arc_weak_none() {
6197e2e9c0cSopenharmony_ci    assert_ser_tokens(&ArcWeak::<bool>::new(), &[Token::None]);
6207e2e9c0cSopenharmony_ci}
6217e2e9c0cSopenharmony_ci
6227e2e9c0cSopenharmony_ci#[test]
6237e2e9c0cSopenharmony_cifn test_wrapping() {
6247e2e9c0cSopenharmony_ci    assert_ser_tokens(&Wrapping(1usize), &[Token::U64(1)]);
6257e2e9c0cSopenharmony_ci}
6267e2e9c0cSopenharmony_ci
6277e2e9c0cSopenharmony_ci#[test]
6287e2e9c0cSopenharmony_cifn test_rc_dst() {
6297e2e9c0cSopenharmony_ci    assert_ser_tokens(&Rc::<str>::from("s"), &[Token::Str("s")]);
6307e2e9c0cSopenharmony_ci    assert_ser_tokens(
6317e2e9c0cSopenharmony_ci        &Rc::<[bool]>::from(&[true][..]),
6327e2e9c0cSopenharmony_ci        &[
6337e2e9c0cSopenharmony_ci            Token::Seq { len: Some(1) },
6347e2e9c0cSopenharmony_ci            Token::Bool(true),
6357e2e9c0cSopenharmony_ci            Token::SeqEnd,
6367e2e9c0cSopenharmony_ci        ],
6377e2e9c0cSopenharmony_ci    );
6387e2e9c0cSopenharmony_ci}
6397e2e9c0cSopenharmony_ci
6407e2e9c0cSopenharmony_ci#[test]
6417e2e9c0cSopenharmony_cifn test_arc_dst() {
6427e2e9c0cSopenharmony_ci    assert_ser_tokens(&Arc::<str>::from("s"), &[Token::Str("s")]);
6437e2e9c0cSopenharmony_ci    assert_ser_tokens(
6447e2e9c0cSopenharmony_ci        &Arc::<[bool]>::from(&[true][..]),
6457e2e9c0cSopenharmony_ci        &[
6467e2e9c0cSopenharmony_ci            Token::Seq { len: Some(1) },
6477e2e9c0cSopenharmony_ci            Token::Bool(true),
6487e2e9c0cSopenharmony_ci            Token::SeqEnd,
6497e2e9c0cSopenharmony_ci        ],
6507e2e9c0cSopenharmony_ci    );
6517e2e9c0cSopenharmony_ci}
6527e2e9c0cSopenharmony_ci
6537e2e9c0cSopenharmony_ci#[test]
6547e2e9c0cSopenharmony_cifn test_fmt_arguments() {
6557e2e9c0cSopenharmony_ci    assert_ser_tokens(&format_args!("{}{}", 1, 'a'), &[Token::Str("1a")]);
6567e2e9c0cSopenharmony_ci}
6577e2e9c0cSopenharmony_ci
6587e2e9c0cSopenharmony_ci#[test]
6597e2e9c0cSopenharmony_cifn test_atomic() {
6607e2e9c0cSopenharmony_ci    assert_ser_tokens(&AtomicBool::new(false), &[Token::Bool(false)]);
6617e2e9c0cSopenharmony_ci    assert_ser_tokens(&AtomicBool::new(true), &[Token::Bool(true)]);
6627e2e9c0cSopenharmony_ci    assert_ser_tokens(&AtomicI8::new(63i8), &[Token::I8(63i8)]);
6637e2e9c0cSopenharmony_ci    assert_ser_tokens(&AtomicI16::new(-318i16), &[Token::I16(-318i16)]);
6647e2e9c0cSopenharmony_ci    assert_ser_tokens(&AtomicI32::new(65792i32), &[Token::I32(65792i32)]);
6657e2e9c0cSopenharmony_ci    assert_ser_tokens(&AtomicIsize::new(-65792isize), &[Token::I64(-65792i64)]);
6667e2e9c0cSopenharmony_ci    assert_ser_tokens(&AtomicU8::new(192u8), &[Token::U8(192u8)]);
6677e2e9c0cSopenharmony_ci    assert_ser_tokens(&AtomicU16::new(510u16), &[Token::U16(510u16)]);
6687e2e9c0cSopenharmony_ci    assert_ser_tokens(&AtomicU32::new(131072u32), &[Token::U32(131072u32)]);
6697e2e9c0cSopenharmony_ci    assert_ser_tokens(&AtomicUsize::new(655360usize), &[Token::U64(655360u64)]);
6707e2e9c0cSopenharmony_ci}
6717e2e9c0cSopenharmony_ci
6727e2e9c0cSopenharmony_ci#[cfg(target_arch = "x86_64")]
6737e2e9c0cSopenharmony_ci#[test]
6747e2e9c0cSopenharmony_cifn test_atomic64() {
6757e2e9c0cSopenharmony_ci    assert_ser_tokens(
6767e2e9c0cSopenharmony_ci        &AtomicI64::new(-4295032832i64),
6777e2e9c0cSopenharmony_ci        &[Token::I64(-4295032832i64)],
6787e2e9c0cSopenharmony_ci    );
6797e2e9c0cSopenharmony_ci    assert_ser_tokens(
6807e2e9c0cSopenharmony_ci        &AtomicU64::new(12884901888u64),
6817e2e9c0cSopenharmony_ci        &[Token::U64(12884901888u64)],
6827e2e9c0cSopenharmony_ci    );
6837e2e9c0cSopenharmony_ci}
6847e2e9c0cSopenharmony_ci
6857e2e9c0cSopenharmony_ci#[test]
6867e2e9c0cSopenharmony_cifn test_net_ipv4addr_readable() {
6877e2e9c0cSopenharmony_ci    assert_ser_tokens(
6887e2e9c0cSopenharmony_ci        &"1.2.3.4".parse::<net::Ipv4Addr>().unwrap().readable(),
6897e2e9c0cSopenharmony_ci        &[Token::Str("1.2.3.4")],
6907e2e9c0cSopenharmony_ci    );
6917e2e9c0cSopenharmony_ci}
6927e2e9c0cSopenharmony_ci
6937e2e9c0cSopenharmony_ci#[test]
6947e2e9c0cSopenharmony_cifn test_net_ipv6addr_readable() {
6957e2e9c0cSopenharmony_ci    assert_ser_tokens(
6967e2e9c0cSopenharmony_ci        &"::1".parse::<net::Ipv6Addr>().unwrap().readable(),
6977e2e9c0cSopenharmony_ci        &[Token::Str("::1")],
6987e2e9c0cSopenharmony_ci    );
6997e2e9c0cSopenharmony_ci}
7007e2e9c0cSopenharmony_ci
7017e2e9c0cSopenharmony_ci#[test]
7027e2e9c0cSopenharmony_cifn test_net_ipaddr_readable() {
7037e2e9c0cSopenharmony_ci    assert_ser_tokens(
7047e2e9c0cSopenharmony_ci        &"1.2.3.4".parse::<net::IpAddr>().unwrap().readable(),
7057e2e9c0cSopenharmony_ci        &[Token::Str("1.2.3.4")],
7067e2e9c0cSopenharmony_ci    );
7077e2e9c0cSopenharmony_ci}
7087e2e9c0cSopenharmony_ci
7097e2e9c0cSopenharmony_ci#[test]
7107e2e9c0cSopenharmony_cifn test_net_socketaddr_readable() {
7117e2e9c0cSopenharmony_ci    assert_ser_tokens(
7127e2e9c0cSopenharmony_ci        &"1.2.3.4:1234"
7137e2e9c0cSopenharmony_ci            .parse::<net::SocketAddr>()
7147e2e9c0cSopenharmony_ci            .unwrap()
7157e2e9c0cSopenharmony_ci            .readable(),
7167e2e9c0cSopenharmony_ci        &[Token::Str("1.2.3.4:1234")],
7177e2e9c0cSopenharmony_ci    );
7187e2e9c0cSopenharmony_ci    assert_ser_tokens(
7197e2e9c0cSopenharmony_ci        &"1.2.3.4:1234"
7207e2e9c0cSopenharmony_ci            .parse::<net::SocketAddrV4>()
7217e2e9c0cSopenharmony_ci            .unwrap()
7227e2e9c0cSopenharmony_ci            .readable(),
7237e2e9c0cSopenharmony_ci        &[Token::Str("1.2.3.4:1234")],
7247e2e9c0cSopenharmony_ci    );
7257e2e9c0cSopenharmony_ci    assert_ser_tokens(
7267e2e9c0cSopenharmony_ci        &"[::1]:1234"
7277e2e9c0cSopenharmony_ci            .parse::<net::SocketAddrV6>()
7287e2e9c0cSopenharmony_ci            .unwrap()
7297e2e9c0cSopenharmony_ci            .readable(),
7307e2e9c0cSopenharmony_ci        &[Token::Str("[::1]:1234")],
7317e2e9c0cSopenharmony_ci    );
7327e2e9c0cSopenharmony_ci}
7337e2e9c0cSopenharmony_ci
7347e2e9c0cSopenharmony_ci#[test]
7357e2e9c0cSopenharmony_cifn test_net_ipv4addr_compact() {
7367e2e9c0cSopenharmony_ci    assert_ser_tokens(
7377e2e9c0cSopenharmony_ci        &net::Ipv4Addr::from(*b"1234").compact(),
7387e2e9c0cSopenharmony_ci        &seq![
7397e2e9c0cSopenharmony_ci            Token::Tuple { len: 4 },
7407e2e9c0cSopenharmony_ci            b"1234".iter().copied().map(Token::U8),
7417e2e9c0cSopenharmony_ci            Token::TupleEnd,
7427e2e9c0cSopenharmony_ci        ],
7437e2e9c0cSopenharmony_ci    );
7447e2e9c0cSopenharmony_ci}
7457e2e9c0cSopenharmony_ci
7467e2e9c0cSopenharmony_ci#[test]
7477e2e9c0cSopenharmony_cifn test_net_ipv6addr_compact() {
7487e2e9c0cSopenharmony_ci    assert_ser_tokens(
7497e2e9c0cSopenharmony_ci        &net::Ipv6Addr::from(*b"1234567890123456").compact(),
7507e2e9c0cSopenharmony_ci        &seq![
7517e2e9c0cSopenharmony_ci            Token::Tuple { len: 16 },
7527e2e9c0cSopenharmony_ci            b"1234567890123456".iter().copied().map(Token::U8),
7537e2e9c0cSopenharmony_ci            Token::TupleEnd,
7547e2e9c0cSopenharmony_ci        ],
7557e2e9c0cSopenharmony_ci    );
7567e2e9c0cSopenharmony_ci}
7577e2e9c0cSopenharmony_ci
7587e2e9c0cSopenharmony_ci#[test]
7597e2e9c0cSopenharmony_cifn test_net_ipaddr_compact() {
7607e2e9c0cSopenharmony_ci    assert_ser_tokens(
7617e2e9c0cSopenharmony_ci        &net::IpAddr::from(*b"1234").compact(),
7627e2e9c0cSopenharmony_ci        &seq![
7637e2e9c0cSopenharmony_ci            Token::NewtypeVariant {
7647e2e9c0cSopenharmony_ci                name: "IpAddr",
7657e2e9c0cSopenharmony_ci                variant: "V4"
7667e2e9c0cSopenharmony_ci            },
7677e2e9c0cSopenharmony_ci            Token::Tuple { len: 4 },
7687e2e9c0cSopenharmony_ci            b"1234".iter().copied().map(Token::U8),
7697e2e9c0cSopenharmony_ci            Token::TupleEnd,
7707e2e9c0cSopenharmony_ci        ],
7717e2e9c0cSopenharmony_ci    );
7727e2e9c0cSopenharmony_ci}
7737e2e9c0cSopenharmony_ci
7747e2e9c0cSopenharmony_ci#[test]
7757e2e9c0cSopenharmony_cifn test_net_socketaddr_compact() {
7767e2e9c0cSopenharmony_ci    assert_ser_tokens(
7777e2e9c0cSopenharmony_ci        &net::SocketAddr::from((*b"1234567890123456", 1234)).compact(),
7787e2e9c0cSopenharmony_ci        &seq![
7797e2e9c0cSopenharmony_ci            Token::NewtypeVariant {
7807e2e9c0cSopenharmony_ci                name: "SocketAddr",
7817e2e9c0cSopenharmony_ci                variant: "V6"
7827e2e9c0cSopenharmony_ci            },
7837e2e9c0cSopenharmony_ci            Token::Tuple { len: 2 },
7847e2e9c0cSopenharmony_ci            Token::Tuple { len: 16 },
7857e2e9c0cSopenharmony_ci            b"1234567890123456".iter().copied().map(Token::U8),
7867e2e9c0cSopenharmony_ci            Token::TupleEnd,
7877e2e9c0cSopenharmony_ci            Token::U16(1234),
7887e2e9c0cSopenharmony_ci            Token::TupleEnd,
7897e2e9c0cSopenharmony_ci        ],
7907e2e9c0cSopenharmony_ci    );
7917e2e9c0cSopenharmony_ci    assert_ser_tokens(
7927e2e9c0cSopenharmony_ci        &net::SocketAddrV4::new(net::Ipv4Addr::from(*b"1234"), 1234).compact(),
7937e2e9c0cSopenharmony_ci        &seq![
7947e2e9c0cSopenharmony_ci            Token::Tuple { len: 2 },
7957e2e9c0cSopenharmony_ci            Token::Tuple { len: 4 },
7967e2e9c0cSopenharmony_ci            b"1234".iter().copied().map(Token::U8),
7977e2e9c0cSopenharmony_ci            Token::TupleEnd,
7987e2e9c0cSopenharmony_ci            Token::U16(1234),
7997e2e9c0cSopenharmony_ci            Token::TupleEnd,
8007e2e9c0cSopenharmony_ci        ],
8017e2e9c0cSopenharmony_ci    );
8027e2e9c0cSopenharmony_ci    assert_ser_tokens(
8037e2e9c0cSopenharmony_ci        &net::SocketAddrV6::new(net::Ipv6Addr::from(*b"1234567890123456"), 1234, 0, 0).compact(),
8047e2e9c0cSopenharmony_ci        &seq![
8057e2e9c0cSopenharmony_ci            Token::Tuple { len: 2 },
8067e2e9c0cSopenharmony_ci            Token::Tuple { len: 16 },
8077e2e9c0cSopenharmony_ci            b"1234567890123456".iter().copied().map(Token::U8),
8087e2e9c0cSopenharmony_ci            Token::TupleEnd,
8097e2e9c0cSopenharmony_ci            Token::U16(1234),
8107e2e9c0cSopenharmony_ci            Token::TupleEnd,
8117e2e9c0cSopenharmony_ci        ],
8127e2e9c0cSopenharmony_ci    );
8137e2e9c0cSopenharmony_ci}
8147e2e9c0cSopenharmony_ci
8157e2e9c0cSopenharmony_ci#[cfg(feature = "unstable")]
8167e2e9c0cSopenharmony_ci#[test]
8177e2e9c0cSopenharmony_cifn test_never_result() {
8187e2e9c0cSopenharmony_ci    assert_ser_tokens(
8197e2e9c0cSopenharmony_ci        &Ok::<u8, !>(0),
8207e2e9c0cSopenharmony_ci        &[
8217e2e9c0cSopenharmony_ci            Token::NewtypeVariant {
8227e2e9c0cSopenharmony_ci                name: "Result",
8237e2e9c0cSopenharmony_ci                variant: "Ok",
8247e2e9c0cSopenharmony_ci            },
8257e2e9c0cSopenharmony_ci            Token::U8(0),
8267e2e9c0cSopenharmony_ci        ],
8277e2e9c0cSopenharmony_ci    );
8287e2e9c0cSopenharmony_ci}
8297e2e9c0cSopenharmony_ci
8307e2e9c0cSopenharmony_ci#[test]
8317e2e9c0cSopenharmony_ci#[cfg(unix)]
8327e2e9c0cSopenharmony_cifn test_cannot_serialize_paths() {
8337e2e9c0cSopenharmony_ci    use std::ffi::OsStr;
8347e2e9c0cSopenharmony_ci    use std::os::unix::ffi::OsStrExt;
8357e2e9c0cSopenharmony_ci
8367e2e9c0cSopenharmony_ci    assert_ser_tokens_error(
8377e2e9c0cSopenharmony_ci        &Path::new(OsStr::from_bytes(b"Hello \xF0\x90\x80World")),
8387e2e9c0cSopenharmony_ci        &[],
8397e2e9c0cSopenharmony_ci        "path contains invalid UTF-8 characters",
8407e2e9c0cSopenharmony_ci    );
8417e2e9c0cSopenharmony_ci}
8427e2e9c0cSopenharmony_ci
8437e2e9c0cSopenharmony_ci#[test]
8447e2e9c0cSopenharmony_cifn test_cannot_serialize_mutably_borrowed_ref_cell() {
8457e2e9c0cSopenharmony_ci    let ref_cell = RefCell::new(42);
8467e2e9c0cSopenharmony_ci    let _reference = ref_cell.borrow_mut();
8477e2e9c0cSopenharmony_ci    assert_ser_tokens_error(&ref_cell, &[], "already mutably borrowed");
8487e2e9c0cSopenharmony_ci}
8497e2e9c0cSopenharmony_ci
8507e2e9c0cSopenharmony_ci#[test]
8517e2e9c0cSopenharmony_cifn test_enum_skipped() {
8527e2e9c0cSopenharmony_ci    assert_ser_tokens_error(
8537e2e9c0cSopenharmony_ci        &Enum::SkippedUnit,
8547e2e9c0cSopenharmony_ci        &[],
8557e2e9c0cSopenharmony_ci        "the enum variant Enum::SkippedUnit cannot be serialized",
8567e2e9c0cSopenharmony_ci    );
8577e2e9c0cSopenharmony_ci    assert_ser_tokens_error(
8587e2e9c0cSopenharmony_ci        &Enum::SkippedOne(42),
8597e2e9c0cSopenharmony_ci        &[],
8607e2e9c0cSopenharmony_ci        "the enum variant Enum::SkippedOne cannot be serialized",
8617e2e9c0cSopenharmony_ci    );
8627e2e9c0cSopenharmony_ci    assert_ser_tokens_error(
8637e2e9c0cSopenharmony_ci        &Enum::SkippedSeq(1, 2),
8647e2e9c0cSopenharmony_ci        &[],
8657e2e9c0cSopenharmony_ci        "the enum variant Enum::SkippedSeq cannot be serialized",
8667e2e9c0cSopenharmony_ci    );
8677e2e9c0cSopenharmony_ci    assert_ser_tokens_error(
8687e2e9c0cSopenharmony_ci        &Enum::SkippedMap { _a: 1, _b: 2 },
8697e2e9c0cSopenharmony_ci        &[],
8707e2e9c0cSopenharmony_ci        "the enum variant Enum::SkippedMap cannot be serialized",
8717e2e9c0cSopenharmony_ci    );
8727e2e9c0cSopenharmony_ci}
8737e2e9c0cSopenharmony_ci
8747e2e9c0cSopenharmony_ci#[test]
8757e2e9c0cSopenharmony_cifn test_integer128() {
8767e2e9c0cSopenharmony_ci    assert_ser_tokens_error(&1i128, &[], "i128 is not supported");
8777e2e9c0cSopenharmony_ci
8787e2e9c0cSopenharmony_ci    assert_ser_tokens_error(&1u128, &[], "u128 is not supported");
8797e2e9c0cSopenharmony_ci}
8807e2e9c0cSopenharmony_ci
8817e2e9c0cSopenharmony_ci#[test]
8827e2e9c0cSopenharmony_cifn test_refcell_dst() {
8837e2e9c0cSopenharmony_ci    assert_ser_tokens(
8847e2e9c0cSopenharmony_ci        &RefCell::new([true]) as &RefCell<[bool]>,
8857e2e9c0cSopenharmony_ci        &[
8867e2e9c0cSopenharmony_ci            Token::Seq { len: Some(1) },
8877e2e9c0cSopenharmony_ci            Token::Bool(true),
8887e2e9c0cSopenharmony_ci            Token::SeqEnd,
8897e2e9c0cSopenharmony_ci        ],
8907e2e9c0cSopenharmony_ci    );
8917e2e9c0cSopenharmony_ci}
8927e2e9c0cSopenharmony_ci
8937e2e9c0cSopenharmony_ci#[test]
8947e2e9c0cSopenharmony_cifn test_mutex_dst() {
8957e2e9c0cSopenharmony_ci    assert_ser_tokens(
8967e2e9c0cSopenharmony_ci        &Mutex::new([true]) as &Mutex<[bool]>,
8977e2e9c0cSopenharmony_ci        &[
8987e2e9c0cSopenharmony_ci            Token::Seq { len: Some(1) },
8997e2e9c0cSopenharmony_ci            Token::Bool(true),
9007e2e9c0cSopenharmony_ci            Token::SeqEnd,
9017e2e9c0cSopenharmony_ci        ],
9027e2e9c0cSopenharmony_ci    );
9037e2e9c0cSopenharmony_ci}
9047e2e9c0cSopenharmony_ci
9057e2e9c0cSopenharmony_ci#[test]
9067e2e9c0cSopenharmony_cifn test_rwlock_dst() {
9077e2e9c0cSopenharmony_ci    assert_ser_tokens(
9087e2e9c0cSopenharmony_ci        &RwLock::new([true]) as &RwLock<[bool]>,
9097e2e9c0cSopenharmony_ci        &[
9107e2e9c0cSopenharmony_ci            Token::Seq { len: Some(1) },
9117e2e9c0cSopenharmony_ci            Token::Bool(true),
9127e2e9c0cSopenharmony_ci            Token::SeqEnd,
9137e2e9c0cSopenharmony_ci        ],
9147e2e9c0cSopenharmony_ci    );
9157e2e9c0cSopenharmony_ci}
916