summaryrefslogtreecommitdiffstats
path: root/gui/tests/layout.rs
blob: e0c04750fb1834e3e054f4b1aa92ecdb19d27296 (plain) (blame)
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
//! Pure presentation maths. Anything that touches a `Ui` is covered by the
//! manual screenshot pass; these are the calculations a pixel test cannot
//! express.

use std::f32::consts::TAU;

use zagan_bet::roulette::{BetTarget, Outside};
use zagan_bet_gui::roulette::{number_under, size_for, target_name};
use zagan_bet_gui::theme::{group_digits, money};

#[test]
fn money_is_grouped_in_threes() {
    assert_eq!(group_digits(0), "0");
    assert_eq!(group_digits(999), "999");
    assert_eq!(group_digits(1000), "1 000");
    assert_eq!(group_digits(1234567), "1 234 567");
    assert_eq!(group_digits(-1500), "-1 500");
    assert_eq!(money(1000), "1 000 Kr");
}

#[test]
fn the_wheel_pointer_reads_the_number_at_the_top() {
    let segment = TAU / 37.0;
    assert_eq!(number_under(0.0), 0);

    // Rotating by -i segments puts wheel entry i under the pointer.
    for number in [0u8, 32, 17, 26] {
        let index = zagan_bet::roulette::WHEEL
            .iter()
            .position(|candidate| *candidate == number)
            .expect("number is on the wheel");
        let rotation = -(index as f32) * segment;
        assert_eq!(number_under(rotation), number);
    }

    // One full turn changes nothing.
    assert_eq!(number_under(-TAU), 0);
}

#[test]
fn table_size_keeps_the_felt_aspect_and_fits() {
    let available = eframe::egui::vec2(1300.0, 900.0);
    let size = size_for(available);
    assert!(size.x <= available.x + 0.01, "{size:?} overflows");
    assert!(size.y <= available.y + 0.01, "{size:?} overflows");

    // 13 cells wide and 4.89 cells tall, plus the felt border on every side.
    let cell = (size.x - 12.0) / 13.0;
    assert!((cell - (size.y - 12.0) / 4.89).abs() < 0.01);
}

#[test]
fn targets_read_as_bet_slips() {
    assert_eq!(
        target_name(&BetTarget::Straight { number: 17 }),
        "Straight 17"
    );
    assert_eq!(
        target_name(&BetTarget::Split { a: 26, b: 29 }),
        "Split 26/29"
    );
    assert_eq!(
        target_name(&BetTarget::Corner {
            numbers: [17, 18, 20, 21]
        }),
        "Corner 17/18/20/21"
    );
    assert_eq!(target_name(&BetTarget::Dozen { index: 1 }), "2nd 12");
    assert_eq!(target_name(&BetTarget::Column { index: 2 }), "Column 3");
    assert_eq!(
        target_name(&BetTarget::Outside {
            kind: Outside::High
        }),
        "19-36"
    );
    assert_eq!(
        target_name(&BetTarget::Outside {
            kind: Outside::Black
        }),
        "Black"
    );
}