@@ -4,19 +4,25 @@ use crate::{Literal, ByteStringLit, test_util::{assert_parse_ok_eq, assert_round
44
55macro_rules! check {
66 ( $lit: literal, $has_escapes: expr, $num_hashes: expr) => {
7- let input = stringify!( $lit) ;
7+ check!( $lit, stringify!( $lit) , $has_escapes, $num_hashes, "" )
8+ } ;
9+ ( $lit: literal, $input: expr, $has_escapes: expr, $num_hashes: expr, $suffix: literal) => {
10+ let input = $input;
811 let expected = ByteStringLit {
912 raw: input,
1013 value: if $has_escapes { Some ( $lit. to_vec( ) ) } else { None } ,
1114 num_hashes: $num_hashes,
15+ start_suffix: input. len( ) - $suffix. len( ) ,
1216 } ;
1317
1418 assert_parse_ok_eq(
1519 input, ByteStringLit :: parse( input) , expected. clone( ) , "ByteStringLit::parse" ) ;
1620 assert_parse_ok_eq(
1721 input, Literal :: parse( input) , Literal :: ByteString ( expected. clone( ) ) , "Literal::parse" ) ;
18- assert_eq!( ByteStringLit :: parse( input) . unwrap( ) . value( ) , $lit) ;
19- assert_eq!( ByteStringLit :: parse( input) . unwrap( ) . into_value( ) . as_ref( ) , $lit) ;
22+ let lit = ByteStringLit :: parse( input) . unwrap( ) ;
23+ assert_eq!( lit. value( ) , $lit) ;
24+ assert_eq!( lit. suffix( ) , $suffix) ;
25+ assert_eq!( lit. into_value( ) . as_ref( ) , $lit) ;
2026 assert_roundtrip( expected. into_owned( ) , input) ;
2127 } ;
2228}
@@ -43,6 +49,7 @@ fn special_whitespace() {
4349 raw : & * input,
4450 value : None ,
4551 num_hashes,
52+ start_suffix : input. len ( ) ,
4653 } ;
4754 assert_parse_ok_eq (
4855 & input, ByteStringLit :: parse ( & * input) , expected. clone ( ) , "ByteStringLit::parse" ) ;
@@ -147,17 +154,23 @@ fn raw_byte_string() {
147154 check ! ( br#"cat\n\t\r\0\\x60\u{123}doggo"# , false , Some ( 1 ) ) ;
148155}
149156
157+ #[ test]
158+ fn suffixes ( ) {
159+ check ! ( b"hello" , r###"b"hello"suffix"### , false , None , "suffix" ) ;
160+ check ! ( b"fox" , r#"b"fox"peter"# , false , None , "peter" ) ;
161+ check ! ( b"a\x0c b\\ " , r#"b"a\x0cb\\"_jürgen"# , true , None , "_jürgen" ) ;
162+ check ! ( br"a\x0cb\\" , r###"br#"a\x0cb\\"#_jürgen"### , false , Some ( 1 ) , "_jürgen" ) ;
163+ }
164+
150165#[ test]
151166fn parse_err ( ) {
152167 assert_err ! ( ByteStringLit , r#"b""# , UnterminatedString , None ) ;
153168 assert_err ! ( ByteStringLit , r#"b"cat"# , UnterminatedString , None ) ;
154169 assert_err ! ( ByteStringLit , r#"b"Jurgen"# , UnterminatedString , None ) ;
155170 assert_err ! ( ByteStringLit , r#"b"foo bar baz"# , UnterminatedString , None ) ;
156171
157- assert_err ! ( ByteStringLit , r#"b"fox"peter"# , UnexpectedChar , 6 ..11 ) ;
158- assert_err ! ( ByteStringLit , r#"b"fox"peter""# , UnexpectedChar , 6 ..12 ) ;
159- assert_err ! ( ByteStringLit , r#"b"fox"bar"# , UnexpectedChar , 6 ..9 ) ;
160- assert_err ! ( ByteStringLit , r###"br#"foo "# bar"#"### , UnexpectedChar , 10 ..16 ) ;
172+ assert_err ! ( ByteStringLit , r#"b"fox"peter""# , InvalidSuffix , 6 ) ;
173+ assert_err ! ( ByteStringLit , r###"br#"foo "# bar"#"### , UnexpectedChar , 10 ) ;
161174
162175 assert_err ! ( ByteStringLit , "b\" \r \" " , IsolatedCr , 2 ) ;
163176 assert_err ! ( ByteStringLit , "b\" fo\r x\" " , IsolatedCr , 4 ) ;
@@ -179,10 +192,10 @@ fn non_ascii() {
179192}
180193
181194#[ test]
182- fn invald_escapes ( ) {
195+ fn invalid_escapes ( ) {
183196 assert_err ! ( ByteStringLit , r#"b"\a""# , UnknownEscape , 2 ..4 ) ;
184197 assert_err ! ( ByteStringLit , r#"b"foo\y""# , UnknownEscape , 5 ..7 ) ;
185- assert_err ! ( ByteStringLit , r#"b"\"# , UnterminatedString , None ) ;
198+ assert_err ! ( ByteStringLit , r#"b"\"# , UnterminatedEscape , 2 ) ;
186199 assert_err ! ( ByteStringLit , r#"b"\x""# , UnterminatedEscape , 2 ..4 ) ;
187200 assert_err ! ( ByteStringLit , r#"b"foo\x1""# , UnterminatedEscape , 5 ..8 ) ;
188201 assert_err ! ( ByteStringLit , r#"b" \xaj""# , InvalidXEscape , 3 ..7 ) ;
0 commit comments