Skip to main content

native_theme/model/
dialog_order.rs

1// Dialog button ordering convention
2
3use serde::{Deserialize, Serialize};
4
5/// Specifies the order of affirmative/cancel buttons in dialogs.
6///
7/// Different desktop environments place the confirmation button at
8/// different ends of the button row.
9#[derive(Clone, Debug, Default, PartialEq, Serialize, Deserialize)]
10#[serde(rename_all = "snake_case")]
11pub enum DialogButtonOrder {
12    /// Affirmative button at the trailing (right) end — Windows, GNOME style.
13    #[default]
14    TrailingAffirmative,
15    /// Affirmative button at the leading (left) end — macOS, KDE style.
16    LeadingAffirmative,
17}
18
19#[cfg(test)]
20#[allow(clippy::unwrap_used, clippy::expect_used)]
21mod tests {
22    use super::*;
23
24    // TOML cannot serialize a bare enum as a top-level value; use a wrapper struct.
25    #[derive(Clone, Debug, PartialEq, Serialize, Deserialize)]
26    struct Wrapper {
27        order: DialogButtonOrder,
28    }
29
30    #[test]
31    fn trailing_affirmative_serializes_correctly() {
32        let w = Wrapper {
33            order: DialogButtonOrder::TrailingAffirmative,
34        };
35        let toml_str = toml::to_string(&w).unwrap();
36        assert!(toml_str.contains("trailing_affirmative"), "got: {toml_str}");
37    }
38
39    #[test]
40    fn leading_affirmative_serializes_correctly() {
41        let w = Wrapper {
42            order: DialogButtonOrder::LeadingAffirmative,
43        };
44        let toml_str = toml::to_string(&w).unwrap();
45        assert!(toml_str.contains("leading_affirmative"), "got: {toml_str}");
46    }
47
48    #[test]
49    fn trailing_affirmative_round_trip() {
50        let original = Wrapper {
51            order: DialogButtonOrder::TrailingAffirmative,
52        };
53        let serialized = toml::to_string(&original).unwrap();
54        let deserialized: Wrapper = toml::from_str(&serialized).unwrap();
55        assert_eq!(deserialized, original);
56    }
57
58    #[test]
59    fn leading_affirmative_round_trip() {
60        let original = Wrapper {
61            order: DialogButtonOrder::LeadingAffirmative,
62        };
63        let serialized = toml::to_string(&original).unwrap();
64        let deserialized: Wrapper = toml::from_str(&serialized).unwrap();
65        assert_eq!(deserialized, original);
66    }
67
68    #[test]
69    fn trailing_affirmative_deserializes_from_toml_value() {
70        let toml_str = r#"order = "trailing_affirmative""#;
71        let w: Wrapper = toml::from_str(toml_str).unwrap();
72        assert_eq!(w.order, DialogButtonOrder::TrailingAffirmative);
73    }
74
75    #[test]
76    fn leading_affirmative_deserializes_from_toml_value() {
77        let toml_str = r#"order = "leading_affirmative""#;
78        let w: Wrapper = toml::from_str(toml_str).unwrap();
79        assert_eq!(w.order, DialogButtonOrder::LeadingAffirmative);
80    }
81}