Skip to content

RFC 014 - Command-line option mappings - #8501

Merged
Amaury Levé (Evangelink) merged 2 commits into
mainfrom
dev/amauryleve/rfc-cli-option-mappings
May 23, 2026
Merged

RFC 014 - Command-line option mappings#8501
Amaury Levé (Evangelink) merged 2 commits into
mainfrom
dev/amauryleve/rfc-cli-option-mappings

Conversation

@Evangelink

Copy link
Copy Markdown
Member

Adds RFC 014 proposing command-line option mappings: a new extensibility point that lets an extension declaratively accept a user-facing option (e.g. --logger trx, --collect ""XPlat Code Coverage"") and rewrite it, at parse time, into one or more first-class MTP options.

Why

The primary scenario is easing migration from VSTest to MTP. Today, dotnet test --logger trx --collect ""XPlat Code Coverage"" produces Unknown option against MTP — correct but unhelpful for the very large body of CI pipelines and tribal knowledge built around VSTest syntax.

The existing ICommandLineOptionsProvider contract intentionally forbids two extensions from registering the same option name. --logger and --collect are however intrinsically polyvalent: the value selects which extension owns the option. A new concept is therefore needed.

What's in the RFC

  • Naming rationale (Mapping over Alias/Transformation/Shim/Legacy…), explicitly addressing the alias-vs-rewrite discussion from [Proposal]: MTP Command-line aliases #7249.
  • Public API surface: ICommandLineOptionMappingProvider, CommandLineOptionMapping, CommandLineOptionMapper delegate (TryHandle style), CommandLineOptionMappingResult.
  • Resolution algorithm: mappings run after response-file expansion, before validation. Zero claimants → error. Multiple claimants → error. Exactly one → rewrite.
  • Worked examples for TRX (including trx;LogFileName=…) and Code Coverage.
  • Cross-cutting validation: mappings cannot collide with canonical option names, cannot rewrite to unknown options, cannot rewrite to other mappings (no loops).
  • Compatibility analysis, 5 rejected alternatives, 5-phase rollout, 5 unresolved questions.

Discussion seeds

Specific points where reviewer input would be most valuable:

  1. Naming — keep Mapping, or switch back to Alias (familiar) or Transformation (most accurate)?
  2. Help layout — separate ""VSTest-style options"" section, or interleave with canonical options?
  3. Warning channel — should TryMap get an out List<string> warnings parameter in v1, or defer?
  4. Telemetry — log only used_compat_mapping: bool, or include allowlisted values?

Refs #7249 — this PR provides the design artefact requested by the issue; implementation will follow in a separate PR once the RFC is approved.

Introduces a proposal for command-line option mappings: a new extensibility
point that lets an extension declaratively accept a user-facing option
(e.g. `--logger trx`, `--collect "XPlat Code Coverage"`) and rewrite
it, at parse time, into one or more first-class MTP options.
The primary scenario is easing migration from VSTest to MTP without
polluting the canonical MTP option set. Multiple extensions are allowed
to register the same mapping name, with exactly one expected to claim
responsibility for a given argument value.
Refs #7249
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Adds a new design RFC to the docs/RFCs area proposing command-line option mappings for Microsoft.Testing.Platform (MTP): an extensibility point allowing VSTest-style options like --logger trx / --collect ... to be rewritten into canonical MTP options during parsing to ease migration.

Changes:

  • Introduces an RFC describing the motivation, naming, proposed public API, and resolution/validation algorithm for command-line option mappings.
  • Provides worked examples (TRX and code coverage) and outlines help/info/telemetry implications plus a phased rollout plan.
Show a summary per file
FileDescription
docs/RFCs/014-Command-Line-Option-Mappings.mdNew RFC document defining the proposed “command-line option mappings” concept, API surface, and behavior.

Copilot's findings

  • Files reviewed: 1/1 changed files
  • Comments generated: 5

Comment threaddocs/RFCs/014-Command-Line-Option-Mappings.md Outdated
Comment threaddocs/RFCs/014-Command-Line-Option-Mappings.md Outdated
Comment threaddocs/RFCs/014-Command-Line-Option-Mappings.md Outdated
Comment threaddocs/RFCs/014-Command-Line-Option-Mappings.md Outdated
Comment threaddocs/RFCs/014-Command-Line-Option-Mappings.md Outdated

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

RFC 014 Review Summary

I've reviewed RFC 014 - Command-line option mappings against 21 expert review dimensions. The RFC proposes a well-motivated solution to a real migration pain point (VSTest → MTP compatibility), with strong design principles and thorough alternatives analysis. However, critical issues in the proposed API design require changes before approval.

Verdict Table

#DimensionVerdict
1Public API & Binary Compatibility🔴 1 BLOCKING, 2 MODERATE
2Defensive Coding at Boundaries🔴 2 BLOCKING, 2 MAJOR
3Algorithmic Correctness🟡 2 MAJOR
4Naming & Conventions⚪ 2 NIT
5Documentation Accuracy⚪ 1 NIT
6Performance & Allocations🟡 1 MODERATE (covered above)

✅ 15/21 dimensions clean.


Critical Issues (Must Fix Before Approval)

🔴 BLOCKING #1: Delegate signature prevents future evolution and lacks safety

Location: Lines 117-119 (CommandLineOptionMapper delegate)

Problems:

  1. Cannot add warnings later: RFC acknowledges (line 350) wanting to add warnings, but adding an out parameter to a delegate is a breaking change
  2. No exception handling: Extension throws → platform crash during startup
  3. No result validation: Extension returns true with result = null → NullReferenceException
  4. No timeout: Extension infinite loop → platform hangs indefinitely

Fix: Replace bool return + out parameter with a result struct that can carry warnings in future versions:

