Skip to main content

coding_agent_search/ui/components/
breadcrumbs.rs

1//! Breadcrumb bar component for the TUI.
2//! Displays current context (Agent > Workspace > Date) and ranking.
3//!
4//! Legacy ratatui rendering has been removed.
5//! The ftui equivalent lives in `src/ui/app.rs`.
6
7use crate::ui::data::RankingMode;
8
9#[derive(Clone, Copy, Debug, PartialEq, Eq)]
10pub enum BreadcrumbKind {
11    Agent,
12    Workspace,
13    Date,
14    Ranking,
15    None,
16}
17
18pub fn ranking_label(r: RankingMode) -> &'static str {
19    match r {
20        RankingMode::RecentHeavy => "Recent",
21        RankingMode::Balanced => "Balanced",
22        RankingMode::RelevanceHeavy => "Relevance",
23        RankingMode::MatchQualityHeavy => "Quality",
24        RankingMode::DateNewest => "Newest",
25        RankingMode::DateOldest => "Oldest",
26    }
27}
28
29#[cfg(test)]
30mod tests {
31    use super::*;
32
33    #[test]
34    fn test_breadcrumb_kind_equality() {
35        assert_eq!(BreadcrumbKind::Agent, BreadcrumbKind::Agent);
36        assert_eq!(BreadcrumbKind::Workspace, BreadcrumbKind::Workspace);
37        assert_eq!(BreadcrumbKind::Date, BreadcrumbKind::Date);
38        assert_eq!(BreadcrumbKind::Ranking, BreadcrumbKind::Ranking);
39        assert_eq!(BreadcrumbKind::None, BreadcrumbKind::None);
40    }
41
42    #[test]
43    fn test_breadcrumb_kind_inequality() {
44        assert_ne!(BreadcrumbKind::Agent, BreadcrumbKind::Workspace);
45        assert_ne!(BreadcrumbKind::Date, BreadcrumbKind::Ranking);
46        assert_ne!(BreadcrumbKind::None, BreadcrumbKind::Agent);
47    }
48
49    #[test]
50    fn test_breadcrumb_kind_clone() {
51        let kind = BreadcrumbKind::Agent;
52        let cloned = kind;
53        assert_eq!(kind, cloned);
54    }
55
56    #[test]
57    fn test_breadcrumb_kind_copy() {
58        let kind = BreadcrumbKind::Workspace;
59        let copied: BreadcrumbKind = kind;
60        assert_eq!(copied, BreadcrumbKind::Workspace);
61    }
62
63    #[test]
64    fn test_breadcrumb_kind_debug() {
65        let debug_str = format!("{:?}", BreadcrumbKind::Agent);
66        assert!(debug_str.contains("Agent"));
67
68        let debug_str = format!("{:?}", BreadcrumbKind::None);
69        assert!(debug_str.contains("None"));
70    }
71
72    #[test]
73    fn test_ranking_label_recent_heavy() {
74        assert_eq!(ranking_label(RankingMode::RecentHeavy), "Recent");
75    }
76
77    #[test]
78    fn test_ranking_label_balanced() {
79        assert_eq!(ranking_label(RankingMode::Balanced), "Balanced");
80    }
81
82    #[test]
83    fn test_ranking_label_relevance_heavy() {
84        assert_eq!(ranking_label(RankingMode::RelevanceHeavy), "Relevance");
85    }
86
87    #[test]
88    fn test_ranking_label_match_quality_heavy() {
89        assert_eq!(ranking_label(RankingMode::MatchQualityHeavy), "Quality");
90    }
91
92    #[test]
93    fn test_ranking_label_date_newest() {
94        assert_eq!(ranking_label(RankingMode::DateNewest), "Newest");
95    }
96
97    #[test]
98    fn test_ranking_label_date_oldest() {
99        assert_eq!(ranking_label(RankingMode::DateOldest), "Oldest");
100    }
101
102    #[test]
103    fn test_ranking_label_all_modes_non_empty() {
104        let modes = [
105            RankingMode::RecentHeavy,
106            RankingMode::Balanced,
107            RankingMode::RelevanceHeavy,
108            RankingMode::MatchQualityHeavy,
109            RankingMode::DateNewest,
110            RankingMode::DateOldest,
111        ];
112
113        for mode in modes {
114            let label = ranking_label(mode);
115            assert!(
116                !label.is_empty(),
117                "Label for {:?} should not be empty",
118                mode
119            );
120        }
121    }
122}