tank_tests/
math.rs

1use std::sync::LazyLock;
2use tank::{
3    AsValue, DataSet, Entity, Executor, Result, cols, expr,
4    stream::{StreamExt, TryStreamExt},
5};
6use tokio::sync::Mutex;
7
8#[derive(Debug, Default, Entity, PartialEq, Eq, PartialOrd, Ord)]
9struct MathTable {
10    #[tank(primary_key)]
11    id: u64,
12    read: u64,
13}
14static MUTEX: LazyLock<Mutex<()>> = LazyLock::new(|| Mutex::new(()));
15
16pub async fn math<E: Executor>(executor: &mut E) {
17    let _lock = MUTEX.lock().await;
18
19    // Setup
20    MathTable::drop_table(executor, true, false)
21        .await
22        .expect("Failed to drop MathTable table");
23    MathTable::create_table(executor, false, false)
24        .await
25        .expect("Failed to create MathTable table");
26    MathTable { id: 0, read: 0 }
27        .save(executor)
28        .await
29        .expect("Could not save the dummy entry");
30
31    let result = MathTable::table()
32        .select(
33            executor,
34            cols!(MathTable::id, ((42 * 6 + 56) / 7) as read),
35            expr!(MathTable::id == 0),
36            None,
37        )
38        .map_ok(MathTable::from_row)
39        .map(Result::flatten)
40        .try_collect::<Vec<_>>()
41        .await
42        .expect("Could not get the result 1");
43    assert_eq!(result, [MathTable { id: 0, read: 44 }]);
44
45    let result = MathTable::table()
46        .select(
47            executor,
48            cols!(MathTable::id, ((5 - (1 << 2)) * 9 % 6) as read),
49            expr!(MathTable::id == 0),
50            None,
51        )
52        .map_ok(MathTable::from_row)
53        .map(Result::flatten)
54        .try_collect::<Vec<_>>()
55        .await
56        .expect("Could not get the result 2");
57    assert_eq!(result, [MathTable { id: 0, read: 3 }]);
58
59    let result = MathTable::table()
60        .select(
61            executor,
62            cols!(MathTable::id, ((1 | 2 | 4) + 1) as read),
63            expr!(MathTable::id == 0),
64            None,
65        )
66        .map_ok(MathTable::from_row)
67        .map(Result::flatten)
68        .try_collect::<Vec<_>>()
69        .await
70        .expect("Could not get the result 3");
71    assert_eq!(result, [MathTable { id: 0, read: 8 }]);
72
73    let result = MathTable::table()
74        .select(
75            executor,
76            cols!(MathTable::id, (90 > 89 && (10 & 6) == 2) as read),
77            expr!(MathTable::id == 0),
78            None,
79        )
80        .map_ok(|v| bool::try_from_value(v.values.into_iter().nth(1).unwrap()))
81        .map(Result::flatten)
82        .try_collect::<Vec<_>>()
83        .await
84        .expect("Could not get the result 4");
85    assert_eq!(result, [true]);
86
87    let result = MathTable::table()
88        .select(
89            executor,
90            cols!(MathTable::id, (4 == (2, 3, 4, 5) as IN) as read),
91            expr!(MathTable::id == 0),
92            None,
93        )
94        .map_ok(|v| bool::try_from_value(v.values.into_iter().nth(1).unwrap()))
95        .map(Result::flatten)
96        .try_collect::<Vec<_>>()
97        .await
98        .expect("Could not get the result 5");
99    assert_eq!(result, [true]);
100}