summaryrefslogtreecommitdiffstats
path: root/third_party/rust/nom/tests/issues.rs
diff options
context:
space:
mode:
Diffstat (limited to 'third_party/rust/nom/tests/issues.rs')
-rw-r--r--third_party/rust/nom/tests/issues.rs242
1 files changed, 242 insertions, 0 deletions
diff --git a/third_party/rust/nom/tests/issues.rs b/third_party/rust/nom/tests/issues.rs
new file mode 100644
index 0000000000..7985702f67
--- /dev/null
+++ b/third_party/rust/nom/tests/issues.rs
@@ -0,0 +1,242 @@
+//#![feature(trace_macros)]
+#![allow(dead_code)]
+#![cfg_attr(feature = "cargo-clippy", allow(redundant_closure))]
+
+use nom::{error::ErrorKind, Err, IResult, Needed};
+
+#[allow(dead_code)]
+struct Range {
+ start: char,
+ end: char,
+}
+
+pub fn take_char(input: &[u8]) -> IResult<&[u8], char> {
+ if !input.is_empty() {
+ Ok((&input[1..], input[0] as char))
+ } else {
+ Err(Err::Incomplete(Needed::new(1)))
+ }
+}
+
+#[cfg(feature = "std")]
+mod parse_int {
+ use nom::HexDisplay;
+ use nom::{
+ character::streaming::{digit1 as digit, space1 as space},
+ combinator::{complete, map, opt},
+ multi::many0,
+ IResult,
+ };
+ use std::str;
+
+ fn parse_ints(input: &[u8]) -> IResult<&[u8], Vec<i32>> {
+ many0(spaces_or_int)(input)
+ }
+
+ fn spaces_or_int(input: &[u8]) -> IResult<&[u8], i32> {
+ println!("{}", input.to_hex(8));
+ let (i, _) = opt(complete(space))(input)?;
+ let (i, res) = map(complete(digit), |x| {
+ println!("x: {:?}", x);
+ let result = str::from_utf8(x).unwrap();
+ println!("Result: {}", result);
+ println!("int is empty?: {}", x.is_empty());
+ match result.parse() {
+ Ok(i) => i,
+ Err(e) => panic!("UH OH! NOT A DIGIT! {:?}", e),
+ }
+ })(i)?;
+
+ Ok((i, res))
+ }
+
+ #[test]
+ fn issue_142() {
+ let subject = parse_ints(&b"12 34 5689a"[..]);
+ let expected = Ok((&b"a"[..], vec![12, 34, 5689]));
+ assert_eq!(subject, expected);
+
+ let subject = parse_ints(&b"12 34 5689 "[..]);
+ let expected = Ok((&b" "[..], vec![12, 34, 5689]));
+ assert_eq!(subject, expected)
+ }
+}
+
+#[test]
+fn usize_length_bytes_issue() {
+ use nom::multi::length_data;
+ use nom::number::streaming::be_u16;
+ let _: IResult<&[u8], &[u8], (&[u8], ErrorKind)> = length_data(be_u16)(b"012346");
+}
+
+#[test]
+fn take_till_issue() {
+ use nom::bytes::streaming::take_till;
+
+ fn nothing(i: &[u8]) -> IResult<&[u8], &[u8]> {
+ take_till(|_| true)(i)
+ }
+
+ assert_eq!(nothing(b""), Err(Err::Incomplete(Needed::new(1))));
+ assert_eq!(nothing(b"abc"), Ok((&b"abc"[..], &b""[..])));
+}
+
+#[test]
+fn issue_655() {
+ use nom::character::streaming::{line_ending, not_line_ending};
+ fn twolines(i: &str) -> IResult<&str, (&str, &str)> {
+ let (i, l1) = not_line_ending(i)?;
+ let (i, _) = line_ending(i)?;
+ let (i, l2) = not_line_ending(i)?;
+ let (i, _) = line_ending(i)?;
+
+ Ok((i, (l1, l2)))
+ }
+
+ assert_eq!(twolines("foo\nbar\n"), Ok(("", ("foo", "bar"))));
+ assert_eq!(twolines("féo\nbar\n"), Ok(("", ("féo", "bar"))));
+ assert_eq!(twolines("foé\nbar\n"), Ok(("", ("foé", "bar"))));
+ assert_eq!(twolines("foé\r\nbar\n"), Ok(("", ("foé", "bar"))));
+}
+
+#[cfg(feature = "alloc")]
+fn issue_717(i: &[u8]) -> IResult<&[u8], Vec<&[u8]>> {
+ use nom::bytes::complete::{is_not, tag};
+ use nom::multi::separated_list0;
+
+ separated_list0(tag([0x0]), is_not([0x0u8]))(i)
+}
+
+mod issue_647 {
+ use nom::bytes::streaming::tag;
+ use nom::combinator::complete;
+ use nom::multi::separated_list0;
+ use nom::{error::Error, number::streaming::be_f64, Err, IResult};
+ pub type Input<'a> = &'a [u8];
+
+ #[derive(PartialEq, Debug, Clone)]
+ struct Data {
+ c: f64,
+ v: Vec<f64>,
+ }
+
+ fn list<'a, 'b>(
+ input: Input<'a>,
+ _cs: &'b f64,
+ ) -> Result<(Input<'a>, Vec<f64>), Err<Error<&'a [u8]>>> {
+ separated_list0(complete(tag(",")), complete(be_f64))(input)
+ }
+
+ fn data(input: Input<'_>) -> IResult<Input<'_>, Data> {
+ let (i, c) = be_f64(input)?;
+ let (i, _) = tag("\n")(i)?;
+ let (i, v) = list(i, &c)?;
+ Ok((i, Data { c, v }))
+ }
+}
+
+#[test]
+fn issue_848_overflow_incomplete_bits_to_bytes() {
+ fn take(i: &[u8]) -> IResult<&[u8], &[u8]> {
+ use nom::bytes::streaming::take;
+ take(0x2000000000000000_usize)(i)
+ }
+ fn parser(i: &[u8]) -> IResult<&[u8], &[u8]> {
+ use nom::bits::{bits, bytes};
+
+ bits(bytes(take))(i)
+ }
+ assert_eq!(
+ parser(&b""[..]),
+ Err(Err::Failure(nom::error_position!(
+ &b""[..],
+ ErrorKind::TooLarge
+ )))
+ );
+}
+
+#[test]
+fn issue_942() {
+ use nom::error::{ContextError, ParseError};
+ pub fn parser<'a, E: ParseError<&'a str> + ContextError<&'a str>>(
+ i: &'a str,
+ ) -> IResult<&'a str, usize, E> {
+ use nom::{character::complete::char, error::context, multi::many0_count};
+ many0_count(context("char_a", char('a')))(i)
+ }
+ assert_eq!(parser::<()>("aaa"), Ok(("", 3)));
+}
+
+#[test]
+fn issue_many_m_n_with_zeros() {
+ use nom::character::complete::char;
+ use nom::multi::many_m_n;
+ let mut parser = many_m_n::<_, _, (), _>(0, 0, char('a'));
+ assert_eq!(parser("aaa"), Ok(("aaa", vec![])));
+}
+
+#[test]
+fn issue_1027_convert_error_panic_nonempty() {
+ use nom::character::complete::char;
+ use nom::error::{convert_error, VerboseError};
+ use nom::sequence::pair;
+
+ let input = "a";
+
+ let result: IResult<_, _, VerboseError<&str>> = pair(char('a'), char('b'))(input);
+ let err = match result.unwrap_err() {
+ Err::Error(e) => e,
+ _ => unreachable!(),
+ };
+
+ let msg = convert_error(input, err);
+ assert_eq!(
+ msg,
+ "0: at line 1:\na\n ^\nexpected \'b\', got end of input\n\n"
+ );
+}
+
+#[test]
+fn issue_1231_bits_expect_fn_closure() {
+ use nom::bits::{bits, complete::take};
+ use nom::error::Error;
+ use nom::sequence::tuple;
+ pub fn example(input: &[u8]) -> IResult<&[u8], (u8, u8)> {
+ bits::<_, _, Error<_>, _, _>(tuple((take(1usize), take(1usize))))(input)
+ }
+ assert_eq!(example(&[0xff]), Ok((&b""[..], (1, 1))));
+}
+
+#[test]
+fn issue_1282_findtoken_char() {
+ use nom::character::complete::one_of;
+ use nom::error::Error;
+ let parser = one_of::<_, _, Error<_>>(&['a', 'b', 'c'][..]);
+ assert_eq!(parser("aaa"), Ok(("aa", 'a')));
+}
+
+#[test]
+fn issue_1459_clamp_capacity() {
+ use nom::character::complete::char;
+
+ // shouldn't panic
+ use nom::multi::many_m_n;
+ let mut parser = many_m_n::<_, _, (), _>(usize::MAX, usize::MAX, char('a'));
+ assert_eq!(parser("a"), Err(nom::Err::Error(())));
+
+ // shouldn't panic
+ use nom::multi::count;
+ let mut parser = count::<_, _, (), _>(char('a'), usize::MAX);
+ assert_eq!(parser("a"), Err(nom::Err::Error(())));
+}
+
+#[test]
+fn issue_1617_count_parser_returning_zero_size() {
+ use nom::{bytes::complete::tag, combinator::map, error::Error, multi::count};
+
+ // previously, `count()` panicked if the parser had type `O = ()`
+ let parser = map(tag::<_, _, Error<&str>>("abc"), |_| ());
+ // shouldn't panic
+ let result = count(parser, 3)("abcabcabcdef").expect("parsing should succeed");
+ assert_eq!(result, ("def", vec![(), (), ()]));
+}