3 use expect_test
::{expect, Expect}
;
5 fn check_raw_str(s
: &str, expected_hashes
: u16, expected_err
: Option
<RawStrError
>) {
6 let s
= &format
!("r{}", s
);
7 let mut cursor
= Cursor
::new(s
);
9 let (n_hashes
, err
) = cursor
.raw_double_quoted_string(0);
10 assert_eq
!(n_hashes
, expected_hashes
);
11 assert_eq
!(err
, expected_err
);
15 fn test_naked_raw_str() {
16 check_raw_str(r
#""abc""#, 0, None);
20 fn test_raw_no_start() {
21 check_raw_str(r
##""abc"#"##, 0, None);
25 fn test_too_many_terminators() {
26 // this error is handled in the parser later
27 check_raw_str(r
###"#"abc"##"###, 1, None);
31 fn test_unterminated() {
35 Some(RawStrError::NoTerminator { expected: 1, found: 0, possible_terminator_offset: None }),
40 Some(RawStrError::NoTerminator {
43 possible_terminator_offset: Some(7),
46 // We're looking for "# not just any #
50 Some(RawStrError::NoTerminator { expected: 2, found: 0, possible_terminator_offset: None }),
55 fn test_invalid_start() {
56 check_raw_str(r##"#~"abc"#"##, 1, Some(RawStrError::InvalidStarter { bad_char: '~' }));
60 fn test_unterminated_no_pound() {
61 // https://github.com/rust-lang/rust/issues/70677
65 Some(RawStrError
::NoTerminator { expected: 0, found: 0, possible_terminator_offset: None }
),
70 fn test_valid_shebang() {
71 // https://github.com/rust-lang/rust/issues/70528
72 let input
= "#!/usr/bin/rustrun\nlet x = 5;";
73 assert_eq
!(strip_shebang(input
), Some(18));
77 fn test_invalid_shebang_valid_rust_syntax() {
78 // https://github.com/rust-lang/rust/issues/70528
79 let input
= "#! [bad_attribute]";
80 assert_eq
!(strip_shebang(input
), None
);
84 fn test_shebang_second_line() {
85 // Because shebangs are interpreted by the kernel, they must be on the first line
86 let input
= "\n#!/bin/bash";
87 assert_eq
!(strip_shebang(input
), None
);
91 fn test_shebang_space() {
92 let input
= "#! /bin/bash";
93 assert_eq
!(strip_shebang(input
), Some(input
.len()));
97 fn test_shebang_empty_shebang() {
98 let input
= "#! \n[attribute(foo)]";
99 assert_eq
!(strip_shebang(input
), None
);
103 fn test_invalid_shebang_comment() {
104 let input
= "#!//bin/ami/a/comment\n[";
105 assert_eq
!(strip_shebang(input
), None
)
109 fn test_invalid_shebang_another_comment() {
110 let input
= "#!/*bin/ami/a/comment*/\n[attribute";
111 assert_eq
!(strip_shebang(input
), None
)
115 fn test_shebang_valid_rust_after() {
116 let input
= "#!/*bin/ami/a/comment*/\npub fn main() {}";
117 assert_eq
!(strip_shebang(input
), Some(23))
121 fn test_shebang_followed_by_attrib() {
122 let input
= "#!/bin/rust-scripts\n#![allow_unused(true)]";
123 assert_eq
!(strip_shebang(input
), Some(19));
126 fn check_lexing(src
: &str, expect
: Expect
) {
127 let actual
: String
= tokenize(src
).map(|token
| format
!("{:?}\n", token
)).collect();
128 expect
.assert_eq(&actual
)
132 fn comment_flavors() {
142 /** outer doc block */
143 /*! inner doc block */
146 Token { kind: Whitespace, len: 1 }
147 Token { kind: LineComment { doc_style: None }, len: 7 }
148 Token { kind: Whitespace, len: 1 }
149 Token { kind: LineComment { doc_style: None }, len: 17 }
150 Token { kind: Whitespace, len: 1 }
151 Token { kind: LineComment { doc_style: Some(Outer) }, len: 18 }
152 Token { kind: Whitespace, len: 1 }
153 Token { kind: LineComment { doc_style: Some(Inner) }, len: 18 }
154 Token { kind: Whitespace, len: 1 }
155 Token { kind: BlockComment { doc_style: None, terminated: true }, len: 11 }
156 Token { kind: Whitespace, len: 1 }
157 Token { kind: BlockComment { doc_style: None, terminated: true }, len: 4 }
158 Token { kind: Whitespace, len: 1 }
159 Token { kind: BlockComment { doc_style: None, terminated: true }, len: 18 }
160 Token { kind: Whitespace, len: 1 }
161 Token { kind: BlockComment { doc_style: Some(Outer), terminated: true }, len: 22 }
162 Token { kind: Whitespace, len: 1 }
163 Token { kind: BlockComment { doc_style: Some(Inner), terminated: true }, len: 22 }
164 Token { kind: Whitespace, len: 1 }