Skip to content

Commit 9f00b23

Browse files
authored
Merge pull request #1624 from dtolnay/peektest
Add more extensive tests for ParseStream::peek
2 parents 1431bd6 + 990300a commit 9f00b23

File tree

1 file changed

+170
-9
lines changed

1 file changed

+170
-9
lines changed

tests/test_parse_stream.rs

Lines changed: 170 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,175 @@
1-
#![allow(clippy::let_underscore_untyped)]
1+
#![allow(clippy::items_after_statements, clippy::let_underscore_untyped)]
22

3+
use proc_macro2::{Delimiter, Group, Punct, Spacing, Span, TokenStream, TokenTree};
4+
use quote::quote;
35
use syn::ext::IdentExt as _;
4-
use syn::parse::ParseStream;
5-
use syn::{Ident, Token};
6+
use syn::parse::{ParseStream, Parser as _, Result};
7+
use syn::{parenthesized, token, Ident, Lifetime, Token};
68

79
#[test]
8-
fn test_peek() {
9-
let _ = |input: ParseStream| {
10-
let _ = input.peek(Ident);
11-
let _ = input.peek(Ident::peek_any);
12-
let _ = input.peek(Token![::]);
13-
};
10+
fn test_peek_punct() {
11+
let tokens = quote!(+= + =);
12+
13+
fn assert(input: ParseStream) -> Result<()> {
14+
assert!(input.peek(Token![+]));
15+
assert!(input.peek(Token![+=]));
16+
17+
let _: Token![+] = input.parse()?;
18+
19+
assert!(input.peek(Token![=]));
20+
assert!(!input.peek(Token![==]));
21+
assert!(!input.peek(Token![+]));
22+
23+
let _: Token![=] = input.parse()?;
24+
25+
assert!(input.peek(Token![+]));
26+
assert!(!input.peek(Token![+=]));
27+
28+
let _: Token![+] = input.parse()?;
29+
let _: Token![=] = input.parse()?;
30+
Ok(())
31+
}
32+
33+
assert.parse2(tokens).unwrap();
34+
}
35+
36+
#[test]
37+
fn test_peek_lifetime() {
38+
// 'static ;
39+
let tokens = TokenStream::from_iter([
40+
TokenTree::Punct(Punct::new('\'', Spacing::Joint)),
41+
TokenTree::Ident(Ident::new("static", Span::call_site())),
42+
TokenTree::Punct(Punct::new(';', Spacing::Alone)),
43+
]);
44+
45+
fn assert(input: ParseStream) -> Result<()> {
46+
assert!(input.peek(Lifetime));
47+
assert!(input.peek2(Token![;]));
48+
assert!(!input.peek2(Token![static]));
49+
50+
let _: Lifetime = input.parse()?;
51+
52+
assert!(input.peek(Token![;]));
53+
54+
let _: Token![;] = input.parse()?;
55+
Ok(())
56+
}
57+
58+
assert.parse2(tokens).unwrap();
59+
}
60+
61+
#[test]
62+
fn test_peek_not_lifetime() {
63+
// ' static
64+
let tokens = TokenStream::from_iter([
65+
TokenTree::Punct(Punct::new('\'', Spacing::Alone)),
66+
TokenTree::Ident(Ident::new("static", Span::call_site())),
67+
]);
68+
69+
fn assert(input: ParseStream) -> Result<()> {
70+
assert!(!input.peek(Lifetime));
71+
assert!(input.parse::<Option<Punct>>()?.is_none());
72+
73+
let _: TokenTree = input.parse()?;
74+
75+
assert!(input.peek(Token![static]));
76+
77+
let _: Token![static] = input.parse()?;
78+
Ok(())
79+
}
80+
81+
assert.parse2(tokens).unwrap();
82+
}
83+
84+
#[test]
85+
fn test_peek_ident() {
86+
let tokens = quote!(static var);
87+
88+
fn assert(input: ParseStream) -> Result<()> {
89+
assert!(!input.peek(Ident));
90+
assert!(input.peek(Ident::peek_any));
91+
assert!(input.peek(Token![static]));
92+
93+
let _: Token![static] = input.parse()?;
94+
95+
assert!(input.peek(Ident));
96+
assert!(input.peek(Ident::peek_any));
97+
98+
let _: Ident = input.parse()?;
99+
Ok(())
100+
}
101+
102+
assert.parse2(tokens).unwrap();
103+
}
104+
105+
#[test]
106+
fn test_peek_groups() {
107+
// pub ( :: ) «∅ ! = ∅» static
108+
let tokens = TokenStream::from_iter([
109+
TokenTree::Ident(Ident::new("pub", Span::call_site())),
110+
TokenTree::Group(Group::new(
111+
Delimiter::Parenthesis,
112+
TokenStream::from_iter([
113+
TokenTree::Punct(Punct::new(':', Spacing::Joint)),
114+
TokenTree::Punct(Punct::new(':', Spacing::Alone)),
115+
]),
116+
)),
117+
TokenTree::Group(Group::new(
118+
Delimiter::None,
119+
TokenStream::from_iter([
120+
TokenTree::Punct(Punct::new('!', Spacing::Alone)),
121+
TokenTree::Punct(Punct::new('=', Spacing::Alone)),
122+
]),
123+
)),
124+
TokenTree::Ident(Ident::new("static", Span::call_site())),
125+
]);
126+
127+
fn assert(input: ParseStream) -> Result<()> {
128+
assert!(input.peek2(token::Paren));
129+
assert!(input.peek3(token::Group));
130+
assert!(input.peek3(Token![!]));
131+
132+
let _: Token![pub] = input.parse()?;
133+
134+
assert!(input.peek(token::Paren));
135+
assert!(!input.peek(Token![::]));
136+
assert!(!input.peek2(Token![::]));
137+
assert!(input.peek2(Token![!]));
138+
assert!(input.peek2(token::Group));
139+
assert!(!input.peek3(Token![=])); // FIXME
140+
assert!(input.peek3(Token![static])); // FIXME
141+
142+
let content;
143+
parenthesized!(content in input);
144+
145+
assert!(content.peek(Token![::]));
146+
assert!(content.peek2(Token![:]));
147+
assert!(!content.peek3(token::Group));
148+
assert!(!content.peek3(Token![!]));
149+
150+
assert!(input.peek(token::Group));
151+
assert!(input.peek(Token![!]));
152+
153+
let _: Token![::] = content.parse()?;
154+
155+
assert!(input.peek(token::Group));
156+
assert!(input.peek(Token![!]));
157+
assert!(input.peek2(Token![=]));
158+
assert!(!input.peek3(Token![static])); // FIXME
159+
assert!(input.peek2(Token![static])); // FIXME
160+
161+
let _: Token![!] = input.parse()?;
162+
163+
assert!(input.peek(Token![=]));
164+
assert!(input.peek2(Token![static]));
165+
166+
let _: Token![=] = input.parse()?;
167+
168+
assert!(input.peek(Token![static]));
169+
170+
let _: Token![static] = input.parse()?;
171+
Ok(())
172+
}
173+
174+
assert.parse2(tokens).unwrap();
14175
}

0 commit comments

Comments
 (0)