string_sequence_tester/
line.rs

1/// The content of a line, with a [LineModifier].
2#[derive(Debug, Clone)]
3pub struct Line {
4    content: String,
5    modifier: LineModifier,
6}
7
8impl Line {
9    /// Creates a Verbatim line
10    pub fn verbatim(s: &str) -> Self {
11        Line { content: s.to_owned(), modifier: LineModifier::Verbatim }
12    }
13
14    /// Creates a Trimmed line
15    pub fn trimmed(s: &str) -> Self {
16        Line { content: s.to_owned(), modifier: LineModifier::Trimmed }
17    }
18
19    /// Checks whether the given, modified line is equal to the internal line of this object.
20    pub(crate) fn accept(&self, s: &str) -> bool {
21        match self.modifier {
22            LineModifier::Verbatim => self.content == s,
23            LineModifier::Trimmed => self.content == s.trim(),
24        }
25    }
26}
27
28/// Line modifiers.
29#[derive(Debug, Clone, Copy)]
30pub enum LineModifier {
31    /// The line shall be checked as-is.
32    Verbatim,
33    /// The line shall be checked with whitespaces trimmed at both ends of it.
34    Trimmed,
35}
36
37#[cfg(test)]
38mod test {
39    use crate::Line;
40
41    #[test]
42    fn test_verbatim_accept() {
43        let l1 = Line::verbatim("test");
44        let l2 = Line::verbatim("  test");
45        assert!(l1.accept("test"));
46        assert!(!l1.accept("  test"));
47        assert!(l2.accept("  test"));
48        assert!(!l2.accept("test"));
49        assert!(!l1.accept("wrong"));
50    }
51
52    #[test]
53    fn test_trimmed_accept() {
54        let l1 = Line::trimmed("test");
55        assert!(l1.accept("test"));
56        assert!(l1.accept("  test"));
57        assert!(l1.accept("test  "));
58        assert!(!l1.accept("wrong"));
59        assert!(!l1.accept("  wrong"));
60    }
61}