Skip to content

Commit 356e526

Browse files
committed
reforge tests and doc_tests in gen_iter_return.rs
1 parent 85724c7 commit 356e526

File tree

1 file changed

+24
-31
lines changed

1 file changed

+24
-31
lines changed

src/gen_iter_return.rs

Lines changed: 24 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,15 @@ impl<G: Generator + Unpin> GenIterReturn<G> {
3232
}
3333
}
3434

35+
/// Force use `&mut g` as iterator to prevent the code below,
36+
/// in which return value cannot be got.
37+
/// ```compile_fail
38+
/// # #![feature(generators)]
39+
/// # use gen_iter::gen_iter_return;
40+
/// let mut g = gen_iter_return!({ yield 1; return "done"; }
41+
/// for v in g {} // invalid, because `GenIterReturn<G>` is not `Iterator`
42+
/// let ret = g.return_or_self().unwrap(); // g is dropped after for
43+
/// ```
3544
impl<G: Generator + Unpin> Iterator for &mut GenIterReturn<G> {
3645
type Item = G::Yield;
3746

@@ -50,6 +59,7 @@ impl<G: Generator + Unpin> Iterator for &mut GenIterReturn<G> {
5059
}
5160
}
5261

62+
/// `GenIterReturn<G>` satisfies the trait `FusedIterator`
5363
impl<G: Generator + Unpin> FusedIterator for &mut GenIterReturn<G> {}
5464

5565
impl<G: Generator + Unpin> From<G> for GenIterReturn<G> {
@@ -60,8 +70,6 @@ impl<G: Generator + Unpin> From<G> for GenIterReturn<G> {
6070
}
6171

6272
/// macro to simplify iterator - via - generator with return value construction
63-
///
64-
/// Examples:
6573
/// ```
6674
/// #![feature(generators)]
6775
///
@@ -78,19 +86,6 @@ impl<G: Generator + Unpin> From<G> for GenIterReturn<G> {
7886
/// assert_eq!((&mut g).next(), None); // safe to call `next()` after done
7987
/// assert_eq!(g.return_or_self().ok(), Some("done")); // get return value of generator
8088
/// ```
81-
/// We should use `&mut g` in `for` statement, to keep `g` be valid after `for`, so we can get the return value.
82-
/// ```compile_fail
83-
/// #![feature(generators)]
84-
///
85-
/// use gen_iter::gen_iter_return;
86-
///
87-
/// let mut g = gen_iter_return!({
88-
/// yield 1;
89-
/// yield 2;
90-
/// return "done";
91-
/// });
92-
/// for v in g {} // compile failed, should use `&mut g`
93-
/// ```
9489
#[macro_export]
9590
macro_rules! gen_iter_return {
9691
($block: block) => {
@@ -105,57 +100,55 @@ macro_rules! gen_iter_return {
105100
mod tests {
106101
use super::GenIterReturn;
107102

103+
/// test `new` and all instance method,
104+
/// and show that it won't panic when call `next()` even exhausted.
108105
#[test]
109106
fn it_works() {
110-
let mut g = gen_iter_return!({
107+
let mut g = GenIterReturn::new(|| {
111108
yield 1;
112-
yield 2;
113109
return "done";
114110
});
115111

116112
assert_eq!((&mut g).next(), Some(1));
117113
assert_eq!(g.is_done(), false);
118-
assert_eq!((&mut g).next(), Some(2));
119-
assert_eq!(g.is_done(), false);
114+
120115
assert_eq!((&mut g).next(), None);
121116
assert_eq!(g.is_done(), true);
122-
assert_eq!((&mut g).next(), None);
117+
118+
assert_eq!((&mut g).next(), None); // it won't panic when call `next()` even exhausted.
119+
123120
assert_eq!(g.return_or_self().ok(), Some("done"));
124121
}
125122

126123
#[test]
127-
fn gen_iter_return_from() {
124+
fn test_from() {
128125
let mut g: GenIterReturn<_> = GenIterReturn::from(|| {
129126
yield 1;
130-
yield 2;
131127
return "done";
132128
});
133-
let mut gi = &mut g;
134129

135-
assert_eq!(gi.next(), Some(1));
136-
assert_eq!(gi.next(), Some(2));
137-
assert_eq!(gi.next(), None);
130+
assert_eq!((&mut g).next(), Some(1));
131+
assert_eq!((&mut g).next(), None);
138132

139133
assert_eq!(g.is_done(), true);
140134
assert_eq!(g.return_or_self().ok(), Some("done"));
141135
}
142136

137+
/// normal usage using macro `gen_iter_return`
143138
#[test]
144-
fn gen_iter_return_macro() {
139+
fn test_macro() {
145140
let mut g = gen_iter_return!({
146141
yield 1;
147142
yield 2;
148143
return "done";
149144
});
150145

151-
let mut sum = 0;
152-
let mut count = 0;
146+
let (mut sum, mut count) = (0, 0);
153147
for y in &mut g {
154148
sum += y;
155149
count += 1;
156150
}
157-
assert_eq!(sum, 3);
158-
assert_eq!(count, 2);
151+
assert_eq!((sum, count), (3, 2));
159152

160153
assert_eq!(g.is_done(), true);
161154
assert_eq!(g.return_or_self().ok(), Some("done"));

0 commit comments

Comments
 (0)