async def METHOD_NAME(widget, probe, other):
    "Widget value is clipped to min/max values when focus is lost."
    # Set min/max values, and a granular step
    widget.min = Decimal(100)
    widget.max = Decimal(2000)
    widget.step = 1
    # Install a handler, and give the widget focus.
    handler = Mock()
    widget.on_change = handler
    widget.focus()
    # Clearing triggers the event handler
    probe.clear_input()
    event_count = 1
    await probe.redraw("Value has been cleared programmatically")
    assert handler.mock_calls == [call(widget)] * event_count
    for char, value, events_delta in [
        ("1", Decimal("100"), 1),  # less than min
        ("2", Decimal("100"), 1),  # less than min
        ("3", Decimal("123"), 1),
        ("4", Decimal("1234"), 1),
        ("5", Decimal("2000"), 1),  # exceeds max
    ]:
        await probe.type_character(char)
        await probe.redraw(f"Typed {char!r}")
        assert widget.value == value
        # The number of events equals the number of characters typed.
        event_count += events_delta
        assert handler.mock_calls == [call(widget)] * event_count
    # On loss of focus, the value will be clipped
    other.focus()
    await probe.redraw("Lost focus; value is clipped")
    assert widget.value == Decimal("2000")
    # The raw value from the implementation matches the widget
    assert probe.value == "2000"