Background
PR #548 introduced settings fixture profiles for QA testing under
packages/rangelink-vscode-extension/qa/fixtures/settings/. These are
JSON files that set specific rangelink configuration values and are loaded
by integration tests via loadSettingsProfile().
Four profiles exist:
clipboard-never.json -- rangelink.clipboard.preserve = "never"
no-dirty-warning.json -- rangelink.warnOnDirtyBuffer = false
terminal-picker-low.json -- rangelink.terminalPicker.maxInline = 2
custom-delimiters.json -- rangelink.delimiterLine = "@l",
rangelink.delimiterPosition = "@c"
The QA Gap Check bot (PR #548 review comment) flagged that these profiles
need corresponding QA YAML test cases.
Existing Coverage Snapshot
clipboard-never
- Integration test
clipboard-preservation-007 (NOT [assisted], fully
automated) already calls loadSettingsProfile('clipboard-never', log).
- YAML TC
clipboard-preservation-006 tests never-mode R-L behavior
(automated: true) but uses direct .update() in the test, not the
fixture profile.
- YAML TC
clipboard-preservation-007 tests never-mode R-V behavior
(automated: false).
no-dirty-warning
- Integration test
dirty-buffer-warning-004 tests
warnOnDirtyBuffer=false via direct .update() (automated: true).
- Integration test
dirty-buffer-warning-008 (assisted) and
dirty-buffer-warning-018 (assisted) also test warnOnDirtyBuffer=false
via direct .update().
- NO integration test currently uses
loadSettingsProfile('no-dirty-warning').
terminal-picker-low
- Integration test
terminal-picker-011 (assisted) already calls
loadSettingsProfile('terminal-picker-low', log).
- YAML TCs
terminal-picker-008 through terminal-picker-011 cover
overflow and maxInline behavior.
custom-delimiters
- No integration test uses
loadSettingsProfile('custom-delimiters').
- One unit-like test (
clickable-file-paths-012 in
filePathDetection.test.ts) verifies that the custom delimiter @l is
not confused with a plain file path.
- No QA YAML test cases exist for custom delimiter behavior at all.
Proposed Test Cases
All TCs would go in a new "Settings Profiles" section in the QA YAML file,
using the feature slug settings-profiles-*. Since no existing TCs use this
slug, numbering starts at -001.
1. settings-profiles-001 — clipboard-never profile loads and takes effect
Description: Load the clipboard-never fixture profile via
loadSettingsProfile() and verify the config value is set
Feature: Settings Profiles (cross-ref: Clipboard Preservation)
Preconditions:
- Extension installed
- Default settings active (clipboard.preserve undefined)
Steps:
1. Execute loadSettingsProfile('clipboard-never')
2. Read rangelink.clipboard.preserve via config API
3. Reset to default
Expected result: The value is "never". Verifies the fixture profile is
well-formed and the loadSettingsProfile helper works for
string-valued settings.
Automated: assisted
Reasoning: The integration test suite already exercises the
clipboard-never fixture in clipboard-preservation-007
(which is fully automated) and terminal-picker-011
(assisted). This TC is a safety net that explicitly
validates the profile file on its own terms, catching
corruption or schema regressions without depending on
the full clipboard send-receive flow.
2. settings-profiles-002 — no-dirty-warning profile loads and takes effect
Description: Load the no-dirty-warning fixture profile and verify the
config value is set
Feature: Settings Profiles (cross-ref: Dirty Buffer Warning)
Preconditions:
- Extension installed
- Default settings active (warnOnDirtyBuffer undefined)
Steps:
1. Execute loadSettingsProfile('no-dirty-warning')
2. Read rangelink.warnOnDirtyBuffer via config API
3. Reset to default
Expected result: The value is false. Verifies the fixture profile works
for boolean-valued settings.
Automated: assisted
Reasoning: Unlike clipboard-never and terminal-picker-low, no
integration test currently calls
loadSettingsProfile('no-dirty-warning'). The existing
dirty buffer tests set the value via direct
.update(). This TC ensures the fixture file itself
is valid.
3. settings-profiles-003 — terminal-picker-low profile loads and takes effect
Description: Load the terminal-picker-low fixture profile and verify
the config value is set
Feature: Settings Profiles (cross-ref: Terminal Picker)
Preconditions:
- Extension installed
- Default settings active (maxInline undefined, defaults to 5)
Steps:
1. Execute loadSettingsProfile('terminal-picker-low')
2. Read rangelink.terminalPicker.maxInline via config API
3. Reset to default
Expected result: The value is 2. Verifies the fixture profile works for
integer-valued settings.
Automated: assisted
Reasoning: Already exercised indirectly by terminal-picker-011.
This TC makes the fixture validation explicit and
documents it in the QA YAML.
4. settings-profiles-004 — custom-delimiters profile loads and takes effect
Description: Load the custom-delimiters fixture profile and verify
both delimiter settings are applied
Feature: Settings Profiles (cross-ref: Delimiters)
Preconditions:
- Extension installed
- Default delimiters active (line='L', position='C')
Steps:
1. Execute loadSettingsProfile('custom-delimiters')
2. Read rangelink.delimiterLine via config API
3. Read rangelink.delimiterPosition via config API
4. Reset to default
Expected result: delimiterLine = "@l", delimiterPosition = "@c"
Automated: assisted
Reasoning: No existing test loads this profile. The fixture
contains two interrelated settings, so this TC catches
partial-load bugs where one setting is applied but the
other is not.
5. settings-profiles-005 — Generate RangeLink using custom delimiters
Description: With custom-delimiters profile active, generate a link
for a selected file range and verify the output uses @l
and @c instead of default L and C
Feature: Settings Profiles (cross-ref: Delimiters)
Preconditions:
- custom-delimiters profile loaded
- Terminal bound as destination
- File with 5+ lines open, character-level selection made
Steps:
1. Load custom-delimiters profile
2. Select e.g. lines 3-4 in the file
3. Press Cmd+R Cmd+L
4. Observe the link sent to the terminal
Expected result: The generated link uses custom delimiters, e.g.
src/file.ts#@l3-@l4 (for line) or
src/file.ts#@l3@c5-@L4@c10 (with columns). The
default L and C do NOT appear.
Automated: assisted
Reasoning: This is the primary behavioral TC for the
custom-delimiters profile. It requires human
verification of the output format in the terminal
buffer (or could be automated via a log-based
assertion in an [assisted] integration test).
6. settings-profiles-006 — Navigate RangeLink with custom delimiters via R-G
Description: With custom-delimiters profile active, use R-G to
navigate to a RangeLink formatted with @l/@c delimiters
Feature: Settings Profiles (cross-ref: Delimiters, R-G Go to Link)
Preconditions:
- custom-delimiters profile loaded
- A file with content accessible (e.g., src/file.ts)
Steps:
1. Load custom-delimiters profile
2. Press Cmd+R Cmd+G
3. Type or paste: src/file.ts#@l3-@l5
4. Press Enter
5. Observe the editor
Expected result: VS Code navigates to src/file.ts and selects lines
3-5. The R-G parser correctly interprets @l as the
line delimiter.
Automated: false
Reasoning: Requires observing the editor tab switch and selection.
The navigation path with custom delimiters involves the
full R-G input flow, which is currently only exercised
manually.
7. settings-profiles-007 — Load default profile resets settings to baseline
Description: After loading a custom profile, load the default profile
and verify settings revert to their default values
Feature: Settings Profiles
Preconditions:
- Extension installed
- clipboard-never profile loaded (clipboard.preserve = "never")
Steps:
1. Verify clipboard.preserve = "never" (from previous profile)
2. Load the default settings profile
3. Read clipboard.preserve via config API
Expected result: clipboard.preserve is undefined (default). Verifies
that profiles can be overridden and reset cleanly.
Automated: assisted
Reasoning: Ensures the fixture mechanism properly overwrites
previous settings. Mitigates risk of stale profile
state leaking between test runs.
Summary Table
| TC ID |
Profile |
Automated |
New infra needed |
| settings-profiles-001 |
clipboard-never |
assisted |
No |
| settings-profiles-002 |
no-dirty-warning |
assisted |
No |
| settings-profiles-003 |
terminal-picker-low |
assisted |
No |
| settings-profiles-004 |
custom-delimiters |
assisted |
No |
| settings-profiles-005 |
custom-delimiters |
assisted |
Yes (new test) |
| settings-profiles-006 |
custom-delimiters |
false |
No |
| settings-profiles-007 |
(cross-profile) |
assisted |
No (uses default profile) |
Implementation Notes
a) Profile-loading TCs (001-004) follow the same pattern and could share
a single [assisted] integration test that iterates over all four
fixture files, reads each back, and asserts the value.
b) TCs 005-006 are the only ones that require new integration test code.
TC 005 could reuse the clipboard-preservation harness pattern (bind a
capturing terminal, execute R-L, dump captured buffer) but would need
a new test in a new suite file or in a new section of an existing
suite.
c) TC 007 requires a default.json fixture file. If one does not yet
exist in qa/fixtures/settings/, it needs to be created. Alternatively,
the test can use resetRangelinkSettings() from settingsHelpers.ts
instead of a default profile.
d) After the proposal is approved, the new TCs should be appended to the
latest QA YAML file following the copy-forward pattern (QA002, QA003,
QA004), not edited into the existing v1.1.0 file.
Background
PR #548 introduced settings fixture profiles for QA testing under
packages/rangelink-vscode-extension/qa/fixtures/settings/. These areJSON files that set specific rangelink configuration values and are loaded
by integration tests via
loadSettingsProfile().Four profiles exist:
clipboard-never.json-- rangelink.clipboard.preserve = "never"no-dirty-warning.json-- rangelink.warnOnDirtyBuffer = falseterminal-picker-low.json-- rangelink.terminalPicker.maxInline = 2custom-delimiters.json-- rangelink.delimiterLine = "@l",rangelink.delimiterPosition = "@c"
The QA Gap Check bot (PR #548 review comment) flagged that these profiles
need corresponding QA YAML test cases.
Existing Coverage Snapshot
clipboard-never
clipboard-preservation-007(NOT [assisted], fullyautomated) already calls
loadSettingsProfile('clipboard-never', log).clipboard-preservation-006tests never-mode R-L behavior(automated: true) but uses direct
.update()in the test, not thefixture profile.
clipboard-preservation-007tests never-mode R-V behavior(automated: false).
no-dirty-warning
dirty-buffer-warning-004testswarnOnDirtyBuffer=false via direct
.update()(automated: true).dirty-buffer-warning-008(assisted) anddirty-buffer-warning-018(assisted) also test warnOnDirtyBuffer=falsevia direct
.update().loadSettingsProfile('no-dirty-warning').terminal-picker-low
terminal-picker-011(assisted) already callsloadSettingsProfile('terminal-picker-low', log).terminal-picker-008throughterminal-picker-011coveroverflow and maxInline behavior.
custom-delimiters
loadSettingsProfile('custom-delimiters').clickable-file-paths-012infilePathDetection.test.ts) verifies that the custom delimiter
@lisnot confused with a plain file path.
Proposed Test Cases
All TCs would go in a new "Settings Profiles" section in the QA YAML file,
using the feature slug
settings-profiles-*. Since no existing TCs use thisslug, numbering starts at
-001.1. settings-profiles-001 — clipboard-never profile loads and takes effect
Description: Load the clipboard-never fixture profile via
loadSettingsProfile() and verify the config value is set
Feature: Settings Profiles (cross-ref: Clipboard Preservation)
Preconditions:
- Extension installed
- Default settings active (clipboard.preserve undefined)
Steps:
1. Execute loadSettingsProfile('clipboard-never')
2. Read rangelink.clipboard.preserve via config API
3. Reset to default
Expected result: The value is "never". Verifies the fixture profile is
well-formed and the loadSettingsProfile helper works for
string-valued settings.
Automated: assisted
Reasoning: The integration test suite already exercises the
clipboard-never fixture in clipboard-preservation-007
(which is fully automated) and terminal-picker-011
(assisted). This TC is a safety net that explicitly
validates the profile file on its own terms, catching
corruption or schema regressions without depending on
the full clipboard send-receive flow.
2. settings-profiles-002 — no-dirty-warning profile loads and takes effect
Description: Load the no-dirty-warning fixture profile and verify the
config value is set
Feature: Settings Profiles (cross-ref: Dirty Buffer Warning)
Preconditions:
- Extension installed
- Default settings active (warnOnDirtyBuffer undefined)
Steps:
1. Execute loadSettingsProfile('no-dirty-warning')
2. Read rangelink.warnOnDirtyBuffer via config API
3. Reset to default
Expected result: The value is false. Verifies the fixture profile works
for boolean-valued settings.
Automated: assisted
Reasoning: Unlike clipboard-never and terminal-picker-low, no
integration test currently calls
loadSettingsProfile('no-dirty-warning'). The existing
dirty buffer tests set the value via direct
.update(). This TC ensures the fixture file itselfis valid.
3. settings-profiles-003 — terminal-picker-low profile loads and takes effect
Description: Load the terminal-picker-low fixture profile and verify
the config value is set
Feature: Settings Profiles (cross-ref: Terminal Picker)
Preconditions:
- Extension installed
- Default settings active (maxInline undefined, defaults to 5)
Steps:
1. Execute loadSettingsProfile('terminal-picker-low')
2. Read rangelink.terminalPicker.maxInline via config API
3. Reset to default
Expected result: The value is 2. Verifies the fixture profile works for
integer-valued settings.
Automated: assisted
Reasoning: Already exercised indirectly by terminal-picker-011.
This TC makes the fixture validation explicit and
documents it in the QA YAML.
4. settings-profiles-004 — custom-delimiters profile loads and takes effect
Description: Load the custom-delimiters fixture profile and verify
both delimiter settings are applied
Feature: Settings Profiles (cross-ref: Delimiters)
Preconditions:
- Extension installed
- Default delimiters active (line='L', position='C')
Steps:
1. Execute loadSettingsProfile('custom-delimiters')
2. Read rangelink.delimiterLine via config API
3. Read rangelink.delimiterPosition via config API
4. Reset to default
Expected result: delimiterLine = "@l", delimiterPosition = "@c"
Automated: assisted
Reasoning: No existing test loads this profile. The fixture
contains two interrelated settings, so this TC catches
partial-load bugs where one setting is applied but the
other is not.
5. settings-profiles-005 — Generate RangeLink using custom delimiters
Description: With custom-delimiters profile active, generate a link
for a selected file range and verify the output uses @l
and @c instead of default L and C
Feature: Settings Profiles (cross-ref: Delimiters)
Preconditions:
- custom-delimiters profile loaded
- Terminal bound as destination
- File with 5+ lines open, character-level selection made
Steps:
1. Load custom-delimiters profile
2. Select e.g. lines 3-4 in the file
3. Press Cmd+R Cmd+L
4. Observe the link sent to the terminal
Expected result: The generated link uses custom delimiters, e.g.
src/file.ts#@l3-@l4 (for line) or
src/file.ts#@l3@c5-@L4@c10 (with columns). The
default
LandCdo NOT appear.Automated: assisted
Reasoning: This is the primary behavioral TC for the
custom-delimiters profile. It requires human
verification of the output format in the terminal
buffer (or could be automated via a log-based
assertion in an [assisted] integration test).
6. settings-profiles-006 — Navigate RangeLink with custom delimiters via R-G
Description: With custom-delimiters profile active, use R-G to
navigate to a RangeLink formatted with @l/@c delimiters
Feature: Settings Profiles (cross-ref: Delimiters, R-G Go to Link)
Preconditions:
- custom-delimiters profile loaded
- A file with content accessible (e.g., src/file.ts)
Steps:
1. Load custom-delimiters profile
2. Press Cmd+R Cmd+G
3. Type or paste: src/file.ts#@l3-@l5
4. Press Enter
5. Observe the editor
Expected result: VS Code navigates to src/file.ts and selects lines
3-5. The R-G parser correctly interprets @l as the
line delimiter.
Automated: false
Reasoning: Requires observing the editor tab switch and selection.
The navigation path with custom delimiters involves the
full R-G input flow, which is currently only exercised
manually.
7. settings-profiles-007 — Load default profile resets settings to baseline
Description: After loading a custom profile, load the default profile
and verify settings revert to their default values
Feature: Settings Profiles
Preconditions:
- Extension installed
- clipboard-never profile loaded (clipboard.preserve = "never")
Steps:
1. Verify clipboard.preserve = "never" (from previous profile)
2. Load the default settings profile
3. Read clipboard.preserve via config API
Expected result: clipboard.preserve is undefined (default). Verifies
that profiles can be overridden and reset cleanly.
Automated: assisted
Reasoning: Ensures the fixture mechanism properly overwrites
previous settings. Mitigates risk of stale profile
state leaking between test runs.
Summary Table
Implementation Notes
a) Profile-loading TCs (001-004) follow the same pattern and could share
a single [assisted] integration test that iterates over all four
fixture files, reads each back, and asserts the value.
b) TCs 005-006 are the only ones that require new integration test code.
TC 005 could reuse the clipboard-preservation harness pattern (bind a
capturing terminal, execute R-L, dump captured buffer) but would need
a new test in a new suite file or in a new section of an existing
suite.
c) TC 007 requires a
default.jsonfixture file. If one does not yetexist in
qa/fixtures/settings/, it needs to be created. Alternatively,the test can use
resetRangelinkSettings()from settingsHelpers.tsinstead of a default profile.
d) After the proposal is approved, the new TCs should be appended to the
latest QA YAML file following the copy-forward pattern (QA002, QA003,
QA004), not edited into the existing v1.1.0 file.