Skip to main content

rustlinqdemo1/
lib.rs

1pub mod sequence_extensions;
2
3#[cfg(test)]
4#[derive(Debug, Clone)]
5struct User {
6    id: i32,
7    name: String,
8}
9
10#[cfg(test)]
11fn sample_users() -> Vec<User> {
12    vec![
13        User {
14            id: 1,
15            name: "Alice".to_string(),
16        },
17        User {
18            id: 2,
19            name: "Bob".to_string(),
20        },
21        User {
22            id: 3,
23            name: "Bob".to_string(),
24        },
25    ]
26}
27
28#[cfg(test)]
29mod tests {
30    use super::sample_users;
31    use super::sequence_extensions::{
32        All, Any, ElementAtOrDefault, FirstOrDefault, GroupByOwned, LastOrDefault, RangeOwned,
33        ReverseOwned, SkipTakeOwned, TakeOwned, TakeRef,
34    };
35    use crate::sequence_extensions::RangeGenerator;
36
37    #[test]
38    fn sample_users_returns_expected_ids() {
39        let users = sample_users();
40
41        let ids = users.iter().map(|user| user.id).collect::<Vec<_>>();
42
43        assert_eq!(ids, vec![1, 2, 3]);
44    }
45
46    #[test]
47    fn all_returns_false_when_one_item_does_not_match() {
48        let values = vec![2, 4, 6, 7];
49
50        assert!(!values.all(|value| *value % 2 == 0));
51    }
52
53    #[test]
54    fn any_returns_true_when_one_item_matches() {
55        let values = vec![1, 3, 5, 8];
56
57        assert!(values.any(|value| *value > 7));
58    }
59
60    #[test]
61    fn elementat_or_default_returns_fourth_item() {
62        let values = vec![3, 5, 11, -3, 45];
63
64        let fourth_number = values.elementat_or_default(3);
65
66        assert_eq!(fourth_number, -3);
67    }
68
69    #[test]
70    fn first_or_default_returns_first_item() {
71        let values = vec![10, 20, 30];
72
73        assert_eq!(values.first_or_default(), 10);
74    }
75
76    #[test]
77    fn last_or_default_returns_last_item() {
78        let values = vec![10, 20, 30];
79
80        assert_eq!(values.last_or_default(), 30);
81    }
82
83    #[test]
84    fn skip_take_owned_returns_requested_range() {
85        let values = vec![1, 2, 3, 4, 5];
86
87        assert_eq!(values.skip_take_owned(1, 2), vec![2, 3]);
88    }
89
90    #[test]
91    fn take_ref_returns_borrowed_prefix() {
92        let values = vec![1, 2, 3, 4, 5];
93
94        assert_eq!(values.take_ref(3), &[1, 2, 3]);
95    }
96
97    #[test]
98    fn take_owned_returns_owned_prefix() {
99        let values = vec![1, 2, 3, 4, 5];
100
101        assert_eq!(values.take_owned(4), vec![1, 2, 3, 4]);
102    }
103
104    #[test]
105    fn reverse_returns_expected_reversal() {
106        let values = vec![1, 2, 3, 4];
107
108        assert_eq!(values.reverse_owned(), vec![4, 3, 2, 1]);
109    }
110
111    #[test]
112    fn groupby_returns_expected_count() {
113        let users = sample_users();
114        let grouped_users = users.group_by_owned(|user| user.name.clone());
115
116        assert_eq!(grouped_users.len(), 2);
117        assert_eq!(grouped_users.get("Alice").map(Vec::len), Some(1));
118        assert_eq!(grouped_users.get("Bob").map(Vec::len), Some(2));
119    }
120
121    #[test]
122    fn range_returns_expected_count() {
123        let range = RangeGenerator::range_owned(-5, 10);
124        let expected_nums = [-5, -4, -3, -2, -1, 0, 1, 2, 3, 4];
125
126        assert_eq!(range, expected_nums);
127
128        // Of course we can just use the default range operator (exclusive range) in Rust
129        for i in -5..4 {
130            println!("Number using default for range in Rust : {}", i);
131        }
132    }
133}