Skip to content

Commit af66ece

Browse files
steffahnjoboet
authored andcommitted
Add tests for Extend<(T, U)> for (ExtendT, ExtendU)
ordering of side-effects to `coretest`.
1 parent d5e6b6f commit af66ece

File tree

1 file changed

+22
-0
lines changed

1 file changed

+22
-0
lines changed

library/coretests/tests/iter/traits/iterator.rs

+22
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
use core::cell::RefCell;
2+
use core::iter::zip;
13
use core::num::NonZero;
24

35
/// A wrapper struct that implements `Eq` and `Ord` based on the wrapped
@@ -642,6 +644,26 @@ fn test_collect_for_tuples() {
642644
assert!(e.2 == d);
643645
}
644646

647+
#[test]
648+
fn test_extend_for_tuple_side_effects_order() {
649+
struct TrackingExtender<'a, T>(&'static str, &'a RefCell<Vec<(&'static str, Vec<T>)>>, Vec<T>);
650+
impl<T: Clone> Extend<T> for TrackingExtender<'_, T> {
651+
fn extend<I: IntoIterator<Item = T>>(&mut self, i: I) {
652+
let items = Vec::from_iter(i);
653+
self.1.borrow_mut().push((self.0, items.clone()));
654+
self.2.extend(items);
655+
}
656+
}
657+
658+
let effects = RefCell::new(vec![]);
659+
let l = TrackingExtender("l", &effects, vec![]);
660+
let r = TrackingExtender("r", &effects, vec![]);
661+
let mut p = ((l, r), ());
662+
p.extend(zip([(1, 2), (3, 4)], [(), ()]));
663+
let effects = effects.into_inner();
664+
assert_eq!(effects, [("l", vec![1]), ("r", vec![2]), ("l", vec![3]), ("r", vec![4])]);
665+
}
666+
645667
// just tests by whether or not this compiles
646668
fn _empty_impl_all_auto_traits<T>() {
647669
use std::panic::{RefUnwindSafe, UnwindSafe};

0 commit comments

Comments
 (0)