Skip to main content

tester_demo/
tester_demo.rs

1/*******************************************************************************
2 *
3 *    Copyright (c) 2025 - 2026.
4 *    Haixing Hu, Qubit Co. Ltd.
5 *
6 *    All rights reserved.
7 *
8 ******************************************************************************/
9
10use qubit_function::{
11    ArcTester,
12    BoxTester,
13    RcTester,
14    Tester,
15};
16use std::cell::Cell;
17use std::rc::Rc;
18use std::sync::{
19    Arc,
20    atomic::{
21        AtomicBool,
22        AtomicUsize,
23        Ordering,
24    },
25};
26
27fn main() {
28    println!("=== Tester Demo ===\n");
29
30    demo_box_tester();
31    demo_arc_tester();
32    demo_rc_tester();
33}
34
35fn demo_box_tester() {
36    println!("--- BoxTester logic ---");
37
38    let healthy = Arc::new(AtomicBool::new(true));
39    let requests = Arc::new(AtomicUsize::new(10));
40    let max_requests = 100;
41
42    let healthy_for_check = Arc::clone(&healthy);
43    let requests_for_check = Arc::clone(&requests);
44    let can_accept = BoxTester::new(move || healthy_for_check.load(Ordering::Relaxed))
45        .and(move || requests_for_check.load(Ordering::Relaxed) < max_requests);
46
47    println!("Can accept initially: {}", can_accept.test());
48    requests.store(150, Ordering::Relaxed);
49    println!("Can accept after overload: {}", can_accept.test());
50    println!();
51}
52
53fn demo_arc_tester() {
54    println!("--- ArcTester sharing ---");
55
56    let enabled = Arc::new(AtomicBool::new(true));
57    let enabled_for_check = Arc::clone(&enabled);
58    let enabled_tester = ArcTester::new(move || enabled_for_check.load(Ordering::Relaxed));
59    let disabled_tester = enabled_tester.not();
60
61    println!("Enabled: {}", enabled_tester.test());
62    println!("Disabled: {}", disabled_tester.test());
63    enabled.store(false, Ordering::Relaxed);
64    println!("Enabled after update: {}", enabled_tester.test());
65    println!("Disabled after update: {}", disabled_tester.test());
66    println!();
67}
68
69fn demo_rc_tester() {
70    println!("--- RcTester single-threaded sharing ---");
71
72    let value = Rc::new(Cell::new(0));
73    let small_value = {
74        let value = Rc::clone(&value);
75        RcTester::new(move || value.get() < 3)
76    };
77    let even_value = {
78        let value = Rc::clone(&value);
79        RcTester::new(move || value.get() % 2 == 0)
80    };
81    let small_and_even = small_value.and(&even_value);
82
83    println!("0 is small and even: {}", small_and_even.test());
84    value.set(2);
85    println!("2 is small and even: {}", small_and_even.test());
86    value.set(3);
87    println!("3 is small and even: {}", small_and_even.test());
88}