use std::{future::ready, time::Duration};
use floop::floop;
use smol::{Timer, block_on};
#[test]
fn continue_is_not_infinite_loop() {
let mut ran = false;
block_on(async {
floop! {
unbiased
return
_ in ready(()) => {
assert!(!ran);
ran = true;
continue;
}
_ in ready(()) => {
if ran {
return;
}
}
}.0
});
}
#[test]
fn continue_before_after() {
let mut counter = 0;
block_on(async {
floop! {
biased
return
before => {
counter += 1;
if counter == 1 {
continue
}
}
after => {
continue
}
_ in if counter == 3, ready(()) => {
return;
}
_ in ready(()) => {}
};
})
}
#[test]
fn continue_does_not_poll_after_finish() {
struct NoCopy;
let mut counter = 0;
block_on(async {
floop! {
biased
_ in ready(NoCopy) => {
counter += 1;
if counter < 10 {
continue;
}
break;
}
}.await;
})
}
#[test]
fn continue_before_afdter_no_arms() {
let mut counter = 0;
#[expect(unreachable_code, reason="i'm testing if it compiles.")]
block_on(floop! {
biased
before => {
counter += 1;
if counter < 10 {
continue;
}
}
after => {
continue
}
});
assert_eq!(counter, 10);
}
#[test]
fn continue_does_not_prevent_break() {
let mut arm_broke = false;
let mut counter = 0;
let fut = floop! {
biased
before => {
counter += 1;
assert!(counter <= 1);
if arm_broke {
continue;
}
}
_ in ready(()) => break 5,
after => if !arm_broke {
arm_broke = true;
continue;
},
};
assert_eq!(block_on(fut), 5);
assert_eq!(counter, 1);
}
#[test]
fn continue_move() {
struct NoCopy;
let fut = async {
floop! {
unbiased
return
value in ready(NoCopy) => {
#[expect(clippy::drop_non_drop, reason="i'm testing if consuming `value` compiles")]
drop(value);
continue;
}
_ in Timer::after(Duration::from_millis(100)) => {
return 10;
}
}.0
};
assert_eq!(block_on(fut), 10);
}