diff options
Diffstat (limited to '')
| -rw-r--r-- | gui/tests/layout.rs | 82 |
1 files changed, 82 insertions, 0 deletions
diff --git a/gui/tests/layout.rs b/gui/tests/layout.rs new file mode 100644 index 0000000..e0c0475 --- /dev/null +++ b/gui/tests/layout.rs | |||
| @@ -0,0 +1,82 @@ | |||
| 1 | //! Pure presentation maths. Anything that touches a `Ui` is covered by the | ||
| 2 | //! manual screenshot pass; these are the calculations a pixel test cannot | ||
| 3 | //! express. | ||
| 4 | |||
| 5 | use std::f32::consts::TAU; | ||
| 6 | |||
| 7 | use zagan_bet::roulette::{BetTarget, Outside}; | ||
| 8 | use zagan_bet_gui::roulette::{number_under, size_for, target_name}; | ||
| 9 | use zagan_bet_gui::theme::{group_digits, money}; | ||
| 10 | |||
| 11 | #[test] | ||
| 12 | fn money_is_grouped_in_threes() { | ||
| 13 | assert_eq!(group_digits(0), "0"); | ||
| 14 | assert_eq!(group_digits(999), "999"); | ||
| 15 | assert_eq!(group_digits(1000), "1 000"); | ||
| 16 | assert_eq!(group_digits(1234567), "1 234 567"); | ||
| 17 | assert_eq!(group_digits(-1500), "-1 500"); | ||
| 18 | assert_eq!(money(1000), "1 000 Kr"); | ||
| 19 | } | ||
| 20 | |||
| 21 | #[test] | ||
| 22 | fn the_wheel_pointer_reads_the_number_at_the_top() { | ||
| 23 | let segment = TAU / 37.0; | ||
| 24 | assert_eq!(number_under(0.0), 0); | ||
| 25 | |||
| 26 | // Rotating by -i segments puts wheel entry i under the pointer. | ||
| 27 | for number in [0u8, 32, 17, 26] { | ||
| 28 | let index = zagan_bet::roulette::WHEEL | ||
| 29 | .iter() | ||
| 30 | .position(|candidate| *candidate == number) | ||
| 31 | .expect("number is on the wheel"); | ||
| 32 | let rotation = -(index as f32) * segment; | ||
| 33 | assert_eq!(number_under(rotation), number); | ||
| 34 | } | ||
| 35 | |||
| 36 | // One full turn changes nothing. | ||
| 37 | assert_eq!(number_under(-TAU), 0); | ||
| 38 | } | ||
| 39 | |||
| 40 | #[test] | ||
| 41 | fn table_size_keeps_the_felt_aspect_and_fits() { | ||
| 42 | let available = eframe::egui::vec2(1300.0, 900.0); | ||
| 43 | let size = size_for(available); | ||
| 44 | assert!(size.x <= available.x + 0.01, "{size:?} overflows"); | ||
| 45 | assert!(size.y <= available.y + 0.01, "{size:?} overflows"); | ||
| 46 | |||
| 47 | // 13 cells wide and 4.89 cells tall, plus the felt border on every side. | ||
| 48 | let cell = (size.x - 12.0) / 13.0; | ||
| 49 | assert!((cell - (size.y - 12.0) / 4.89).abs() < 0.01); | ||
| 50 | } | ||
| 51 | |||
| 52 | #[test] | ||
| 53 | fn targets_read_as_bet_slips() { | ||
| 54 | assert_eq!( | ||
| 55 | target_name(&BetTarget::Straight { number: 17 }), | ||
| 56 | "Straight 17" | ||
| 57 | ); | ||
| 58 | assert_eq!( | ||
| 59 | target_name(&BetTarget::Split { a: 26, b: 29 }), | ||
| 60 | "Split 26/29" | ||
| 61 | ); | ||
| 62 | assert_eq!( | ||
| 63 | target_name(&BetTarget::Corner { | ||
| 64 | numbers: [17, 18, 20, 21] | ||
| 65 | }), | ||
| 66 | "Corner 17/18/20/21" | ||
| 67 | ); | ||
| 68 | assert_eq!(target_name(&BetTarget::Dozen { index: 1 }), "2nd 12"); | ||
| 69 | assert_eq!(target_name(&BetTarget::Column { index: 2 }), "Column 3"); | ||
| 70 | assert_eq!( | ||
| 71 | target_name(&BetTarget::Outside { | ||
| 72 | kind: Outside::High | ||
| 73 | }), | ||
| 74 | "19-36" | ||
| 75 | ); | ||
| 76 | assert_eq!( | ||
| 77 | target_name(&BetTarget::Outside { | ||
| 78 | kind: Outside::Black | ||
| 79 | }), | ||
| 80 | "Black" | ||
| 81 | ); | ||
| 82 | } | ||
