Skip to main content

tester_demo/
tester_demo.rs

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