Skip to content

Commit cf21b58

Browse files
committed
Move test into async_await_macros, handle malformed input more cleanly
1 parent 55c10f3 commit cf21b58

File tree

4 files changed

+45
-42
lines changed

4 files changed

+45
-42
lines changed

futures-macro/src/lib.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -60,5 +60,5 @@ pub fn test_internal(input: TokenStream, item: TokenStream) -> TokenStream {
6060
#[cfg_attr(fn_like_proc_macro, proc_macro)]
6161
#[cfg_attr(not(fn_like_proc_macro), proc_macro_hack::proc_macro_hack)]
6262
pub fn stream_select_internal(input: TokenStream) -> TokenStream {
63-
crate::stream_select::stream_select(input)
63+
crate::stream_select::stream_select(input.into()).unwrap_or_else(syn::Error::into_compile_error).into()
6464
}

futures-macro/src/stream_select.rs

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,18 @@
1-
use proc_macro::TokenStream;
1+
use proc_macro2::TokenStream;
22
use quote::{format_ident, quote, ToTokens};
33
use syn::{parse::Parser, punctuated::Punctuated, Expr, Index, Token};
44

55
/// The `stream_select!` macro.
6-
pub(crate) fn stream_select(input: TokenStream) -> TokenStream {
6+
pub(crate) fn stream_select(input: TokenStream) -> Result<TokenStream, syn::Error> {
77
let args = Punctuated::<Expr, Token![,]>::parse_terminated
8-
.parse(input)
9-
.expect("macro expects a comma separated list of expressions");
8+
.parse2(input)?;
109
let generic_idents = (0..args.len()).map(|i| format_ident!("_{}", i)).collect::<Vec<_>>();
1110
let field_idents = (0..args.len()).map(|i| format_ident!("__{}", i)).collect::<Vec<_>>();
1211
let field_idents_2 = (0..args.len()).map(|i| format_ident!("___{}", i)).collect::<Vec<_>>();
1312
let field_indices = (0..args.len()).map(Index::from).collect::<Vec<_>>();
1413
let args = args.iter().map(|e| e.to_token_stream());
1514

16-
TokenStream::from(quote! {
15+
Ok(TokenStream::from(quote! {
1716
{
1817
#[derive(Debug)]
1918
struct StreamSelect<#(#generic_idents),*> (#(Option<#generic_idents>),*);
@@ -106,5 +105,5 @@ pub(crate) fn stream_select(input: TokenStream) -> TokenStream {
106105
StreamSelect(#(Some(#args)),*)
107106

108107
}
109-
})
108+
}))
110109
}

futures/tests/async_await_macros.rs

Lines changed: 38 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ use futures::future::{self, poll_fn, FutureExt};
44
use futures::sink::SinkExt;
55
use futures::stream::StreamExt;
66
use futures::task::{Context, Poll};
7-
use futures::{join, pending, pin_mut, poll, select, select_biased, try_join};
7+
use futures::{join, pending, pin_mut, poll, select, select_biased, stream, stream_select, try_join};
88
use std::mem;
99

1010
#[test]
@@ -308,6 +308,43 @@ fn select_on_mutable_borrowing_future_with_same_borrow_in_block_and_default() {
308308
});
309309
}
310310

311+
#[test]
312+
#[allow(unused_assignments)]
313+
fn stream_select() {
314+
// stream_select! macro
315+
block_on(async {
316+
let endless_ints = |i| stream::iter(vec![i].into_iter().cycle());
317+
318+
let mut endless_ones = stream_select!(endless_ints(1i32), stream::pending());
319+
assert_eq!(endless_ones.next().await, Some(1));
320+
assert_eq!(endless_ones.next().await, Some(1));
321+
322+
let mut finite_list = stream_select!(stream::iter(vec![1, 2, 3].into_iter()));
323+
assert_eq!(finite_list.next().await, Some(1));
324+
assert_eq!(finite_list.next().await, Some(2));
325+
assert_eq!(finite_list.next().await, Some(3));
326+
assert_eq!(finite_list.next().await, None);
327+
328+
let endless_mixed =
329+
stream_select!(endless_ints(1i32), endless_ints(2), endless_ints(3));
330+
// Take 100, and assert a somewhat even distribution of values.
331+
// The fairness is randomized, but over 100 samples we should be pretty close to even.
332+
// This test may be a bit flaky. Feel free to adjust the margins as you see fit.
333+
let mut count = 0;
334+
let results = endless_mixed
335+
.take_while(move |_| {
336+
count += 1;
337+
let ret = count < 100;
338+
async move { ret }
339+
})
340+
.collect::<Vec<_>>()
341+
.await;
342+
assert!(results.iter().filter(|x| **x == 1).count() >= 29);
343+
assert!(results.iter().filter(|x| **x == 2).count() >= 29);
344+
assert!(results.iter().filter(|x| **x == 3).count() >= 29);
345+
});
346+
}
347+
311348
#[test]
312349
fn join_size() {
313350
let fut = async {

futures/tests/macro-tests/src/main.rs

Lines changed: 1 addition & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
// Check that it works even if proc-macros are reexported.
22

33
fn main() {
4-
use futures04::{executor::block_on, future, stream, StreamExt};
4+
use futures04::{executor::block_on, future};
55

66
// join! macro
77
let _ = block_on(async {
@@ -65,37 +65,4 @@ fn main() {
6565
_ = b => unreachable!(),
6666
};
6767
});
68-
69-
// stream_select! macro
70-
let _ = block_on(async {
71-
let endless_ints = |i| stream::iter(vec![i].into_iter().cycle());
72-
73-
let mut endless_ones = futures04::stream_select!(endless_ints(1i32), stream::pending());
74-
assert_eq!(endless_ones.next().await, Some(1));
75-
assert_eq!(endless_ones.next().await, Some(1));
76-
77-
let mut finite_list = futures04::stream_select!(stream::iter(vec![1, 2, 3].into_iter()));
78-
assert_eq!(finite_list.next().await, Some(1));
79-
assert_eq!(finite_list.next().await, Some(2));
80-
assert_eq!(finite_list.next().await, Some(3));
81-
assert_eq!(finite_list.next().await, None);
82-
83-
let endless_mixed =
84-
futures04::stream_select!(endless_ints(1i32), endless_ints(2), endless_ints(3));
85-
// Take 100, and assert a somewhat even distribution of values.
86-
// The fairness is randomized, but over 100 samples we should be pretty close to even.
87-
// This test may be a bit flaky. Feel free to adjust the margins as you see fit.
88-
let mut count = 0;
89-
let results = endless_mixed
90-
.take_while(move |_| {
91-
count += 1;
92-
let ret = count < 100;
93-
async move { ret }
94-
})
95-
.collect::<Vec<_>>()
96-
.await;
97-
assert!(results.iter().filter(|x| **x == 1).count() >= 29);
98-
assert!(results.iter().filter(|x| **x == 2).count() >= 29);
99-
assert!(results.iter().filter(|x| **x == 3).count() >= 29);
100-
});
10168
}

0 commit comments

Comments
 (0)