@@ -1,6 +1,6 @@
11use super::create_element;
22use dodrio::{Node, Render, RenderContext, Vdom};
3−use futures::Future;
3+use futures::future::{select, Either};
44use std::cell::{Cell, RefCell};
55use std::rc::Rc;
66use wasm_bindgen::prelude::*;
@@ -9,7 +9,7 @@ use wasm_bindgen_test::*;
99
1010struct EventContainer {
1111 event: &'static str,
12− on_event: Box<FnMut()>,
12+ on_event: Box<dyn FnMut()>,
1313}
1414
1515impl EventContainer {
@@ -44,14 +44,14 @@ fn target(container: &web_sys::Element) -> web_sys::HtmlElement {
4444 .unchecked_into()
4545}
4646
47−#[wasm_bindgen_test(async)]
48−fn click() -> impl Future<Item = (), Error = JsValue> {
47+#[wasm_bindgen_test]
48+async fn click() {
4949 let container = create_element("div");
5050
51− let (sender, receiver) = futures::sync::oneshot::channel();
51+ let (sender, receiver) = futures::channel::oneshot::channel();
5252 let mut sender = Some(sender);
5353
54− let vdom = Vdom::new(
54+ let _vdom = Vdom::new(
5555 &container,
5656 EventContainer::new("click", move || {
5757 sender
@@ -64,18 +64,14 @@ fn click() -> impl Future<Item = (), Error = JsValue> {
6464
6565 target(&container).click();
6666
67− receiver
68− .map(|_| {
69− drop(vdom);
70− })
71− .map_err(|e| JsValue::from(e.to_string()))
67+ receiver.await.unwrap();
7268}
7369
74−#[wasm_bindgen_test(async)]
75−fn updated_listener_is_called() -> impl Future<Item = (), Error = JsValue> {
70+#[wasm_bindgen_test]
71+async fn updated_listener_is_called() {
7672 let container = create_element("div");
7773
78− let (first_sender, first_receiver) = futures::sync::oneshot::channel();
74+ let (first_sender, first_receiver) = futures::channel::oneshot::channel();
7975 let mut first_sender = Some(first_sender);
8076
8177 let vdom = Vdom::new(
@@ -89,7 +85,7 @@ fn updated_listener_is_called() -> impl Future<Item = (), Error = JsValue> {
8985 }),
9086 );
9187
92− let (second_sender, second_receiver) = futures::sync::oneshot::channel();
88+ let (second_sender, second_receiver) = futures::channel::oneshot::channel();
9389 let mut second_sender = Some(second_sender);
9490
9591 vdom.weak()
@@ -100,25 +96,22 @@ fn updated_listener_is_called() -> impl Future<Item = (), Error = JsValue> {
10096 .send("second")
10197 .expect_throw("should not have dropped the receiver");
10298 })))
103− .map_err(|e| JsValue::from(e.to_string()))
104− .and_then(move |_| {
105− target(&container).click();
106−
107− first_receiver
108− .select(second_receiver)
109− .map(|(which, _other)| which)
110− .or_else(|(_error, other)| other)
111− .map(|which| {
112− assert_eq!(which, "second");
113− drop(vdom);
114− })
115− .map_err(|e| JsValue::from(e.to_string()))
116− })
99+ .await
100+ .unwrap();
101+
102+ target(&container).click();
103+
104+ match select(first_receiver, second_receiver).await {
105+ Either::Left((Ok(_), _)) => panic!(),
106+ Either::Left((Err(_), second)) => assert_eq!(second.await, Ok("second")),
107+ Either::Right((Ok(msg), _)) => assert_eq!(msg, "second"),
108+ Either::Right((Err(_), _)) => panic!(),
109+ }
117110}
118111
119112struct ListensOnlyOnFirstRender {
120113 count: Cell<usize>,
121− callback: Box<FnMut()>,
114+ callback: Box<dyn FnMut()>,
122115}
123116
124117impl ListensOnlyOnFirstRender {
@@ -150,11 +143,11 @@ impl Render for ListensOnlyOnFirstRender {
150143 }
151144}
152145
153−#[wasm_bindgen_test(async)]
154−fn removed_listener_is_not_called() -> impl Future<Item = (), Error = JsValue> {
146+#[wasm_bindgen_test]
147+async fn removed_listener_is_not_called() {
155148 let container = create_element("div");
156149
157− let (outer_sender, outer_receiver) = futures::sync::oneshot::channel();
150+ let (outer_sender, outer_receiver) = futures::channel::oneshot::channel();
158151 let outer_sender = Rc::new(RefCell::new(Some(outer_sender)));
159152 let outer_listener = Closure::wrap(Box::new(move |_| {
160153 outer_sender
@@ -163,13 +156,13 @@ fn removed_listener_is_not_called() -> impl Future<Item = (), Error = JsValue> {
163156 .expect_throw("should only invoke outer_listener once")
164157 .send("outer")
165158 .expect_throw("should not have dropped receiver");
166− }) as Box<FnMut(web_sys::Event)>);
159+ }) as Box<dyn FnMut(web_sys::Event)>);
167160
168161 container
169162 .add_event_listener_with_callback("click", outer_listener.as_ref().unchecked_ref())
170163 .unwrap();
171164
172− let (vdom_sender, vdom_receiver) = futures::sync::oneshot::channel();
165+ let (vdom_sender, vdom_receiver) = futures::channel::oneshot::channel();
173166 let mut vdom_sender = Some(vdom_sender);
174167
175168 // Render a vdom with a listener into container.
@@ -184,33 +177,26 @@ fn removed_listener_is_not_called() -> impl Future<Item = (), Error = JsValue> {
184177 }),
185178 );
186179
187− vdom.weak()
188− // Re-render, so we aren't listening anymore.
189− .render()
190− .map_err(|e| JsValue::from(e.to_string()))
191− .and_then(move |_| {
192− target(&container).click();
193−
194− // We should get our container's event handler fired, and not the unmounted
195− // vdom's event handler.
196− outer_receiver
197− .select(vdom_receiver)
198− .map(|(which, _other)| which)
199− .or_else(|(_error, other)| other)
200− .map(|which| {
201− assert_eq!(which, "outer");
202− drop(outer_listener);
203− drop(vdom)
204− })
205− .map_err(|e| JsValue::from(e.to_string()))
206− })
180+ // Re-render, so we aren't listening anymore.
181+ vdom.weak().render().await.unwrap();
182+
183+ target(&container).click();
184+
185+ // We should get our container's event handler fired, and not the unmounted
186+ // vdom's event handler.
187+ match select(outer_receiver, vdom_receiver).await {
188+ Either::Left((Ok(msg), _)) => assert_eq!(msg, ("outer")),
189+ Either::Left((Err(_), _)) => panic!(),
190+ Either::Right((Ok(_), _)) => panic!(),
191+ Either::Right((Err(_), outer)) => assert_eq!(outer.await, Ok("outer")),
192+ }
207193}
208194
209−#[wasm_bindgen_test(async)]
210−fn event_does_not_fire_after_unmounting() -> impl Future<Item = (), Error = JsValue> {
195+#[wasm_bindgen_test]
196+async fn event_does_not_fire_after_unmounting() {
211197 let container = create_element("div");
212198
213− let (outer_sender, outer_receiver) = futures::sync::oneshot::channel();
199+ let (outer_sender, outer_receiver) = futures::channel::oneshot::channel();
214200 let outer_sender = Rc::new(RefCell::new(Some(outer_sender)));
215201 let outer_listener = Closure::wrap(Box::new(move |_| {
216202 outer_sender
@@ -219,13 +205,13 @@ fn event_does_not_fire_after_unmounting() -> impl Future<Item = (), Error = JsVa
219205 .expect_throw("should only invoke outer_listener once")
220206 .send("outer")
221207 .expect_throw("should not have dropped receiver");
222− }) as Box<FnMut(web_sys::Event)>);
208+ }) as Box<dyn FnMut(web_sys::Event)>);
223209
224210 container
225211 .add_event_listener_with_callback("click", outer_listener.as_ref().unchecked_ref())
226212 .unwrap();
227213
228− let (vdom_sender, vdom_receiver) = futures::sync::oneshot::channel();
214+ let (vdom_sender, vdom_receiver) = futures::channel::oneshot::channel();
229215 let mut vdom_sender = Some(vdom_sender);
230216
231217 // Render a vdom with a listener into container.
@@ -255,13 +241,10 @@ fn event_does_not_fire_after_unmounting() -> impl Future<Item = (), Error = JsVa
255241
256242 // We should get our container's event handler fired, and not the unmounted
257243 // vdom's event handler.
258− outer_receiver
259− .select(vdom_receiver)
260− .map(|(which, _other)| which)
261− .or_else(|(_error, other)| other)
262− .map(|which| {
263− assert_eq!(which, "outer");
264− drop(outer_listener);
265− })
266− .map_err(|e| JsValue::from(e.to_string()))
244+ match select(outer_receiver, vdom_receiver).await {
245+ Either::Left((Ok(msg), _)) => assert_eq!(msg, ("outer")),
246+ Either::Left((Err(_), _)) => panic!(),
247+ Either::Right((Ok(_), _)) => panic!(),
248+ Either::Right((Err(_), outer)) => assert_eq!(outer.await, Ok("outer")),
249+ }
267250}