publicdelegateCommandLineOptionMapperResultCommandLineOptionMapper(ReadOnlySpan<string>arguments);publicreadonlystructCommandLineOptionMapperResult{publicboolSuccess{get;init;}publicIReadOnlyList<CommandLineOptionMappingResult>Results{get;init;}// Future: public IReadOnlyList<string> Warnings { get; init; }}

Add defensive wrapping (try/catch, validation, timeout) to the RFC's algorithm section.

🔴 BLOCKING #2: Naming inconsistency in manager pattern

Location: Lines 141, 149

Problem: ICommandLineMappingsManager uses plural "Mappings", breaking the universal MTP pattern: ICommandLineManager, ITestHostManager, IConfigurationManager, ILoggingManager (all singular).

Fix: Rename to ICommandLineMappingManager (singular). Update property name to CommandLineMapping to match the TestHost / ITestHostManager pattern.


Major Issues (Should Fix)

🟡 Algorithmic correctness gaps (2 issues)

  1. Empty result list undefined (line 246): What if TryMap returns true with empty results? Does occurrence get deleted?
  2. Runtime validation missing (line 258): Validation rules claim "enforced at startup" but can't detect invalid OptionName until runtime

Fix: Specify behavior for empty results (error recommended). Add runtime validation step in algorithm.

🟡 Defensive coding gaps (2 more issues beyond BLOCKING)

  1. Unbounded growth (line 192): Example code splits on ; with no limits → 100K segments from malicious input
  2. Malformed sub-options (line 194): No guidance on handling trx;LogFileName= (empty value)

Fix: Add defensive limits to examples (max segments, length checks). Document error handling approach for malformed sub-options.


Moderate Issues (Recommended Fixes)

Constructor design (line 126)

  1. params blocks future evolution: Can't add optional parameters after params array
  2. Unnecessary allocation: params creates array wrapper even for zero-argument cases

Fix: Add non-params overload for zero-argument case and explicit IReadOnlyList<string> overload.


Summary

Strong points:

  • Clear problem statement and motivation
  • Thorough alternatives analysis (5 rejected options)
  • Well-defined design principles
  • Comprehensive phasing plan
  • Threading/concurrency design is sound (synchronous, pre-DI, single-threaded startup)

Must address before approval:

  • Delegate signature evolution strategy (warnings, safety)
  • Naming consistency with existing patterns
  • Algorithm specification completeness (empty results, runtime validation)
  • Defensive coding guidance (limits, error handling)

The core concept is sound and valuable. The issues are fixable refinements to the API design, not fundamental flaws. Recommend addressing BLOCKING issues and reconsidering the MAJOR issues before moving to implementation.


Review dimensions not applicable to RFC: Test Isolation, Assertion Quality, Flakiness Patterns, Data-Driven Test Coverage, Analyzer Quality, IPC Wire Compatibility, Resource Management, Localization, Build Infrastructure, Cross-TFM Compatibility (these apply to implementation, not design docs).

Generated by Expert Code Review (on open) for issue #8501 · ● 22.6M

Comment threaddocs/RFCs/015-Command-Line-Option-Mappings.md
Comment threaddocs/RFCs/014-Command-Line-Option-Mappings.md Outdated
Comment threaddocs/RFCs/015-Command-Line-Option-Mappings.md
Comment threaddocs/RFCs/015-Command-Line-Option-Mappings.md
Comment threaddocs/RFCs/014-Command-Line-Option-Mappings.md Outdated
Comment threaddocs/RFCs/014-Command-Line-Option-Mappings.md Outdated
Comment threaddocs/RFCs/014-Command-Line-Option-Mappings.md Outdated
- Renumber to 015 to avoid collision with the existing
014-TestRun-Current-PlannedTests RFC.
- Align Naming section with the actual proposed types
(ICommandLineOptionMappingProvider / ICommandLineMappingManager,
matching the singular convention used elsewhere).
- Fix the broken <see cref="TryMap"/> reference to point at the Map
property.
- Make the TRX example case-insensitive for both the exact "trx" check
and the "trx;" prefix, matching VSTest-compat expectations.
- Replace ReadOnlySpan<string> with IReadOnlyList<string> in the public
delegate; the platform targets netstandard2.0 and Span-shaped APIs add
a System.Memory dependency to the public surface for limited benefit.
- Replace params string[] with IReadOnlyList<string> in
CommandLineOptionMappingResult to keep the constructor open for future
parameters and avoid unnecessary array allocations for the (common)
zero/one-argument case.
- Document the empty-result contract violation explicitly and split
startup-time vs runtime cross-cutting validation rules so the RFC
matches what can actually be enforced when the Map delegate is opaque.
- Expand the TRX example with malformed-segment handling and a sub-
option cap to address the defensive-coding concerns about unbounded
user input.
- Note in Unresolved Questions that adding an out-parameter to the
delegate is a binary-breaking change, so the warning-channel decision
must be made before shipping (or absorbed via a sibling delegate).
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
@Evangelink
Amaury Levé (Evangelink) merged commit e5e85a3 into mainMay 23, 2026
190 checks passed
@Evangelink
Amaury Levé (Evangelink) deleted the dev/amauryleve/rfc-cli-option-mappings branch May 23, 2026 15:45
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

type/rfcRequest for comments.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@Evangelink
, 'i'); if (__m === '*' || __re.test(location.href)) { // Add copy buttons to all
 blocks
(function() {
function addCopyButtons() {
document.querySelectorAll('pre code').forEach(function(codeBlock) {
if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;
codeBlock.parentElement.setAttribute('data-copy-added', 'true');
var btn = document.createElement('button');
btn.textContent = 'Copy';
btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';
btn.onmouseover = function() { this.style.opacity = '1'; };
btn.onmouseout = function() { this.style.opacity = '0.7'; };
btn.onclick = function() {
navigator.clipboard.writeText(codeBlock.textContent).then(function() {
btn.textContent = 'Copied!';
setTimeout(function() { btn.textContent = 'Copy'; }, 1500);
});
};
codeBlock.parentElement.style.position = 'relative';
codeBlock.parentElement.appendChild(btn);
});
}
addCopyButtons();
// Re-run on dynamic content
var observer = new MutationObserver(addCopyButtons);
observer.observe(document.body, { childList: true, subtree: true });
})();
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
RFC 014 - Command-line option mappings by Evangelink · Pull Request #8501 · microsoft/testfx · GitHub
Skip to content

RFC 014 - Command-line option mappings - #8501

Merged
Amaury Levé (Evangelink) merged 2 commits into
mainfrom
dev/amauryleve/rfc-cli-option-mappings
May 23, 2026
Merged

RFC 014 - Command-line option mappings#8501
Amaury Levé (Evangelink) merged 2 commits into
mainfrom
dev/amauryleve/rfc-cli-option-mappings

Conversation

@Evangelink

Copy link
Copy Markdown
Member

Adds RFC 014 proposing command-line option mappings: a new extensibility point that lets an extension declaratively accept a user-facing option (e.g. --logger trx, --collect ""XPlat Code Coverage"") and rewrite it, at parse time, into one or more first-class MTP options.

Why

The primary scenario is easing migration from VSTest to MTP. Today, dotnet test --logger trx --collect ""XPlat Code Coverage"" produces Unknown option against MTP — correct but unhelpful for the very large body of CI pipelines and tribal knowledge built around VSTest syntax.

The existing ICommandLineOptionsProvider contract intentionally forbids two extensions from registering the same option name. --logger and --collect are however intrinsically polyvalent: the value selects which extension owns the option. A new concept is therefore needed.

What's in the RFC

  • Naming rationale (Mapping over Alias/Transformation/Shim/Legacy…), explicitly addressing the alias-vs-rewrite discussion from [Proposal]: MTP Command-line aliases #7249.
  • Public API surface: ICommandLineOptionMappingProvider, CommandLineOptionMapping, CommandLineOptionMapper delegate (TryHandle style), CommandLineOptionMappingResult.
  • Resolution algorithm: mappings run after response-file expansion, before validation. Zero claimants → error. Multiple claimants → error. Exactly one → rewrite.
  • Worked examples for TRX (including trx;LogFileName=…) and Code Coverage.
  • Cross-cutting validation: mappings cannot collide with canonical option names, cannot rewrite to unknown options, cannot rewrite to other mappings (no loops).
  • Compatibility analysis, 5 rejected alternatives, 5-phase rollout, 5 unresolved questions.

Discussion seeds

Specific points where reviewer input would be most valuable:

  1. Naming — keep Mapping, or switch back to Alias (familiar) or Transformation (most accurate)?
  2. Help layout — separate ""VSTest-style options"" section, or interleave with canonical options?
  3. Warning channel — should TryMap get an out List<string> warnings parameter in v1, or defer?
  4. Telemetry — log only used_compat_mapping: bool, or include allowlisted values?

Refs #7249 — this PR provides the design artefact requested by the issue; implementation will follow in a separate PR once the RFC is approved.

Introduces a proposal for command-line option mappings: a new extensibility
point that lets an extension declaratively accept a user-facing option
(e.g. `--logger trx`, `--collect "XPlat Code Coverage"`) and rewrite
it, at parse time, into one or more first-class MTP options.
The primary scenario is easing migration from VSTest to MTP without
polluting the canonical MTP option set. Multiple extensions are allowed
to register the same mapping name, with exactly one expected to claim
responsibility for a given argument value.
Refs #7249
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Adds a new design RFC to the docs/RFCs area proposing command-line option mappings for Microsoft.Testing.Platform (MTP): an extensibility point allowing VSTest-style options like --logger trx / --collect ... to be rewritten into canonical MTP options during parsing to ease migration.

Changes:

  • Introduces an RFC describing the motivation, naming, proposed public API, and resolution/validation algorithm for command-line option mappings.
  • Provides worked examples (TRX and code coverage) and outlines help/info/telemetry implications plus a phased rollout plan.
Show a summary per file
FileDescription
docs/RFCs/014-Command-Line-Option-Mappings.mdNew RFC document defining the proposed “command-line option mappings” concept, API surface, and behavior.

Copilot's findings

  • Files reviewed: 1/1 changed files
  • Comments generated: 5

Comment threaddocs/RFCs/014-Command-Line-Option-Mappings.md Outdated
Comment threaddocs/RFCs/014-Command-Line-Option-Mappings.md Outdated
Comment threaddocs/RFCs/014-Command-Line-Option-Mappings.md Outdated
Comment threaddocs/RFCs/014-Command-Line-Option-Mappings.md Outdated
Comment threaddocs/RFCs/014-Command-Line-Option-Mappings.md Outdated

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

RFC 014 Review Summary

I've reviewed RFC 014 - Command-line option mappings against 21 expert review dimensions. The RFC proposes a well-motivated solution to a real migration pain point (VSTest → MTP compatibility), with strong design principles and thorough alternatives analysis. However, critical issues in the proposed API design require changes before approval.

Verdict Table

#DimensionVerdict
1Public API & Binary Compatibility🔴 1 BLOCKING, 2 MODERATE
2Defensive Coding at Boundaries🔴 2 BLOCKING, 2 MAJOR
3Algorithmic Correctness🟡 2 MAJOR
4Naming & Conventions⚪ 2 NIT
5Documentation Accuracy⚪ 1 NIT
6Performance & Allocations🟡 1 MODERATE (covered above)

✅ 15/21 dimensions clean.


Critical Issues (Must Fix Before Approval)

🔴 BLOCKING #1: Delegate signature prevents future evolution and lacks safety

Location: Lines 117-119 (CommandLineOptionMapper delegate)

Problems:

  1. Cannot add warnings later: RFC acknowledges (line 350) wanting to add warnings, but adding an out parameter to a delegate is a breaking change
  2. No exception handling: Extension throws → platform crash during startup
  3. No result validation: Extension returns true with result = null → NullReferenceException
  4. No timeout: Extension infinite loop → platform hangs indefinitely

Fix: Replace bool return + out parameter with a result struct that can carry warnings in future versions:

publicdelegateCommandLineOptionMapperResultCommandLineOptionMapper(ReadOnlySpan<string>arguments);publicreadonlystructCommandLineOptionMapperResult{publicboolSuccess{get;init;}publicIReadOnlyList<CommandLineOptionMappingResult>Results{get;init;}// Future: public IReadOnlyList<string> Warnings { get; init; }}

Add defensive wrapping (try/catch, validation, timeout) to the RFC's algorithm section.

🔴 BLOCKING #2: Naming inconsistency in manager pattern

Location: Lines 141, 149

Problem: ICommandLineMappingsManager uses plural "Mappings", breaking the universal MTP pattern: ICommandLineManager, ITestHostManager, IConfigurationManager, ILoggingManager (all singular).

Fix: Rename to ICommandLineMappingManager (singular). Update property name to CommandLineMapping to match the TestHost / ITestHostManager pattern.


Major Issues (Should Fix)

🟡 Algorithmic correctness gaps (2 issues)

  1. Empty result list undefined (line 246): What if TryMap returns true with empty results? Does occurrence get deleted?
  2. Runtime validation missing (line 258): Validation rules claim "enforced at startup" but can't detect invalid OptionName until runtime

Fix: Specify behavior for empty results (error recommended). Add runtime validation step in algorithm.

🟡 Defensive coding gaps (2 more issues beyond BLOCKING)

  1. Unbounded growth (line 192): Example code splits on ; with no limits → 100K segments from malicious input
  2. Malformed sub-options (line 194): No guidance on handling trx;LogFileName= (empty value)

Fix: Add defensive limits to examples (max segments, length checks). Document error handling approach for malformed sub-options.


Moderate Issues (Recommended Fixes)

Constructor design (line 126)

  1. params blocks future evolution: Can't add optional parameters after params array
  2. Unnecessary allocation: params creates array wrapper even for zero-argument cases

Fix: Add non-params overload for zero-argument case and explicit IReadOnlyList<string> overload.


Summary

Strong points:

  • Clear problem statement and motivation
  • Thorough alternatives analysis (5 rejected options)
  • Well-defined design principles
  • Comprehensive phasing plan
  • Threading/concurrency design is sound (synchronous, pre-DI, single-threaded startup)

Must address before approval:

  • Delegate signature evolution strategy (warnings, safety)
  • Naming consistency with existing patterns
  • Algorithm specification completeness (empty results, runtime validation)
  • Defensive coding guidance (limits, error handling)

The core concept is sound and valuable. The issues are fixable refinements to the API design, not fundamental flaws. Recommend addressing BLOCKING issues and reconsidering the MAJOR issues before moving to implementation.


Review dimensions not applicable to RFC: Test Isolation, Assertion Quality, Flakiness Patterns, Data-Driven Test Coverage, Analyzer Quality, IPC Wire Compatibility, Resource Management, Localization, Build Infrastructure, Cross-TFM Compatibility (these apply to implementation, not design docs).

Generated by Expert Code Review (on open) for issue #8501 · ● 22.6M

Comment threaddocs/RFCs/015-Command-Line-Option-Mappings.md
Comment threaddocs/RFCs/014-Command-Line-Option-Mappings.md Outdated
Comment threaddocs/RFCs/015-Command-Line-Option-Mappings.md
Comment threaddocs/RFCs/015-Command-Line-Option-Mappings.md
Comment threaddocs/RFCs/014-Command-Line-Option-Mappings.md Outdated
Comment threaddocs/RFCs/014-Command-Line-Option-Mappings.md Outdated
Comment threaddocs/RFCs/014-Command-Line-Option-Mappings.md Outdated
- Renumber to 015 to avoid collision with the existing
014-TestRun-Current-PlannedTests RFC.
- Align Naming section with the actual proposed types
(ICommandLineOptionMappingProvider / ICommandLineMappingManager,
matching the singular convention used elsewhere).
- Fix the broken <see cref="TryMap"/> reference to point at the Map
property.
- Make the TRX example case-insensitive for both the exact "trx" check
and the "trx;" prefix, matching VSTest-compat expectations.
- Replace ReadOnlySpan<string> with IReadOnlyList<string> in the public
delegate; the platform targets netstandard2.0 and Span-shaped APIs add
a System.Memory dependency to the public surface for limited benefit.
- Replace params string[] with IReadOnlyList<string> in
CommandLineOptionMappingResult to keep the constructor open for future
parameters and avoid unnecessary array allocations for the (common)
zero/one-argument case.
- Document the empty-result contract violation explicitly and split
startup-time vs runtime cross-cutting validation rules so the RFC
matches what can actually be enforced when the Map delegate is opaque.
- Expand the TRX example with malformed-segment handling and a sub-
option cap to address the defensive-coding concerns about unbounded
user input.
- Note in Unresolved Questions that adding an out-parameter to the
delegate is a binary-breaking change, so the warning-channel decision
must be made before shipping (or absorbed via a sibling delegate).
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
@Evangelink
Amaury Levé (Evangelink) merged commit e5e85a3 into mainMay 23, 2026
190 checks passed
@Evangelink
Amaury Levé (Evangelink) deleted the dev/amauryleve/rfc-cli-option-mappings branch May 23, 2026 15:45
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

type/rfcRequest for comments.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@Evangelink
, 'i'); if (__m === '*' || __re.test(location.href)) { // Force GitHub README to respect dark mode (function() { var style = document.createElement('style'); style.textContent = ' .markdown-body { color-scheme: dark light; } .markdown-body pre { background: #161b22 !important; } .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; } .markdown-body table th, .markdown-body table td { border-color: #30363d !important; } .markdown-body img { background: #0d1117; } .markdown-body blockquote { border-left-color: #8b949e; } .markdown-body hr { border-color: #30363d; } '; document.head.appendChild(style); })(); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' RFC 014 - Command-line option mappings by Evangelink · Pull Request #8501 · microsoft/testfx · GitHub
Skip to content

RFC 014 - Command-line option mappings - #8501

Merged
Amaury Levé (Evangelink) merged 2 commits into
mainfrom
dev/amauryleve/rfc-cli-option-mappings
May 23, 2026
Merged

RFC 014 - Command-line option mappings#8501
Amaury Levé (Evangelink) merged 2 commits into
mainfrom
dev/amauryleve/rfc-cli-option-mappings

Conversation

@Evangelink

Copy link
Copy Markdown
Member

Adds RFC 014 proposing command-line option mappings: a new extensibility point that lets an extension declaratively accept a user-facing option (e.g. --logger trx, --collect ""XPlat Code Coverage"") and rewrite it, at parse time, into one or more first-class MTP options.

Why

The primary scenario is easing migration from VSTest to MTP. Today, dotnet test --logger trx --collect ""XPlat Code Coverage"" produces Unknown option against MTP — correct but unhelpful for the very large body of CI pipelines and tribal knowledge built around VSTest syntax.

The existing ICommandLineOptionsProvider contract intentionally forbids two extensions from registering the same option name. --logger and --collect are however intrinsically polyvalent: the value selects which extension owns the option. A new concept is therefore needed.

What's in the RFC

  • Naming rationale (Mapping over Alias/Transformation/Shim/Legacy…), explicitly addressing the alias-vs-rewrite discussion from [Proposal]: MTP Command-line aliases #7249.
  • Public API surface: ICommandLineOptionMappingProvider, CommandLineOptionMapping, CommandLineOptionMapper delegate (TryHandle style), CommandLineOptionMappingResult.
  • Resolution algorithm: mappings run after response-file expansion, before validation. Zero claimants → error. Multiple claimants → error. Exactly one → rewrite.
  • Worked examples for TRX (including trx;LogFileName=…) and Code Coverage.
  • Cross-cutting validation: mappings cannot collide with canonical option names, cannot rewrite to unknown options, cannot rewrite to other mappings (no loops).
  • Compatibility analysis, 5 rejected alternatives, 5-phase rollout, 5 unresolved questions.

Discussion seeds

Specific points where reviewer input would be most valuable:

  1. Naming — keep Mapping, or switch back to Alias (familiar) or Transformation (most accurate)?
  2. Help layout — separate ""VSTest-style options"" section, or interleave with canonical options?
  3. Warning channel — should TryMap get an out List<string> warnings parameter in v1, or defer?
  4. Telemetry — log only used_compat_mapping: bool, or include allowlisted values?

Refs #7249 — this PR provides the design artefact requested by the issue; implementation will follow in a separate PR once the RFC is approved.

Introduces a proposal for command-line option mappings: a new extensibility
point that lets an extension declaratively accept a user-facing option
(e.g. `--logger trx`, `--collect "XPlat Code Coverage"`) and rewrite
it, at parse time, into one or more first-class MTP options.
The primary scenario is easing migration from VSTest to MTP without
polluting the canonical MTP option set. Multiple extensions are allowed
to register the same mapping name, with exactly one expected to claim
responsibility for a given argument value.
Refs #7249
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Adds a new design RFC to the docs/RFCs area proposing command-line option mappings for Microsoft.Testing.Platform (MTP): an extensibility point allowing VSTest-style options like --logger trx / --collect ... to be rewritten into canonical MTP options during parsing to ease migration.

Changes:

  • Introduces an RFC describing the motivation, naming, proposed public API, and resolution/validation algorithm for command-line option mappings.
  • Provides worked examples (TRX and code coverage) and outlines help/info/telemetry implications plus a phased rollout plan.
Show a summary per file
FileDescription
docs/RFCs/014-Command-Line-Option-Mappings.mdNew RFC document defining the proposed “command-line option mappings” concept, API surface, and behavior.

Copilot's findings

  • Files reviewed: 1/1 changed files
  • Comments generated: 5

Comment threaddocs/RFCs/014-Command-Line-Option-Mappings.md Outdated
Comment threaddocs/RFCs/014-Command-Line-Option-Mappings.md Outdated
Comment threaddocs/RFCs/014-Command-Line-Option-Mappings.md Outdated
Comment threaddocs/RFCs/014-Command-Line-Option-Mappings.md Outdated
Comment threaddocs/RFCs/014-Command-Line-Option-Mappings.md Outdated

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

RFC 014 Review Summary

I've reviewed RFC 014 - Command-line option mappings against 21 expert review dimensions. The RFC proposes a well-motivated solution to a real migration pain point (VSTest → MTP compatibility), with strong design principles and thorough alternatives analysis. However, critical issues in the proposed API design require changes before approval.

Verdict Table

#DimensionVerdict
1Public API & Binary Compatibility🔴 1 BLOCKING, 2 MODERATE
2Defensive Coding at Boundaries🔴 2 BLOCKING, 2 MAJOR
3Algorithmic Correctness🟡 2 MAJOR
4Naming & Conventions⚪ 2 NIT
5Documentation Accuracy⚪ 1 NIT
6Performance & Allocations🟡 1 MODERATE (covered above)

✅ 15/21 dimensions clean.


Critical Issues (Must Fix Before Approval)

🔴 BLOCKING #1: Delegate signature prevents future evolution and lacks safety

Location: Lines 117-119 (CommandLineOptionMapper delegate)

Problems:

  1. Cannot add warnings later: RFC acknowledges (line 350) wanting to add warnings, but adding an out parameter to a delegate is a breaking change
  2. No exception handling: Extension throws → platform crash during startup
  3. No result validation: Extension returns true with result = null → NullReferenceException
  4. No timeout: Extension infinite loop → platform hangs indefinitely

Fix: Replace bool return + out parameter with a result struct that can carry warnings in future versions:

publicdelegateCommandLineOptionMapperResultCommandLineOptionMapper(ReadOnlySpan<string>arguments);publicreadonlystructCommandLineOptionMapperResult{publicboolSuccess{get;init;}publicIReadOnlyList<CommandLineOptionMappingResult>Results{get;init;}// Future: public IReadOnlyList<string> Warnings { get; init; }}

Add defensive wrapping (try/catch, validation, timeout) to the RFC's algorithm section.

🔴 BLOCKING #2: Naming inconsistency in manager pattern

Location: Lines 141, 149

Problem: ICommandLineMappingsManager uses plural "Mappings", breaking the universal MTP pattern: ICommandLineManager, ITestHostManager, IConfigurationManager, ILoggingManager (all singular).

Fix: Rename to ICommandLineMappingManager (singular). Update property name to CommandLineMapping to match the TestHost / ITestHostManager pattern.


Major Issues (Should Fix)

🟡 Algorithmic correctness gaps (2 issues)

  1. Empty result list undefined (line 246): What if TryMap returns true with empty results? Does occurrence get deleted?
  2. Runtime validation missing (line 258): Validation rules claim "enforced at startup" but can't detect invalid OptionName until runtime

Fix: Specify behavior for empty results (error recommended). Add runtime validation step in algorithm.

🟡 Defensive coding gaps (2 more issues beyond BLOCKING)

  1. Unbounded growth (line 192): Example code splits on ; with no limits → 100K segments from malicious input
  2. Malformed sub-options (line 194): No guidance on handling trx;LogFileName= (empty value)

Fix: Add defensive limits to examples (max segments, length checks). Document error handling approach for malformed sub-options.


Moderate Issues (Recommended Fixes)

Constructor design (line 126)

  1. params blocks future evolution: Can't add optional parameters after params array
  2. Unnecessary allocation: params creates array wrapper even for zero-argument cases

Fix: Add non-params overload for zero-argument case and explicit IReadOnlyList<string> overload.


Summary

Strong points:

  • Clear problem statement and motivation
  • Thorough alternatives analysis (5 rejected options)
  • Well-defined design principles
  • Comprehensive phasing plan
  • Threading/concurrency design is sound (synchronous, pre-DI, single-threaded startup)

Must address before approval:

  • Delegate signature evolution strategy (warnings, safety)
  • Naming consistency with existing patterns
  • Algorithm specification completeness (empty results, runtime validation)
  • Defensive coding guidance (limits, error handling)

The core concept is sound and valuable. The issues are fixable refinements to the API design, not fundamental flaws. Recommend addressing BLOCKING issues and reconsidering the MAJOR issues before moving to implementation.


Review dimensions not applicable to RFC: Test Isolation, Assertion Quality, Flakiness Patterns, Data-Driven Test Coverage, Analyzer Quality, IPC Wire Compatibility, Resource Management, Localization, Build Infrastructure, Cross-TFM Compatibility (these apply to implementation, not design docs).

Generated by Expert Code Review (on open) for issue #8501 · ● 22.6M

Comment threaddocs/RFCs/015-Command-Line-Option-Mappings.md
Comment threaddocs/RFCs/014-Command-Line-Option-Mappings.md Outdated
Comment threaddocs/RFCs/015-Command-Line-Option-Mappings.md
Comment threaddocs/RFCs/015-Command-Line-Option-Mappings.md
Comment threaddocs/RFCs/014-Command-Line-Option-Mappings.md Outdated
Comment threaddocs/RFCs/014-Command-Line-Option-Mappings.md Outdated
Comment threaddocs/RFCs/014-Command-Line-Option-Mappings.md Outdated
- Renumber to 015 to avoid collision with the existing
014-TestRun-Current-PlannedTests RFC.
- Align Naming section with the actual proposed types
(ICommandLineOptionMappingProvider / ICommandLineMappingManager,
matching the singular convention used elsewhere).
- Fix the broken <see cref="TryMap"/> reference to point at the Map
property.
- Make the TRX example case-insensitive for both the exact "trx" check
and the "trx;" prefix, matching VSTest-compat expectations.
- Replace ReadOnlySpan<string> with IReadOnlyList<string> in the public
delegate; the platform targets netstandard2.0 and Span-shaped APIs add
a System.Memory dependency to the public surface for limited benefit.
- Replace params string[] with IReadOnlyList<string> in
CommandLineOptionMappingResult to keep the constructor open for future
parameters and avoid unnecessary array allocations for the (common)
zero/one-argument case.
- Document the empty-result contract violation explicitly and split
startup-time vs runtime cross-cutting validation rules so the RFC
matches what can actually be enforced when the Map delegate is opaque.
- Expand the TRX example with malformed-segment handling and a sub-
option cap to address the defensive-coding concerns about unbounded
user input.
- Note in Unresolved Questions that adding an out-parameter to the
delegate is a binary-breaking change, so the warning-channel decision
must be made before shipping (or absorbed via a sibling delegate).
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
@Evangelink
Amaury Levé (Evangelink) merged commit e5e85a3 into mainMay 23, 2026
190 checks passed
@Evangelink
Amaury Levé (Evangelink) deleted the dev/amauryleve/rfc-cli-option-mappings branch May 23, 2026 15:45
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

type/rfcRequest for comments.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@Evangelink
, 'i'); if (__m === '*' || __re.test(location.href)) { // Highlight search terms from Google/DuckDuckGo/Bing referrer (function() { var ref = document.referrer; var terms = []; if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) { var url = new URL(ref); var q = url.searchParams.get('q') || url.searchParams.get('p'); if (q) { terms = q.split(/\s+/).filter(function(t) { return t.length > 2; }); } } if (terms.length === 0) return; var style = document.createElement('style'); style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }'; document.head.appendChild(style); function highlight(node) { if (node.nodeType === 3) { // text node var text = node.textContent; var found = false; terms.forEach(function(term) { var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\]\\]/g, '\\') + ')', 'gi'); if (regex.test(text)) { found = true; var frag = document.createDocumentFragment(); var parts = text.split(regex); parts.forEach(function(part, i) { if (i % 2 === 0) { frag.appendChild(document.createTextNode(part)); } else { var span = document.createElement('span'); span.className = 'userscript-highlight'; span.textContent = part; frag.appendChild(span); } }); node.parentNode.replaceChild(frag, node); } }); } else if (node.nodeType === 1 && node.childNodes) { // element var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT']; if (!skipTags.includes(node.tagName)) { Array.from(node.childNodes).forEach(highlight); } } } highlight(document.body); // Re-highlight on dynamic content var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1 || node.nodeType === 3) highlight(node); }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' RFC 014 - Command-line option mappings by Evangelink · Pull Request #8501 · microsoft/testfx · GitHub
Skip to content

RFC 014 - Command-line option mappings - #8501

Merged
Amaury Levé (Evangelink) merged 2 commits into
mainfrom
dev/amauryleve/rfc-cli-option-mappings
May 23, 2026
Merged

RFC 014 - Command-line option mappings#8501
Amaury Levé (Evangelink) merged 2 commits into
mainfrom
dev/amauryleve/rfc-cli-option-mappings

Conversation

@Evangelink

Copy link
Copy Markdown
Member

Adds RFC 014 proposing command-line option mappings: a new extensibility point that lets an extension declaratively accept a user-facing option (e.g. --logger trx, --collect ""XPlat Code Coverage"") and rewrite it, at parse time, into one or more first-class MTP options.

Why

The primary scenario is easing migration from VSTest to MTP. Today, dotnet test --logger trx --collect ""XPlat Code Coverage"" produces Unknown option against MTP — correct but unhelpful for the very large body of CI pipelines and tribal knowledge built around VSTest syntax.

The existing ICommandLineOptionsProvider contract intentionally forbids two extensions from registering the same option name. --logger and --collect are however intrinsically polyvalent: the value selects which extension owns the option. A new concept is therefore needed.

What's in the RFC

  • Naming rationale (Mapping over Alias/Transformation/Shim/Legacy…), explicitly addressing the alias-vs-rewrite discussion from [Proposal]: MTP Command-line aliases #7249.
  • Public API surface: ICommandLineOptionMappingProvider, CommandLineOptionMapping, CommandLineOptionMapper delegate (TryHandle style), CommandLineOptionMappingResult.
  • Resolution algorithm: mappings run after response-file expansion, before validation. Zero claimants → error. Multiple claimants → error. Exactly one → rewrite.
  • Worked examples for TRX (including trx;LogFileName=…) and Code Coverage.
  • Cross-cutting validation: mappings cannot collide with canonical option names, cannot rewrite to unknown options, cannot rewrite to other mappings (no loops).
  • Compatibility analysis, 5 rejected alternatives, 5-phase rollout, 5 unresolved questions.

Discussion seeds

Specific points where reviewer input would be most valuable:

  1. Naming — keep Mapping, or switch back to Alias (familiar) or Transformation (most accurate)?
  2. Help layout — separate ""VSTest-style options"" section, or interleave with canonical options?
  3. Warning channel — should TryMap get an out List<string> warnings parameter in v1, or defer?
  4. Telemetry — log only used_compat_mapping: bool, or include allowlisted values?

Refs #7249 — this PR provides the design artefact requested by the issue; implementation will follow in a separate PR once the RFC is approved.

Introduces a proposal for command-line option mappings: a new extensibility
point that lets an extension declaratively accept a user-facing option
(e.g. `--logger trx`, `--collect "XPlat Code Coverage"`) and rewrite
it, at parse time, into one or more first-class MTP options.
The primary scenario is easing migration from VSTest to MTP without
polluting the canonical MTP option set. Multiple extensions are allowed
to register the same mapping name, with exactly one expected to claim
responsibility for a given argument value.
Refs #7249
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Adds a new design RFC to the docs/RFCs area proposing command-line option mappings for Microsoft.Testing.Platform (MTP): an extensibility point allowing VSTest-style options like --logger trx / --collect ... to be rewritten into canonical MTP options during parsing to ease migration.

Changes:

  • Introduces an RFC describing the motivation, naming, proposed public API, and resolution/validation algorithm for command-line option mappings.
  • Provides worked examples (TRX and code coverage) and outlines help/info/telemetry implications plus a phased rollout plan.
Show a summary per file
FileDescription
docs/RFCs/014-Command-Line-Option-Mappings.mdNew RFC document defining the proposed “command-line option mappings” concept, API surface, and behavior.

Copilot's findings

  • Files reviewed: 1/1 changed files
  • Comments generated: 5

Comment threaddocs/RFCs/014-Command-Line-Option-Mappings.md Outdated
Comment threaddocs/RFCs/014-Command-Line-Option-Mappings.md Outdated
Comment threaddocs/RFCs/014-Command-Line-Option-Mappings.md Outdated
Comment threaddocs/RFCs/014-Command-Line-Option-Mappings.md Outdated
Comment threaddocs/RFCs/014-Command-Line-Option-Mappings.md Outdated

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

RFC 014 Review Summary

I've reviewed RFC 014 - Command-line option mappings against 21 expert review dimensions. The RFC proposes a well-motivated solution to a real migration pain point (VSTest → MTP compatibility), with strong design principles and thorough alternatives analysis. However, critical issues in the proposed API design require changes before approval.

Verdict Table

#DimensionVerdict
1Public API & Binary Compatibility🔴 1 BLOCKING, 2 MODERATE
2Defensive Coding at Boundaries🔴 2 BLOCKING, 2 MAJOR
3Algorithmic Correctness🟡 2 MAJOR
4Naming & Conventions⚪ 2 NIT
5Documentation Accuracy⚪ 1 NIT
6Performance & Allocations🟡 1 MODERATE (covered above)

✅ 15/21 dimensions clean.


Critical Issues (Must Fix Before Approval)

🔴 BLOCKING #1: Delegate signature prevents future evolution and lacks safety

Location: Lines 117-119 (CommandLineOptionMapper delegate)

Problems:

  1. Cannot add warnings later: RFC acknowledges (line 350) wanting to add warnings, but adding an out parameter to a delegate is a breaking change
  2. No exception handling: Extension throws → platform crash during startup
  3. No result validation: Extension returns true with result = null → NullReferenceException
  4. No timeout: Extension infinite loop → platform hangs indefinitely

Fix: Replace bool return + out parameter with a result struct that can carry warnings in future versions:

publicdelegateCommandLineOptionMapperResultCommandLineOptionMapper(ReadOnlySpan<string>arguments);publicreadonlystructCommandLineOptionMapperResult{publicboolSuccess{get;init;}publicIReadOnlyList<CommandLineOptionMappingResult>Results{get;init;}// Future: public IReadOnlyList<string> Warnings { get; init; }}

Add defensive wrapping (try/catch, validation, timeout) to the RFC's algorithm section.

🔴 BLOCKING #2: Naming inconsistency in manager pattern

Location: Lines 141, 149

Problem: ICommandLineMappingsManager uses plural "Mappings", breaking the universal MTP pattern: ICommandLineManager, ITestHostManager, IConfigurationManager, ILoggingManager (all singular).

Fix: Rename to ICommandLineMappingManager (singular). Update property name to CommandLineMapping to match the TestHost / ITestHostManager pattern.


Major Issues (Should Fix)

🟡 Algorithmic correctness gaps (2 issues)

  1. Empty result list undefined (line 246): What if TryMap returns true with empty results? Does occurrence get deleted?
  2. Runtime validation missing (line 258): Validation rules claim "enforced at startup" but can't detect invalid OptionName until runtime

Fix: Specify behavior for empty results (error recommended). Add runtime validation step in algorithm.

🟡 Defensive coding gaps (2 more issues beyond BLOCKING)

  1. Unbounded growth (line 192): Example code splits on ; with no limits → 100K segments from malicious input
  2. Malformed sub-options (line 194): No guidance on handling trx;LogFileName= (empty value)

Fix: Add defensive limits to examples (max segments, length checks). Document error handling approach for malformed sub-options.


Moderate Issues (Recommended Fixes)

Constructor design (line 126)

  1. params blocks future evolution: Can't add optional parameters after params array
  2. Unnecessary allocation: params creates array wrapper even for zero-argument cases

Fix: Add non-params overload for zero-argument case and explicit IReadOnlyList<string> overload.


Summary

Strong points:

  • Clear problem statement and motivation
  • Thorough alternatives analysis (5 rejected options)
  • Well-defined design principles
  • Comprehensive phasing plan
  • Threading/concurrency design is sound (synchronous, pre-DI, single-threaded startup)

Must address before approval:

  • Delegate signature evolution strategy (warnings, safety)
  • Naming consistency with existing patterns
  • Algorithm specification completeness (empty results, runtime validation)
  • Defensive coding guidance (limits, error handling)

The core concept is sound and valuable. The issues are fixable refinements to the API design, not fundamental flaws. Recommend addressing BLOCKING issues and reconsidering the MAJOR issues before moving to implementation.


Review dimensions not applicable to RFC: Test Isolation, Assertion Quality, Flakiness Patterns, Data-Driven Test Coverage, Analyzer Quality, IPC Wire Compatibility, Resource Management, Localization, Build Infrastructure, Cross-TFM Compatibility (these apply to implementation, not design docs).

Generated by Expert Code Review (on open) for issue #8501 · ● 22.6M

Comment threaddocs/RFCs/015-Command-Line-Option-Mappings.md
Comment threaddocs/RFCs/014-Command-Line-Option-Mappings.md Outdated
Comment threaddocs/RFCs/015-Command-Line-Option-Mappings.md
Comment threaddocs/RFCs/015-Command-Line-Option-Mappings.md
Comment threaddocs/RFCs/014-Command-Line-Option-Mappings.md Outdated
Comment threaddocs/RFCs/014-Command-Line-Option-Mappings.md Outdated
Comment threaddocs/RFCs/014-Command-Line-Option-Mappings.md Outdated
- Renumber to 015 to avoid collision with the existing
014-TestRun-Current-PlannedTests RFC.
- Align Naming section with the actual proposed types
(ICommandLineOptionMappingProvider / ICommandLineMappingManager,
matching the singular convention used elsewhere).
- Fix the broken <see cref="TryMap"/> reference to point at the Map
property.
- Make the TRX example case-insensitive for both the exact "trx" check
and the "trx;" prefix, matching VSTest-compat expectations.
- Replace ReadOnlySpan<string> with IReadOnlyList<string> in the public
delegate; the platform targets netstandard2.0 and Span-shaped APIs add
a System.Memory dependency to the public surface for limited benefit.
- Replace params string[] with IReadOnlyList<string> in
CommandLineOptionMappingResult to keep the constructor open for future
parameters and avoid unnecessary array allocations for the (common)
zero/one-argument case.
- Document the empty-result contract violation explicitly and split
startup-time vs runtime cross-cutting validation rules so the RFC
matches what can actually be enforced when the Map delegate is opaque.
- Expand the TRX example with malformed-segment handling and a sub-
option cap to address the defensive-coding concerns about unbounded
user input.
- Note in Unresolved Questions that adding an out-parameter to the
delegate is a binary-breaking change, so the warning-channel decision
must be made before shipping (or absorbed via a sibling delegate).
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
@Evangelink
Amaury Levé (Evangelink) merged commit e5e85a3 into mainMay 23, 2026
190 checks passed
@Evangelink
Amaury Levé (Evangelink) deleted the dev/amauryleve/rfc-cli-option-mappings branch May 23, 2026 15:45
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

type/rfcRequest for comments.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@Evangelink
, 'i'); if (__m === '*' || __re.test(location.href)) { // Strip utm_, fbclid, gclid, etc. from all links on page (function() { var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content', 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid', 'ref', 'ref_src', 'source', 'medium', 'campaign']; function cleanUrl(url) { try { var u = new URL(url, window.location.origin); var changed = false; trackingParams.forEach(function(p) { if (u.searchParams.has(p)) { u.searchParams.delete(p); changed = true; } }); return changed ? u.toString() : url; } catch (e) { return url; } } function cleanLinks() { document.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } cleanLinks(); var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1) { if (node.tagName === 'A') cleanLinks(); node.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + ' RFC 014 - Command-line option mappings by Evangelink · Pull Request #8501 · microsoft/testfx · GitHub
Skip to content

RFC 014 - Command-line option mappings - #8501

Merged
Amaury Levé (Evangelink) merged 2 commits into
mainfrom
dev/amauryleve/rfc-cli-option-mappings
May 23, 2026
Merged

RFC 014 - Command-line option mappings#8501
Amaury Levé (Evangelink) merged 2 commits into
mainfrom
dev/amauryleve/rfc-cli-option-mappings

Conversation

@Evangelink

Copy link
Copy Markdown
Member

Adds RFC 014 proposing command-line option mappings: a new extensibility point that lets an extension declaratively accept a user-facing option (e.g. --logger trx, --collect ""XPlat Code Coverage"") and rewrite it, at parse time, into one or more first-class MTP options.

Why

The primary scenario is easing migration from VSTest to MTP. Today, dotnet test --logger trx --collect ""XPlat Code Coverage"" produces Unknown option against MTP — correct but unhelpful for the very large body of CI pipelines and tribal knowledge built around VSTest syntax.

The existing ICommandLineOptionsProvider contract intentionally forbids two extensions from registering the same option name. --logger and --collect are however intrinsically polyvalent: the value selects which extension owns the option. A new concept is therefore needed.

What's in the RFC

  • Naming rationale (Mapping over Alias/Transformation/Shim/Legacy…), explicitly addressing the alias-vs-rewrite discussion from [Proposal]: MTP Command-line aliases #7249.
  • Public API surface: ICommandLineOptionMappingProvider, CommandLineOptionMapping, CommandLineOptionMapper delegate (TryHandle style), CommandLineOptionMappingResult.
  • Resolution algorithm: mappings run after response-file expansion, before validation. Zero claimants → error. Multiple claimants → error. Exactly one → rewrite.
  • Worked examples for TRX (including trx;LogFileName=…) and Code Coverage.
  • Cross-cutting validation: mappings cannot collide with canonical option names, cannot rewrite to unknown options, cannot rewrite to other mappings (no loops).
  • Compatibility analysis, 5 rejected alternatives, 5-phase rollout, 5 unresolved questions.

Discussion seeds

Specific points where reviewer input would be most valuable:

  1. Naming — keep Mapping, or switch back to Alias (familiar) or Transformation (most accurate)?
  2. Help layout — separate ""VSTest-style options"" section, or interleave with canonical options?
  3. Warning channel — should TryMap get an out List<string> warnings parameter in v1, or defer?
  4. Telemetry — log only used_compat_mapping: bool, or include allowlisted values?

Refs #7249 — this PR provides the design artefact requested by the issue; implementation will follow in a separate PR once the RFC is approved.

Introduces a proposal for command-line option mappings: a new extensibility
point that lets an extension declaratively accept a user-facing option
(e.g. `--logger trx`, `--collect "XPlat Code Coverage"`) and rewrite
it, at parse time, into one or more first-class MTP options.
The primary scenario is easing migration from VSTest to MTP without
polluting the canonical MTP option set. Multiple extensions are allowed
to register the same mapping name, with exactly one expected to claim
responsibility for a given argument value.
Refs #7249
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Adds a new design RFC to the docs/RFCs area proposing command-line option mappings for Microsoft.Testing.Platform (MTP): an extensibility point allowing VSTest-style options like --logger trx / --collect ... to be rewritten into canonical MTP options during parsing to ease migration.

Changes:

  • Introduces an RFC describing the motivation, naming, proposed public API, and resolution/validation algorithm for command-line option mappings.
  • Provides worked examples (TRX and code coverage) and outlines help/info/telemetry implications plus a phased rollout plan.
Show a summary per file
FileDescription
docs/RFCs/014-Command-Line-Option-Mappings.mdNew RFC document defining the proposed “command-line option mappings” concept, API surface, and behavior.

Copilot's findings

  • Files reviewed: 1/1 changed files
  • Comments generated: 5

Comment threaddocs/RFCs/014-Command-Line-Option-Mappings.md Outdated
Comment threaddocs/RFCs/014-Command-Line-Option-Mappings.md Outdated
Comment threaddocs/RFCs/014-Command-Line-Option-Mappings.md Outdated
Comment threaddocs/RFCs/014-Command-Line-Option-Mappings.md Outdated
Comment threaddocs/RFCs/014-Command-Line-Option-Mappings.md Outdated

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

RFC 014 Review Summary

I've reviewed RFC 014 - Command-line option mappings against 21 expert review dimensions. The RFC proposes a well-motivated solution to a real migration pain point (VSTest → MTP compatibility), with strong design principles and thorough alternatives analysis. However, critical issues in the proposed API design require changes before approval.

Verdict Table

#DimensionVerdict
1Public API & Binary Compatibility🔴 1 BLOCKING, 2 MODERATE
2Defensive Coding at Boundaries🔴 2 BLOCKING, 2 MAJOR
3Algorithmic Correctness🟡 2 MAJOR
4Naming & Conventions⚪ 2 NIT
5Documentation Accuracy⚪ 1 NIT
6Performance & Allocations🟡 1 MODERATE (covered above)

✅ 15/21 dimensions clean.


Critical Issues (Must Fix Before Approval)

🔴 BLOCKING #1: Delegate signature prevents future evolution and lacks safety

Location: Lines 117-119 (CommandLineOptionMapper delegate)

Problems:

  1. Cannot add warnings later: RFC acknowledges (line 350) wanting to add warnings, but adding an out parameter to a delegate is a breaking change
  2. No exception handling: Extension throws → platform crash during startup
  3. No result validation: Extension returns true with result = null → NullReferenceException
  4. No timeout: Extension infinite loop → platform hangs indefinitely

Fix: Replace bool return + out parameter with a result struct that can carry warnings in future versions:

publicdelegateCommandLineOptionMapperResultCommandLineOptionMapper(ReadOnlySpan<string>arguments);publicreadonlystructCommandLineOptionMapperResult{publicboolSuccess{get;init;}publicIReadOnlyList<CommandLineOptionMappingResult>Results{get;init;}// Future: public IReadOnlyList<string> Warnings { get; init; }}

Add defensive wrapping (try/catch, validation, timeout) to the RFC's algorithm section.

🔴 BLOCKING #2: Naming inconsistency in manager pattern

Location: Lines 141, 149

Problem: ICommandLineMappingsManager uses plural "Mappings", breaking the universal MTP pattern: ICommandLineManager, ITestHostManager, IConfigurationManager, ILoggingManager (all singular).

Fix: Rename to ICommandLineMappingManager (singular). Update property name to CommandLineMapping to match the TestHost / ITestHostManager pattern.


Major Issues (Should Fix)

🟡 Algorithmic correctness gaps (2 issues)

  1. Empty result list undefined (line 246): What if TryMap returns true with empty results? Does occurrence get deleted?
  2. Runtime validation missing (line 258): Validation rules claim "enforced at startup" but can't detect invalid OptionName until runtime

Fix: Specify behavior for empty results (error recommended). Add runtime validation step in algorithm.

🟡 Defensive coding gaps (2 more issues beyond BLOCKING)

  1. Unbounded growth (line 192): Example code splits on ; with no limits → 100K segments from malicious input
  2. Malformed sub-options (line 194): No guidance on handling trx;LogFileName= (empty value)

Fix: Add defensive limits to examples (max segments, length checks). Document error handling approach for malformed sub-options.


Moderate Issues (Recommended Fixes)

Constructor design (line 126)

  1. params blocks future evolution: Can't add optional parameters after params array
  2. Unnecessary allocation: params creates array wrapper even for zero-argument cases

Fix: Add non-params overload for zero-argument case and explicit IReadOnlyList<string> overload.


Summary

Strong points:

  • Clear problem statement and motivation
  • Thorough alternatives analysis (5 rejected options)
  • Well-defined design principles
  • Comprehensive phasing plan
  • Threading/concurrency design is sound (synchronous, pre-DI, single-threaded startup)

Must address before approval:

  • Delegate signature evolution strategy (warnings, safety)
  • Naming consistency with existing patterns
  • Algorithm specification completeness (empty results, runtime validation)
  • Defensive coding guidance (limits, error handling)

The core concept is sound and valuable. The issues are fixable refinements to the API design, not fundamental flaws. Recommend addressing BLOCKING issues and reconsidering the MAJOR issues before moving to implementation.


Review dimensions not applicable to RFC: Test Isolation, Assertion Quality, Flakiness Patterns, Data-Driven Test Coverage, Analyzer Quality, IPC Wire Compatibility, Resource Management, Localization, Build Infrastructure, Cross-TFM Compatibility (these apply to implementation, not design docs).

Generated by Expert Code Review (on open) for issue #8501 · ● 22.6M

Comment threaddocs/RFCs/015-Command-Line-Option-Mappings.md
Comment threaddocs/RFCs/014-Command-Line-Option-Mappings.md Outdated
Comment threaddocs/RFCs/015-Command-Line-Option-Mappings.md
Comment threaddocs/RFCs/015-Command-Line-Option-Mappings.md
Comment threaddocs/RFCs/014-Command-Line-Option-Mappings.md Outdated
Comment threaddocs/RFCs/014-Command-Line-Option-Mappings.md Outdated
Comment threaddocs/RFCs/014-Command-Line-Option-Mappings.md Outdated
- Renumber to 015 to avoid collision with the existing
014-TestRun-Current-PlannedTests RFC.
- Align Naming section with the actual proposed types
(ICommandLineOptionMappingProvider / ICommandLineMappingManager,
matching the singular convention used elsewhere).
- Fix the broken <see cref="TryMap"/> reference to point at the Map
property.
- Make the TRX example case-insensitive for both the exact "trx" check
and the "trx;" prefix, matching VSTest-compat expectations.
- Replace ReadOnlySpan<string> with IReadOnlyList<string> in the public
delegate; the platform targets netstandard2.0 and Span-shaped APIs add
a System.Memory dependency to the public surface for limited benefit.
- Replace params string[] with IReadOnlyList<string> in
CommandLineOptionMappingResult to keep the constructor open for future
parameters and avoid unnecessary array allocations for the (common)
zero/one-argument case.
- Document the empty-result contract violation explicitly and split
startup-time vs runtime cross-cutting validation rules so the RFC
matches what can actually be enforced when the Map delegate is opaque.
- Expand the TRX example with malformed-segment handling and a sub-
option cap to address the defensive-coding concerns about unbounded
user input.
- Note in Unresolved Questions that adding an out-parameter to the
delegate is a binary-breaking change, so the warning-channel decision
must be made before shipping (or absorbed via a sibling delegate).
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
@Evangelink
Amaury Levé (Evangelink) merged commit e5e85a3 into mainMay 23, 2026
190 checks passed
@Evangelink
Amaury Levé (Evangelink) deleted the dev/amauryleve/rfc-cli-option-mappings branch May 23, 2026 15:45
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

type/rfcRequest for comments.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@Evangelink
, 'i'); if (__m === '*' || __re.test(location.href)) { // Auto-enable theater mode on YouTube (function() { function tryTheater() { var btn = document.querySelector('button[aria-label="Theater mode"], ytd-player #player button[title="Theater mode"]'); if (btn && !btn.classList.contains('activated')) { btn.click(); } } // Try immediately tryTheater(); // Try after navigation (SPA) var lastUrl = location.href; setInterval(function() { if (location.href !== lastUrl) { lastUrl = location.href; setTimeout(tryTheater, 500); } }, 1000); // Also try on player load var observer = new MutationObserver(tryTheater); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' RFC 014 - Command-line option mappings by Evangelink · Pull Request #8501 · microsoft/testfx · GitHub
Skip to content

RFC 014 - Command-line option mappings - #8501

Merged
Amaury Levé (Evangelink) merged 2 commits into
mainfrom
dev/amauryleve/rfc-cli-option-mappings
May 23, 2026
Merged

RFC 014 - Command-line option mappings#8501
Amaury Levé (Evangelink) merged 2 commits into
mainfrom
dev/amauryleve/rfc-cli-option-mappings

Conversation

@Evangelink

Copy link
Copy Markdown
Member

Adds RFC 014 proposing command-line option mappings: a new extensibility point that lets an extension declaratively accept a user-facing option (e.g. --logger trx, --collect ""XPlat Code Coverage"") and rewrite it, at parse time, into one or more first-class MTP options.

Why

The primary scenario is easing migration from VSTest to MTP. Today, dotnet test --logger trx --collect ""XPlat Code Coverage"" produces Unknown option against MTP — correct but unhelpful for the very large body of CI pipelines and tribal knowledge built around VSTest syntax.

The existing ICommandLineOptionsProvider contract intentionally forbids two extensions from registering the same option name. --logger and --collect are however intrinsically polyvalent: the value selects which extension owns the option. A new concept is therefore needed.

What's in the RFC

  • Naming rationale (Mapping over Alias/Transformation/Shim/Legacy…), explicitly addressing the alias-vs-rewrite discussion from [Proposal]: MTP Command-line aliases #7249.
  • Public API surface: ICommandLineOptionMappingProvider, CommandLineOptionMapping, CommandLineOptionMapper delegate (TryHandle style), CommandLineOptionMappingResult.
  • Resolution algorithm: mappings run after response-file expansion, before validation. Zero claimants → error. Multiple claimants → error. Exactly one → rewrite.
  • Worked examples for TRX (including trx;LogFileName=…) and Code Coverage.
  • Cross-cutting validation: mappings cannot collide with canonical option names, cannot rewrite to unknown options, cannot rewrite to other mappings (no loops).
  • Compatibility analysis, 5 rejected alternatives, 5-phase rollout, 5 unresolved questions.

Discussion seeds

Specific points where reviewer input would be most valuable:

  1. Naming — keep Mapping, or switch back to Alias (familiar) or Transformation (most accurate)?
  2. Help layout — separate ""VSTest-style options"" section, or interleave with canonical options?
  3. Warning channel — should TryMap get an out List<string> warnings parameter in v1, or defer?
  4. Telemetry — log only used_compat_mapping: bool, or include allowlisted values?

Refs #7249 — this PR provides the design artefact requested by the issue; implementation will follow in a separate PR once the RFC is approved.

Introduces a proposal for command-line option mappings: a new extensibility
point that lets an extension declaratively accept a user-facing option
(e.g. `--logger trx`, `--collect "XPlat Code Coverage"`) and rewrite
it, at parse time, into one or more first-class MTP options.
The primary scenario is easing migration from VSTest to MTP without
polluting the canonical MTP option set. Multiple extensions are allowed
to register the same mapping name, with exactly one expected to claim
responsibility for a given argument value.
Refs #7249
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Adds a new design RFC to the docs/RFCs area proposing command-line option mappings for Microsoft.Testing.Platform (MTP): an extensibility point allowing VSTest-style options like --logger trx / --collect ... to be rewritten into canonical MTP options during parsing to ease migration.

Changes:

  • Introduces an RFC describing the motivation, naming, proposed public API, and resolution/validation algorithm for command-line option mappings.
  • Provides worked examples (TRX and code coverage) and outlines help/info/telemetry implications plus a phased rollout plan.
Show a summary per file
FileDescription
docs/RFCs/014-Command-Line-Option-Mappings.mdNew RFC document defining the proposed “command-line option mappings” concept, API surface, and behavior.

Copilot's findings

  • Files reviewed: 1/1 changed files
  • Comments generated: 5

Comment threaddocs/RFCs/014-Command-Line-Option-Mappings.md Outdated
Comment threaddocs/RFCs/014-Command-Line-Option-Mappings.md Outdated
Comment threaddocs/RFCs/014-Command-Line-Option-Mappings.md Outdated
Comment threaddocs/RFCs/014-Command-Line-Option-Mappings.md Outdated
Comment threaddocs/RFCs/014-Command-Line-Option-Mappings.md Outdated

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

RFC 014 Review Summary

I've reviewed RFC 014 - Command-line option mappings against 21 expert review dimensions. The RFC proposes a well-motivated solution to a real migration pain point (VSTest → MTP compatibility), with strong design principles and thorough alternatives analysis. However, critical issues in the proposed API design require changes before approval.

Verdict Table

#DimensionVerdict
1Public API & Binary Compatibility🔴 1 BLOCKING, 2 MODERATE
2Defensive Coding at Boundaries🔴 2 BLOCKING, 2 MAJOR
3Algorithmic Correctness🟡 2 MAJOR
4Naming & Conventions⚪ 2 NIT
5Documentation Accuracy⚪ 1 NIT
6Performance & Allocations🟡 1 MODERATE (covered above)

✅ 15/21 dimensions clean.


Critical Issues (Must Fix Before Approval)

🔴 BLOCKING #1: Delegate signature prevents future evolution and lacks safety

Location: Lines 117-119 (CommandLineOptionMapper delegate)

Problems:

  1. Cannot add warnings later: RFC acknowledges (line 350) wanting to add warnings, but adding an out parameter to a delegate is a breaking change
  2. No exception handling: Extension throws → platform crash during startup
  3. No result validation: Extension returns true with result = null → NullReferenceException
  4. No timeout: Extension infinite loop → platform hangs indefinitely

Fix: Replace bool return + out parameter with a result struct that can carry warnings in future versions:

publicdelegateCommandLineOptionMapperResultCommandLineOptionMapper(ReadOnlySpan<string>arguments);publicreadonlystructCommandLineOptionMapperResult{publicboolSuccess{get;init;}publicIReadOnlyList<CommandLineOptionMappingResult>Results{get;init;}// Future: public IReadOnlyList<string> Warnings { get; init; }}

Add defensive wrapping (try/catch, validation, timeout) to the RFC's algorithm section.

🔴 BLOCKING #2: Naming inconsistency in manager pattern

Location: Lines 141, 149

Problem: ICommandLineMappingsManager uses plural "Mappings", breaking the universal MTP pattern: ICommandLineManager, ITestHostManager, IConfigurationManager, ILoggingManager (all singular).

Fix: Rename to ICommandLineMappingManager (singular). Update property name to CommandLineMapping to match the TestHost / ITestHostManager pattern.


Major Issues (Should Fix)

🟡 Algorithmic correctness gaps (2 issues)

  1. Empty result list undefined (line 246): What if TryMap returns true with empty results? Does occurrence get deleted?
  2. Runtime validation missing (line 258): Validation rules claim "enforced at startup" but can't detect invalid OptionName until runtime

Fix: Specify behavior for empty results (error recommended). Add runtime validation step in algorithm.

🟡 Defensive coding gaps (2 more issues beyond BLOCKING)

  1. Unbounded growth (line 192): Example code splits on ; with no limits → 100K segments from malicious input
  2. Malformed sub-options (line 194): No guidance on handling trx;LogFileName= (empty value)

Fix: Add defensive limits to examples (max segments, length checks). Document error handling approach for malformed sub-options.


Moderate Issues (Recommended Fixes)

Constructor design (line 126)

  1. params blocks future evolution: Can't add optional parameters after params array
  2. Unnecessary allocation: params creates array wrapper even for zero-argument cases

Fix: Add non-params overload for zero-argument case and explicit IReadOnlyList<string> overload.


Summary

Strong points:

  • Clear problem statement and motivation
  • Thorough alternatives analysis (5 rejected options)
  • Well-defined design principles
  • Comprehensive phasing plan
  • Threading/concurrency design is sound (synchronous, pre-DI, single-threaded startup)

Must address before approval:

  • Delegate signature evolution strategy (warnings, safety)
  • Naming consistency with existing patterns
  • Algorithm specification completeness (empty results, runtime validation)
  • Defensive coding guidance (limits, error handling)

The core concept is sound and valuable. The issues are fixable refinements to the API design, not fundamental flaws. Recommend addressing BLOCKING issues and reconsidering the MAJOR issues before moving to implementation.


Review dimensions not applicable to RFC: Test Isolation, Assertion Quality, Flakiness Patterns, Data-Driven Test Coverage, Analyzer Quality, IPC Wire Compatibility, Resource Management, Localization, Build Infrastructure, Cross-TFM Compatibility (these apply to implementation, not design docs).

Generated by Expert Code Review (on open) for issue #8501 · ● 22.6M

Comment threaddocs/RFCs/015-Command-Line-Option-Mappings.md
Comment threaddocs/RFCs/014-Command-Line-Option-Mappings.md Outdated
Comment threaddocs/RFCs/015-Command-Line-Option-Mappings.md
Comment threaddocs/RFCs/015-Command-Line-Option-Mappings.md
Comment threaddocs/RFCs/014-Command-Line-Option-Mappings.md Outdated
Comment threaddocs/RFCs/014-Command-Line-Option-Mappings.md Outdated
Comment threaddocs/RFCs/014-Command-Line-Option-Mappings.md Outdated
- Renumber to 015 to avoid collision with the existing
014-TestRun-Current-PlannedTests RFC.
- Align Naming section with the actual proposed types
(ICommandLineOptionMappingProvider / ICommandLineMappingManager,
matching the singular convention used elsewhere).
- Fix the broken <see cref="TryMap"/> reference to point at the Map
property.
- Make the TRX example case-insensitive for both the exact "trx" check
and the "trx;" prefix, matching VSTest-compat expectations.
- Replace ReadOnlySpan<string> with IReadOnlyList<string> in the public
delegate; the platform targets netstandard2.0 and Span-shaped APIs add
a System.Memory dependency to the public surface for limited benefit.
- Replace params string[] with IReadOnlyList<string> in
CommandLineOptionMappingResult to keep the constructor open for future
parameters and avoid unnecessary array allocations for the (common)
zero/one-argument case.
- Document the empty-result contract violation explicitly and split
startup-time vs runtime cross-cutting validation rules so the RFC
matches what can actually be enforced when the Map delegate is opaque.
- Expand the TRX example with malformed-segment handling and a sub-
option cap to address the defensive-coding concerns about unbounded
user input.
- Note in Unresolved Questions that adding an out-parameter to the
delegate is a binary-breaking change, so the warning-channel decision
must be made before shipping (or absorbed via a sibling delegate).
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
@Evangelink
Amaury Levé (Evangelink) merged commit e5e85a3 into mainMay 23, 2026
190 checks passed
@Evangelink
Amaury Levé (Evangelink) deleted the dev/amauryleve/rfc-cli-option-mappings branch May 23, 2026 15:45
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

type/rfcRequest for comments.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@Evangelink
, 'i'); if (__m === '*' || __re.test(location.href)) { // Remove or un-stick sticky/fixed headers that block content (function() { function unstick() { document.querySelectorAll('header, nav, [role="banner"], .header, .navbar, .sticky, .fixed-top, [style*="position: fixed"], [style*="position:sticky"]').forEach(function(el) { if (el.style.position === 'fixed' || el.style.position === 'sticky' || getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') { el.style.position = 'static'; el.style.top = 'auto'; el.style.zIndex = 'auto'; } }); } unstick(); var observer = new MutationObserver(unstick); observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] }); })(); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' RFC 014 - Command-line option mappings by Evangelink · Pull Request #8501 · microsoft/testfx · GitHub
Skip to content

RFC 014 - Command-line option mappings - #8501

Merged
Amaury Levé (Evangelink) merged 2 commits into
mainfrom
dev/amauryleve/rfc-cli-option-mappings
May 23, 2026
Merged

RFC 014 - Command-line option mappings#8501
Amaury Levé (Evangelink) merged 2 commits into
mainfrom
dev/amauryleve/rfc-cli-option-mappings

Conversation

@Evangelink

Copy link
Copy Markdown
Member

Adds RFC 014 proposing command-line option mappings: a new extensibility point that lets an extension declaratively accept a user-facing option (e.g. --logger trx, --collect ""XPlat Code Coverage"") and rewrite it, at parse time, into one or more first-class MTP options.

Why

The primary scenario is easing migration from VSTest to MTP. Today, dotnet test --logger trx --collect ""XPlat Code Coverage"" produces Unknown option against MTP — correct but unhelpful for the very large body of CI pipelines and tribal knowledge built around VSTest syntax.

The existing ICommandLineOptionsProvider contract intentionally forbids two extensions from registering the same option name. --logger and --collect are however intrinsically polyvalent: the value selects which extension owns the option. A new concept is therefore needed.

What's in the RFC

  • Naming rationale (Mapping over Alias/Transformation/Shim/Legacy…), explicitly addressing the alias-vs-rewrite discussion from [Proposal]: MTP Command-line aliases #7249.
  • Public API surface: ICommandLineOptionMappingProvider, CommandLineOptionMapping, CommandLineOptionMapper delegate (TryHandle style), CommandLineOptionMappingResult.
  • Resolution algorithm: mappings run after response-file expansion, before validation. Zero claimants → error. Multiple claimants → error. Exactly one → rewrite.
  • Worked examples for TRX (including trx;LogFileName=…) and Code Coverage.
  • Cross-cutting validation: mappings cannot collide with canonical option names, cannot rewrite to unknown options, cannot rewrite to other mappings (no loops).
  • Compatibility analysis, 5 rejected alternatives, 5-phase rollout, 5 unresolved questions.

Discussion seeds

Specific points where reviewer input would be most valuable:

  1. Naming — keep Mapping, or switch back to Alias (familiar) or Transformation (most accurate)?
  2. Help layout — separate ""VSTest-style options"" section, or interleave with canonical options?
  3. Warning channel — should TryMap get an out List<string> warnings parameter in v1, or defer?
  4. Telemetry — log only used_compat_mapping: bool, or include allowlisted values?

Refs #7249 — this PR provides the design artefact requested by the issue; implementation will follow in a separate PR once the RFC is approved.

Introduces a proposal for command-line option mappings: a new extensibility
point that lets an extension declaratively accept a user-facing option
(e.g. `--logger trx`, `--collect "XPlat Code Coverage"`) and rewrite
it, at parse time, into one or more first-class MTP options.
The primary scenario is easing migration from VSTest to MTP without
polluting the canonical MTP option set. Multiple extensions are allowed
to register the same mapping name, with exactly one expected to claim
responsibility for a given argument value.
Refs #7249
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Adds a new design RFC to the docs/RFCs area proposing command-line option mappings for Microsoft.Testing.Platform (MTP): an extensibility point allowing VSTest-style options like --logger trx / --collect ... to be rewritten into canonical MTP options during parsing to ease migration.

Changes:

  • Introduces an RFC describing the motivation, naming, proposed public API, and resolution/validation algorithm for command-line option mappings.
  • Provides worked examples (TRX and code coverage) and outlines help/info/telemetry implications plus a phased rollout plan.
Show a summary per file
FileDescription
docs/RFCs/014-Command-Line-Option-Mappings.mdNew RFC document defining the proposed “command-line option mappings” concept, API surface, and behavior.

Copilot's findings

  • Files reviewed: 1/1 changed files
  • Comments generated: 5

Comment threaddocs/RFCs/014-Command-Line-Option-Mappings.md Outdated
Comment threaddocs/RFCs/014-Command-Line-Option-Mappings.md Outdated
Comment threaddocs/RFCs/014-Command-Line-Option-Mappings.md Outdated
Comment threaddocs/RFCs/014-Command-Line-Option-Mappings.md Outdated
Comment threaddocs/RFCs/014-Command-Line-Option-Mappings.md Outdated

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

RFC 014 Review Summary

I've reviewed RFC 014 - Command-line option mappings against 21 expert review dimensions. The RFC proposes a well-motivated solution to a real migration pain point (VSTest → MTP compatibility), with strong design principles and thorough alternatives analysis. However, critical issues in the proposed API design require changes before approval.

Verdict Table

#DimensionVerdict
1Public API & Binary Compatibility🔴 1 BLOCKING, 2 MODERATE
2Defensive Coding at Boundaries🔴 2 BLOCKING, 2 MAJOR
3Algorithmic Correctness🟡 2 MAJOR
4Naming & Conventions⚪ 2 NIT
5Documentation Accuracy⚪ 1 NIT
6Performance & Allocations🟡 1 MODERATE (covered above)

✅ 15/21 dimensions clean.


Critical Issues (Must Fix Before Approval)

🔴 BLOCKING #1: Delegate signature prevents future evolution and lacks safety

Location: Lines 117-119 (CommandLineOptionMapper delegate)

Problems:

  1. Cannot add warnings later: RFC acknowledges (line 350) wanting to add warnings, but adding an out parameter to a delegate is a breaking change
  2. No exception handling: Extension throws → platform crash during startup
  3. No result validation: Extension returns true with result = null → NullReferenceException
  4. No timeout: Extension infinite loop → platform hangs indefinitely

Fix: Replace bool return + out parameter with a result struct that can carry warnings in future versions:

publicdelegateCommandLineOptionMapperResultCommandLineOptionMapper(ReadOnlySpan<string>arguments);publicreadonlystructCommandLineOptionMapperResult{publicboolSuccess{get;init;}publicIReadOnlyList<CommandLineOptionMappingResult>Results{get;init;}// Future: public IReadOnlyList<string> Warnings { get; init; }}

Add defensive wrapping (try/catch, validation, timeout) to the RFC's algorithm section.

🔴 BLOCKING #2: Naming inconsistency in manager pattern

Location: Lines 141, 149

Problem: ICommandLineMappingsManager uses plural "Mappings", breaking the universal MTP pattern: ICommandLineManager, ITestHostManager, IConfigurationManager, ILoggingManager (all singular).

Fix: Rename to ICommandLineMappingManager (singular). Update property name to CommandLineMapping to match the TestHost / ITestHostManager pattern.


Major Issues (Should Fix)

🟡 Algorithmic correctness gaps (2 issues)

  1. Empty result list undefined (line 246): What if TryMap returns true with empty results? Does occurrence get deleted?
  2. Runtime validation missing (line 258): Validation rules claim "enforced at startup" but can't detect invalid OptionName until runtime

Fix: Specify behavior for empty results (error recommended). Add runtime validation step in algorithm.

🟡 Defensive coding gaps (2 more issues beyond BLOCKING)

  1. Unbounded growth (line 192): Example code splits on ; with no limits → 100K segments from malicious input
  2. Malformed sub-options (line 194): No guidance on handling trx;LogFileName= (empty value)

Fix: Add defensive limits to examples (max segments, length checks). Document error handling approach for malformed sub-options.


Moderate Issues (Recommended Fixes)

Constructor design (line 126)

  1. params blocks future evolution: Can't add optional parameters after params array
  2. Unnecessary allocation: params creates array wrapper even for zero-argument cases

Fix: Add non-params overload for zero-argument case and explicit IReadOnlyList<string> overload.


Summary

Strong points:

  • Clear problem statement and motivation
  • Thorough alternatives analysis (5 rejected options)
  • Well-defined design principles
  • Comprehensive phasing plan
  • Threading/concurrency design is sound (synchronous, pre-DI, single-threaded startup)

Must address before approval:

  • Delegate signature evolution strategy (warnings, safety)
  • Naming consistency with existing patterns
  • Algorithm specification completeness (empty results, runtime validation)
  • Defensive coding guidance (limits, error handling)

The core concept is sound and valuable. The issues are fixable refinements to the API design, not fundamental flaws. Recommend addressing BLOCKING issues and reconsidering the MAJOR issues before moving to implementation.


Review dimensions not applicable to RFC: Test Isolation, Assertion Quality, Flakiness Patterns, Data-Driven Test Coverage, Analyzer Quality, IPC Wire Compatibility, Resource Management, Localization, Build Infrastructure, Cross-TFM Compatibility (these apply to implementation, not design docs).

Generated by Expert Code Review (on open) for issue #8501 · ● 22.6M

Comment threaddocs/RFCs/015-Command-Line-Option-Mappings.md
Comment threaddocs/RFCs/014-Command-Line-Option-Mappings.md Outdated
Comment threaddocs/RFCs/015-Command-Line-Option-Mappings.md
Comment threaddocs/RFCs/015-Command-Line-Option-Mappings.md
Comment threaddocs/RFCs/014-Command-Line-Option-Mappings.md Outdated
Comment threaddocs/RFCs/014-Command-Line-Option-Mappings.md Outdated
Comment threaddocs/RFCs/014-Command-Line-Option-Mappings.md Outdated
- Renumber to 015 to avoid collision with the existing
014-TestRun-Current-PlannedTests RFC.
- Align Naming section with the actual proposed types
(ICommandLineOptionMappingProvider / ICommandLineMappingManager,
matching the singular convention used elsewhere).
- Fix the broken <see cref="TryMap"/> reference to point at the Map
property.
- Make the TRX example case-insensitive for both the exact "trx" check
and the "trx;" prefix, matching VSTest-compat expectations.
- Replace ReadOnlySpan<string> with IReadOnlyList<string> in the public
delegate; the platform targets netstandard2.0 and Span-shaped APIs add
a System.Memory dependency to the public surface for limited benefit.
- Replace params string[] with IReadOnlyList<string> in
CommandLineOptionMappingResult to keep the constructor open for future
parameters and avoid unnecessary array allocations for the (common)
zero/one-argument case.
- Document the empty-result contract violation explicitly and split
startup-time vs runtime cross-cutting validation rules so the RFC
matches what can actually be enforced when the Map delegate is opaque.
- Expand the TRX example with malformed-segment handling and a sub-
option cap to address the defensive-coding concerns about unbounded
user input.
- Note in Unresolved Questions that adding an out-parameter to the
delegate is a binary-breaking change, so the warning-channel decision
must be made before shipping (or absorbed via a sibling delegate).
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
@Evangelink
Amaury Levé (Evangelink) merged commit e5e85a3 into mainMay 23, 2026
190 checks passed
@Evangelink
Amaury Levé (Evangelink) deleted the dev/amauryleve/rfc-cli-option-mappings branch May 23, 2026 15:45
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

type/rfcRequest for comments.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@Evangelink
, 'i'); if (__m === '*' || __re.test(location.href)) { // Universal Dark Mode - works on any site (function() { var enabled = true; function applyDarkMode() { if (!enabled) return; // Create style element if it doesn't exist var style = document.getElementById('universal-dark-mode-style'); if (!style) { style = document.createElement('style'); style.id = 'universal-dark-mode-style'; document.head.appendChild(style); } // Dark mode CSS - inverts colors but preserves images/video style.textContent = ' /* Invert everything except media */ html { filter: invert(1) hue-rotate(180deg) !important; background: #1a1a2e !important; } /* Restore images, videos, iframes, canvas */ img, video, iframe, canvas, svg, picture, [style*="background-image"] { filter: invert(1) hue-rotate(180deg) !important; } /* Preserve specific elements that should not be inverted */ .no-dark-mode, .no-dark-mode *, [data-theme="light"], [data-theme="light"], .ace_editor, .ace_editor *, .CodeMirror, .CodeMirror *, .monaco-editor, .monaco-editor *, .markdown-body pre, .markdown-body pre *, .highlight, .highlight *, pre code, pre code * { filter: none !important; } /* Fix common UI elements */ .modal, .popup, .dropdown-menu, .tooltip, .popover { filter: invert(1) hue-rotate(180deg) !important; background: #2d2d44 !important; border-color: #444 !important; } /* Scrollbars */ ::-webkit-scrollbar { background: #1a1a2e !important; } ::-webkit-scrollbar-thumb { background: #444 !important; } ::-webkit-scrollbar-thumb:hover { background: #555 !important; } /* Selection */ ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; } ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; } '; } function removeDarkMode() { var style = document.getElementById('universal-dark-mode-style'); if (style) style.remove(); } // Toggle with Alt+Shift+D document.addEventListener('keydown', function(e) { if (e.altKey && e.shiftKey && e.key === 'D') { e.preventDefault(); enabled = !enabled; if (enabled) { applyDarkMode(); console.log('[Universal Dark Mode] Enabled'); } else { removeDarkMode(); console.log('[Universal Dark Mode] Disabled'); } } }); // Apply on load applyDarkMode(); // Re-apply on dynamic content var observer = new MutationObserver(function(mutations) { if (enabled && !document.getElementById('universal-dark-mode-style')) { applyDarkMode(); } }); observer.observe(document.head, { childList: true }); console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle'); })(); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })(); RFC 014 - Command-line option mappings by Evangelink · Pull Request #8501 · microsoft/testfx · GitHub
Skip to content

RFC 014 - Command-line option mappings - #8501

Merged
Amaury Levé (Evangelink) merged 2 commits into
mainfrom
dev/amauryleve/rfc-cli-option-mappings
May 23, 2026
Merged

RFC 014 - Command-line option mappings#8501
Amaury Levé (Evangelink) merged 2 commits into
mainfrom
dev/amauryleve/rfc-cli-option-mappings

Conversation

@Evangelink

Copy link
Copy Markdown
Member

Adds RFC 014 proposing command-line option mappings: a new extensibility point that lets an extension declaratively accept a user-facing option (e.g. --logger trx, --collect ""XPlat Code Coverage"") and rewrite it, at parse time, into one or more first-class MTP options.

Why

The primary scenario is easing migration from VSTest to MTP. Today, dotnet test --logger trx --collect ""XPlat Code Coverage"" produces Unknown option against MTP — correct but unhelpful for the very large body of CI pipelines and tribal knowledge built around VSTest syntax.

The existing ICommandLineOptionsProvider contract intentionally forbids two extensions from registering the same option name. --logger and --collect are however intrinsically polyvalent: the value selects which extension owns the option. A new concept is therefore needed.

What's in the RFC

  • Naming rationale (Mapping over Alias/Transformation/Shim/Legacy…), explicitly addressing the alias-vs-rewrite discussion from [Proposal]: MTP Command-line aliases #7249.
  • Public API surface: ICommandLineOptionMappingProvider, CommandLineOptionMapping, CommandLineOptionMapper delegate (TryHandle style), CommandLineOptionMappingResult.
  • Resolution algorithm: mappings run after response-file expansion, before validation. Zero claimants → error. Multiple claimants → error. Exactly one → rewrite.
  • Worked examples for TRX (including trx;LogFileName=…) and Code Coverage.
  • Cross-cutting validation: mappings cannot collide with canonical option names, cannot rewrite to unknown options, cannot rewrite to other mappings (no loops).
  • Compatibility analysis, 5 rejected alternatives, 5-phase rollout, 5 unresolved questions.

Discussion seeds

Specific points where reviewer input would be most valuable:

  1. Naming — keep Mapping, or switch back to Alias (familiar) or Transformation (most accurate)?
  2. Help layout — separate ""VSTest-style options"" section, or interleave with canonical options?
  3. Warning channel — should TryMap get an out List<string> warnings parameter in v1, or defer?
  4. Telemetry — log only used_compat_mapping: bool, or include allowlisted values?

Refs #7249 — this PR provides the design artefact requested by the issue; implementation will follow in a separate PR once the RFC is approved.

Introduces a proposal for command-line option mappings: a new extensibility
point that lets an extension declaratively accept a user-facing option
(e.g. `--logger trx`, `--collect "XPlat Code Coverage"`) and rewrite
it, at parse time, into one or more first-class MTP options.
The primary scenario is easing migration from VSTest to MTP without
polluting the canonical MTP option set. Multiple extensions are allowed
to register the same mapping name, with exactly one expected to claim
responsibility for a given argument value.
Refs #7249
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Adds a new design RFC to the docs/RFCs area proposing command-line option mappings for Microsoft.Testing.Platform (MTP): an extensibility point allowing VSTest-style options like --logger trx / --collect ... to be rewritten into canonical MTP options during parsing to ease migration.

Changes:

  • Introduces an RFC describing the motivation, naming, proposed public API, and resolution/validation algorithm for command-line option mappings.
  • Provides worked examples (TRX and code coverage) and outlines help/info/telemetry implications plus a phased rollout plan.
Show a summary per file
FileDescription
docs/RFCs/014-Command-Line-Option-Mappings.mdNew RFC document defining the proposed “command-line option mappings” concept, API surface, and behavior.

Copilot's findings

  • Files reviewed: 1/1 changed files
  • Comments generated: 5

Comment threaddocs/RFCs/014-Command-Line-Option-Mappings.md Outdated
Comment threaddocs/RFCs/014-Command-Line-Option-Mappings.md Outdated
Comment threaddocs/RFCs/014-Command-Line-Option-Mappings.md Outdated
Comment threaddocs/RFCs/014-Command-Line-Option-Mappings.md Outdated
Comment threaddocs/RFCs/014-Command-Line-Option-Mappings.md Outdated

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

RFC 014 Review Summary

I've reviewed RFC 014 - Command-line option mappings against 21 expert review dimensions. The RFC proposes a well-motivated solution to a real migration pain point (VSTest → MTP compatibility), with strong design principles and thorough alternatives analysis. However, critical issues in the proposed API design require changes before approval.

Verdict Table

#DimensionVerdict
1Public API & Binary Compatibility🔴 1 BLOCKING, 2 MODERATE
2Defensive Coding at Boundaries🔴 2 BLOCKING, 2 MAJOR
3Algorithmic Correctness🟡 2 MAJOR
4Naming & Conventions⚪ 2 NIT
5Documentation Accuracy⚪ 1 NIT
6Performance & Allocations🟡 1 MODERATE (covered above)

✅ 15/21 dimensions clean.


Critical Issues (Must Fix Before Approval)

🔴 BLOCKING #1: Delegate signature prevents future evolution and lacks safety

Location: Lines 117-119 (CommandLineOptionMapper delegate)

Problems:

  1. Cannot add warnings later: RFC acknowledges (line 350) wanting to add warnings, but adding an out parameter to a delegate is a breaking change
  2. No exception handling: Extension throws → platform crash during startup
  3. No result validation: Extension returns true with result = null → NullReferenceException
  4. No timeout: Extension infinite loop → platform hangs indefinitely

Fix: Replace bool return + out parameter with a result struct that can carry warnings in future versions:

publicdelegateCommandLineOptionMapperResultCommandLineOptionMapper(ReadOnlySpan<string>arguments);publicreadonlystructCommandLineOptionMapperResult{publicboolSuccess{get;init;}publicIReadOnlyList<CommandLineOptionMappingResult>Results{get;init;}// Future: public IReadOnlyList<string> Warnings { get; init; }}

Add defensive wrapping (try/catch, validation, timeout) to the RFC's algorithm section.

🔴 BLOCKING #2: Naming inconsistency in manager pattern

Location: Lines 141, 149

Problem: ICommandLineMappingsManager uses plural "Mappings", breaking the universal MTP pattern: ICommandLineManager, ITestHostManager, IConfigurationManager, ILoggingManager (all singular).

Fix: Rename to ICommandLineMappingManager (singular). Update property name to CommandLineMapping to match the TestHost / ITestHostManager pattern.


Major Issues (Should Fix)

🟡 Algorithmic correctness gaps (2 issues)

  1. Empty result list undefined (line 246): What if TryMap returns true with empty results? Does occurrence get deleted?
  2. Runtime validation missing (line 258): Validation rules claim "enforced at startup" but can't detect invalid OptionName until runtime

Fix: Specify behavior for empty results (error recommended). Add runtime validation step in algorithm.

🟡 Defensive coding gaps (2 more issues beyond BLOCKING)

  1. Unbounded growth (line 192): Example code splits on ; with no limits → 100K segments from malicious input
  2. Malformed sub-options (line 194): No guidance on handling trx;LogFileName= (empty value)

Fix: Add defensive limits to examples (max segments, length checks). Document error handling approach for malformed sub-options.


Moderate Issues (Recommended Fixes)

Constructor design (line 126)

  1. params blocks future evolution: Can't add optional parameters after params array
  2. Unnecessary allocation: params creates array wrapper even for zero-argument cases

Fix: Add non-params overload for zero-argument case and explicit IReadOnlyList<string> overload.


Summary

Strong points:

  • Clear problem statement and motivation
  • Thorough alternatives analysis (5 rejected options)
  • Well-defined design principles
  • Comprehensive phasing plan
  • Threading/concurrency design is sound (synchronous, pre-DI, single-threaded startup)

Must address before approval:

  • Delegate signature evolution strategy (warnings, safety)
  • Naming consistency with existing patterns
  • Algorithm specification completeness (empty results, runtime validation)
  • Defensive coding guidance (limits, error handling)

The core concept is sound and valuable. The issues are fixable refinements to the API design, not fundamental flaws. Recommend addressing BLOCKING issues and reconsidering the MAJOR issues before moving to implementation.


Review dimensions not applicable to RFC: Test Isolation, Assertion Quality, Flakiness Patterns, Data-Driven Test Coverage, Analyzer Quality, IPC Wire Compatibility, Resource Management, Localization, Build Infrastructure, Cross-TFM Compatibility (these apply to implementation, not design docs).

Generated by Expert Code Review (on open) for issue #8501 · ● 22.6M

Comment threaddocs/RFCs/015-Command-Line-Option-Mappings.md
Comment threaddocs/RFCs/014-Command-Line-Option-Mappings.md Outdated
Comment threaddocs/RFCs/015-Command-Line-Option-Mappings.md
Comment threaddocs/RFCs/015-Command-Line-Option-Mappings.md
Comment threaddocs/RFCs/014-Command-Line-Option-Mappings.md Outdated
Comment threaddocs/RFCs/014-Command-Line-Option-Mappings.md Outdated
Comment threaddocs/RFCs/014-Command-Line-Option-Mappings.md Outdated
- Renumber to 015 to avoid collision with the existing
014-TestRun-Current-PlannedTests RFC.
- Align Naming section with the actual proposed types
(ICommandLineOptionMappingProvider / ICommandLineMappingManager,
matching the singular convention used elsewhere).
- Fix the broken <see cref="TryMap"/> reference to point at the Map
property.
- Make the TRX example case-insensitive for both the exact "trx" check
and the "trx;" prefix, matching VSTest-compat expectations.
- Replace ReadOnlySpan<string> with IReadOnlyList<string> in the public
delegate; the platform targets netstandard2.0 and Span-shaped APIs add
a System.Memory dependency to the public surface for limited benefit.
- Replace params string[] with IReadOnlyList<string> in
CommandLineOptionMappingResult to keep the constructor open for future
parameters and avoid unnecessary array allocations for the (common)
zero/one-argument case.
- Document the empty-result contract violation explicitly and split
startup-time vs runtime cross-cutting validation rules so the RFC
matches what can actually be enforced when the Map delegate is opaque.
- Expand the TRX example with malformed-segment handling and a sub-
option cap to address the defensive-coding concerns about unbounded
user input.
- Note in Unresolved Questions that adding an out-parameter to the
delegate is a binary-breaking change, so the warning-channel decision
must be made before shipping (or absorbed via a sibling delegate).
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
@Evangelink
Amaury Levé (Evangelink) merged commit e5e85a3 into mainMay 23, 2026
190 checks passed
@Evangelink
Amaury Levé (Evangelink) deleted the dev/amauryleve/rfc-cli-option-mappings branch May 23, 2026 15:45
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

type/rfcRequest for comments.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@Evangelink