1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
// =============================================================================
// Copyright (c) 2025 - 2026 Haixing Hu.
//
// SPDX-License-Identifier: Apache-2.0
//
// Licensed under the Apache License, Version 2.0.
// =============================================================================
//! Unit tests for MutatingFunction types (stateless Fn(&mut T) -> R)
use qubit_function::{
ArcMutatingFunction,
BoxMutatingFunction,
MutatingFunction,
MutatingFunctionOnce,
RcMutatingFunction,
};
// ============================================================================
// BoxMutatingFunction Tests
// ============================================================================
/// Test struct that implements MutatingFunction to test default methods
struct TestMutatingFunction {
multiplier: i32,
}
impl TestMutatingFunction {
fn new(multiplier: i32) -> Self {
TestMutatingFunction { multiplier }
}
}
impl MutatingFunction<i32, i32> for TestMutatingFunction {
fn apply(&self, input: &mut i32) -> i32 {
let old_value = *input;
*input *= self.multiplier;
old_value
}
}
impl Clone for TestMutatingFunction {
fn clone(&self) -> Self {
TestMutatingFunction {
multiplier: self.multiplier,
}
}
}
// ============================================================================
// MutatingFunction Debug and Display Tests
// ============================================================================
#[cfg(test)]
mod test_rc_mutating_function {
use super::{
MutatingFunction,
RcMutatingFunction,
};
#[test]
fn test_new() {
let func = RcMutatingFunction::new(|x: &mut i32| {
*x += 1;
*x
});
let mut value = 5;
assert_eq!(func.apply(&mut value), 6);
assert_eq!(value, 6);
}
#[test]
fn test_clone() {
let func = RcMutatingFunction::new(|x: &mut i32| {
*x *= 2;
*x
});
let clone = func.clone();
let mut value1 = 5;
assert_eq!(func.apply(&mut value1), 10);
let mut value2 = 3;
assert_eq!(clone.apply(&mut value2), 6);
}
#[test]
fn test_identity() {
let identity = RcMutatingFunction::<i32, i32>::identity();
let mut value = 42;
assert_eq!(identity.apply(&mut value), 42);
assert_eq!(value, 42);
}
#[test]
fn test_map() {
let func = RcMutatingFunction::new(|x: &mut i32| {
*x *= 2;
*x
});
let mapped = func.and_then(|result: &i32| result.to_string());
let mut value = 5;
assert_eq!(mapped.apply(&mut value), "10");
assert_eq!(value, 10);
}
}
// ============================================================================
// ArcMutatingFunction Tests
// ============================================================================