Skip to content

Commit 63d73fd

Browse files
committed
Add test suite
1 parent 9de451c commit 63d73fd

File tree

2 files changed

+133
-0
lines changed

2 files changed

+133
-0
lines changed

src/test/run-pass/async-fn-size.rs

+106
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,106 @@
1+
// edition:2018
2+
// aux-build:arc_wake.rs
3+
4+
#![feature(async_await, await_macro)]
5+
6+
extern crate arc_wake;
7+
8+
use std::pin::Pin;
9+
use std::future::Future;
10+
use std::sync::{
11+
Arc,
12+
atomic::{self, AtomicUsize},
13+
};
14+
use std::task::{Context, Poll};
15+
use arc_wake::ArcWake;
16+
17+
struct Counter {
18+
wakes: AtomicUsize,
19+
}
20+
21+
impl ArcWake for Counter {
22+
fn wake(self: Arc<Self>) {
23+
Self::wake_by_ref(&self)
24+
}
25+
fn wake_by_ref(arc_self: &Arc<Self>) {
26+
arc_self.wakes.fetch_add(1, atomic::Ordering::SeqCst);
27+
}
28+
}
29+
30+
struct WakeOnceThenComplete(bool, u8);
31+
32+
impl Future for WakeOnceThenComplete {
33+
type Output = u8;
34+
fn poll(mut self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll<u8> {
35+
if self.0 {
36+
Poll::Ready(self.1)
37+
} else {
38+
cx.waker().wake_by_ref();
39+
self.0 = true;
40+
Poll::Pending
41+
}
42+
}
43+
}
44+
45+
fn wait(fut: impl Future<Output = u8>) -> u8 {
46+
let mut fut = Box::pin(fut);
47+
let counter = Arc::new(Counter { wakes: AtomicUsize::new(0) });
48+
let waker = ArcWake::into_waker(counter.clone());
49+
let mut cx = Context::from_waker(&waker);
50+
loop {
51+
match fut.as_mut().poll(&mut cx) {
52+
Poll::Ready(out) => return out,
53+
Poll::Pending => (),
54+
}
55+
}
56+
}
57+
58+
fn base() -> WakeOnceThenComplete { WakeOnceThenComplete(false, 1) }
59+
60+
async fn await1_level1() -> u8 {
61+
await!(base())
62+
}
63+
64+
async fn await2_level1() -> u8 {
65+
await!(base()) + await!(base())
66+
}
67+
68+
async fn await3_level1() -> u8 {
69+
await!(base()) + await!(base()) + await!(base())
70+
}
71+
72+
async fn await3_level2() -> u8 {
73+
await!(await3_level1()) + await!(await3_level1()) + await!(await3_level1())
74+
}
75+
76+
async fn await3_level3() -> u8 {
77+
await!(await3_level2()) + await!(await3_level2()) + await!(await3_level2())
78+
}
79+
80+
async fn await3_level4() -> u8 {
81+
await!(await3_level3()) + await!(await3_level3()) + await!(await3_level3())
82+
}
83+
84+
async fn await3_level5() -> u8 {
85+
await!(await3_level4()) + await!(await3_level4()) + await!(await3_level4())
86+
}
87+
88+
fn main() {
89+
assert_eq!(2, std::mem::size_of_val(&base()));
90+
assert_eq!(8, std::mem::size_of_val(&await1_level1()));
91+
assert_eq!(12, std::mem::size_of_val(&await2_level1()));
92+
assert_eq!(12, std::mem::size_of_val(&await3_level1()));
93+
assert_eq!(20, std::mem::size_of_val(&await3_level2()));
94+
assert_eq!(28, std::mem::size_of_val(&await3_level3()));
95+
assert_eq!(36, std::mem::size_of_val(&await3_level4()));
96+
assert_eq!(44, std::mem::size_of_val(&await3_level5()));
97+
98+
assert_eq!(1, wait(base()));
99+
assert_eq!(1, wait(await1_level1()));
100+
assert_eq!(2, wait(await2_level1()));
101+
assert_eq!(3, wait(await3_level1()));
102+
assert_eq!(9, wait(await3_level2()));
103+
assert_eq!(27, wait(await3_level3()));
104+
assert_eq!(81, wait(await3_level4()));
105+
assert_eq!(243, wait(await3_level5()));
106+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
#![feature(generators)]
2+
3+
fn main() {
4+
let a = || {
5+
{
6+
let w: i32 = 4;
7+
yield;
8+
println!("{:?}", w);
9+
}
10+
{
11+
let x: i32 = 5;
12+
yield;
13+
println!("{:?}", x);
14+
}
15+
{
16+
let y: i32 = 6;
17+
yield;
18+
println!("{:?}", y);
19+
}
20+
{
21+
let z: i32 = 7;
22+
yield;
23+
println!("{:?}", z);
24+
}
25+
};
26+
assert_eq!(8, std::mem::size_of_val(&a));
27+
}

0 commit comments

Comments
 (0)