Files
cleveragents-core/features/tui_conversation_module_coverage.feature
drew ffac6be326
CI / load-versions (pull_request) Successful in 16s
CI / push-validation (pull_request) Successful in 24s
CI / lint (pull_request) Successful in 50s
CI / quality (pull_request) Successful in 57s
CI / typecheck (pull_request) Successful in 1m3s
CI / security (pull_request) Successful in 1m4s
CI / build (pull_request) Successful in 43s
CI / helm (pull_request) Successful in 40s
CI / unit_tests (pull_request) Successful in 7m7s
CI / docker (pull_request) Successful in 2m11s
CI / integration_tests (pull_request) Successful in 11m38s
CI / coverage (pull_request) Successful in 10m18s
CI / status-check (pull_request) Successful in 3s
fix(tui): count conversation separators for pruning
2026-06-17 00:57:52 -04:00

142 lines
7.2 KiB
Gherkin

Feature: TUI conversation module coverage
Directly exercises the cleveragents.tui.conversation module to cover
pruning hysteresis, settings clamping, persistence loading, and edge
cases that the high-level TUI scenarios do not reach.
@tdd_issue @tdd_issue_6350
Scenario: Default ConversationSettings derive trigger_line_count from low_mark and excess
When I build default ConversationSettings
Then conversation settings prune_low_mark should equal 1500
And conversation settings prune_excess should equal 1000
And conversation settings trigger_line_count should equal 2500
@tdd_issue @tdd_issue_6350
Scenario: ConversationSettings clamps prune_low_mark below the minimum
When I build ConversationSettings with prune_low_mark 10 prune_excess 200 preserve_recent_lines 50
Then conversation settings prune_low_mark should equal 100
And conversation settings prune_excess should equal 200
And conversation settings preserve_recent_lines should equal 50
@tdd_issue @tdd_issue_6350
Scenario: ConversationSettings clamps prune_low_mark above the maximum
When I build ConversationSettings with prune_low_mark 99999 prune_excess 200 preserve_recent_lines 50
Then conversation settings prune_low_mark should equal 10000
@tdd_issue @tdd_issue_6350
Scenario: ConversationSettings clamps prune_excess below the minimum
When I build ConversationSettings with prune_low_mark 500 prune_excess 1 preserve_recent_lines 50
Then conversation settings prune_excess should equal 10
@tdd_issue @tdd_issue_6350
Scenario: ConversationSettings clamps prune_excess above the maximum
When I build ConversationSettings with prune_low_mark 500 prune_excess 99999 preserve_recent_lines 50
Then conversation settings prune_excess should equal 5000
@tdd_issue @tdd_issue_6350
Scenario: ConversationSettings clamps preserve_recent_lines below zero
When I build ConversationSettings with prune_low_mark 500 prune_excess 100 preserve_recent_lines -25
Then conversation settings preserve_recent_lines should equal 0
@tdd_issue @tdd_issue_6350
Scenario: ConversationBlock line_count counts trailing newlines and empty text
Then a conversation block with text "alpha" should have line count 1
And a conversation block with text "alpha\nbeta" should have line count 2
And a conversation block with empty text should have line count 0
@tdd_issue @tdd_issue_6350
Scenario: ConversationStream bootstrap installs a protected welcome block
Given a fresh ConversationStream with default settings
When I bootstrap the stream with welcome text "Hello world"
Then the stream should have exactly 1 block
And the stream total_lines should be greater than zero
And the stream rendered text should contain "Hello world"
@tdd_issue @tdd_issue_6350
Scenario: ConversationStream clear empties blocks and resets total_lines
Given a fresh ConversationStream with default settings
When I bootstrap the stream with welcome text "Hello"
And I clear the stream
Then the stream should have exactly 0 blocks
And the stream total_lines should be zero
@tdd_issue @tdd_issue_6350
Scenario: ConversationStream extend appends multiple blocks
Given a fresh ConversationStream with default settings
When I extend the stream with 3 plain message blocks
Then the stream should have exactly 3 blocks
And the stream rendered text should contain "extend-block-2"
@tdd_issue @tdd_issue_6350
Scenario: ConversationStream renders markup blocks verbatim and escapes plain blocks
Given a fresh ConversationStream with default settings
When I add a plain block "[red]plain[/]" to the stream
And I add a markup block "[red]styled[/]" to the stream
Then the stream rendered text should contain "[red]styled[/]"
And the stream rendered plain segment should be backslash escaped
@tdd_issue @tdd_issue_6350
Scenario: ConversationStream skips empty-text blocks during render
Given a fresh ConversationStream with default settings
When I add an empty plain block to the stream
And I add a plain block "after-empty" to the stream
Then the stream rendered text should equal "after-empty"
@tdd_issue @tdd_issue_6350
Scenario: ConversationStream pruning preserves protected blocks
Given a fresh ConversationStream with low_mark 200 excess 50 preserve_recent_lines 100
When I bootstrap the stream with welcome text "Protected welcome"
And I deliver 4 plain blocks of 200 lines each through add_block
Then the stream rendered text should contain "Protected welcome"
And the stream total_lines should be less than or equal to 350
@tdd_issue @tdd_issue_6350
Scenario: ConversationStream pruning counts rendered separators between blocks
Given a fresh ConversationStream with low_mark 100 excess 50 preserve_recent_lines 0
When I deliver 100 plain blocks of 1 lines each through add_block
Then the stream should have exactly 1 note block
And the stream rendered text should not contain "plain-1-line-1"
And the stream total_lines should equal the rendered line count
And the stream rendered line count should be less than or equal to 150
@tdd_issue @tdd_issue_6350
Scenario: ConversationStream pruning updates the note in place rather than re-inserting
Given a fresh ConversationStream with low_mark 200 excess 50 preserve_recent_lines 100
When I deliver 8 plain blocks of 200 lines each through add_block
Then the stream should have exactly 1 note block
@tdd_issue @tdd_issue_6350
Scenario: ConversationStream pruning with preserve_recent_lines zero allows full prune
Given a fresh ConversationStream with low_mark 200 excess 50 preserve_recent_lines 0
When I deliver 6 plain blocks of 200 lines each through add_block
Then the stream total_lines should be less than or equal to 250
@tdd_issue @tdd_issue_6350
Scenario: load_conversation_settings returns defaults when the config file is absent
When I load conversation settings from a missing config path
Then loaded settings prune_low_mark should equal 1500
And loaded settings prune_excess should equal 1000
@tdd_issue @tdd_issue_6350
Scenario: load_conversation_settings returns defaults when the config file is malformed JSON
When I load conversation settings from a malformed JSON config
Then loaded settings prune_low_mark should equal 1500
And loaded settings prune_excess should equal 1000
@tdd_issue @tdd_issue_6350
Scenario: load_conversation_settings honours explicit ui values
When I load conversation settings from a config with low_mark 800 excess 400
Then loaded settings prune_low_mark should equal 800
And loaded settings prune_excess should equal 400
@tdd_issue @tdd_issue_6350
Scenario: load_conversation_settings returns defaults when ui values are non-numeric
When I load conversation settings from a config with non-numeric values
Then loaded settings prune_low_mark should equal 1500
And loaded settings prune_excess should equal 1000
@tdd_issue @tdd_issue_6350
Scenario: load_conversation_settings returns defaults when payload is not a dict
When I load conversation settings from a list-valued JSON config
Then loaded settings prune_low_mark should equal 1500
And loaded settings prune_excess should equal 1000