nigig-org/crates/apps/nigig-traffic/tests/ui.rs
andodeki ac8f8aa002
Some checks failed
repo hygiene / hygiene (push) Has been cancelled
PDF engine / engine (push) Has been cancelled
PDF engine / makepad-integration (push) Has been cancelled
PDF engine / fuzz (push) Has been cancelled
nigig-build (CAD) / supply-chain (push) Has been cancelled
nigig-build (CAD) / cad-module (push) Has been cancelled
nigig-build (CAD) / full-crate-check (push) Has been cancelled
nigig-build (CAD) / cad-engine-coverage (push) Has been cancelled
nigig-build (CAD) / doc-workspace-coverage (push) Has been cancelled
nigig-build (CAD) / cad-widget-coverage (push) Has been cancelled
traffic / gates (push) Has been cancelled
traffic / nigig-traffic (push) Has been cancelled
traffic / supply-chain (push) Has been cancelled
doc-engine / engine (push) Has been cancelled
doc-engine / coverage (push) Has been cancelled
doc-engine / consumer (push) Has been cancelled
email / gates (push) Has been cancelled
email / email-domain (push) Has been cancelled
email / nigig-email (push) Has been cancelled
email / supply-chain (push) Has been cancelled
nigig-map / test (push) Has been cancelled
sms / gates (push) Has been cancelled
sms / robius-sms (push) Has been cancelled
sms / android (push) Has been cancelled
sms / nigig-sms (push) Has been cancelled
sms / supply-chain (push) Has been cancelled
spreadsheet / engine-coverage (push) Has been cancelled
spreadsheet / ui-controller-coverage (push) Has been cancelled
p2p-intel / engine (push) Has been cancelled
p2p-intel / notifications (push) Has been cancelled
p2p-intel / coverage (push) Has been cancelled
p2p-intel / makepad-app (push) Has been cancelled
p2p-intel / exchange-tab (push) Has been cancelled
Payment domain, storage, platform and UI / isolated-payment-tests (push) Has been cancelled
Payment domain, storage, platform and UI / payment-ui-tests (push) Has been cancelled
chore: sync full working tree to gitdab
Whole-tree sync: cad-core/cad-ui split sources, nigig-build
construction_frame migration, pdf port progress, mpesa/pay/uikit/doc
updates, workspace members/profiles/lock, CI workflows and reviews.
See individual file history for details.
2026-09-12 07:15:24 +03:00

111 lines
4.4 KiB
Rust

use makepad_test::{makepad_test, Selector, TestApp};
fn wait_drive_page(app: &TestApp) {
// Drive page is the default active_page (see game_frame/traffic.rs:17)
app.locator(Selector::id("drive_game")).wait_visible();
app.locator(Selector::all().text_contains("Driving Practice"))
.wait_visible();
}
#[makepad_test]
#[ignore = "headless cargo run via StudioHub currently exits 101 before AppStarted (see runtime.rs BuildStopped); use ui_basic for now"]
fn traffic_app_launches_on_drive_page(app: TestApp) {
// App boots into TrafficScreen with drive_page active; bottom nav Drive is selected.
wait_drive_page(&app);
app.locator(Selector::id("traffic_drive")).wait_visible();
// Runtime log from game_view::ensure_props should appear once the 3D view
// realizes — proves the renderer path ran headless.
app.wait_for_log_contains("traffic: no kenney props");
// No font family warnings after game_view.rs:43 fix (theme.font_regular)
// — ensure the new log stream doesn't contain it. We allow the old binary's
// leftover warnings but a fresh headless run after the fix should not emit
// them; this is a soft check via snapshot text.
let dump = app.widget_dump();
assert!(
dump.contains("drive_game"),
"widget tree should contain TrafficGameView"
);
}
#[makepad_test]
#[ignore = "see above"]
fn traffic_bottom_nav_navigates_all_tabs_and_logs(app: TestApp) {
wait_drive_page(&app);
// Drive -> Lessons
app.locator(Selector::id("traffic_lessons"))
.wait_visible()
.click();
app.locator(Selector::all().text_contains("MTB Driving Theory"))
.wait_visible();
app.locator(Selector::all().text_contains("Lane Discipline"))
.wait_visible();
// Lessons page realized -> log is available; ensure we still see the drive log
// and that navigation itself produces no new error logs.
let logs_before = app.widget_snapshot();
assert!(!logs_before.is_empty());
// Lessons -> Scenarios
app.locator(Selector::id("traffic_scenarios"))
.wait_visible()
.click();
// Scenarios page has its own scroll + category chips
app.locator(Selector::all().text_contains("Scenarios"))
.wait_visible();
// Scenarios -> Settings
app.locator(Selector::id("traffic_settings"))
.wait_visible()
.click();
app.locator(Selector::all().text_contains("View Mode"))
.wait_visible();
app.locator(Selector::all().text_contains("MTB Premium"))
.wait_visible();
// Settings -> Drive (full cycle, proves PageFlip active_page switches both ways)
app.locator(Selector::id("traffic_drive"))
.wait_visible()
.click();
wait_drive_page(&app);
// Final sanity: drive_game still visible, widget tree contains it, and the
// startup prop log is still present (headless 3D view stayed alive).
app.locator(Selector::id("drive_game")).wait_visible();
app.wait_for_log_contains("traffic: no kenney props");
// Capture a screenshot for failure artifacts parity with pageflipnav suite
let _path = app
.try_screenshot()
.unwrap_or_else(|_| std::path::PathBuf::from("/tmp/missing.png"));
}
#[makepad_test]
#[ignore = "see above"]
fn traffic_drive_hud_shows_scenario_and_speed(app: TestApp) {
wait_drive_page(&app);
// HUD labels from game_view.rs: draw_hud — category/difficulty, title, speed/score
app.locator(Selector::all().text_contains("km/h"))
.wait_visible();
app.locator(Selector::all().text_contains("Score:"))
.wait_visible();
// Phase text cycles Intro -> Driving after ~1s, but "Get ready" is visible at boot
app.locator(Selector::all().text_contains("Get ready"))
.wait_visible();
}
#[makepad_test]
#[ignore = "see above"]
fn traffic_settings_switches_render_modes(app: TestApp) {
wait_drive_page(&app);
app.locator(Selector::id("traffic_settings")).click();
// Three radio-style rows for RenderMode
app.locator(Selector::all().text_contains("Top-Down"))
.wait_visible();
app.locator(Selector::all().text_contains("Chase-Cam"))
.wait_visible();
app.locator(Selector::all().text_contains("Full 3D"))
.wait_visible();
// Clicking a mode should not crash and should return to drive still functional
app.locator(Selector::all().text_exact("Full 3D")).click();
app.locator(Selector::id("traffic_drive")).click();
wait_drive_page(&app);
}