1 use crate::ascii::dec_uint;
2 use crate::combinator::dispatch;
3 use crate::combinator::empty;
4 use crate::combinator::fail;
5 use crate::combinator::seq;
6 use crate::error::ErrMode;
7 use crate::error::ErrorKind;
8 use crate::error::ParserError;
9 use crate::prelude::*;
10 use crate::token::any;
11 
12 #[test]
dispatch_basics()13 fn dispatch_basics() {
14     fn escape_seq_char(input: &mut &str) -> PResult<char> {
15         dispatch! {any;
16             'b' => empty.value('\u{8}'),
17             'f' => empty.value('\u{c}'),
18             'n' => empty.value('\n'),
19             'r' => empty.value('\r'),
20             't' => empty.value('\t'),
21             '\\' => empty.value('\\'),
22             '"' => empty.value('"'),
23             _ => fail::<_, char, _>,
24         }
25         .parse_next(input)
26     }
27     assert_eq!(escape_seq_char.parse_peek("b123"), Ok(("123", '\u{8}')));
28     assert_eq!(
29         escape_seq_char.parse_peek("error"),
30         Err(ErrMode::Backtrack(ParserError::from_error_kind(
31             &"rror",
32             ErrorKind::Fail
33         )))
34     );
35     assert_eq!(
36         escape_seq_char.parse_peek(""),
37         Err(ErrMode::Backtrack(ParserError::from_error_kind(
38             &"",
39             ErrorKind::Fail
40         )))
41     );
42 }
43 
44 #[test]
seq_struct_basics()45 fn seq_struct_basics() {
46     #[derive(Debug, PartialEq)]
47     struct Point {
48         x: u32,
49         y: u32,
50     }
51 
52     fn parser(input: &mut &str) -> PResult<Point> {
53         seq! {
54             Point {
55                 x: dec_uint,
56                 _: ',',
57                 y: dec_uint,
58             }
59         }
60         .parse_next(input)
61     }
62     assert_eq!(
63         parser.parse_peek("123,4 remaining"),
64         Ok((" remaining", Point { x: 123, y: 4 },)),
65     );
66     assert_eq!(
67         parser.parse_peek("123, remaining"),
68         Err(ErrMode::Backtrack(ParserError::from_error_kind(
69             &" remaining",
70             ErrorKind::Fail
71         )))
72     );
73     assert_eq!(
74         parser.parse_peek(""),
75         Err(ErrMode::Backtrack(ParserError::from_error_kind(
76             &"",
77             ErrorKind::Fail
78         )))
79     );
80 }
81 
82 #[test]
seq_struct_default_init()83 fn seq_struct_default_init() {
84     #[derive(Debug, PartialEq, Default)]
85     struct Point {
86         x: u32,
87         y: u32,
88         z: u32,
89     }
90 
91     fn parser(input: &mut &str) -> PResult<Point> {
92         seq! {
93             Point {
94                 x: dec_uint,
95                 _: ',',
96                 y: dec_uint,
97                 ..Default::default()
98             }
99         }
100         .parse_next(input)
101     }
102     assert_eq!(
103         parser.parse_peek("123,4 remaining"),
104         Ok((" remaining", Point { x: 123, y: 4, z: 0 },)),
105     );
106     assert_eq!(
107         parser.parse_peek("123, remaining"),
108         Err(ErrMode::Backtrack(ParserError::from_error_kind(
109             &" remaining",
110             ErrorKind::Fail
111         )))
112     );
113     assert_eq!(
114         parser.parse_peek(""),
115         Err(ErrMode::Backtrack(ParserError::from_error_kind(
116             &"",
117             ErrorKind::Fail
118         )))
119     );
120 }
121 
122 #[test]
seq_struct_trailing_comma_elided()123 fn seq_struct_trailing_comma_elided() {
124     #![allow(dead_code)]
125 
126     #[derive(Debug, PartialEq)]
127     struct Point {
128         x: u32,
129         y: u32,
130     }
131 
132     fn parser(input: &mut &str) -> PResult<Point> {
133         seq! {
134             Point {
135                 x: dec_uint,
136                 _: ',',
137                 y: dec_uint,
138                 _: empty,
139             }
140         }
141         .parse_next(input)
142     }
143 }
144 
145 #[test]
seq_struct_no_trailing_comma()146 fn seq_struct_no_trailing_comma() {
147     #![allow(dead_code)]
148 
149     #[derive(Debug, PartialEq)]
150     struct Point {
151         x: u32,
152         y: u32,
153     }
154 
155     fn parser(input: &mut &str) -> PResult<Point> {
156         seq! {
157             Point {
158                 x: dec_uint,
159                 _: ',',
160                 y: dec_uint
161             }
162         }
163         .parse_next(input)
164     }
165 }
166 
167 #[test]
seq_struct_no_trailing_comma_elided()168 fn seq_struct_no_trailing_comma_elided() {
169     #![allow(dead_code)]
170 
171     #[derive(Debug, PartialEq)]
172     struct Point {
173         x: u32,
174         y: u32,
175     }
176 
177     fn parser(input: &mut &str) -> PResult<Point> {
178         seq! {
179             Point {
180                 x: dec_uint,
181                 _: ',',
182                 y: dec_uint,
183                 _: empty
184             }
185         }
186         .parse_next(input)
187     }
188 }
189 
190 #[test]
seq_tuple_struct_basics()191 fn seq_tuple_struct_basics() {
192     #[derive(Debug, PartialEq)]
193     struct Point(u32, u32);
194 
195     fn parser(input: &mut &str) -> PResult<Point> {
196         seq! {
197             Point(
198                 dec_uint,
199                 _: ',',
200                 dec_uint,
201             )
202         }
203         .parse_next(input)
204     }
205     assert_eq!(
206         parser.parse_peek("123,4 remaining"),
207         Ok((" remaining", Point(123, 4),)),
208     );
209     assert_eq!(
210         parser.parse_peek("123, remaining"),
211         Err(ErrMode::Backtrack(ParserError::from_error_kind(
212             &" remaining",
213             ErrorKind::Fail
214         )))
215     );
216     assert_eq!(
217         parser.parse_peek(""),
218         Err(ErrMode::Backtrack(ParserError::from_error_kind(
219             &"",
220             ErrorKind::Fail
221         )))
222     );
223 }
224 
225 #[test]
seq_tuple_struct_trailing_comma_elided()226 fn seq_tuple_struct_trailing_comma_elided() {
227     #![allow(dead_code)]
228 
229     #[derive(Debug, PartialEq)]
230     struct Point(u32, u32);
231 
232     fn parser(input: &mut &str) -> PResult<Point> {
233         seq! {
234             Point(
235                 dec_uint,
236                 _: ',',
237                 dec_uint,
238                 _: empty,
239             )
240         }
241         .parse_next(input)
242     }
243 }
244 
245 #[test]
seq_tuple_struct_no_trailing_comma()246 fn seq_tuple_struct_no_trailing_comma() {
247     #![allow(dead_code)]
248 
249     #[derive(Debug, PartialEq)]
250     struct Point(u32, u32);
251 
252     fn parser(input: &mut &str) -> PResult<Point> {
253         seq! {
254             Point(
255                 dec_uint,
256                 _: ',',
257                 dec_uint
258             )
259         }
260         .parse_next(input)
261     }
262 }
263 
264 #[test]
seq_tuple_struct_no_trailing_comma_elided()265 fn seq_tuple_struct_no_trailing_comma_elided() {
266     #![allow(dead_code)]
267 
268     #[derive(Debug, PartialEq)]
269     struct Point(u32, u32);
270 
271     fn parser(input: &mut &str) -> PResult<Point> {
272         seq! {
273             Point(
274                 dec_uint,
275                 _: ',',
276                 dec_uint,
277                 _: empty
278             )
279         }
280         .parse_next(input)
281     }
282 }
283 
284 #[test]
seq_tuple_basics()285 fn seq_tuple_basics() {
286     fn parser(input: &mut &str) -> PResult<(u32, u32)> {
287         seq! {
288             (
289                 dec_uint,
290                 _: ',',
291                 dec_uint,
292             )
293         }
294         .parse_next(input)
295     }
296     assert_eq!(
297         parser.parse_peek("123,4 remaining"),
298         Ok((" remaining", (123, 4),)),
299     );
300     assert_eq!(
301         parser.parse_peek("123, remaining"),
302         Err(ErrMode::Backtrack(ParserError::from_error_kind(
303             &" remaining",
304             ErrorKind::Fail
305         )))
306     );
307     assert_eq!(
308         parser.parse_peek(""),
309         Err(ErrMode::Backtrack(ParserError::from_error_kind(
310             &"",
311             ErrorKind::Fail
312         )))
313     );
314 }
315 
316 #[test]
seq_tuple_trailing_comma_elided()317 fn seq_tuple_trailing_comma_elided() {
318     #![allow(dead_code)]
319 
320     fn parser(input: &mut &str) -> PResult<(u32, u32)> {
321         seq! {
322             (
323                 dec_uint,
324                 _: ',',
325                 dec_uint,
326                 _: empty,
327             )
328         }
329         .parse_next(input)
330     }
331 }
332 
333 #[test]
seq_tuple_no_trailing_comma()334 fn seq_tuple_no_trailing_comma() {
335     #![allow(dead_code)]
336 
337     fn parser(input: &mut &str) -> PResult<(u32, u32)> {
338         seq! {
339             (
340                 dec_uint,
341                 _: ',',
342                 dec_uint
343             )
344         }
345         .parse_next(input)
346     }
347 }
348 
349 #[test]
seq_tuple_no_trailing_comma_elided()350 fn seq_tuple_no_trailing_comma_elided() {
351     #![allow(dead_code)]
352 
353     fn parser(input: &mut &str) -> PResult<(u32, u32)> {
354         seq! {
355             (
356                 dec_uint,
357                 _: ',',
358                 dec_uint,
359                 _: empty
360             )
361         }
362         .parse_next(input)
363     }
364 }
365 
366 #[test]
seq_tuple_no_parens()367 fn seq_tuple_no_parens() {
368     #![allow(dead_code)]
369 
370     fn parser(input: &mut &str) -> PResult<(u32, u32)> {
371         seq! (
372             dec_uint,
373             _: ',',
374             dec_uint,
375         )
376         .parse_next(input)
377     }
378 }
379