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
// =============================================================================
// Copyright (c) 2025 - 2026 Haixing Hu.
//
// SPDX-License-Identifier: Apache-2.0
//
// Licensed under the Apache License, Version 2.0.
// =============================================================================
//! Unit tests for StatefulMutatingFunction types (stateful FnMut(&mut T) ->
//! R)
use qubit_function::BoxStatefulMutatingFunction;
use qubit_function::StatefulMutatingFunction;
// ============================================================================
// BoxStatefulMutatingFunction Tests
// ============================================================================
#[cfg(test)]
mod test_box_stateful_mutating_function {
use super::BoxStatefulMutatingFunction;
use super::StatefulMutatingFunction;
#[test]
fn test_new() {
let mut counter = {
let mut count = 0;
BoxStatefulMutatingFunction::new(move |x: &mut i32| {
count += 1;
*x += 1;
count
})
};
let mut value = 5;
assert_eq!(counter.apply(&mut value), 1);
assert_eq!(value, 6);
assert_eq!(counter.apply(&mut value), 2);
assert_eq!(value, 7);
}
#[test]
fn test_accumulator() {
let mut accumulator = {
let mut sum = 0;
BoxStatefulMutatingFunction::new(move |x: &mut i32| {
*x *= 2;
sum += *x;
sum
})
};
let mut value = 5;
assert_eq!(accumulator.apply(&mut value), 10);
assert_eq!(value, 10);
let mut value2 = 3;
assert_eq!(accumulator.apply(&mut value2), 16); // 10 + 6
assert_eq!(value2, 6);
}
#[test]
fn test_identity() {
let mut identity = BoxStatefulMutatingFunction::<i32, i32>::identity();
let mut value = 42;
assert_eq!(identity.apply(&mut value), 42);
assert_eq!(value, 42);
}
#[test]
fn test_map() {
let func = {
let mut count = 0;
BoxStatefulMutatingFunction::new(move |x: &mut i32| {
count += 1;
*x *= 2;
count
})
};
let mut mapped = func.and_then::<String, _>(|count: &i32| format!("Call #{}", *count));
let mut value = 5;
assert_eq!(mapped.apply(&mut value), "Call #1");
assert_eq!(value, 10);
}
}
// ============================================================================
// RcStatefulMutatingFunction Tests
// ============================================================================