continent_code/
seven.rs

1continent_code! {
2    #[derive(Debug, Clone)]
3    pub enum ContinentCode {
4        AS => "Asia",
5        AF => "Africa",
6        NA => "North America",
7        SA => "South America",
8        AN => "Antarctica",
9        EU => "Europe",
10        OC | AU => "Oceania",
11    }
12}
13
14#[cfg(test)]
15mod tests {
16    use super::*;
17
18    use alloc::string::ToString as _;
19
20    use csv::ReaderBuilder;
21
22    #[test]
23    fn test_continent_code() {
24        // Wikipedia
25        let mut rdr = ReaderBuilder::new()
26            .has_headers(false)
27            .flexible(true)
28            .from_reader(include_str!("../tests/Continent/Area_and_population.csv").as_bytes());
29
30        let mut n = 0;
31        for record in rdr.records().skip(2) {
32            let record = record.unwrap();
33            let en_name = &record[0];
34            assert_eq!(en_name.parse::<ContinentCode>().unwrap().en_name(), en_name);
35            n += 1;
36        }
37
38        assert_eq!("AU".parse::<ContinentCode>().unwrap().to_string(), "OC");
39
40        assert_eq!(ContinentCode::VARS.len(), n);
41
42        assert_eq!(ContinentCode::from_en_name("Asia"), Some(ContinentCode::AS));
43        assert_eq!(ContinentCode::AS.en_name(), "Asia");
44
45        // PartialEq
46        assert_eq!(ContinentCode::AS, ContinentCode::AS);
47        assert_eq!(ContinentCode::AS, "AS");
48
49        #[cfg(feature = "serde")]
50        {
51            #[derive(serde::Serialize, serde::Deserialize)]
52            struct Foo {
53                code: ContinentCode,
54            }
55
56            assert_eq!(
57                serde_json::from_str::<Foo>(r#"{"code":"AS"}"#)
58                    .unwrap()
59                    .code,
60                ContinentCode::AS
61            );
62            assert_eq!(
63                serde_json::to_string(&Foo {
64                    code: ContinentCode::AS
65                })
66                .unwrap(),
67                r#"{"code":"AS"}"#
68            );
69        }
70    }
71}