use super::*;
#[test]
fn test_if_closure_is_copy_trait() {
let value = 0u64; let rng_closure = || value + 1;
let _rng_closure_clone = rng_closure; let _rng_closure_second = rng_closure;
let returned_value: u64 = gen_range(0..=50000, rng_closure);
assert_eq!(
returned_value,
1,
"Expected gen_range to return 1, but got {} instead",
returned_value
);
println!("Test successful. Closure is Copy-compatible.");
}
#[test]
fn test_if_closure_is_copy_trait2() {
let mut value = 0u64; let rng_closure = move || { value +=1; value };
let _rng_closure_clone = rng_closure; let _rng_closure_second = rng_closure;
let returned_value: u64 = gen_range(0..=50000, rng_closure);
assert_eq!(
returned_value,
1,
"Expected gen_range to return 1, but got {} instead",
returned_value
);
println!("Test successful. Closure is Copy-compatible.");
}
#[test]
fn test_if_closure_is_copy_trait3() {
let mut value = 0u64; let rng_closure = move || { value +=1; value };
let _rng_closure_clone = rng_closure; let _rng_closure_second = rng_closure;
let mut mutable = rng_closure;
assert_eq!( mutable(), 1);
assert_eq!( mutable(), 2);
mutable = _rng_closure_clone;
assert_eq!( mutable(), 1);
println!("Test successful. Closure is Copy-compatible.");
}
#[test]
fn test_closure_copy_trait_ro() {
let value = 0u64; let rng_closure = || value + 1;
let _clone1 = rng_closure; let _clone2 = rng_closure;
assert_eq!(_clone1(), 1);
assert_eq!(_clone1(), 1);
assert_eq!(_clone2(), 1);
println!("Closure is Copy-compatible.");
}
#[test]
fn test_closure_copy_trait_rw() {
let mut value = 0u64; let rng_closure = move || { value +=1; value };
let mut _clone1 = rng_closure; let mut _clone2 = rng_closure;
assert_eq!(_clone1(), 1);
assert_eq!(_clone1(), 2);
assert_eq!(_clone2(), 1); assert_eq!(_clone2(), 2); assert_eq!(_clone1(), 3);
println!("Closure is Copy-compatible.");
}
#[test]
fn test_if_closure_is_copy_compiletime() {
fn takes_copy<F: Copy>(_: F) {}
let value = 0u64; let rng_closure = || value + 1;
takes_copy(rng_closure);
let _clone1 = rng_closure;
let _clone2 = rng_closure;
assert_eq!(_clone1(), 1);
assert_eq!(_clone2(), 1);
assert_eq!(rng_closure(), 1);
println!("Closure is truly Copy-compatible.");
}
#[test]
fn test_if_closure_is_copy_compiletime_rw() {
fn takes_copy<F: Copy>(_: F) {}
let mut value = 0u64; let rng_closure = move || { value +=1; value };
takes_copy(rng_closure);
let mut _clone1 = rng_closure;
let mut _clone2 = rng_closure;
assert_eq!(_clone1(), 1);
assert_eq!(_clone2(), 1);
println!("Closure is truly Copy-compatible.");
}
#[test]
fn test_if_closure_is_copy_compiletime_retval_check() {
fn takes_copy<F: Copy + FnMut() -> u64>(closure: F) -> u64 {
let mut mutable_closure = closure;
mutable_closure() }
let mut value = 0u64; let rng_closure = move || { value +=1; value };
let result1 = takes_copy(rng_closure); let result2 = takes_copy(rng_closure);
let mut _clone1 = rng_closure;
let mut _clone2 = rng_closure;
assert_eq!(_clone1(), 1);
assert_eq!(_clone2(), 1);
assert_eq!(result1, 1, "Expected takes_copy to return 1, but got {}", result1);
assert_eq!(result2, 1, "Expected takes_copy to return 1, but got {}", result2);
println!("Closure is truly Copy-compatible.");
}
#[test]
#[allow(non_snake_case)]
fn test_if_closure_is_copy_42_chatGPT() {
fn takes_copy<F: Copy + FnMut() -> u64>(closure: F) -> (u64, u64) {
let mut copy1 = closure;
let mut copy2 = closure; (copy1(), copy2())
}
let mut value = 41u64; let rng_closure = move || { value +=1; value };
let (result1, result2) = takes_copy(rng_closure);
assert_eq!(result1, 42, "left value not ok");
assert_eq!(result2, 42, "right value not ok");
println!("Closure is truly Copy-compatible.");
}