Files
falyx/tests/test_validators/test_multi_index_validator.py
Roland Thomas a25888f316 feat: add path completion, LCP-based suggestions, and validator tests
- Refactored `FalyxCompleter` to support longest common prefix (LCP) completions by default.
- Added `_ensure_quote` helper to auto-quote completions containing spaces/tabs.
- Integrated `_yield_lcp_completions` for consistent completion insertion logic.
- Added `_suggest_paths()` helper to dynamically suggest filesystem paths for arguments of type `Path`.
- Integrated path completion into `suggest_next()` for both positional and flagged arguments.
- Updated `argument_examples.py` to include a `--path` argument (`Path | None`), demonstrating file path completion.
- Enabled `CompleteStyle.COLUMN` for tab-completion menu formatting in interactive sessions.
- Improved bottom bar docstring formatting with fenced code block examples.
- Added safeguard to `word_validator` to reject `"N"` since it’s reserved for `yes_no_validator`.
- Improved help panel rendering for commands (using `Padding` + `Panel`).
- Added full test coverage for:
  - `FalyxCompleter` and LCP behavior (`tests/test_completer/`)
  - All validators (`tests/test_validators/`)
- Bumped version to 0.1.80.
2025-08-03 18:10:32 -04:00

74 lines
2.6 KiB
Python

import pytest
from prompt_toolkit.document import Document
from prompt_toolkit.validation import ValidationError
from falyx.validators import MultiIndexValidator
def test_multi_index_validator_accepts_valid_indices():
validator = MultiIndexValidator(
1, 5, number_selections=3, separator=",", allow_duplicates=False, cancel_key="C"
)
for valid in ["1,2,3", "2,3,4", "1,4,5"]:
validator.validate(Document(valid))
def test_multi_index_validator_rejects_invalid_indices():
validator = MultiIndexValidator(
1, 5, number_selections=3, separator=",", allow_duplicates=False, cancel_key="C"
)
with pytest.raises(ValidationError):
validator.validate(Document("A,!,F"))
with pytest.raises(ValidationError):
validator.validate(Document("0,6,7"))
with pytest.raises(ValidationError):
validator.validate(Document("1,2,2"))
def test_multi_index_validator_rejects_invalid_number_of_selections():
validator = MultiIndexValidator(
1, 5, number_selections=3, separator=",", allow_duplicates=False, cancel_key="C"
)
with pytest.raises(ValidationError):
validator.validate(Document("1,2"))
with pytest.raises(ValidationError):
validator.validate(Document("1,2,3,4"))
validator = MultiIndexValidator(
1, 5, number_selections=1, separator=",", allow_duplicates=False, cancel_key="C"
)
validator.validate(Document("1"))
with pytest.raises(ValidationError):
validator.validate(Document("2,3"))
def test_multi_index_validator_cancel_key():
validator = MultiIndexValidator(
1, 5, number_selections=3, separator=",", allow_duplicates=False, cancel_key="C"
)
validator.validate(Document("C"))
def test_multi_index_validator_cancel_alone():
validator = MultiIndexValidator(
1, 5, number_selections=3, separator=",", allow_duplicates=False, cancel_key="C"
)
with pytest.raises(ValidationError):
validator.validate(Document("1,C"))
def test_multi_index_validator_empty_input():
validator = MultiIndexValidator(
1, 5, number_selections=3, separator=",", allow_duplicates=False, cancel_key="C"
)
with pytest.raises(ValidationError):
validator.validate(Document(""))
def test_multi_index_validator_error_message_for_duplicates():
validator = MultiIndexValidator(
1, 5, number_selections=3, separator=",", allow_duplicates=False, cancel_key="C"
)
with pytest.raises(ValidationError) as e:
validator.validate(Document("1,1,2"))
assert "Duplicate selection" in str(e.value)