Skip to main content

basecoat_core/classes/
select.rs

1use crate::props::select::SelectProps;
2
3/// Returns the canonical CSS class string for a select.
4///
5/// Upstream: `.select` class on the outer wrapper element (a non-`<select>`
6/// container per `*:not(select).select` in basecoat.css).
7pub fn select(p: &SelectProps) -> String {
8    match &p.class {
9        Some(extra) if !extra.is_empty() => format!("select {extra}"),
10        _ => "select".to_string(),
11    }
12}
13
14#[cfg(test)]
15mod tests {
16    use super::*;
17    use crate::props::select::{SelectOption, SelectProps};
18
19    #[test]
20    fn base_class() {
21        assert_eq!(select(&SelectProps::default()), "select");
22    }
23
24    #[test]
25    fn with_extra_class() {
26        let p = SelectProps {
27            class: Some("w-64".into()),
28            ..Default::default()
29        };
30        assert_eq!(select(&p), "select w-64");
31    }
32
33    #[test]
34    fn empty_extra_class_is_ignored() {
35        let p = SelectProps {
36            class: Some("".into()),
37            ..Default::default()
38        };
39        assert_eq!(select(&p), "select");
40    }
41
42    #[test]
43    fn options_constructor_is_enabled_by_default() {
44        let o = SelectOption::new("a", "Apple");
45        assert_eq!(o.value, "a");
46        assert_eq!(o.label, "Apple");
47        assert!(!o.disabled);
48    }
49
50    #[test]
51    fn options_disabled_builder() {
52        let o = SelectOption::new("b", "Banana").disabled();
53        assert!(o.disabled);
54    }
55}