diff options
author | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-05-04 12:47:55 +0000 |
---|---|---|
committer | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-05-04 12:47:55 +0000 |
commit | 2aadc03ef15cb5ca5cc2af8a7c08e070742f0ac4 (patch) | |
tree | 033cc839730fda84ff08db877037977be94e5e3a /vendor/winnow/src/stream/tests.rs | |
parent | Initial commit. (diff) | |
download | cargo-2aadc03ef15cb5ca5cc2af8a7c08e070742f0ac4.tar.xz cargo-2aadc03ef15cb5ca5cc2af8a7c08e070742f0ac4.zip |
Adding upstream version 0.70.1+ds1.upstream/0.70.1+ds1upstream
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'vendor/winnow/src/stream/tests.rs')
-rw-r--r-- | vendor/winnow/src/stream/tests.rs | 131 |
1 files changed, 131 insertions, 0 deletions
diff --git a/vendor/winnow/src/stream/tests.rs b/vendor/winnow/src/stream/tests.rs new file mode 100644 index 0000000..2dbb807 --- /dev/null +++ b/vendor/winnow/src/stream/tests.rs @@ -0,0 +1,131 @@ +#[cfg(feature = "std")] +use proptest::prelude::*; + +use super::*; + +#[test] +fn test_offset_u8() { + let s = b"abcd123"; + let a = &s[..]; + let b = &a[2..]; + let c = &a[..4]; + let d = &a[3..5]; + assert_eq!(b.offset_from(&a), 2); + assert_eq!(c.offset_from(&a), 0); + assert_eq!(d.offset_from(&a), 3); +} + +#[test] +fn test_offset_str() { + let a = "abcřèÂßÇd123"; + let b = &a[7..]; + let c = &a[..5]; + let d = &a[5..9]; + assert_eq!(b.offset_from(&a), 7); + assert_eq!(c.offset_from(&a), 0); + assert_eq!(d.offset_from(&a), 5); +} + +#[test] +#[cfg(feature = "alloc")] +fn test_bit_stream_empty() { + let i = (&b""[..], 0); + + let actual = i.iter_offsets().collect::<crate::lib::std::vec::Vec<_>>(); + assert_eq!(actual, vec![]); + + let actual = i.eof_offset(); + assert_eq!(actual, 0); + + let actual = i.peek_token(); + assert_eq!(actual, None); + + let actual = i.offset_for(|b| b); + assert_eq!(actual, None); + + let actual = i.offset_at(1); + assert_eq!(actual, Err(Needed::new(1))); + + let (actual_input, actual_slice) = i.peek_slice(0); + assert_eq!(actual_input, (&b""[..], 0)); + assert_eq!(actual_slice, (&b""[..], 0, 0)); +} + +#[test] +#[cfg(feature = "alloc")] +fn test_bit_offset_empty() { + let i = (&b""[..], 0); + + let actual = i.offset_from(&i); + assert_eq!(actual, 0); +} + +#[cfg(feature = "std")] +proptest! { + #[test] + #[cfg_attr(miri, ignore)] // See https://github.com/AltSysrq/proptest/issues/253 + fn bit_stream(byte_len in 0..20usize, start in 0..160usize) { + bit_stream_inner(byte_len, start); + } +} + +#[cfg(feature = "std")] +fn bit_stream_inner(byte_len: usize, start: usize) { + let start = start.min(byte_len * 8); + let start_byte = start / 8; + let start_bit = start % 8; + + let bytes = vec![0b1010_1010; byte_len]; + let i = (&bytes[start_byte..], start_bit); + + let mut curr_i = i; + let mut curr_offset = 0; + while let Some((next_i, _token)) = curr_i.peek_token() { + let to_offset = curr_i.offset_from(&i); + assert_eq!(curr_offset, to_offset); + + let (slice_i, _) = i.peek_slice(curr_offset); + assert_eq!(curr_i, slice_i); + + let at_offset = i.offset_at(curr_offset).unwrap(); + assert_eq!(curr_offset, at_offset); + + let eof_offset = curr_i.eof_offset(); + let (next_eof_i, eof_slice) = curr_i.peek_slice(eof_offset); + assert_eq!(next_eof_i, (&b""[..], 0)); + let eof_slice_i = (eof_slice.0, eof_slice.1); + assert_eq!(eof_slice_i, curr_i); + + curr_offset += 1; + curr_i = next_i; + } + assert_eq!(i.eof_offset(), curr_offset); +} + +#[test] +fn test_partial_complete() { + let mut i = Partial::new(&b""[..]); + assert!(Partial::<&[u8]>::is_partial_supported()); + + assert!(i.is_partial(), "incomplete by default"); + let incomplete_state = i.complete(); + assert!(!i.is_partial(), "the stream should be marked as complete"); + + i.restore_partial(incomplete_state); + assert!(i.is_partial(), "incomplete stream state should be restored"); +} + +#[test] +fn test_custom_slice() { + type Token = usize; + type TokenSlice<'i> = &'i [Token]; + + let mut tokens: TokenSlice<'_> = &[1, 2, 3, 4]; + + let input = &mut tokens; + let start = input.checkpoint(); + let _ = input.next_token(); + let _ = input.next_token(); + let offset = input.offset_from(&start); + assert_eq!(offset, 2); +} |