]>
git.proxmox.com Git - rustc.git/blob - vendor/rustc-rayon/src/iter/collect/test.rs
2 #![allow(unused_assignments)]
4 // These tests are primarily targeting "abusive" producers that will
5 // try to drive the "collect consumer" incorrectly. These should
9 use crate::iter
::plumbing
::*;
12 /// Promises to produce 2 items, but then produces 3. Does not do any
15 #[should_panic(expected = "too many values")]
16 fn produce_too_many_items() {
18 let mut collect
= Collect
::new(&mut v
, 2);
19 let consumer
= collect
.as_consumer();
20 let mut folder
= consumer
.into_folder();
21 folder
= folder
.consume(22);
22 folder
= folder
.consume(23);
26 /// Produces fewer items than promised. Does not do any
29 #[should_panic(expected = "expected 5 total writes, but got 2")]
30 fn produce_fewer_items() {
32 let mut collect
= Collect
::new(&mut v
, 5);
34 let consumer
= collect
.as_consumer();
35 let mut folder
= consumer
.into_folder();
36 folder
= folder
.consume(22);
37 folder
= folder
.consume(23);
43 // Complete is not called by the consumer.Hence,the collection vector is not fully initialized.
45 #[should_panic(expected = "expected 4 total writes, but got 2")]
46 fn left_produces_items_with_no_complete() {
48 let mut collect
= Collect
::new(&mut v
, 4);
50 let consumer
= collect
.as_consumer();
51 let (left_consumer
, right_consumer
, _
) = consumer
.split_at(2);
52 let mut left_folder
= left_consumer
.into_folder();
53 let mut right_folder
= right_consumer
.into_folder();
54 left_folder
= left_folder
.consume(0).consume(1);
55 right_folder
= right_folder
.consume(2).consume(3);
56 right_folder
.complete();
61 // Complete is not called by the right consumer. Hence,the
62 // collection vector is not fully initialized.
64 #[should_panic(expected = "expected 4 total writes, but got 2")]
65 fn right_produces_items_with_no_complete() {
67 let mut collect
= Collect
::new(&mut v
, 4);
69 let consumer
= collect
.as_consumer();
70 let (left_consumer
, right_consumer
, _
) = consumer
.split_at(2);
71 let mut left_folder
= left_consumer
.into_folder();
72 let mut right_folder
= right_consumer
.into_folder();
73 left_folder
= left_folder
.consume(0).consume(1);
74 right_folder
= right_folder
.consume(2).consume(3);
75 left_folder
.complete();
80 // Complete is not called by the consumer. Hence,the collection vector is not fully initialized.
82 #[should_panic(expected = "expected 2 total writes, but got 0")]
83 fn produces_items_with_no_complete() {
85 let mut collect
= Collect
::new(&mut v
, 2);
87 let consumer
= collect
.as_consumer();
88 let mut folder
= consumer
.into_folder();
89 folder
= folder
.consume(22);
90 folder
= folder
.consume(23);
95 // The left consumer produces too many items while the right
96 // consumer produces correct number.
98 #[should_panic(expected = "too many values")]
99 fn left_produces_too_many_items() {
101 let mut collect
= Collect
::new(&mut v
, 4);
103 let consumer
= collect
.as_consumer();
104 let (left_consumer
, right_consumer
, _
) = consumer
.split_at(2);
105 let mut left_folder
= left_consumer
.into_folder();
106 let mut right_folder
= right_consumer
.into_folder();
107 left_folder
= left_folder
.consume(0).consume(1).consume(2);
108 right_folder
= right_folder
.consume(2).consume(3);
109 right_folder
.complete();
114 // The right consumer produces too many items while the left
115 // consumer produces correct number.
117 #[should_panic(expected = "too many values")]
118 fn right_produces_too_many_items() {
120 let mut collect
= Collect
::new(&mut v
, 4);
122 let consumer
= collect
.as_consumer();
123 let (left_consumer
, right_consumer
, _
) = consumer
.split_at(2);
124 let mut left_folder
= left_consumer
.into_folder();
125 let mut right_folder
= right_consumer
.into_folder();
126 left_folder
= left_folder
.consume(0).consume(1);
127 right_folder
= right_folder
.consume(2).consume(3).consume(4);
128 left_folder
.complete();
133 // The left consumer produces fewer items while the right
134 // consumer produces correct number.
136 #[should_panic(expected = "expected 4 total writes, but got 3")]
137 fn left_produces_fewer_items() {
139 let mut collect
= Collect
::new(&mut v
, 4);
141 let consumer
= collect
.as_consumer();
142 let (left_consumer
, right_consumer
, _
) = consumer
.split_at(2);
143 let mut left_folder
= left_consumer
.into_folder();
144 let mut right_folder
= right_consumer
.into_folder();
145 left_folder
= left_folder
.consume(0);
146 right_folder
= right_folder
.consume(2).consume(3);
147 left_folder
.complete();
148 right_folder
.complete();
153 // The right consumer produces fewer items while the left
154 // consumer produces correct number.
156 #[should_panic(expected = "expected 4 total writes, but got 3")]
157 fn right_produces_fewer_items() {
159 let mut collect
= Collect
::new(&mut v
, 4);
161 let consumer
= collect
.as_consumer();
162 let (left_consumer
, right_consumer
, _
) = consumer
.split_at(2);
163 let mut left_folder
= left_consumer
.into_folder();
164 let mut right_folder
= right_consumer
.into_folder();
165 left_folder
= left_folder
.consume(0).consume(1);
166 right_folder
= right_folder
.consume(2);
167 left_folder
.complete();
168 right_folder
.complete();
173 // The left consumer panics and the right stops short, like `panic_fuse()`.
174 // We should get the left panic without ever reaching `Collect::complete()`.
176 #[should_panic(expected = "left consumer panic")]
179 let mut collect
= Collect
::new(&mut v
, 4);
181 let consumer
= collect
.as_consumer();
182 let (left_consumer
, right_consumer
, _
) = consumer
.split_at(2);
185 let mut left_folder
= left_consumer
.into_folder();
186 left_folder
= left_folder
.consume(0);
187 panic
!("left consumer panic");
190 let mut right_folder
= right_consumer
.into_folder();
191 right_folder
= right_folder
.consume(2);
192 right_folder
.complete() // early return
199 // The right consumer panics and the left stops short, like `panic_fuse()`.
200 // We should get the right panic without ever reaching `Collect::complete()`.
202 #[should_panic(expected = "right consumer panic")]
205 let mut collect
= Collect
::new(&mut v
, 4);
207 let consumer
= collect
.as_consumer();
208 let (left_consumer
, right_consumer
, _
) = consumer
.split_at(2);
211 let mut left_folder
= left_consumer
.into_folder();
212 left_folder
= left_folder
.consume(0);
213 left_folder
.complete() // early return
216 let mut right_folder
= right_consumer
.into_folder();
217 right_folder
= right_folder
.consume(2);
218 panic
!("right consumer panic");