third_party_rust_nom/tests/issues.rs

212 lines
5.0 KiB
Rust
Raw Normal View History

//#![feature(trace_macros)]
2017-06-16 12:34:49 +00:00
#![allow(dead_code)]
2017-12-10 13:03:25 +00:00
#![cfg_attr(feature = "cargo-clippy", allow(redundant_closure))]
2017-06-16 12:34:49 +00:00
use nom::{error::ErrorKind, Err, IResult, Needed};
2015-08-04 07:07:55 +00:00
#[allow(dead_code)]
struct Range {
start: char,
end: char,
2015-08-04 07:07:55 +00:00
}
pub fn take_char(input: &[u8]) -> IResult<&[u8], char> {
2017-12-10 13:03:25 +00:00
if !input.is_empty() {
Ok((&input[1..], input[0] as char))
2015-08-04 07:07:55 +00:00
} else {
Err(Err::Incomplete(Needed::new(1)))
2015-08-04 07:07:55 +00:00
}
}
#[cfg(feature = "std")]
mod parse_int {
use nom::HexDisplay;
2020-04-10 09:01:58 +00:00
use nom::{
character::streaming::{digit1 as digit, space1 as space},
IResult,
};
use std::str;
2018-02-17 14:06:43 +00:00
named!(parse_ints<Vec<i32>>, many0!(spaces_or_int));
2017-12-10 17:39:11 +00:00
fn spaces_or_int(input: &[u8]) -> IResult<&[u8], i32> {
println!("{}", input.to_hex(8));
2018-02-17 14:06:43 +00:00
do_parse!(
input,
2020-04-10 09:01:58 +00:00
opt!(complete!(space))
>> 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),
}
})
>> (res)
)
}
#[test]
2017-12-10 17:39:11 +00:00
fn issue_142() {
let subject = parse_ints(&b"12 34 5689a"[..]);
let expected = Ok((&b"a"[..], vec![12, 34, 5689]));
2017-12-10 17:39:11 +00:00
assert_eq!(subject, expected);
let subject = parse_ints(&b"12 34 5689 "[..]);
let expected = Ok((&b" "[..], vec![12, 34, 5689]));
assert_eq!(subject, expected)
}
}
2016-03-28 08:07:03 +00:00
#[test]
2017-12-10 17:39:11 +00:00
fn usize_length_bytes_issue() {
2019-04-15 14:53:57 +00:00
use nom::number::streaming::be_u16;
2019-05-06 13:48:56 +00:00
let _: IResult<&[u8], &[u8], (&[u8], ErrorKind)> = length_data!(b"012346", be_u16);
2016-03-28 08:07:03 +00:00
}
/*
DOES NOT COMPILE
#[test]
fn issue_152() {
named!(take4, take!(4));
named!(xyz, tag!("XYZ"));
named!(abc, tag!("abc"));
named!(sw,
switch!(take4,
b"abcd" => xyz |
b"efgh" => abc
)
);
}
*/
#[test]
fn take_till_issue() {
2018-02-17 14:06:43 +00:00
named!(nothing, take_till!(call!(|_| true)));
assert_eq!(nothing(b""), Err(Err::Incomplete(Needed::new(1))));
2017-12-10 17:39:11 +00:00
assert_eq!(nothing(b"abc"), Ok((&b"abc"[..], &b""[..])));
}
2018-01-15 11:07:51 +00:00
#[test]
fn issue_655() {
2019-04-15 14:53:57 +00:00
use nom::character::streaming::{line_ending, not_line_ending};
2018-01-15 11:07:51 +00:00
named!(twolines(&str) -> (&str, &str),
do_parse!(
l1 : not_line_ending >>
line_ending >>
l2 : not_line_ending >>
line_ending >>
((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"))));
}
2018-01-24 15:36:09 +00:00
#[cfg(feature = "alloc")]
2018-03-26 09:09:58 +00:00
named!(issue_717<&[u8], Vec<&[u8]> >,
separated_list0!(tag!([0x0]), is_not!([0x0u8]))
2018-03-26 09:09:58 +00:00
);
2018-08-18 16:04:45 +00:00
mod issue_647 {
use nom::{error::Error, number::streaming::be_f64, Err};
2018-08-18 16:04:45 +00:00
pub type Input<'a> = &'a [u8];
#[derive(PartialEq, Debug, Clone)]
struct Data {
2020-04-10 09:01:58 +00:00
c: f64,
v: Vec<f64>,
2018-08-18 16:04:45 +00:00
}
2020-04-10 09:01:58 +00:00
fn list<'a, 'b>(
input: Input<'a>,
_cs: &'b f64,
) -> Result<(Input<'a>, Vec<f64>), Err<Error<&'a [u8]>>> {
separated_list0!(input, complete!(tag!(",")), complete!(be_f64))
2018-08-18 16:04:45 +00:00
}
named!(data<Input,Data>, map!(
do_parse!(
c: be_f64 >>
tag!("\n") >>
v: call!(list,&c) >>
(c,v)
), |(c,v)| {
Data {
c: c,
v: v
}
}
));
}
#[test]
fn issue_848_overflow_incomplete_bits_to_bytes() {
2019-06-17 14:12:06 +00:00
named!(take, take!(0x2000000000000000));
named!(parser<&[u8], &[u8]>, bits!(bytes!(take)));
2020-04-10 09:01:58 +00:00
assert_eq!(
parser(&b""[..]),
Err(Err::Failure(error_position!(&b""[..], ErrorKind::TooLarge)))
);
}
#[test]
fn issue_942() {
2020-10-24 13:19:14 +00:00
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)));
}
2019-07-16 13:48:45 +00:00
#[test]
fn issue_many_m_n_with_zeros() {
2020-04-10 09:01:58 +00:00
use nom::character::complete::char;
use nom::multi::many_m_n;
let mut parser = many_m_n::<_, _, (), _>(0, 0, char('a'));
2020-04-10 09:01:58 +00:00
assert_eq!(parser("aaa"), Ok(("aaa", vec!())));
2019-07-16 13:48:45 +00:00
}
2019-09-13 20:46:29 +00:00
#[test]
fn issue_1027_convert_error_panic_nonempty() {
use nom::character::complete::char;
2020-04-10 09:01:58 +00:00
use nom::error::{convert_error, VerboseError};
use nom::sequence::pair;
2019-09-13 20:46:29 +00:00
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);
2020-04-10 09:01:58 +00:00
assert_eq!(
msg,
"0: at line 1:\na\n ^\nexpected \'b\', got end of input\n\n"
);
2020-01-07 18:11:19 +00:00
}
#[test]
fn issue_1231_bits_expect_fn_closure() {
2020-11-24 10:29:17 +00:00
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))));
}