#![cfg(feature = "desktop")]
use rust_widgets::app::App;
use rust_widgets::app::WidgetHandle as _;
fn app() -> App {
let mut app = App::new();
app.init();
app
}
#[test]
fn slider_accepts_crossed_range_without_panicking() {
let app = app();
let win = app.new_window("slider-crossed", 0, 0, 400, 300);
let s = win.new_slider(0, 0, 100, 20);
s.set_range(0, 100);
s.set_value(40);
assert_eq!(s.value(), 40);
s.set_range(100, 0);
assert_eq!(s.value(), 40, "40 lies within the span the crossed range defines");
s.set_value(150);
assert_eq!(s.value(), 100);
s.set_value(-10);
assert_eq!(s.value(), 0);
s.set_range(200, 300);
assert_eq!(s.value(), 200);
s.set_range(300, 200);
assert_eq!(s.value(), 200, "200 is inside the span [200, 300] either way round");
s.set_range(400, 500);
assert_eq!(s.value(), 400);
if let Some((min, max)) = s.range() {
assert!(min <= max, "backend stored inverted range ({min}, {max})");
}
}
#[test]
fn spinner_accepts_crossed_range_without_panicking() {
let app = app();
let win = app.new_window("spinbox-crossed", 0, 0, 400, 300);
let sb = win.new_spin_box(0, 0, 100, 20);
sb.set_range(0, 100);
sb.set_value(40);
assert_eq!(sb.value(), 40);
sb.set_range(100, 0);
assert_eq!(sb.value(), 40, "40 lies within the span the crossed range defines");
sb.set_value(150);
assert_eq!(sb.value(), 100);
sb.set_value(-10);
assert_eq!(sb.value(), 0);
if let Some((min, max)) = sb.range() {
assert!(min <= max, "backend stored inverted range ({min}, {max})");
}
}
#[test]
fn progress_bar_min_above_max_does_not_persist_inverted_range() {
let app = app();
let win = app.new_window("progress-crossed", 0, 0, 400, 300);
let pb = win.new_progress_bar(0, 0, 100, 20);
pb.set_range(0.0, 100.0);
pb.set_value(40);
assert_eq!(pb.value(), 40);
pb.set_min(100);
assert_eq!(pb.value(), 100, "the collapsed span [100, 100] pulls the value up");
if let Some((min, max)) = pb.range() {
assert!(min <= max, "set_min left the backend with ({min}, {max})");
}
pb.set_value(150);
assert_eq!(pb.value(), 100);
pb.set_value(0);
assert_eq!(pb.value(), 100);
}
#[test]
fn progress_bar_max_below_min_does_not_persist_inverted_range() {
let app = app();
let win = app.new_window("progress-crossed-2", 0, 0, 400, 300);
let pb = win.new_progress_bar(0, 0, 100, 20);
pb.set_range(0.0, 100.0);
pb.set_value(40);
pb.set_max(0);
assert_eq!(pb.value(), 0, "the collapsed span [0, 0] pulls the value down");
if let Some((min, max)) = pb.range() {
assert!(min <= max, "set_max left the backend with ({min}, {max})");
}
pb.set_value(150);
assert_eq!(pb.value(), 0, "the value stays inside the collapsed span");
}
#[test]
fn ordered_ranges_still_clamp_normally() {
let app = app();
let win = app.new_window("ordered", 0, 0, 400, 300);
let s = win.new_slider(0, 0, 100, 20);
s.set_range(10, 20);
s.set_value(5);
assert_eq!(s.value(), 10);
s.set_value(99);
assert_eq!(s.value(), 20);
s.set_value(15);
assert_eq!(s.value(), 15);
let pb = win.new_progress_bar(0, 30, 100, 20);
pb.set_range(0.0, 10.0);
pb.set_min(0);
pb.set_max(10);
pb.set_value(50);
assert_eq!(pb.value(), 10);
pb.set_value(3);
assert_eq!(pb.value(), 3);
}