Skip to content

Commit 0949c7e

Browse files
committed
Add unit tests for cargo tree format parser
Signed-off-by: Alexandre Barone <[email protected]>
1 parent 8c4a25c commit 0949c7e

File tree

1 file changed

+101
-0
lines changed

1 file changed

+101
-0
lines changed

src/cargo/ops/tree/format/parse.rs

Lines changed: 101 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
use std::iter;
44
use std::str;
55

6+
#[derive(Debug, PartialEq, Eq)]
67
pub enum RawChunk<'a> {
78
/// Raw text to include in the output.
89
Text(&'a str),
@@ -121,3 +122,103 @@ impl<'a> Iterator for Parser<'a> {
121122
}
122123
}
123124
}
125+
126+
#[cfg(test)]
127+
mod tests {
128+
use super::{Parser, RawChunk};
129+
130+
#[test]
131+
fn plain_text() {
132+
let chunks: Vec<_> = Parser::new("Hello World").collect();
133+
assert_eq!(chunks, vec![RawChunk::Text("Hello World")]);
134+
}
135+
136+
#[test]
137+
fn basic_argument() {
138+
let chunks: Vec<_> = Parser::new("{pkg}").collect();
139+
assert_eq!(chunks, vec![RawChunk::Argument("pkg")]);
140+
}
141+
142+
#[test]
143+
fn mixed_content() {
144+
let chunks: Vec<_> = Parser::new("Package {p} version:{v}").collect();
145+
assert_eq!(
146+
chunks,
147+
vec![
148+
RawChunk::Text("Package "),
149+
RawChunk::Argument("p"),
150+
RawChunk::Text(" version:"),
151+
RawChunk::Argument("v"),
152+
]
153+
);
154+
}
155+
156+
#[test]
157+
fn escaped_braces() {
158+
let chunks: Vec<_> = Parser::new("{{text}} in {{braces}}").collect();
159+
assert_eq!(
160+
chunks,
161+
vec![
162+
RawChunk::Text("{"),
163+
RawChunk::Text("text"),
164+
RawChunk::Text("}"),
165+
RawChunk::Text(" in "),
166+
RawChunk::Text("{"),
167+
RawChunk::Text("braces"),
168+
RawChunk::Text("}"),
169+
]
170+
);
171+
}
172+
173+
#[test]
174+
fn unclosed_brace() {
175+
let chunks: Vec<_> = Parser::new("{unclosed").collect();
176+
assert_eq!(chunks, vec![RawChunk::Error("expected '}'")])
177+
}
178+
179+
#[test]
180+
fn unexpected_close_brace() {
181+
let chunks: Vec<_> = Parser::new("unexpected}").collect();
182+
assert_eq!(
183+
chunks,
184+
vec![
185+
RawChunk::Text("unexpected"),
186+
RawChunk::Error("unexpected '}'"),
187+
]
188+
);
189+
}
190+
191+
#[test]
192+
fn empty_argument() {
193+
let chunks: Vec<_> = Parser::new("{}").collect();
194+
assert_eq!(chunks, vec![RawChunk::Argument("")]);
195+
}
196+
197+
#[test]
198+
fn invalid_argument_chars() {
199+
let chunks: Vec<_> = Parser::new("{a-b} {123}").collect();
200+
assert_eq!(chunks, vec![RawChunk::Error("expected '}'")]);
201+
}
202+
203+
#[test]
204+
fn complex_format() {
205+
let format = "Pkg{{name}}: {p} [{v}] (License: {l})";
206+
let chunks: Vec<_> = Parser::new(format).collect();
207+
assert_eq!(
208+
chunks,
209+
vec![
210+
RawChunk::Text("Pkg"),
211+
RawChunk::Text("{"),
212+
RawChunk::Text("name"),
213+
RawChunk::Text("}"),
214+
RawChunk::Text(": "),
215+
RawChunk::Argument("p"),
216+
RawChunk::Text(" ["),
217+
RawChunk::Argument("v"),
218+
RawChunk::Text("] (License: "),
219+
RawChunk::Argument("l"),
220+
RawChunk::Text(")"),
221+
]
222+
);
223+
}
224+
}

0 commit comments

Comments
 (0)