Counter App
Interactive counter with increment/decrement buttons.
Code
use presentar::widgets::{Button, Column, Text};
use presentar::widgets::row::MainAxisAlignment;
use presentar::{Constraints, Rect, Size, Widget, RecordingCanvas};
fn main() {
// Build UI
let mut ui = Column::new()
.main_axis_alignment(MainAxisAlignment::Center)
.gap(16.0)
.child(
Text::new("Counter: 0")
.font_size(32.0)
.with_test_id("counter-display")
)
.child(
Button::new("+1")
.with_test_id("increment")
)
.child(
Button::new("-1")
.with_test_id("decrement")
);
// Measure
let size = ui.measure(Constraints::loose(Size::new(400.0, 400.0)));
// Layout
ui.layout(Rect::new(0.0, 0.0, size.width, size.height));
// Paint
let mut canvas = RecordingCanvas::new();
ui.paint(&mut canvas);
println!("Counter app: {} commands", canvas.command_count());
}
Testing
#[test]
fn test_counter_ui() {
use presentar_test::Harness;
use presentar_widgets::{Button, Column, Text};
let ui = Column::new()
.child(Text::new("0").with_test_id("display"))
.child(Button::new("+").with_test_id("inc"))
.child(Button::new("-").with_test_id("dec"));
let harness = Harness::new(ui);
harness
.assert_exists("[data-testid='display']")
.assert_exists("[data-testid='inc']")
.assert_exists("[data-testid='dec']")
.assert_count("[data-testid='display']", 1);
}
Verified Test
#[test]
fn test_counter_builds() {
use presentar_widgets::{Button, Column, Text};
use presentar_core::{Constraints, Size, Widget};
let ui = Column::new()
.child(Text::new("0"))
.child(Button::new("+"))
.child(Button::new("-"));
let size = ui.measure(Constraints::loose(Size::new(400.0, 400.0)));
assert!(size.height > 0.0);
}