12d8ae3abSopenharmony_ci#![cfg(feature = "serde")]
22d8ae3abSopenharmony_ci
32d8ae3abSopenharmony_ciextern crate serde;
42d8ae3abSopenharmony_ciuse self::serde::de::{
52d8ae3abSopenharmony_ci    Deserialize, DeserializeSeed, Deserializer, EnumAccess, Error, Unexpected, VariantAccess,
62d8ae3abSopenharmony_ci    Visitor,
72d8ae3abSopenharmony_ci};
82d8ae3abSopenharmony_ciuse self::serde::ser::{Serialize, Serializer};
92d8ae3abSopenharmony_ci
102d8ae3abSopenharmony_ciuse {Level, LevelFilter, LOG_LEVEL_NAMES};
112d8ae3abSopenharmony_ci
122d8ae3abSopenharmony_ciuse std::fmt;
132d8ae3abSopenharmony_ciuse std::str::{self, FromStr};
142d8ae3abSopenharmony_ci
152d8ae3abSopenharmony_ci// The Deserialize impls are handwritten to be case insensitive using FromStr.
162d8ae3abSopenharmony_ci
172d8ae3abSopenharmony_ciimpl Serialize for Level {
182d8ae3abSopenharmony_ci    fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
192d8ae3abSopenharmony_ci    where
202d8ae3abSopenharmony_ci        S: Serializer,
212d8ae3abSopenharmony_ci    {
222d8ae3abSopenharmony_ci        match *self {
232d8ae3abSopenharmony_ci            Level::Error => serializer.serialize_unit_variant("Level", 0, "ERROR"),
242d8ae3abSopenharmony_ci            Level::Warn => serializer.serialize_unit_variant("Level", 1, "WARN"),
252d8ae3abSopenharmony_ci            Level::Info => serializer.serialize_unit_variant("Level", 2, "INFO"),
262d8ae3abSopenharmony_ci            Level::Debug => serializer.serialize_unit_variant("Level", 3, "DEBUG"),
272d8ae3abSopenharmony_ci            Level::Trace => serializer.serialize_unit_variant("Level", 4, "TRACE"),
282d8ae3abSopenharmony_ci        }
292d8ae3abSopenharmony_ci    }
302d8ae3abSopenharmony_ci}
312d8ae3abSopenharmony_ci
322d8ae3abSopenharmony_ciimpl<'de> Deserialize<'de> for Level {
332d8ae3abSopenharmony_ci    fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
342d8ae3abSopenharmony_ci    where
352d8ae3abSopenharmony_ci        D: Deserializer<'de>,
362d8ae3abSopenharmony_ci    {
372d8ae3abSopenharmony_ci        struct LevelIdentifier;
382d8ae3abSopenharmony_ci
392d8ae3abSopenharmony_ci        impl<'de> Visitor<'de> for LevelIdentifier {
402d8ae3abSopenharmony_ci            type Value = Level;
412d8ae3abSopenharmony_ci
422d8ae3abSopenharmony_ci            fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
432d8ae3abSopenharmony_ci                formatter.write_str("log level")
442d8ae3abSopenharmony_ci            }
452d8ae3abSopenharmony_ci
462d8ae3abSopenharmony_ci            fn visit_str<E>(self, s: &str) -> Result<Self::Value, E>
472d8ae3abSopenharmony_ci            where
482d8ae3abSopenharmony_ci                E: Error,
492d8ae3abSopenharmony_ci            {
502d8ae3abSopenharmony_ci                // Case insensitive.
512d8ae3abSopenharmony_ci                FromStr::from_str(s).map_err(|_| Error::unknown_variant(s, &LOG_LEVEL_NAMES[1..]))
522d8ae3abSopenharmony_ci            }
532d8ae3abSopenharmony_ci
542d8ae3abSopenharmony_ci            fn visit_bytes<E>(self, value: &[u8]) -> Result<Self::Value, E>
552d8ae3abSopenharmony_ci            where
562d8ae3abSopenharmony_ci                E: Error,
572d8ae3abSopenharmony_ci            {
582d8ae3abSopenharmony_ci                let variant = str::from_utf8(value)
592d8ae3abSopenharmony_ci                    .map_err(|_| Error::invalid_value(Unexpected::Bytes(value), &self))?;
602d8ae3abSopenharmony_ci
612d8ae3abSopenharmony_ci                self.visit_str(variant)
622d8ae3abSopenharmony_ci            }
632d8ae3abSopenharmony_ci
642d8ae3abSopenharmony_ci            fn visit_u64<E>(self, v: u64) -> Result<Self::Value, E>
652d8ae3abSopenharmony_ci            where
662d8ae3abSopenharmony_ci                E: Error,
672d8ae3abSopenharmony_ci            {
682d8ae3abSopenharmony_ci                let variant = LOG_LEVEL_NAMES[1..]
692d8ae3abSopenharmony_ci                    .get(v as usize)
702d8ae3abSopenharmony_ci                    .ok_or_else(|| Error::invalid_value(Unexpected::Unsigned(v), &self))?;
712d8ae3abSopenharmony_ci
722d8ae3abSopenharmony_ci                self.visit_str(variant)
732d8ae3abSopenharmony_ci            }
742d8ae3abSopenharmony_ci        }
752d8ae3abSopenharmony_ci
762d8ae3abSopenharmony_ci        impl<'de> DeserializeSeed<'de> for LevelIdentifier {
772d8ae3abSopenharmony_ci            type Value = Level;
782d8ae3abSopenharmony_ci
792d8ae3abSopenharmony_ci            fn deserialize<D>(self, deserializer: D) -> Result<Self::Value, D::Error>
802d8ae3abSopenharmony_ci            where
812d8ae3abSopenharmony_ci                D: Deserializer<'de>,
822d8ae3abSopenharmony_ci            {
832d8ae3abSopenharmony_ci                deserializer.deserialize_identifier(LevelIdentifier)
842d8ae3abSopenharmony_ci            }
852d8ae3abSopenharmony_ci        }
862d8ae3abSopenharmony_ci
872d8ae3abSopenharmony_ci        struct LevelEnum;
882d8ae3abSopenharmony_ci
892d8ae3abSopenharmony_ci        impl<'de> Visitor<'de> for LevelEnum {
902d8ae3abSopenharmony_ci            type Value = Level;
912d8ae3abSopenharmony_ci
922d8ae3abSopenharmony_ci            fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
932d8ae3abSopenharmony_ci                formatter.write_str("log level")
942d8ae3abSopenharmony_ci            }
952d8ae3abSopenharmony_ci
962d8ae3abSopenharmony_ci            fn visit_enum<A>(self, value: A) -> Result<Self::Value, A::Error>
972d8ae3abSopenharmony_ci            where
982d8ae3abSopenharmony_ci                A: EnumAccess<'de>,
992d8ae3abSopenharmony_ci            {
1002d8ae3abSopenharmony_ci                let (level, variant) = value.variant_seed(LevelIdentifier)?;
1012d8ae3abSopenharmony_ci                // Every variant is a unit variant.
1022d8ae3abSopenharmony_ci                variant.unit_variant()?;
1032d8ae3abSopenharmony_ci                Ok(level)
1042d8ae3abSopenharmony_ci            }
1052d8ae3abSopenharmony_ci        }
1062d8ae3abSopenharmony_ci
1072d8ae3abSopenharmony_ci        deserializer.deserialize_enum("Level", &LOG_LEVEL_NAMES[1..], LevelEnum)
1082d8ae3abSopenharmony_ci    }
1092d8ae3abSopenharmony_ci}
1102d8ae3abSopenharmony_ci
1112d8ae3abSopenharmony_ciimpl Serialize for LevelFilter {
1122d8ae3abSopenharmony_ci    fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
1132d8ae3abSopenharmony_ci    where
1142d8ae3abSopenharmony_ci        S: Serializer,
1152d8ae3abSopenharmony_ci    {
1162d8ae3abSopenharmony_ci        match *self {
1172d8ae3abSopenharmony_ci            LevelFilter::Off => serializer.serialize_unit_variant("LevelFilter", 0, "OFF"),
1182d8ae3abSopenharmony_ci            LevelFilter::Error => serializer.serialize_unit_variant("LevelFilter", 1, "ERROR"),
1192d8ae3abSopenharmony_ci            LevelFilter::Warn => serializer.serialize_unit_variant("LevelFilter", 2, "WARN"),
1202d8ae3abSopenharmony_ci            LevelFilter::Info => serializer.serialize_unit_variant("LevelFilter", 3, "INFO"),
1212d8ae3abSopenharmony_ci            LevelFilter::Debug => serializer.serialize_unit_variant("LevelFilter", 4, "DEBUG"),
1222d8ae3abSopenharmony_ci            LevelFilter::Trace => serializer.serialize_unit_variant("LevelFilter", 5, "TRACE"),
1232d8ae3abSopenharmony_ci        }
1242d8ae3abSopenharmony_ci    }
1252d8ae3abSopenharmony_ci}
1262d8ae3abSopenharmony_ci
1272d8ae3abSopenharmony_ciimpl<'de> Deserialize<'de> for LevelFilter {
1282d8ae3abSopenharmony_ci    fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
1292d8ae3abSopenharmony_ci    where
1302d8ae3abSopenharmony_ci        D: Deserializer<'de>,
1312d8ae3abSopenharmony_ci    {
1322d8ae3abSopenharmony_ci        struct LevelFilterIdentifier;
1332d8ae3abSopenharmony_ci
1342d8ae3abSopenharmony_ci        impl<'de> Visitor<'de> for LevelFilterIdentifier {
1352d8ae3abSopenharmony_ci            type Value = LevelFilter;
1362d8ae3abSopenharmony_ci
1372d8ae3abSopenharmony_ci            fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
1382d8ae3abSopenharmony_ci                formatter.write_str("log level filter")
1392d8ae3abSopenharmony_ci            }
1402d8ae3abSopenharmony_ci
1412d8ae3abSopenharmony_ci            fn visit_str<E>(self, s: &str) -> Result<Self::Value, E>
1422d8ae3abSopenharmony_ci            where
1432d8ae3abSopenharmony_ci                E: Error,
1442d8ae3abSopenharmony_ci            {
1452d8ae3abSopenharmony_ci                // Case insensitive.
1462d8ae3abSopenharmony_ci                FromStr::from_str(s).map_err(|_| Error::unknown_variant(s, &LOG_LEVEL_NAMES))
1472d8ae3abSopenharmony_ci            }
1482d8ae3abSopenharmony_ci
1492d8ae3abSopenharmony_ci            fn visit_bytes<E>(self, value: &[u8]) -> Result<Self::Value, E>
1502d8ae3abSopenharmony_ci            where
1512d8ae3abSopenharmony_ci                E: Error,
1522d8ae3abSopenharmony_ci            {
1532d8ae3abSopenharmony_ci                let variant = str::from_utf8(value)
1542d8ae3abSopenharmony_ci                    .map_err(|_| Error::invalid_value(Unexpected::Bytes(value), &self))?;
1552d8ae3abSopenharmony_ci
1562d8ae3abSopenharmony_ci                self.visit_str(variant)
1572d8ae3abSopenharmony_ci            }
1582d8ae3abSopenharmony_ci
1592d8ae3abSopenharmony_ci            fn visit_u64<E>(self, v: u64) -> Result<Self::Value, E>
1602d8ae3abSopenharmony_ci            where
1612d8ae3abSopenharmony_ci                E: Error,
1622d8ae3abSopenharmony_ci            {
1632d8ae3abSopenharmony_ci                let variant = LOG_LEVEL_NAMES
1642d8ae3abSopenharmony_ci                    .get(v as usize)
1652d8ae3abSopenharmony_ci                    .ok_or_else(|| Error::invalid_value(Unexpected::Unsigned(v), &self))?;
1662d8ae3abSopenharmony_ci
1672d8ae3abSopenharmony_ci                self.visit_str(variant)
1682d8ae3abSopenharmony_ci            }
1692d8ae3abSopenharmony_ci        }
1702d8ae3abSopenharmony_ci
1712d8ae3abSopenharmony_ci        impl<'de> DeserializeSeed<'de> for LevelFilterIdentifier {
1722d8ae3abSopenharmony_ci            type Value = LevelFilter;
1732d8ae3abSopenharmony_ci
1742d8ae3abSopenharmony_ci            fn deserialize<D>(self, deserializer: D) -> Result<Self::Value, D::Error>
1752d8ae3abSopenharmony_ci            where
1762d8ae3abSopenharmony_ci                D: Deserializer<'de>,
1772d8ae3abSopenharmony_ci            {
1782d8ae3abSopenharmony_ci                deserializer.deserialize_identifier(LevelFilterIdentifier)
1792d8ae3abSopenharmony_ci            }
1802d8ae3abSopenharmony_ci        }
1812d8ae3abSopenharmony_ci
1822d8ae3abSopenharmony_ci        struct LevelFilterEnum;
1832d8ae3abSopenharmony_ci
1842d8ae3abSopenharmony_ci        impl<'de> Visitor<'de> for LevelFilterEnum {
1852d8ae3abSopenharmony_ci            type Value = LevelFilter;
1862d8ae3abSopenharmony_ci
1872d8ae3abSopenharmony_ci            fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
1882d8ae3abSopenharmony_ci                formatter.write_str("log level filter")
1892d8ae3abSopenharmony_ci            }
1902d8ae3abSopenharmony_ci
1912d8ae3abSopenharmony_ci            fn visit_enum<A>(self, value: A) -> Result<Self::Value, A::Error>
1922d8ae3abSopenharmony_ci            where
1932d8ae3abSopenharmony_ci                A: EnumAccess<'de>,
1942d8ae3abSopenharmony_ci            {
1952d8ae3abSopenharmony_ci                let (level_filter, variant) = value.variant_seed(LevelFilterIdentifier)?;
1962d8ae3abSopenharmony_ci                // Every variant is a unit variant.
1972d8ae3abSopenharmony_ci                variant.unit_variant()?;
1982d8ae3abSopenharmony_ci                Ok(level_filter)
1992d8ae3abSopenharmony_ci            }
2002d8ae3abSopenharmony_ci        }
2012d8ae3abSopenharmony_ci
2022d8ae3abSopenharmony_ci        deserializer.deserialize_enum("LevelFilter", &LOG_LEVEL_NAMES, LevelFilterEnum)
2032d8ae3abSopenharmony_ci    }
2042d8ae3abSopenharmony_ci}
2052d8ae3abSopenharmony_ci
2062d8ae3abSopenharmony_ci#[cfg(test)]
2072d8ae3abSopenharmony_cimod tests {
2082d8ae3abSopenharmony_ci    extern crate serde_test;
2092d8ae3abSopenharmony_ci    use self::serde_test::{assert_de_tokens, assert_de_tokens_error, assert_tokens, Token};
2102d8ae3abSopenharmony_ci
2112d8ae3abSopenharmony_ci    use {Level, LevelFilter};
2122d8ae3abSopenharmony_ci
2132d8ae3abSopenharmony_ci    fn level_token(variant: &'static str) -> Token {
2142d8ae3abSopenharmony_ci        Token::UnitVariant {
2152d8ae3abSopenharmony_ci            name: "Level",
2162d8ae3abSopenharmony_ci            variant: variant,
2172d8ae3abSopenharmony_ci        }
2182d8ae3abSopenharmony_ci    }
2192d8ae3abSopenharmony_ci
2202d8ae3abSopenharmony_ci    fn level_bytes_tokens(variant: &'static [u8]) -> [Token; 3] {
2212d8ae3abSopenharmony_ci        [
2222d8ae3abSopenharmony_ci            Token::Enum { name: "Level" },
2232d8ae3abSopenharmony_ci            Token::Bytes(variant),
2242d8ae3abSopenharmony_ci            Token::Unit,
2252d8ae3abSopenharmony_ci        ]
2262d8ae3abSopenharmony_ci    }
2272d8ae3abSopenharmony_ci
2282d8ae3abSopenharmony_ci    fn level_variant_tokens(variant: u32) -> [Token; 3] {
2292d8ae3abSopenharmony_ci        [
2302d8ae3abSopenharmony_ci            Token::Enum { name: "Level" },
2312d8ae3abSopenharmony_ci            Token::U32(variant),
2322d8ae3abSopenharmony_ci            Token::Unit,
2332d8ae3abSopenharmony_ci        ]
2342d8ae3abSopenharmony_ci    }
2352d8ae3abSopenharmony_ci
2362d8ae3abSopenharmony_ci    fn level_filter_token(variant: &'static str) -> Token {
2372d8ae3abSopenharmony_ci        Token::UnitVariant {
2382d8ae3abSopenharmony_ci            name: "LevelFilter",
2392d8ae3abSopenharmony_ci            variant: variant,
2402d8ae3abSopenharmony_ci        }
2412d8ae3abSopenharmony_ci    }
2422d8ae3abSopenharmony_ci
2432d8ae3abSopenharmony_ci    fn level_filter_bytes_tokens(variant: &'static [u8]) -> [Token; 3] {
2442d8ae3abSopenharmony_ci        [
2452d8ae3abSopenharmony_ci            Token::Enum {
2462d8ae3abSopenharmony_ci                name: "LevelFilter",
2472d8ae3abSopenharmony_ci            },
2482d8ae3abSopenharmony_ci            Token::Bytes(variant),
2492d8ae3abSopenharmony_ci            Token::Unit,
2502d8ae3abSopenharmony_ci        ]
2512d8ae3abSopenharmony_ci    }
2522d8ae3abSopenharmony_ci
2532d8ae3abSopenharmony_ci    fn level_filter_variant_tokens(variant: u32) -> [Token; 3] {
2542d8ae3abSopenharmony_ci        [
2552d8ae3abSopenharmony_ci            Token::Enum {
2562d8ae3abSopenharmony_ci                name: "LevelFilter",
2572d8ae3abSopenharmony_ci            },
2582d8ae3abSopenharmony_ci            Token::U32(variant),
2592d8ae3abSopenharmony_ci            Token::Unit,
2602d8ae3abSopenharmony_ci        ]
2612d8ae3abSopenharmony_ci    }
2622d8ae3abSopenharmony_ci
2632d8ae3abSopenharmony_ci    #[test]
2642d8ae3abSopenharmony_ci    fn test_level_ser_de() {
2652d8ae3abSopenharmony_ci        let cases = [
2662d8ae3abSopenharmony_ci            (Level::Error, [level_token("ERROR")]),
2672d8ae3abSopenharmony_ci            (Level::Warn, [level_token("WARN")]),
2682d8ae3abSopenharmony_ci            (Level::Info, [level_token("INFO")]),
2692d8ae3abSopenharmony_ci            (Level::Debug, [level_token("DEBUG")]),
2702d8ae3abSopenharmony_ci            (Level::Trace, [level_token("TRACE")]),
2712d8ae3abSopenharmony_ci        ];
2722d8ae3abSopenharmony_ci
2732d8ae3abSopenharmony_ci        for &(s, expected) in &cases {
2742d8ae3abSopenharmony_ci            assert_tokens(&s, &expected);
2752d8ae3abSopenharmony_ci        }
2762d8ae3abSopenharmony_ci    }
2772d8ae3abSopenharmony_ci
2782d8ae3abSopenharmony_ci    #[test]
2792d8ae3abSopenharmony_ci    fn test_level_case_insensitive() {
2802d8ae3abSopenharmony_ci        let cases = [
2812d8ae3abSopenharmony_ci            (Level::Error, [level_token("error")]),
2822d8ae3abSopenharmony_ci            (Level::Warn, [level_token("warn")]),
2832d8ae3abSopenharmony_ci            (Level::Info, [level_token("info")]),
2842d8ae3abSopenharmony_ci            (Level::Debug, [level_token("debug")]),
2852d8ae3abSopenharmony_ci            (Level::Trace, [level_token("trace")]),
2862d8ae3abSopenharmony_ci        ];
2872d8ae3abSopenharmony_ci
2882d8ae3abSopenharmony_ci        for &(s, expected) in &cases {
2892d8ae3abSopenharmony_ci            assert_de_tokens(&s, &expected);
2902d8ae3abSopenharmony_ci        }
2912d8ae3abSopenharmony_ci    }
2922d8ae3abSopenharmony_ci
2932d8ae3abSopenharmony_ci    #[test]
2942d8ae3abSopenharmony_ci    fn test_level_de_bytes() {
2952d8ae3abSopenharmony_ci        let cases = [
2962d8ae3abSopenharmony_ci            (Level::Error, level_bytes_tokens(b"ERROR")),
2972d8ae3abSopenharmony_ci            (Level::Warn, level_bytes_tokens(b"WARN")),
2982d8ae3abSopenharmony_ci            (Level::Info, level_bytes_tokens(b"INFO")),
2992d8ae3abSopenharmony_ci            (Level::Debug, level_bytes_tokens(b"DEBUG")),
3002d8ae3abSopenharmony_ci            (Level::Trace, level_bytes_tokens(b"TRACE")),
3012d8ae3abSopenharmony_ci        ];
3022d8ae3abSopenharmony_ci
3032d8ae3abSopenharmony_ci        for &(value, tokens) in &cases {
3042d8ae3abSopenharmony_ci            assert_de_tokens(&value, &tokens);
3052d8ae3abSopenharmony_ci        }
3062d8ae3abSopenharmony_ci    }
3072d8ae3abSopenharmony_ci
3082d8ae3abSopenharmony_ci    #[test]
3092d8ae3abSopenharmony_ci    fn test_level_de_variant_index() {
3102d8ae3abSopenharmony_ci        let cases = [
3112d8ae3abSopenharmony_ci            (Level::Error, level_variant_tokens(0)),
3122d8ae3abSopenharmony_ci            (Level::Warn, level_variant_tokens(1)),
3132d8ae3abSopenharmony_ci            (Level::Info, level_variant_tokens(2)),
3142d8ae3abSopenharmony_ci            (Level::Debug, level_variant_tokens(3)),
3152d8ae3abSopenharmony_ci            (Level::Trace, level_variant_tokens(4)),
3162d8ae3abSopenharmony_ci        ];
3172d8ae3abSopenharmony_ci
3182d8ae3abSopenharmony_ci        for &(value, tokens) in &cases {
3192d8ae3abSopenharmony_ci            assert_de_tokens(&value, &tokens);
3202d8ae3abSopenharmony_ci        }
3212d8ae3abSopenharmony_ci    }
3222d8ae3abSopenharmony_ci
3232d8ae3abSopenharmony_ci    #[test]
3242d8ae3abSopenharmony_ci    fn test_level_de_error() {
3252d8ae3abSopenharmony_ci        let msg = "unknown variant `errorx`, expected one of \
3262d8ae3abSopenharmony_ci                   `ERROR`, `WARN`, `INFO`, `DEBUG`, `TRACE`";
3272d8ae3abSopenharmony_ci        assert_de_tokens_error::<Level>(&[level_token("errorx")], msg);
3282d8ae3abSopenharmony_ci    }
3292d8ae3abSopenharmony_ci
3302d8ae3abSopenharmony_ci    #[test]
3312d8ae3abSopenharmony_ci    fn test_level_filter_ser_de() {
3322d8ae3abSopenharmony_ci        let cases = [
3332d8ae3abSopenharmony_ci            (LevelFilter::Off, [level_filter_token("OFF")]),
3342d8ae3abSopenharmony_ci            (LevelFilter::Error, [level_filter_token("ERROR")]),
3352d8ae3abSopenharmony_ci            (LevelFilter::Warn, [level_filter_token("WARN")]),
3362d8ae3abSopenharmony_ci            (LevelFilter::Info, [level_filter_token("INFO")]),
3372d8ae3abSopenharmony_ci            (LevelFilter::Debug, [level_filter_token("DEBUG")]),
3382d8ae3abSopenharmony_ci            (LevelFilter::Trace, [level_filter_token("TRACE")]),
3392d8ae3abSopenharmony_ci        ];
3402d8ae3abSopenharmony_ci
3412d8ae3abSopenharmony_ci        for &(s, expected) in &cases {
3422d8ae3abSopenharmony_ci            assert_tokens(&s, &expected);
3432d8ae3abSopenharmony_ci        }
3442d8ae3abSopenharmony_ci    }
3452d8ae3abSopenharmony_ci
3462d8ae3abSopenharmony_ci    #[test]
3472d8ae3abSopenharmony_ci    fn test_level_filter_case_insensitive() {
3482d8ae3abSopenharmony_ci        let cases = [
3492d8ae3abSopenharmony_ci            (LevelFilter::Off, [level_filter_token("off")]),
3502d8ae3abSopenharmony_ci            (LevelFilter::Error, [level_filter_token("error")]),
3512d8ae3abSopenharmony_ci            (LevelFilter::Warn, [level_filter_token("warn")]),
3522d8ae3abSopenharmony_ci            (LevelFilter::Info, [level_filter_token("info")]),
3532d8ae3abSopenharmony_ci            (LevelFilter::Debug, [level_filter_token("debug")]),
3542d8ae3abSopenharmony_ci            (LevelFilter::Trace, [level_filter_token("trace")]),
3552d8ae3abSopenharmony_ci        ];
3562d8ae3abSopenharmony_ci
3572d8ae3abSopenharmony_ci        for &(s, expected) in &cases {
3582d8ae3abSopenharmony_ci            assert_de_tokens(&s, &expected);
3592d8ae3abSopenharmony_ci        }
3602d8ae3abSopenharmony_ci    }
3612d8ae3abSopenharmony_ci
3622d8ae3abSopenharmony_ci    #[test]
3632d8ae3abSopenharmony_ci    fn test_level_filter_de_bytes() {
3642d8ae3abSopenharmony_ci        let cases = [
3652d8ae3abSopenharmony_ci            (LevelFilter::Off, level_filter_bytes_tokens(b"OFF")),
3662d8ae3abSopenharmony_ci            (LevelFilter::Error, level_filter_bytes_tokens(b"ERROR")),
3672d8ae3abSopenharmony_ci            (LevelFilter::Warn, level_filter_bytes_tokens(b"WARN")),
3682d8ae3abSopenharmony_ci            (LevelFilter::Info, level_filter_bytes_tokens(b"INFO")),
3692d8ae3abSopenharmony_ci            (LevelFilter::Debug, level_filter_bytes_tokens(b"DEBUG")),
3702d8ae3abSopenharmony_ci            (LevelFilter::Trace, level_filter_bytes_tokens(b"TRACE")),
3712d8ae3abSopenharmony_ci        ];
3722d8ae3abSopenharmony_ci
3732d8ae3abSopenharmony_ci        for &(value, tokens) in &cases {
3742d8ae3abSopenharmony_ci            assert_de_tokens(&value, &tokens);
3752d8ae3abSopenharmony_ci        }
3762d8ae3abSopenharmony_ci    }
3772d8ae3abSopenharmony_ci
3782d8ae3abSopenharmony_ci    #[test]
3792d8ae3abSopenharmony_ci    fn test_level_filter_de_variant_index() {
3802d8ae3abSopenharmony_ci        let cases = [
3812d8ae3abSopenharmony_ci            (LevelFilter::Off, level_filter_variant_tokens(0)),
3822d8ae3abSopenharmony_ci            (LevelFilter::Error, level_filter_variant_tokens(1)),
3832d8ae3abSopenharmony_ci            (LevelFilter::Warn, level_filter_variant_tokens(2)),
3842d8ae3abSopenharmony_ci            (LevelFilter::Info, level_filter_variant_tokens(3)),
3852d8ae3abSopenharmony_ci            (LevelFilter::Debug, level_filter_variant_tokens(4)),
3862d8ae3abSopenharmony_ci            (LevelFilter::Trace, level_filter_variant_tokens(5)),
3872d8ae3abSopenharmony_ci        ];
3882d8ae3abSopenharmony_ci
3892d8ae3abSopenharmony_ci        for &(value, tokens) in &cases {
3902d8ae3abSopenharmony_ci            assert_de_tokens(&value, &tokens);
3912d8ae3abSopenharmony_ci        }
3922d8ae3abSopenharmony_ci    }
3932d8ae3abSopenharmony_ci
3942d8ae3abSopenharmony_ci    #[test]
3952d8ae3abSopenharmony_ci    fn test_level_filter_de_error() {
3962d8ae3abSopenharmony_ci        let msg = "unknown variant `errorx`, expected one of \
3972d8ae3abSopenharmony_ci                   `OFF`, `ERROR`, `WARN`, `INFO`, `DEBUG`, `TRACE`";
3982d8ae3abSopenharmony_ci        assert_de_tokens_error::<LevelFilter>(&[level_filter_token("errorx")], msg);
3992d8ae3abSopenharmony_ci    }
4002d8ae3abSopenharmony_ci}
401