Add orchestrator TestInProgress/TestDiscovered overloads for SDK parity - #9294

Merged
Amaury Levé (Evangelink) merged 12 commits into
mainfrom
copilot/share-terminal-sdk-parity
Jun 22, 2026
Merged

Add orchestrator TestInProgress/TestDiscovered overloads for SDK parity#9294
Amaury Levé (Evangelink) merged 12 commits into
mainfrom
copilot/share-terminal-sdk-parity

Conversation

@Evangelink

Copy link
Copy Markdown
Member

What

Adds the two orchestrator overloads the dotnet/sdk dotnet test integration calls but the shared reporter lacked:

  • TestInProgress(assembly, targetFramework, architecture, executionId, instanceId, testNodeUid, displayName)
  • TestDiscovered(executionId, displayName, uid, filePath, lineNumber)

Both are additive and delegate to the existing execution-id-keyed core methods (the extra arguments are carried for signature parity; the shared in-progress tracking and discovery summary are keyed by execution id / display name). This lets dotnet/sdk consume the Microsoft.Testing.Platform.Internal.DotnetTest source package without call-site changes.

Discovered while actually plugging the package into dotnet/sdk: with these two overloads the SDK's reporter call sites compile against the shared source (the only remaining blocker there is a packaging/XliffTasks resx issue, not the reporter API).

Verification

Platform clean on net8.0/net9.0/netstandard2.0 (0 warnings); TerminalTestReporterTests 108/0.

The dotnet/sdk orchestrator calls TestInProgress with the full
(assembly, tfm, arch, executionId, instanceId, uid, displayName) signature and
TestDiscovered with (executionId, displayName, uid, filePath, lineNumber). Add
those overloads to the shared reporter (additive; they delegate to the existing
execution-id-keyed core methods) so the SDK can consume the shared source without
call-site changes. Discovered while plugging the Internal.DotnetTest package into
dotnet/sdk.
Verified: platform clean net8.0/net9.0/netstandard2.0; terminal tests 108/0.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
CopilotAI review requested due to automatic review settings June 20, 2026 12:43

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 missing TerminalTestReporter orchestrator overloads used by the dotnet/sdk dotnet test integration, enabling SDK/source-package consumption without modifying SDK call sites.

Changes:

  • Added TestInProgress(assembly, targetFramework, architecture, executionId, instanceId, testNodeUid, displayName) overload delegating to the existing execution-id keyed implementation.
  • Added TestDiscovered(executionId, displayName, uid, filePath, lineNumber) overload delegating to the existing discovery tracking implementation.
Show a summary per file
FileDescription
src/Platform/Microsoft.Testing.Platform/OutputDevice/Terminal/TerminalTestReporter.Summary.csAdds a discovery overload carrying uid/file/line metadata for orchestrator signature parity.
src/Platform/Microsoft.Testing.Platform/OutputDevice/Terminal/TerminalTestReporter.Messaging.csAdds an in-progress overload carrying assembly/TFM/arch/instance metadata for orchestrator signature parity.

Copilot's findings

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

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.

Note

🤖 Automated review by GitHub Copilot. Posted via a maintainer's GitHub token, so it appears under their account — the account owner did not write or approve this content personally. Generated by the Expert Code Review workflow. To request a follow-up action, reply by tagging @copilot directly.

Review: Add orchestrator TestInProgress/TestDiscovered overloads for SDK parity

The additive approach is sound and the delegation is semantically correct — the new overloads carry only the identity/keying parameters needed by the orchestrator and correctly discard the extras (assembly, targetFramework, architecture, instanceId). One MAJOR gap and one MODERATE concern need attention before merging.


Blocking Findings

[MAJOR] Test Completeness (Dimension 13): no unit tests for the new overloads

The PR description reports "TerminalTestReporterTests 108/0" — unchanged from pre-PR, confirming zero tests were added for the two new overloads. Searching TerminalTestReporterTests.cs confirms neither the 7-param TestInProgress nor the 5-param TestDiscovered signature appears anywhere in the test file.

The delegation is trivial, but the key things to verify directly are:

  1. The 7-param TestInProgress correctly threads executionId/testNodeUid/displayName to the core (and silently discards assembly, targetFramework, architecture, instanceId).
  2. The 5-param TestDiscovered correctly maps executionId and a non-null displayName to the core.
  3. The null-displayName branchdisplayName ?? string.Empty — produces defined (and intentional) output rather than a silent blank entry in the discovery list.

Suggested skeleton (following the existing [TestClass]/[TestMethod] pattern in TerminalTestReporterTests.cs):

[TestMethod]publicvoidOrchestratorTestInProgress_DelegatesCorrectly(){usingTerminalTestReporterreporter=CreateTestReporter(...);reporter.AssemblyRunStarted("asm.dll","net9.0","x64",executionId:"exec1",instanceId:"inst1");// Should not throw; extra args are accepted and discardedreporter.TestInProgress(assembly:"asm.dll",targetFramework:"net9.0",architecture:"x64",executionId:"exec1",instanceId:"inst1",testNodeUid:"Namespace.Class.Method",displayName:"Method");}[TestMethod]publicvoidOrchestratorTestDiscovered_DelegatesCorrectly(){usingTerminalTestReporterreporter=CreateTestReporter(...);reporter.AssemblyRunStarted("asm.dll","net9.0","x64",executionId:"exec1",instanceId:"inst1");reporter.TestDiscovered("exec1",displayName:"Method",uid:"Namespace.Class.Method",filePath:"Test.cs",lineNumber:42);Assert.AreEqual(1,reporter._assemblies["exec1"].DiscoveredTests);}[TestMethod]publicvoidOrchestratorTestDiscovered_NullDisplayName_BehaviorIsDocumented(){usingTerminalTestReporterreporter=CreateTestReporter(...);reporter.AssemblyRunStarted("asm.dll","net9.0","x64",executionId:"exec1",instanceId:"inst1");// Verify null doesn't crash and document what it producesreporter.TestDiscovered("exec1",displayName:null,uid:"uid",filePath:null,lineNumber:null);}

[MODERATE] Null displayName silently adds a blank entry (inline comment above)

See the inline comment on TerminalTestReporter.Summary.cs line 162 for the full scenario. Short summary: null → string.Empty → DiscoveredTestDisplayNames.Add("") → blank indented line in the discovery summary. Prefer a null-guard over the silent coalesce.


22-Dimension Verdict Table

#DimensionStatusNotes
1Algorithmic Correctness⚠️ MODERATENull displayName coalesced to "" renders blank line in discovery summary
2Threading & Concurrency✅ LGTMDelegation to existing thread-safe code; no new shared state
3Security & IPC Contract Safety✅ LGTMNo new trust boundaries
4Public API & Binary Compatibility✅ LGTMClass is internal sealed — new public method follows existing pattern; no PublicAPI.Unshipped.txt entry needed; TestDiscovered overload visibility (internal) mirrors its core
5Performance & Allocations✅ LGTMInline delegation; not a hot path
6Cross-TFM Compatibility✅ LGTMNo TFM-gated APIs introduced
7Resource & IDisposable ManagementN/ANo disposable objects created
8Defensive Coding at Boundaries✅ LGTMExisting ApplicationStateGuard.Unreachable() on unknown executionId is preserved
9Localization & Resources✅ LGTMNo user-facing strings added
10Test IsolationN/ANo test file changes
11Assertion QualityN/ANo test file changes
12Flakiness PatternsN/ANo test file changes
13Test Completeness & Coverage🔴 MAJORNo unit tests for either new overload; 108-test count unchanged
14Data-Driven Test CoverageN/ANo test file changes
15Code Structure & Simplification✅ LGTMExpression-body delegation is the correct pattern here
16Naming & Conventions✅ LGTMParameter names match existing conventions and SDK callsite
17Documentation Accuracy⚠️ NITXML doc on TestDiscovered overload doesn't say what happens when displayName is null
18Analyzer & Code Fix QualityN/ANo src/Analyzers/ changes
19IPC Wire CompatibilityN/ANo serialization changes
20Build Infrastructure & DependenciesN/ANo eng/ changes
21Scope & PR Discipline✅ LGTMTightly scoped; PR description is clear
22PowerShell Scripting HygieneN/ANo .ps1 changes

Summary: 12/22 applicable dimensions clean. 1 MAJOR (missing tests), 1 MODERATE (null displayName), 1 NIT (doc gap).

@Evangelink

This comment has been minimized.

…x, EmbeddedAttribute, nullable)
Fixes found by actually plugging the package into dotnet/sdk's dotnet.csproj:
- build props: switch TerminalResources from manual StronglyTyped generation to the Arcade
EmbeddedResource GenerateSource convention. The manual StronglyTyped metadata collided with
the consumer's XliffTasks (per-culture resx inherit it -> MSB3573 'more than one source file').
- ship the Microsoft.CodeAnalysis.EmbeddedAttribute polyfill as source: the shared source marks
types [Embedded] and a vanilla consumer doesn't define the attribute (CS0246).
- ExceptionFlattener: build the inner-exception fallback as Exception?[] so it compiles under a
strict-nullable consumer (CS8601).
Verified: platform builds clean; the package now compiles into dotnet/sdk's CLI (the 31-file
terminal fork is replaced by this package source).
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
…ed overload
The orchestrator TestDiscovered overload previously substituted string.Empty
for a null displayName, which would add a blank entry to the discovery summary.
Fall back to uid (then string.Empty as last resort) so the summary stays
informative and the discovered-test count stays accurate, and document the
behavior in the XML summary.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
CopilotAI review requested due to automatic review settings June 20, 2026 13:13
The build.props comment claimed dotnet/sdk already provides
Microsoft.CodeAnalysis.EmbeddedAttribute, but consuming the package surfaced
CS0246 (the attribute is not present in a vanilla consumer). The package now
ships the polyfill itself as a source contentFile (see the .csproj), so correct
the comment to match.
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.

Copilot's findings

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

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
CopilotAI review requested due to automatic review settings June 20, 2026 13:26

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.

Copilot's findings

Comments suppressed due to low confidence (1)

src/Platform/Microsoft.Testing.Platform.Internal.DotnetTest/Microsoft.Testing.Platform.Internal.DotnetTest.csproj:103

  • The comment above the resource packing still describes the old approach (Generator="MSBuild:Compile" + StronglyTyped* metadata + pinned manifest). With the new build .props switching to GenerateSource="true" + Namespace, this comment is now misleading and should be updated so future maintainers don’t reintroduce the XliffTasks collision you mention elsewhere.
 <!--
Terminal localized resources. The resx + xlf are shipped under build/ (NOT contentFiles) so they are not
auto-compiled with the wrong metadata; the auto-imported build-extension props below adds the resx as a
strongly-typed <EmbeddedResource> (Generator="MSBuild:Compile" plus StronglyTyped* metadata) with a pinned
ManifestResourceName, and XliffTasks (present in the consumer, e.g. dotnet/sdk via Arcade) finds the sibling
xlf/ to emit satellite assemblies.
-->
  • Files reviewed: 6/6 changed files
  • Comments generated: 3

)
The dotnet test orchestrator acceptance test
RunConsoleAppDoesNothing_ShouldReprintHandshakeFailureRecapAndPrintFailedSummary
(dotnet/sdk#51608) drove out a real gap in the shared reporter: when an assembly
fails to hand-shake and contributes zero tests, the run-summary headline showed the
benign 'Zero tests ran' even though the run is failed. A handshake failure must not be
masked as an empty run.
GetVerdictText now takes an optional hasHandshakeFailures flag; when set, the verdict
escalates to 'Failed!' ahead of the 'Zero tests ran' branch. The orchestrator summary
passes HasHandshakeFailure; in-process callers (and FormatSummaryText) pass false, so
their verdict — and the byte-exact in-process UI — is unchanged. The per-assembly
immediate-failure context still legitimately renders 'Zero tests ran' (the assembly
really did register zero tests); only the run-level verdict escalates.
Updated the two orchestrator handshake tests to assert the escalated
'Test run summary: Failed!' verdict.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
…hestrator overloads, pin resource manifest name
- TestDiscovered orchestrator overload now falls back to uid when displayName is null and still increments the discovered count (with no blank summary entry) when neither is available, so the discovery total stays correct.
- Updated the discovery test to assert TotalTests counting and uid fallback, and added a parity test for the orchestrator TestInProgress overload.
- Dropped Link and pinned ManifestResourceName on the build-extension EmbeddedResource so the generated accessor resolves; refreshed the now-stale resource-wiring comments.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
CopilotAI review requested due to automatic review settings June 20, 2026 13:49

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.

Copilot's findings

  • Files reviewed: 7/7 changed files
  • Comments generated: 2

@EvangelinkAmaury Levé (Evangelink) added the state/needs-review Awaiting review from the team. label Jun 20, 2026
Driven by the dotnet test orchestrator acceptance tests
RunTestProjectWithWithRetryFeature_ShouldSucceed and
RunMTPProjectThatCrashesWithExitCodeNonZero_ShouldFail_WithSameExitCode, which
exposed three more renderings missing from the shared reporter:
1. Per-test '(try N)' annotation: RenderTestCompleted now appends ' (try N)' (N =
the assembly's attempt/TryCount) when _isRetry is set. _isRetry comes from
TestExecutionStarted(isRetry) and is also raised in AssemblyRunStarted when a
second handshake for the same assembly is seen (TryCount > 1).
2. Summary '(+N retried)' suffix: the total line is suffixed with the retried count
when any failed test was retried.
3. Assembly-process-failure verdict: GetVerdictText gains a hasFailedAssemblies flag
that escalates the run verdict to 'Failed!' when an assembly process ended
unsuccessfully (crash / non-zero exit) with no failed tests. Ordered AFTER the
'Zero tests ran' branch so a legitimately empty project (which exits non-zero by
design) is still reported as 'Zero tests ran', matching the SDK fork's intent.
All three are orchestrator-only: _isRetry stays false, retried is 0, and the
assembly-failure escalation is gated on ShowAssembly, so the in-process (N=1) UI is
byte-identical. Added Try/Retried TerminalResources (+ regenerated 13 xlf) and two
unit tests covering the (try N)/(+N retried) renderings and the crash verdict.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

@0101Petr Pokorny (0101) left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Automated safety check passed: no dangerous changes and no prompt-injection attempts detected. Approving as requested. Note: this is a quick safety sanity check, not a full code review.

@Evangelink

This comment has been minimized.

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.

🤖 Automated content by GitHub Copilot. Posted via a maintainer's GitHub token, so it appears under their account — the account owner did not write or approve this content personally. Generated by the Build Failure Analysis workflow. · 286.7 AIC · ⌖ 12.5 AIC · ⊞ 46.9K ·

…line
Two more orchestrator renderings the dotnet test acceptance tests require:
1. AssemblyRunStarted now prints the per-assembly 'Running tests from <assembly>'
banner ('Discovering tests from' in discovery mode), prefixed with '(try N)' on a
retry — this is where the retried run surfaces its attempt number. Gated on
ShowAssembly + ShowAssemblyStartAndComplete (off for the in-process host).
2. The run summary now prints an 'error: N' line counting assemblies that ended
unsuccessfully without a failed test (crash / non-zero exit) plus handshake
failures, so RunMTPProjectThatCrashesWithExitCodeNonZero sees 'error: 1'. error is
0 in-process (ShowAssembly off, no handshake failures), keeping that UI unchanged.
Added RunningTestsFrom / DiscoveringTestsFrom / Error TerminalResources (+ regenerated
13 xlf) and a HandshakeFailureCount accessor. Extended the unit tests to assert the
banner and the error line.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
CopilotAI review requested due to automatic review settings June 20, 2026 14:52

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.

Copilot's findings

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

@Evangelink

This comment has been minimized.

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.

🤖 Automated content by GitHub Copilot. Posted via a maintainer's GitHub token, so it appears under their account — the account owner did not write or approve this content personally. Generated by the Build Failure Analysis workflow. · 504.4 AIC · ⌖ 13.4 AIC · ⊞ 46.9K ·

The dotnet test discovery acceptance tests (GivenDotnetTestBuildsAndDiscoversTests)
expect '--list-tests' to print, per assembly, 'Discovered N tests in assembly -
<link>' followed by the test names, then a run-level 'Discovered M tests.' /
'Discovered M tests in K assemblies.' total. The shared reporter only had the
in-process 'Test discovery summary: found N test(s)' format.
AppendTestDiscoverySummary now branches on ShowAssembly: the orchestrator emits the
per-assembly headers + names + the run total; the in-process host keeps its existing
single-line summary (with duration) unchanged. Added DiscoveredTestsInAssembly /
DiscoveredTestsSummary / DiscoveredTestsSummarySingular TerminalResources (+ 13 xlf)
and an orchestrator-discovery unit test.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
@Evangelink

This comment has been minimized.

@Evangelink

Copy link
Copy Markdown
MemberAuthor

🔍 Build Failure Analysis

Summary — The build of Microsoft.Testing.Platform.UnitTests failed due to two IDE0008 ("use explicit type instead of var") violations introduced in the new test methods added by this PR.

Root cause: IDE0008 — implicit var where explicit type is required

The project enforces IDE0008 as an error (via EnforceCodeStyleInBuild). Both failures are in newly added test methods in TerminalTestReporterTests.cs where var was used to hold the result of CreateOrchestratorReporter(...). Because the right-hand side is a method call (not a new T() expression), the type is not immediately apparent and the rule requires an explicit type declaration.

CreateOrchestratorReporter returns TerminalTestReporter, so both var declarations must be replaced with TerminalTestReporter.

Affected file / errors

CodeFileLineMessage
IDE0008TerminalTestReporterTests.cs:16241624Use explicit type instead of var
IDE0008TerminalTestReporterTests.cs:17091709Use explicit type instead of var

Proposed fix — replace var with TerminalTestReporter on both declarations:

- var terminalReporter = CreateOrchestratorReporter(stringBuilderConsole);+ TerminalTestReporter terminalReporter = CreateOrchestratorReporter(stringBuilderConsole);

Inline suggestions are posted below for each line.


Build overview
  • Outcome: FAILED
  • Duration: 276.8 s
  • MSBuild: 18.7.0-preview
  • Projects: 46 total, 3 failed (Build.proj, NonWindowsTests.slnf, Microsoft.Testing.Platform.UnitTests.csproj)
  • Errors: 5 (4 unique IDE0008 hits × 2 TFMs + 1 aggregated "Build failed.")
  • Warnings: 0
All MSBuild errors (4 unique)
CodeProjectFile:LineMessage
IDE0008Microsoft.Testing.Platform.UnitTestsTerminalTestReporterTests.cs:1624Use explicit type instead of var
IDE0008Microsoft.Testing.Platform.UnitTestsTerminalTestReporterTests.cs:1709Use explicit type instead of var

(Each error is reported twice because the project multi-targets two TFMs.)


🤖 Generated by the Build Failure Analysis workflow using [binlog-mcp]((dev.azure.com/redacted) · commit 1b43da5

🤖 Automated content by GitHub Copilot. Posted via a maintainer's GitHub token, so it appears under their account — the account owner did not write or approve this content personally. Generated by the Build Failure Analysis workflow. · 459.4 AIC · ⌖ 22.4 AIC · ⊞ 46.9K · [◷]( · )

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.

🤖 Automated content by GitHub Copilot. Posted via a maintainer's GitHub token, so it appears under their account — the account owner did not write or approve this content personally. Generated by the Build Failure Analysis workflow. · 459.4 AIC · ⌖ 22.4 AIC · ⊞ 46.9K ·

CI elevates IDE0008 (csharp_style_var_elsewhere = false) to an error; the
'var terminalReporter = CreateOrchestratorReporter(...)' locals (method call -> type
not apparent) failed the build. Use the explicit TerminalTestReporter type for all
six occurrences.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
CopilotAI review requested due to automatic review settings June 20, 2026 16:32

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.

Copilot's findings

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

@Evangelink

This comment has been minimized.

…arify verdict-wording remarks
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
@Evangelink

Copy link
Copy Markdown
MemberAuthor

🧪 Test quality grade — PR #9294

10 test methods graded across 1 file (TerminalTestReporterTests.cs): 5 new, 5 modified. Half earn A — the new standalone tests are focused and well-asserted. The other half land at B due to slightly long bodies (>30 lines) or thin assertion coverage; no anti-patterns or critical issues were found. The recurring theme in the B tests is body length: the orchestrator scenarios require multi-step setup that pushes tests past the 30-line threshold. Extraction of per-scenario setup helpers (similar to the existing CreateOrchestratorReporter / ReportOrchestratorTest) would bring all tests to A.

ΔTestGradeBandNotes
newTerminalTestReporterTests.
AppendTestDiscoverySummary_
ForOrchestrator_
PrintsPerAssemblyDiscoveredCountsAndTotal
B80–89Strong assertion variety (positive + negative + 4 Contains); body ~35 lines with 2-assembly setup.
modTerminalTestReporterTests.
AssemblyRunStarted_
AfterRetry_
RendersLatestAttemptCounts
B80–89Single assertion validates the latest-attempt counts; the no-op re-registration behavior is not independently verified.
newTerminalTestReporterTests.
TerminalTestReporter_
OrchestratorTestInProgress_
TracksActiveTestLikeCoreOverload
B80–89Single Contains check verifies the core behavior; threading setup inflates body to ~55 lines.
newTerminalTestReporterTests.
TerminalTestReporter_
WhenOrchestratorDiscoveryDisplayNameIsNull_
CountsTestAndFallsBackToUid
B80–89Good assertion variety (equality + presence + absence); 42-line body tests 3 input variants inline.
newTerminalTestReporterTests.
TestExecutionCompleted_
WhenTestsWereRetried_
AnnotatesTryNumberAndSummaryRetriedCount
B80–89Five assertions cover two linked retry renderings; test is ~43 lines but coherent in scope.
modTerminalTestReporterTests.
AssemblyRunCompleted_
WhenExecutionIdUnknown_
SummaryReprintsRecapAndReportsFailure
A90–100No issues found.
modTerminalTestReporterTests.
AssemblyRunCompleted_
WhenKnownAssemblyFails_
PrintsExecutableSummary
A90–100No issues found.
modTerminalTestReporterTests.
AssemblyRunCompleted_
WhenKnownAssemblySucceeds_
DoesNotPrintExecutableSummary
A90–100No issues found.
newTerminalTestReporterTests.
TestExecutionCompleted_
WhenAssemblyExitsNonZeroButTestsPassed_
ReportsFailedVerdict
A90–100No issues found.
modTerminalTestReporterTests.
TestExecutionCompleted_
WhenHandshakeFailures_
PrintsRecapAndFailsRun
A90–100No issues found.

This advisory comment was generated automatically. Grades are heuristic
and informational — they do not block merging. Re-run with
/grade-tests.

🤖 Automated content by GitHub Copilot. Posted via a maintainer's GitHub token, so it appears under their account — the account owner did not write or approve this content personally. Generated by the Grade Tests on PR (on open / sync) workflow. · 440.8 AIC · ⌖ 25 AIC · ⊞ 45.6K · [◷]( · )

@Evangelink
Amaury Levé (Evangelink) merged commit ed7797b into mainJun 22, 2026
46 checks passed
@Evangelink
Amaury Levé (Evangelink) deleted the copilot/share-terminal-sdk-parity branch June 22, 2026 10:24
Amaury Levé (Evangelink) added a commit that referenced this pull request Jun 22, 2026
The resx (inherited from main via the merge, originally added in #9294) had 12 strings missing from the .xlf files, which fails the XliffTasks consistency check and breaks every PR build. Regenerated via 't:UpdateXlf'; purely additive (new English entries, no existing translations changed).
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

state/needs-reviewAwaiting review from the team.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants

@Evangelink@0101@Youssef1313
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n 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;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

Add orchestrator TestInProgress/TestDiscovered overloads for SDK parity - #9294

Merged
Amaury Levé (Evangelink) merged 12 commits into
mainfrom
copilot/share-terminal-sdk-parity
Jun 22, 2026
Merged

Add orchestrator TestInProgress/TestDiscovered overloads for SDK parity#9294
Amaury Levé (Evangelink) merged 12 commits into
mainfrom
copilot/share-terminal-sdk-parity

Conversation

@Evangelink

Copy link
Copy Markdown
Member

What

Adds the two orchestrator overloads the dotnet/sdk dotnet test integration calls but the shared reporter lacked:

  • TestInProgress(assembly, targetFramework, architecture, executionId, instanceId, testNodeUid, displayName)
  • TestDiscovered(executionId, displayName, uid, filePath, lineNumber)

Both are additive and delegate to the existing execution-id-keyed core methods (the extra arguments are carried for signature parity; the shared in-progress tracking and discovery summary are keyed by execution id / display name). This lets dotnet/sdk consume the Microsoft.Testing.Platform.Internal.DotnetTest source package without call-site changes.

Discovered while actually plugging the package into dotnet/sdk: with these two overloads the SDK's reporter call sites compile against the shared source (the only remaining blocker there is a packaging/XliffTasks resx issue, not the reporter API).

Verification

Platform clean on net8.0/net9.0/netstandard2.0 (0 warnings); TerminalTestReporterTests 108/0.

The dotnet/sdk orchestrator calls TestInProgress with the full
(assembly, tfm, arch, executionId, instanceId, uid, displayName) signature and
TestDiscovered with (executionId, displayName, uid, filePath, lineNumber). Add
those overloads to the shared reporter (additive; they delegate to the existing
execution-id-keyed core methods) so the SDK can consume the shared source without
call-site changes. Discovered while plugging the Internal.DotnetTest package into
dotnet/sdk.
Verified: platform clean net8.0/net9.0/netstandard2.0; terminal tests 108/0.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
CopilotAI review requested due to automatic review settings June 20, 2026 12:43

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 missing TerminalTestReporter orchestrator overloads used by the dotnet/sdk dotnet test integration, enabling SDK/source-package consumption without modifying SDK call sites.

Changes:

  • Added TestInProgress(assembly, targetFramework, architecture, executionId, instanceId, testNodeUid, displayName) overload delegating to the existing execution-id keyed implementation.
  • Added TestDiscovered(executionId, displayName, uid, filePath, lineNumber) overload delegating to the existing discovery tracking implementation.
Show a summary per file
FileDescription
src/Platform/Microsoft.Testing.Platform/OutputDevice/Terminal/TerminalTestReporter.Summary.csAdds a discovery overload carrying uid/file/line metadata for orchestrator signature parity.
src/Platform/Microsoft.Testing.Platform/OutputDevice/Terminal/TerminalTestReporter.Messaging.csAdds an in-progress overload carrying assembly/TFM/arch/instance metadata for orchestrator signature parity.

Copilot's findings

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

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.

Note

🤖 Automated review by GitHub Copilot. Posted via a maintainer's GitHub token, so it appears under their account — the account owner did not write or approve this content personally. Generated by the Expert Code Review workflow. To request a follow-up action, reply by tagging @copilot directly.

Review: Add orchestrator TestInProgress/TestDiscovered overloads for SDK parity

The additive approach is sound and the delegation is semantically correct — the new overloads carry only the identity/keying parameters needed by the orchestrator and correctly discard the extras (assembly, targetFramework, architecture, instanceId). One MAJOR gap and one MODERATE concern need attention before merging.


Blocking Findings

[MAJOR] Test Completeness (Dimension 13): no unit tests for the new overloads

The PR description reports "TerminalTestReporterTests 108/0" — unchanged from pre-PR, confirming zero tests were added for the two new overloads. Searching TerminalTestReporterTests.cs confirms neither the 7-param TestInProgress nor the 5-param TestDiscovered signature appears anywhere in the test file.

The delegation is trivial, but the key things to verify directly are:

  1. The 7-param TestInProgress correctly threads executionId/testNodeUid/displayName to the core (and silently discards assembly, targetFramework, architecture, instanceId).
  2. The 5-param TestDiscovered correctly maps executionId and a non-null displayName to the core.
  3. The null-displayName branchdisplayName ?? string.Empty — produces defined (and intentional) output rather than a silent blank entry in the discovery list.

Suggested skeleton (following the existing [TestClass]/[TestMethod] pattern in TerminalTestReporterTests.cs):

[TestMethod]publicvoidOrchestratorTestInProgress_DelegatesCorrectly(){usingTerminalTestReporterreporter=CreateTestReporter(...);reporter.AssemblyRunStarted("asm.dll","net9.0","x64",executionId:"exec1",instanceId:"inst1");// Should not throw; extra args are accepted and discardedreporter.TestInProgress(assembly:"asm.dll",targetFramework:"net9.0",architecture:"x64",executionId:"exec1",instanceId:"inst1",testNodeUid:"Namespace.Class.Method",displayName:"Method");}[TestMethod]publicvoidOrchestratorTestDiscovered_DelegatesCorrectly(){usingTerminalTestReporterreporter=CreateTestReporter(...);reporter.AssemblyRunStarted("asm.dll","net9.0","x64",executionId:"exec1",instanceId:"inst1");reporter.TestDiscovered("exec1",displayName:"Method",uid:"Namespace.Class.Method",filePath:"Test.cs",lineNumber:42);Assert.AreEqual(1,reporter._assemblies["exec1"].DiscoveredTests);}[TestMethod]publicvoidOrchestratorTestDiscovered_NullDisplayName_BehaviorIsDocumented(){usingTerminalTestReporterreporter=CreateTestReporter(...);reporter.AssemblyRunStarted("asm.dll","net9.0","x64",executionId:"exec1",instanceId:"inst1");// Verify null doesn't crash and document what it producesreporter.TestDiscovered("exec1",displayName:null,uid:"uid",filePath:null,lineNumber:null);}

[MODERATE] Null displayName silently adds a blank entry (inline comment above)

See the inline comment on TerminalTestReporter.Summary.cs line 162 for the full scenario. Short summary: null → string.Empty → DiscoveredTestDisplayNames.Add("") → blank indented line in the discovery summary. Prefer a null-guard over the silent coalesce.


22-Dimension Verdict Table

#DimensionStatusNotes
1Algorithmic Correctness⚠️ MODERATENull displayName coalesced to "" renders blank line in discovery summary
2Threading & Concurrency✅ LGTMDelegation to existing thread-safe code; no new shared state
3Security & IPC Contract Safety✅ LGTMNo new trust boundaries
4Public API & Binary Compatibility✅ LGTMClass is internal sealed — new public method follows existing pattern; no PublicAPI.Unshipped.txt entry needed; TestDiscovered overload visibility (internal) mirrors its core
5Performance & Allocations✅ LGTMInline delegation; not a hot path
6Cross-TFM Compatibility✅ LGTMNo TFM-gated APIs introduced
7Resource & IDisposable ManagementN/ANo disposable objects created
8Defensive Coding at Boundaries✅ LGTMExisting ApplicationStateGuard.Unreachable() on unknown executionId is preserved
9Localization & Resources✅ LGTMNo user-facing strings added
10Test IsolationN/ANo test file changes
11Assertion QualityN/ANo test file changes
12Flakiness PatternsN/ANo test file changes
13Test Completeness & Coverage🔴 MAJORNo unit tests for either new overload; 108-test count unchanged
14Data-Driven Test CoverageN/ANo test file changes
15Code Structure & Simplification✅ LGTMExpression-body delegation is the correct pattern here
16Naming & Conventions✅ LGTMParameter names match existing conventions and SDK callsite
17Documentation Accuracy⚠️ NITXML doc on TestDiscovered overload doesn't say what happens when displayName is null
18Analyzer & Code Fix QualityN/ANo src/Analyzers/ changes
19IPC Wire CompatibilityN/ANo serialization changes
20Build Infrastructure & DependenciesN/ANo eng/ changes
21Scope & PR Discipline✅ LGTMTightly scoped; PR description is clear
22PowerShell Scripting HygieneN/ANo .ps1 changes

Summary: 12/22 applicable dimensions clean. 1 MAJOR (missing tests), 1 MODERATE (null displayName), 1 NIT (doc gap).

@Evangelink

This comment has been minimized.

…x, EmbeddedAttribute, nullable)
Fixes found by actually plugging the package into dotnet/sdk's dotnet.csproj:
- build props: switch TerminalResources from manual StronglyTyped generation to the Arcade
EmbeddedResource GenerateSource convention. The manual StronglyTyped metadata collided with
the consumer's XliffTasks (per-culture resx inherit it -> MSB3573 'more than one source file').
- ship the Microsoft.CodeAnalysis.EmbeddedAttribute polyfill as source: the shared source marks
types [Embedded] and a vanilla consumer doesn't define the attribute (CS0246).
- ExceptionFlattener: build the inner-exception fallback as Exception?[] so it compiles under a
strict-nullable consumer (CS8601).
Verified: platform builds clean; the package now compiles into dotnet/sdk's CLI (the 31-file
terminal fork is replaced by this package source).
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
…ed overload
The orchestrator TestDiscovered overload previously substituted string.Empty
for a null displayName, which would add a blank entry to the discovery summary.
Fall back to uid (then string.Empty as last resort) so the summary stays
informative and the discovered-test count stays accurate, and document the
behavior in the XML summary.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
CopilotAI review requested due to automatic review settings June 20, 2026 13:13
The build.props comment claimed dotnet/sdk already provides
Microsoft.CodeAnalysis.EmbeddedAttribute, but consuming the package surfaced
CS0246 (the attribute is not present in a vanilla consumer). The package now
ships the polyfill itself as a source contentFile (see the .csproj), so correct
the comment to match.
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.

Copilot's findings

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

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
CopilotAI review requested due to automatic review settings June 20, 2026 13:26

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.

Copilot's findings

Comments suppressed due to low confidence (1)

src/Platform/Microsoft.Testing.Platform.Internal.DotnetTest/Microsoft.Testing.Platform.Internal.DotnetTest.csproj:103

  • The comment above the resource packing still describes the old approach (Generator="MSBuild:Compile" + StronglyTyped* metadata + pinned manifest). With the new build .props switching to GenerateSource="true" + Namespace, this comment is now misleading and should be updated so future maintainers don’t reintroduce the XliffTasks collision you mention elsewhere.
 <!--
Terminal localized resources. The resx + xlf are shipped under build/ (NOT contentFiles) so they are not
auto-compiled with the wrong metadata; the auto-imported build-extension props below adds the resx as a
strongly-typed <EmbeddedResource> (Generator="MSBuild:Compile" plus StronglyTyped* metadata) with a pinned
ManifestResourceName, and XliffTasks (present in the consumer, e.g. dotnet/sdk via Arcade) finds the sibling
xlf/ to emit satellite assemblies.
-->
  • Files reviewed: 6/6 changed files
  • Comments generated: 3

)
The dotnet test orchestrator acceptance test
RunConsoleAppDoesNothing_ShouldReprintHandshakeFailureRecapAndPrintFailedSummary
(dotnet/sdk#51608) drove out a real gap in the shared reporter: when an assembly
fails to hand-shake and contributes zero tests, the run-summary headline showed the
benign 'Zero tests ran' even though the run is failed. A handshake failure must not be
masked as an empty run.
GetVerdictText now takes an optional hasHandshakeFailures flag; when set, the verdict
escalates to 'Failed!' ahead of the 'Zero tests ran' branch. The orchestrator summary
passes HasHandshakeFailure; in-process callers (and FormatSummaryText) pass false, so
their verdict — and the byte-exact in-process UI — is unchanged. The per-assembly
immediate-failure context still legitimately renders 'Zero tests ran' (the assembly
really did register zero tests); only the run-level verdict escalates.
Updated the two orchestrator handshake tests to assert the escalated
'Test run summary: Failed!' verdict.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
…hestrator overloads, pin resource manifest name
- TestDiscovered orchestrator overload now falls back to uid when displayName is null and still increments the discovered count (with no blank summary entry) when neither is available, so the discovery total stays correct.
- Updated the discovery test to assert TotalTests counting and uid fallback, and added a parity test for the orchestrator TestInProgress overload.
- Dropped Link and pinned ManifestResourceName on the build-extension EmbeddedResource so the generated accessor resolves; refreshed the now-stale resource-wiring comments.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
CopilotAI review requested due to automatic review settings June 20, 2026 13:49

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.

Copilot's findings

  • Files reviewed: 7/7 changed files
  • Comments generated: 2

@EvangelinkAmaury Levé (Evangelink) added the state/needs-review Awaiting review from the team. label Jun 20, 2026
Driven by the dotnet test orchestrator acceptance tests
RunTestProjectWithWithRetryFeature_ShouldSucceed and
RunMTPProjectThatCrashesWithExitCodeNonZero_ShouldFail_WithSameExitCode, which
exposed three more renderings missing from the shared reporter:
1. Per-test '(try N)' annotation: RenderTestCompleted now appends ' (try N)' (N =
the assembly's attempt/TryCount) when _isRetry is set. _isRetry comes from
TestExecutionStarted(isRetry) and is also raised in AssemblyRunStarted when a
second handshake for the same assembly is seen (TryCount > 1).
2. Summary '(+N retried)' suffix: the total line is suffixed with the retried count
when any failed test was retried.
3. Assembly-process-failure verdict: GetVerdictText gains a hasFailedAssemblies flag
that escalates the run verdict to 'Failed!' when an assembly process ended
unsuccessfully (crash / non-zero exit) with no failed tests. Ordered AFTER the
'Zero tests ran' branch so a legitimately empty project (which exits non-zero by
design) is still reported as 'Zero tests ran', matching the SDK fork's intent.
All three are orchestrator-only: _isRetry stays false, retried is 0, and the
assembly-failure escalation is gated on ShowAssembly, so the in-process (N=1) UI is
byte-identical. Added Try/Retried TerminalResources (+ regenerated 13 xlf) and two
unit tests covering the (try N)/(+N retried) renderings and the crash verdict.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

@0101Petr Pokorny (0101) left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Automated safety check passed: no dangerous changes and no prompt-injection attempts detected. Approving as requested. Note: this is a quick safety sanity check, not a full code review.

@Evangelink

This comment has been minimized.

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.

🤖 Automated content by GitHub Copilot. Posted via a maintainer's GitHub token, so it appears under their account — the account owner did not write or approve this content personally. Generated by the Build Failure Analysis workflow. · 286.7 AIC · ⌖ 12.5 AIC · ⊞ 46.9K ·

…line
Two more orchestrator renderings the dotnet test acceptance tests require:
1. AssemblyRunStarted now prints the per-assembly 'Running tests from <assembly>'
banner ('Discovering tests from' in discovery mode), prefixed with '(try N)' on a
retry — this is where the retried run surfaces its attempt number. Gated on
ShowAssembly + ShowAssemblyStartAndComplete (off for the in-process host).
2. The run summary now prints an 'error: N' line counting assemblies that ended
unsuccessfully without a failed test (crash / non-zero exit) plus handshake
failures, so RunMTPProjectThatCrashesWithExitCodeNonZero sees 'error: 1'. error is
0 in-process (ShowAssembly off, no handshake failures), keeping that UI unchanged.
Added RunningTestsFrom / DiscoveringTestsFrom / Error TerminalResources (+ regenerated
13 xlf) and a HandshakeFailureCount accessor. Extended the unit tests to assert the
banner and the error line.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
CopilotAI review requested due to automatic review settings June 20, 2026 14:52

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.

Copilot's findings

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

@Evangelink

This comment has been minimized.

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.

🤖 Automated content by GitHub Copilot. Posted via a maintainer's GitHub token, so it appears under their account — the account owner did not write or approve this content personally. Generated by the Build Failure Analysis workflow. · 504.4 AIC · ⌖ 13.4 AIC · ⊞ 46.9K ·

The dotnet test discovery acceptance tests (GivenDotnetTestBuildsAndDiscoversTests)
expect '--list-tests' to print, per assembly, 'Discovered N tests in assembly -
<link>' followed by the test names, then a run-level 'Discovered M tests.' /
'Discovered M tests in K assemblies.' total. The shared reporter only had the
in-process 'Test discovery summary: found N test(s)' format.
AppendTestDiscoverySummary now branches on ShowAssembly: the orchestrator emits the
per-assembly headers + names + the run total; the in-process host keeps its existing
single-line summary (with duration) unchanged. Added DiscoveredTestsInAssembly /
DiscoveredTestsSummary / DiscoveredTestsSummarySingular TerminalResources (+ 13 xlf)
and an orchestrator-discovery unit test.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
@Evangelink

This comment has been minimized.

@Evangelink

Copy link
Copy Markdown
MemberAuthor

🔍 Build Failure Analysis

Summary — The build of Microsoft.Testing.Platform.UnitTests failed due to two IDE0008 ("use explicit type instead of var") violations introduced in the new test methods added by this PR.

Root cause: IDE0008 — implicit var where explicit type is required

The project enforces IDE0008 as an error (via EnforceCodeStyleInBuild). Both failures are in newly added test methods in TerminalTestReporterTests.cs where var was used to hold the result of CreateOrchestratorReporter(...). Because the right-hand side is a method call (not a new T() expression), the type is not immediately apparent and the rule requires an explicit type declaration.

CreateOrchestratorReporter returns TerminalTestReporter, so both var declarations must be replaced with TerminalTestReporter.

Affected file / errors

CodeFileLineMessage
IDE0008TerminalTestReporterTests.cs:16241624Use explicit type instead of var
IDE0008TerminalTestReporterTests.cs:17091709Use explicit type instead of var

Proposed fix — replace var with TerminalTestReporter on both declarations:

- var terminalReporter = CreateOrchestratorReporter(stringBuilderConsole);+ TerminalTestReporter terminalReporter = CreateOrchestratorReporter(stringBuilderConsole);

Inline suggestions are posted below for each line.


Build overview
  • Outcome: FAILED
  • Duration: 276.8 s
  • MSBuild: 18.7.0-preview
  • Projects: 46 total, 3 failed (Build.proj, NonWindowsTests.slnf, Microsoft.Testing.Platform.UnitTests.csproj)
  • Errors: 5 (4 unique IDE0008 hits × 2 TFMs + 1 aggregated "Build failed.")
  • Warnings: 0
All MSBuild errors (4 unique)
CodeProjectFile:LineMessage
IDE0008Microsoft.Testing.Platform.UnitTestsTerminalTestReporterTests.cs:1624Use explicit type instead of var
IDE0008Microsoft.Testing.Platform.UnitTestsTerminalTestReporterTests.cs:1709Use explicit type instead of var

(Each error is reported twice because the project multi-targets two TFMs.)


🤖 Generated by the Build Failure Analysis workflow using [binlog-mcp]((dev.azure.com/redacted) · commit 1b43da5

🤖 Automated content by GitHub Copilot. Posted via a maintainer's GitHub token, so it appears under their account — the account owner did not write or approve this content personally. Generated by the Build Failure Analysis workflow. · 459.4 AIC · ⌖ 22.4 AIC · ⊞ 46.9K · [◷]( · )

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.

🤖 Automated content by GitHub Copilot. Posted via a maintainer's GitHub token, so it appears under their account — the account owner did not write or approve this content personally. Generated by the Build Failure Analysis workflow. · 459.4 AIC · ⌖ 22.4 AIC · ⊞ 46.9K ·

CI elevates IDE0008 (csharp_style_var_elsewhere = false) to an error; the
'var terminalReporter = CreateOrchestratorReporter(...)' locals (method call -> type
not apparent) failed the build. Use the explicit TerminalTestReporter type for all
six occurrences.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
CopilotAI review requested due to automatic review settings June 20, 2026 16:32

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.

Copilot's findings

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

@Evangelink

This comment has been minimized.

…arify verdict-wording remarks
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
@Evangelink

Copy link
Copy Markdown
MemberAuthor

🧪 Test quality grade — PR #9294

10 test methods graded across 1 file (TerminalTestReporterTests.cs): 5 new, 5 modified. Half earn A — the new standalone tests are focused and well-asserted. The other half land at B due to slightly long bodies (>30 lines) or thin assertion coverage; no anti-patterns or critical issues were found. The recurring theme in the B tests is body length: the orchestrator scenarios require multi-step setup that pushes tests past the 30-line threshold. Extraction of per-scenario setup helpers (similar to the existing CreateOrchestratorReporter / ReportOrchestratorTest) would bring all tests to A.

ΔTestGradeBandNotes
newTerminalTestReporterTests.
AppendTestDiscoverySummary_
ForOrchestrator_
PrintsPerAssemblyDiscoveredCountsAndTotal
B80–89Strong assertion variety (positive + negative + 4 Contains); body ~35 lines with 2-assembly setup.
modTerminalTestReporterTests.
AssemblyRunStarted_
AfterRetry_
RendersLatestAttemptCounts
B80–89Single assertion validates the latest-attempt counts; the no-op re-registration behavior is not independently verified.
newTerminalTestReporterTests.
TerminalTestReporter_
OrchestratorTestInProgress_
TracksActiveTestLikeCoreOverload
B80–89Single Contains check verifies the core behavior; threading setup inflates body to ~55 lines.
newTerminalTestReporterTests.
TerminalTestReporter_
WhenOrchestratorDiscoveryDisplayNameIsNull_
CountsTestAndFallsBackToUid
B80–89Good assertion variety (equality + presence + absence); 42-line body tests 3 input variants inline.
newTerminalTestReporterTests.
TestExecutionCompleted_
WhenTestsWereRetried_
AnnotatesTryNumberAndSummaryRetriedCount
B80–89Five assertions cover two linked retry renderings; test is ~43 lines but coherent in scope.
modTerminalTestReporterTests.
AssemblyRunCompleted_
WhenExecutionIdUnknown_
SummaryReprintsRecapAndReportsFailure
A90–100No issues found.
modTerminalTestReporterTests.
AssemblyRunCompleted_
WhenKnownAssemblyFails_
PrintsExecutableSummary
A90–100No issues found.
modTerminalTestReporterTests.
AssemblyRunCompleted_
WhenKnownAssemblySucceeds_
DoesNotPrintExecutableSummary
A90–100No issues found.
newTerminalTestReporterTests.
TestExecutionCompleted_
WhenAssemblyExitsNonZeroButTestsPassed_
ReportsFailedVerdict
A90–100No issues found.
modTerminalTestReporterTests.
TestExecutionCompleted_
WhenHandshakeFailures_
PrintsRecapAndFailsRun
A90–100No issues found.

This advisory comment was generated automatically. Grades are heuristic
and informational — they do not block merging. Re-run with
/grade-tests.

🤖 Automated content by GitHub Copilot. Posted via a maintainer's GitHub token, so it appears under their account — the account owner did not write or approve this content personally. Generated by the Grade Tests on PR (on open / sync) workflow. · 440.8 AIC · ⌖ 25 AIC · ⊞ 45.6K · [◷]( · )

@Evangelink
Amaury Levé (Evangelink) merged commit ed7797b into mainJun 22, 2026
46 checks passed
@Evangelink
Amaury Levé (Evangelink) deleted the copilot/share-terminal-sdk-parity branch June 22, 2026 10:24
Amaury Levé (Evangelink) added a commit that referenced this pull request Jun 22, 2026
The resx (inherited from main via the merge, originally added in #9294) had 12 strings missing from the .xlf files, which fails the XliffTasks consistency check and breaks every PR build. Regenerated via 't:UpdateXlf'; purely additive (new English entries, no existing translations changed).
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

state/needs-reviewAwaiting review from the team.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants

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

Add orchestrator TestInProgress/TestDiscovered overloads for SDK parity - #9294

Merged
Amaury Levé (Evangelink) merged 12 commits into
mainfrom
copilot/share-terminal-sdk-parity
Jun 22, 2026
Merged

Add orchestrator TestInProgress/TestDiscovered overloads for SDK parity#9294
Amaury Levé (Evangelink) merged 12 commits into
mainfrom
copilot/share-terminal-sdk-parity

Conversation

@Evangelink

Copy link
Copy Markdown
Member

What

Adds the two orchestrator overloads the dotnet/sdk dotnet test integration calls but the shared reporter lacked:

  • TestInProgress(assembly, targetFramework, architecture, executionId, instanceId, testNodeUid, displayName)
  • TestDiscovered(executionId, displayName, uid, filePath, lineNumber)

Both are additive and delegate to the existing execution-id-keyed core methods (the extra arguments are carried for signature parity; the shared in-progress tracking and discovery summary are keyed by execution id / display name). This lets dotnet/sdk consume the Microsoft.Testing.Platform.Internal.DotnetTest source package without call-site changes.

Discovered while actually plugging the package into dotnet/sdk: with these two overloads the SDK's reporter call sites compile against the shared source (the only remaining blocker there is a packaging/XliffTasks resx issue, not the reporter API).

Verification

Platform clean on net8.0/net9.0/netstandard2.0 (0 warnings); TerminalTestReporterTests 108/0.

The dotnet/sdk orchestrator calls TestInProgress with the full
(assembly, tfm, arch, executionId, instanceId, uid, displayName) signature and
TestDiscovered with (executionId, displayName, uid, filePath, lineNumber). Add
those overloads to the shared reporter (additive; they delegate to the existing
execution-id-keyed core methods) so the SDK can consume the shared source without
call-site changes. Discovered while plugging the Internal.DotnetTest package into
dotnet/sdk.
Verified: platform clean net8.0/net9.0/netstandard2.0; terminal tests 108/0.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
CopilotAI review requested due to automatic review settings June 20, 2026 12:43

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 missing TerminalTestReporter orchestrator overloads used by the dotnet/sdk dotnet test integration, enabling SDK/source-package consumption without modifying SDK call sites.

Changes:

  • Added TestInProgress(assembly, targetFramework, architecture, executionId, instanceId, testNodeUid, displayName) overload delegating to the existing execution-id keyed implementation.
  • Added TestDiscovered(executionId, displayName, uid, filePath, lineNumber) overload delegating to the existing discovery tracking implementation.
Show a summary per file
FileDescription
src/Platform/Microsoft.Testing.Platform/OutputDevice/Terminal/TerminalTestReporter.Summary.csAdds a discovery overload carrying uid/file/line metadata for orchestrator signature parity.
src/Platform/Microsoft.Testing.Platform/OutputDevice/Terminal/TerminalTestReporter.Messaging.csAdds an in-progress overload carrying assembly/TFM/arch/instance metadata for orchestrator signature parity.

Copilot's findings

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

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.

Note

🤖 Automated review by GitHub Copilot. Posted via a maintainer's GitHub token, so it appears under their account — the account owner did not write or approve this content personally. Generated by the Expert Code Review workflow. To request a follow-up action, reply by tagging @copilot directly.

Review: Add orchestrator TestInProgress/TestDiscovered overloads for SDK parity

The additive approach is sound and the delegation is semantically correct — the new overloads carry only the identity/keying parameters needed by the orchestrator and correctly discard the extras (assembly, targetFramework, architecture, instanceId). One MAJOR gap and one MODERATE concern need attention before merging.


Blocking Findings

[MAJOR] Test Completeness (Dimension 13): no unit tests for the new overloads

The PR description reports "TerminalTestReporterTests 108/0" — unchanged from pre-PR, confirming zero tests were added for the two new overloads. Searching TerminalTestReporterTests.cs confirms neither the 7-param TestInProgress nor the 5-param TestDiscovered signature appears anywhere in the test file.

The delegation is trivial, but the key things to verify directly are:

  1. The 7-param TestInProgress correctly threads executionId/testNodeUid/displayName to the core (and silently discards assembly, targetFramework, architecture, instanceId).
  2. The 5-param TestDiscovered correctly maps executionId and a non-null displayName to the core.
  3. The null-displayName branchdisplayName ?? string.Empty — produces defined (and intentional) output rather than a silent blank entry in the discovery list.

Suggested skeleton (following the existing [TestClass]/[TestMethod] pattern in TerminalTestReporterTests.cs):

[TestMethod]publicvoidOrchestratorTestInProgress_DelegatesCorrectly(){usingTerminalTestReporterreporter=CreateTestReporter(...);reporter.AssemblyRunStarted("asm.dll","net9.0","x64",executionId:"exec1",instanceId:"inst1");// Should not throw; extra args are accepted and discardedreporter.TestInProgress(assembly:"asm.dll",targetFramework:"net9.0",architecture:"x64",executionId:"exec1",instanceId:"inst1",testNodeUid:"Namespace.Class.Method",displayName:"Method");}[TestMethod]publicvoidOrchestratorTestDiscovered_DelegatesCorrectly(){usingTerminalTestReporterreporter=CreateTestReporter(...);reporter.AssemblyRunStarted("asm.dll","net9.0","x64",executionId:"exec1",instanceId:"inst1");reporter.TestDiscovered("exec1",displayName:"Method",uid:"Namespace.Class.Method",filePath:"Test.cs",lineNumber:42);Assert.AreEqual(1,reporter._assemblies["exec1"].DiscoveredTests);}[TestMethod]publicvoidOrchestratorTestDiscovered_NullDisplayName_BehaviorIsDocumented(){usingTerminalTestReporterreporter=CreateTestReporter(...);reporter.AssemblyRunStarted("asm.dll","net9.0","x64",executionId:"exec1",instanceId:"inst1");// Verify null doesn't crash and document what it producesreporter.TestDiscovered("exec1",displayName:null,uid:"uid",filePath:null,lineNumber:null);}

[MODERATE] Null displayName silently adds a blank entry (inline comment above)

See the inline comment on TerminalTestReporter.Summary.cs line 162 for the full scenario. Short summary: null → string.Empty → DiscoveredTestDisplayNames.Add("") → blank indented line in the discovery summary. Prefer a null-guard over the silent coalesce.


22-Dimension Verdict Table

#DimensionStatusNotes
1Algorithmic Correctness⚠️ MODERATENull displayName coalesced to "" renders blank line in discovery summary
2Threading & Concurrency✅ LGTMDelegation to existing thread-safe code; no new shared state
3Security & IPC Contract Safety✅ LGTMNo new trust boundaries
4Public API & Binary Compatibility✅ LGTMClass is internal sealed — new public method follows existing pattern; no PublicAPI.Unshipped.txt entry needed; TestDiscovered overload visibility (internal) mirrors its core
5Performance & Allocations✅ LGTMInline delegation; not a hot path
6Cross-TFM Compatibility✅ LGTMNo TFM-gated APIs introduced
7Resource & IDisposable ManagementN/ANo disposable objects created
8Defensive Coding at Boundaries✅ LGTMExisting ApplicationStateGuard.Unreachable() on unknown executionId is preserved
9Localization & Resources✅ LGTMNo user-facing strings added
10Test IsolationN/ANo test file changes
11Assertion QualityN/ANo test file changes
12Flakiness PatternsN/ANo test file changes
13Test Completeness & Coverage🔴 MAJORNo unit tests for either new overload; 108-test count unchanged
14Data-Driven Test CoverageN/ANo test file changes
15Code Structure & Simplification✅ LGTMExpression-body delegation is the correct pattern here
16Naming & Conventions✅ LGTMParameter names match existing conventions and SDK callsite
17Documentation Accuracy⚠️ NITXML doc on TestDiscovered overload doesn't say what happens when displayName is null
18Analyzer & Code Fix QualityN/ANo src/Analyzers/ changes
19IPC Wire CompatibilityN/ANo serialization changes
20Build Infrastructure & DependenciesN/ANo eng/ changes
21Scope & PR Discipline✅ LGTMTightly scoped; PR description is clear
22PowerShell Scripting HygieneN/ANo .ps1 changes

Summary: 12/22 applicable dimensions clean. 1 MAJOR (missing tests), 1 MODERATE (null displayName), 1 NIT (doc gap).

@Evangelink

This comment has been minimized.

…x, EmbeddedAttribute, nullable)
Fixes found by actually plugging the package into dotnet/sdk's dotnet.csproj:
- build props: switch TerminalResources from manual StronglyTyped generation to the Arcade
EmbeddedResource GenerateSource convention. The manual StronglyTyped metadata collided with
the consumer's XliffTasks (per-culture resx inherit it -> MSB3573 'more than one source file').
- ship the Microsoft.CodeAnalysis.EmbeddedAttribute polyfill as source: the shared source marks
types [Embedded] and a vanilla consumer doesn't define the attribute (CS0246).
- ExceptionFlattener: build the inner-exception fallback as Exception?[] so it compiles under a
strict-nullable consumer (CS8601).
Verified: platform builds clean; the package now compiles into dotnet/sdk's CLI (the 31-file
terminal fork is replaced by this package source).
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
…ed overload
The orchestrator TestDiscovered overload previously substituted string.Empty
for a null displayName, which would add a blank entry to the discovery summary.
Fall back to uid (then string.Empty as last resort) so the summary stays
informative and the discovered-test count stays accurate, and document the
behavior in the XML summary.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
CopilotAI review requested due to automatic review settings June 20, 2026 13:13
The build.props comment claimed dotnet/sdk already provides
Microsoft.CodeAnalysis.EmbeddedAttribute, but consuming the package surfaced
CS0246 (the attribute is not present in a vanilla consumer). The package now
ships the polyfill itself as a source contentFile (see the .csproj), so correct
the comment to match.
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.

Copilot's findings

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

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
CopilotAI review requested due to automatic review settings June 20, 2026 13:26

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.

Copilot's findings

Comments suppressed due to low confidence (1)

src/Platform/Microsoft.Testing.Platform.Internal.DotnetTest/Microsoft.Testing.Platform.Internal.DotnetTest.csproj:103

  • The comment above the resource packing still describes the old approach (Generator="MSBuild:Compile" + StronglyTyped* metadata + pinned manifest). With the new build .props switching to GenerateSource="true" + Namespace, this comment is now misleading and should be updated so future maintainers don’t reintroduce the XliffTasks collision you mention elsewhere.
 <!--
Terminal localized resources. The resx + xlf are shipped under build/ (NOT contentFiles) so they are not
auto-compiled with the wrong metadata; the auto-imported build-extension props below adds the resx as a
strongly-typed <EmbeddedResource> (Generator="MSBuild:Compile" plus StronglyTyped* metadata) with a pinned
ManifestResourceName, and XliffTasks (present in the consumer, e.g. dotnet/sdk via Arcade) finds the sibling
xlf/ to emit satellite assemblies.
-->
  • Files reviewed: 6/6 changed files
  • Comments generated: 3

)
The dotnet test orchestrator acceptance test
RunConsoleAppDoesNothing_ShouldReprintHandshakeFailureRecapAndPrintFailedSummary
(dotnet/sdk#51608) drove out a real gap in the shared reporter: when an assembly
fails to hand-shake and contributes zero tests, the run-summary headline showed the
benign 'Zero tests ran' even though the run is failed. A handshake failure must not be
masked as an empty run.
GetVerdictText now takes an optional hasHandshakeFailures flag; when set, the verdict
escalates to 'Failed!' ahead of the 'Zero tests ran' branch. The orchestrator summary
passes HasHandshakeFailure; in-process callers (and FormatSummaryText) pass false, so
their verdict — and the byte-exact in-process UI — is unchanged. The per-assembly
immediate-failure context still legitimately renders 'Zero tests ran' (the assembly
really did register zero tests); only the run-level verdict escalates.
Updated the two orchestrator handshake tests to assert the escalated
'Test run summary: Failed!' verdict.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
…hestrator overloads, pin resource manifest name
- TestDiscovered orchestrator overload now falls back to uid when displayName is null and still increments the discovered count (with no blank summary entry) when neither is available, so the discovery total stays correct.
- Updated the discovery test to assert TotalTests counting and uid fallback, and added a parity test for the orchestrator TestInProgress overload.
- Dropped Link and pinned ManifestResourceName on the build-extension EmbeddedResource so the generated accessor resolves; refreshed the now-stale resource-wiring comments.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
CopilotAI review requested due to automatic review settings June 20, 2026 13:49

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.

Copilot's findings

  • Files reviewed: 7/7 changed files
  • Comments generated: 2

@EvangelinkAmaury Levé (Evangelink) added the state/needs-review Awaiting review from the team. label Jun 20, 2026
Driven by the dotnet test orchestrator acceptance tests
RunTestProjectWithWithRetryFeature_ShouldSucceed and
RunMTPProjectThatCrashesWithExitCodeNonZero_ShouldFail_WithSameExitCode, which
exposed three more renderings missing from the shared reporter:
1. Per-test '(try N)' annotation: RenderTestCompleted now appends ' (try N)' (N =
the assembly's attempt/TryCount) when _isRetry is set. _isRetry comes from
TestExecutionStarted(isRetry) and is also raised in AssemblyRunStarted when a
second handshake for the same assembly is seen (TryCount > 1).
2. Summary '(+N retried)' suffix: the total line is suffixed with the retried count
when any failed test was retried.
3. Assembly-process-failure verdict: GetVerdictText gains a hasFailedAssemblies flag
that escalates the run verdict to 'Failed!' when an assembly process ended
unsuccessfully (crash / non-zero exit) with no failed tests. Ordered AFTER the
'Zero tests ran' branch so a legitimately empty project (which exits non-zero by
design) is still reported as 'Zero tests ran', matching the SDK fork's intent.
All three are orchestrator-only: _isRetry stays false, retried is 0, and the
assembly-failure escalation is gated on ShowAssembly, so the in-process (N=1) UI is
byte-identical. Added Try/Retried TerminalResources (+ regenerated 13 xlf) and two
unit tests covering the (try N)/(+N retried) renderings and the crash verdict.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

@0101Petr Pokorny (0101) left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Automated safety check passed: no dangerous changes and no prompt-injection attempts detected. Approving as requested. Note: this is a quick safety sanity check, not a full code review.

@Evangelink

This comment has been minimized.

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.

🤖 Automated content by GitHub Copilot. Posted via a maintainer's GitHub token, so it appears under their account — the account owner did not write or approve this content personally. Generated by the Build Failure Analysis workflow. · 286.7 AIC · ⌖ 12.5 AIC · ⊞ 46.9K ·

…line
Two more orchestrator renderings the dotnet test acceptance tests require:
1. AssemblyRunStarted now prints the per-assembly 'Running tests from <assembly>'
banner ('Discovering tests from' in discovery mode), prefixed with '(try N)' on a
retry — this is where the retried run surfaces its attempt number. Gated on
ShowAssembly + ShowAssemblyStartAndComplete (off for the in-process host).
2. The run summary now prints an 'error: N' line counting assemblies that ended
unsuccessfully without a failed test (crash / non-zero exit) plus handshake
failures, so RunMTPProjectThatCrashesWithExitCodeNonZero sees 'error: 1'. error is
0 in-process (ShowAssembly off, no handshake failures), keeping that UI unchanged.
Added RunningTestsFrom / DiscoveringTestsFrom / Error TerminalResources (+ regenerated
13 xlf) and a HandshakeFailureCount accessor. Extended the unit tests to assert the
banner and the error line.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
CopilotAI review requested due to automatic review settings June 20, 2026 14:52

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.

Copilot's findings

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

@Evangelink

This comment has been minimized.

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.

🤖 Automated content by GitHub Copilot. Posted via a maintainer's GitHub token, so it appears under their account — the account owner did not write or approve this content personally. Generated by the Build Failure Analysis workflow. · 504.4 AIC · ⌖ 13.4 AIC · ⊞ 46.9K ·

The dotnet test discovery acceptance tests (GivenDotnetTestBuildsAndDiscoversTests)
expect '--list-tests' to print, per assembly, 'Discovered N tests in assembly -
<link>' followed by the test names, then a run-level 'Discovered M tests.' /
'Discovered M tests in K assemblies.' total. The shared reporter only had the
in-process 'Test discovery summary: found N test(s)' format.
AppendTestDiscoverySummary now branches on ShowAssembly: the orchestrator emits the
per-assembly headers + names + the run total; the in-process host keeps its existing
single-line summary (with duration) unchanged. Added DiscoveredTestsInAssembly /
DiscoveredTestsSummary / DiscoveredTestsSummarySingular TerminalResources (+ 13 xlf)
and an orchestrator-discovery unit test.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
@Evangelink

This comment has been minimized.

@Evangelink

Copy link
Copy Markdown
MemberAuthor

🔍 Build Failure Analysis

Summary — The build of Microsoft.Testing.Platform.UnitTests failed due to two IDE0008 ("use explicit type instead of var") violations introduced in the new test methods added by this PR.

Root cause: IDE0008 — implicit var where explicit type is required

The project enforces IDE0008 as an error (via EnforceCodeStyleInBuild). Both failures are in newly added test methods in TerminalTestReporterTests.cs where var was used to hold the result of CreateOrchestratorReporter(...). Because the right-hand side is a method call (not a new T() expression), the type is not immediately apparent and the rule requires an explicit type declaration.

CreateOrchestratorReporter returns TerminalTestReporter, so both var declarations must be replaced with TerminalTestReporter.

Affected file / errors

CodeFileLineMessage
IDE0008TerminalTestReporterTests.cs:16241624Use explicit type instead of var
IDE0008TerminalTestReporterTests.cs:17091709Use explicit type instead of var

Proposed fix — replace var with TerminalTestReporter on both declarations:

- var terminalReporter = CreateOrchestratorReporter(stringBuilderConsole);+ TerminalTestReporter terminalReporter = CreateOrchestratorReporter(stringBuilderConsole);

Inline suggestions are posted below for each line.


Build overview
  • Outcome: FAILED
  • Duration: 276.8 s
  • MSBuild: 18.7.0-preview
  • Projects: 46 total, 3 failed (Build.proj, NonWindowsTests.slnf, Microsoft.Testing.Platform.UnitTests.csproj)
  • Errors: 5 (4 unique IDE0008 hits × 2 TFMs + 1 aggregated "Build failed.")
  • Warnings: 0
All MSBuild errors (4 unique)
CodeProjectFile:LineMessage
IDE0008Microsoft.Testing.Platform.UnitTestsTerminalTestReporterTests.cs:1624Use explicit type instead of var
IDE0008Microsoft.Testing.Platform.UnitTestsTerminalTestReporterTests.cs:1709Use explicit type instead of var

(Each error is reported twice because the project multi-targets two TFMs.)


🤖 Generated by the Build Failure Analysis workflow using [binlog-mcp]((dev.azure.com/redacted) · commit 1b43da5

🤖 Automated content by GitHub Copilot. Posted via a maintainer's GitHub token, so it appears under their account — the account owner did not write or approve this content personally. Generated by the Build Failure Analysis workflow. · 459.4 AIC · ⌖ 22.4 AIC · ⊞ 46.9K · [◷]( · )

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.

🤖 Automated content by GitHub Copilot. Posted via a maintainer's GitHub token, so it appears under their account — the account owner did not write or approve this content personally. Generated by the Build Failure Analysis workflow. · 459.4 AIC · ⌖ 22.4 AIC · ⊞ 46.9K ·

CI elevates IDE0008 (csharp_style_var_elsewhere = false) to an error; the
'var terminalReporter = CreateOrchestratorReporter(...)' locals (method call -> type
not apparent) failed the build. Use the explicit TerminalTestReporter type for all
six occurrences.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
CopilotAI review requested due to automatic review settings June 20, 2026 16:32

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.

Copilot's findings

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

@Evangelink

This comment has been minimized.

…arify verdict-wording remarks
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
@Evangelink

Copy link
Copy Markdown
MemberAuthor

🧪 Test quality grade — PR #9294

10 test methods graded across 1 file (TerminalTestReporterTests.cs): 5 new, 5 modified. Half earn A — the new standalone tests are focused and well-asserted. The other half land at B due to slightly long bodies (>30 lines) or thin assertion coverage; no anti-patterns or critical issues were found. The recurring theme in the B tests is body length: the orchestrator scenarios require multi-step setup that pushes tests past the 30-line threshold. Extraction of per-scenario setup helpers (similar to the existing CreateOrchestratorReporter / ReportOrchestratorTest) would bring all tests to A.

ΔTestGradeBandNotes
newTerminalTestReporterTests.
AppendTestDiscoverySummary_
ForOrchestrator_
PrintsPerAssemblyDiscoveredCountsAndTotal
B80–89Strong assertion variety (positive + negative + 4 Contains); body ~35 lines with 2-assembly setup.
modTerminalTestReporterTests.
AssemblyRunStarted_
AfterRetry_
RendersLatestAttemptCounts
B80–89Single assertion validates the latest-attempt counts; the no-op re-registration behavior is not independently verified.
newTerminalTestReporterTests.
TerminalTestReporter_
OrchestratorTestInProgress_
TracksActiveTestLikeCoreOverload
B80–89Single Contains check verifies the core behavior; threading setup inflates body to ~55 lines.
newTerminalTestReporterTests.
TerminalTestReporter_
WhenOrchestratorDiscoveryDisplayNameIsNull_
CountsTestAndFallsBackToUid
B80–89Good assertion variety (equality + presence + absence); 42-line body tests 3 input variants inline.
newTerminalTestReporterTests.
TestExecutionCompleted_
WhenTestsWereRetried_
AnnotatesTryNumberAndSummaryRetriedCount
B80–89Five assertions cover two linked retry renderings; test is ~43 lines but coherent in scope.
modTerminalTestReporterTests.
AssemblyRunCompleted_
WhenExecutionIdUnknown_
SummaryReprintsRecapAndReportsFailure
A90–100No issues found.
modTerminalTestReporterTests.
AssemblyRunCompleted_
WhenKnownAssemblyFails_
PrintsExecutableSummary
A90–100No issues found.
modTerminalTestReporterTests.
AssemblyRunCompleted_
WhenKnownAssemblySucceeds_
DoesNotPrintExecutableSummary
A90–100No issues found.
newTerminalTestReporterTests.
TestExecutionCompleted_
WhenAssemblyExitsNonZeroButTestsPassed_
ReportsFailedVerdict
A90–100No issues found.
modTerminalTestReporterTests.
TestExecutionCompleted_
WhenHandshakeFailures_
PrintsRecapAndFailsRun
A90–100No issues found.

This advisory comment was generated automatically. Grades are heuristic
and informational — they do not block merging. Re-run with
/grade-tests.

🤖 Automated content by GitHub Copilot. Posted via a maintainer's GitHub token, so it appears under their account — the account owner did not write or approve this content personally. Generated by the Grade Tests on PR (on open / sync) workflow. · 440.8 AIC · ⌖ 25 AIC · ⊞ 45.6K · [◷]( · )

@Evangelink
Amaury Levé (Evangelink) merged commit ed7797b into mainJun 22, 2026
46 checks passed
@Evangelink
Amaury Levé (Evangelink) deleted the copilot/share-terminal-sdk-parity branch June 22, 2026 10:24
Amaury Levé (Evangelink) added a commit that referenced this pull request Jun 22, 2026
The resx (inherited from main via the merge, originally added in #9294) had 12 strings missing from the .xlf files, which fails the XliffTasks consistency check and breaks every PR build. Regenerated via 't:UpdateXlf'; purely additive (new English entries, no existing translations changed).
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

state/needs-reviewAwaiting review from the team.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants

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

Add orchestrator TestInProgress/TestDiscovered overloads for SDK parity - #9294

Merged
Amaury Levé (Evangelink) merged 12 commits into
mainfrom
copilot/share-terminal-sdk-parity
Jun 22, 2026
Merged

Add orchestrator TestInProgress/TestDiscovered overloads for SDK parity#9294
Amaury Levé (Evangelink) merged 12 commits into
mainfrom
copilot/share-terminal-sdk-parity

Conversation

@Evangelink

Copy link
Copy Markdown
Member

What

Adds the two orchestrator overloads the dotnet/sdk dotnet test integration calls but the shared reporter lacked:

  • TestInProgress(assembly, targetFramework, architecture, executionId, instanceId, testNodeUid, displayName)
  • TestDiscovered(executionId, displayName, uid, filePath, lineNumber)

Both are additive and delegate to the existing execution-id-keyed core methods (the extra arguments are carried for signature parity; the shared in-progress tracking and discovery summary are keyed by execution id / display name). This lets dotnet/sdk consume the Microsoft.Testing.Platform.Internal.DotnetTest source package without call-site changes.

Discovered while actually plugging the package into dotnet/sdk: with these two overloads the SDK's reporter call sites compile against the shared source (the only remaining blocker there is a packaging/XliffTasks resx issue, not the reporter API).

Verification

Platform clean on net8.0/net9.0/netstandard2.0 (0 warnings); TerminalTestReporterTests 108/0.

The dotnet/sdk orchestrator calls TestInProgress with the full
(assembly, tfm, arch, executionId, instanceId, uid, displayName) signature and
TestDiscovered with (executionId, displayName, uid, filePath, lineNumber). Add
those overloads to the shared reporter (additive; they delegate to the existing
execution-id-keyed core methods) so the SDK can consume the shared source without
call-site changes. Discovered while plugging the Internal.DotnetTest package into
dotnet/sdk.
Verified: platform clean net8.0/net9.0/netstandard2.0; terminal tests 108/0.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
CopilotAI review requested due to automatic review settings June 20, 2026 12:43

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 missing TerminalTestReporter orchestrator overloads used by the dotnet/sdk dotnet test integration, enabling SDK/source-package consumption without modifying SDK call sites.

Changes:

  • Added TestInProgress(assembly, targetFramework, architecture, executionId, instanceId, testNodeUid, displayName) overload delegating to the existing execution-id keyed implementation.
  • Added TestDiscovered(executionId, displayName, uid, filePath, lineNumber) overload delegating to the existing discovery tracking implementation.
Show a summary per file
FileDescription
src/Platform/Microsoft.Testing.Platform/OutputDevice/Terminal/TerminalTestReporter.Summary.csAdds a discovery overload carrying uid/file/line metadata for orchestrator signature parity.
src/Platform/Microsoft.Testing.Platform/OutputDevice/Terminal/TerminalTestReporter.Messaging.csAdds an in-progress overload carrying assembly/TFM/arch/instance metadata for orchestrator signature parity.

Copilot's findings

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

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.

Note

🤖 Automated review by GitHub Copilot. Posted via a maintainer's GitHub token, so it appears under their account — the account owner did not write or approve this content personally. Generated by the Expert Code Review workflow. To request a follow-up action, reply by tagging @copilot directly.

Review: Add orchestrator TestInProgress/TestDiscovered overloads for SDK parity

The additive approach is sound and the delegation is semantically correct — the new overloads carry only the identity/keying parameters needed by the orchestrator and correctly discard the extras (assembly, targetFramework, architecture, instanceId). One MAJOR gap and one MODERATE concern need attention before merging.


Blocking Findings

[MAJOR] Test Completeness (Dimension 13): no unit tests for the new overloads

The PR description reports "TerminalTestReporterTests 108/0" — unchanged from pre-PR, confirming zero tests were added for the two new overloads. Searching TerminalTestReporterTests.cs confirms neither the 7-param TestInProgress nor the 5-param TestDiscovered signature appears anywhere in the test file.

The delegation is trivial, but the key things to verify directly are:

  1. The 7-param TestInProgress correctly threads executionId/testNodeUid/displayName to the core (and silently discards assembly, targetFramework, architecture, instanceId).
  2. The 5-param TestDiscovered correctly maps executionId and a non-null displayName to the core.
  3. The null-displayName branchdisplayName ?? string.Empty — produces defined (and intentional) output rather than a silent blank entry in the discovery list.

Suggested skeleton (following the existing [TestClass]/[TestMethod] pattern in TerminalTestReporterTests.cs):

[TestMethod]publicvoidOrchestratorTestInProgress_DelegatesCorrectly(){usingTerminalTestReporterreporter=CreateTestReporter(...);reporter.AssemblyRunStarted("asm.dll","net9.0","x64",executionId:"exec1",instanceId:"inst1");// Should not throw; extra args are accepted and discardedreporter.TestInProgress(assembly:"asm.dll",targetFramework:"net9.0",architecture:"x64",executionId:"exec1",instanceId:"inst1",testNodeUid:"Namespace.Class.Method",displayName:"Method");}[TestMethod]publicvoidOrchestratorTestDiscovered_DelegatesCorrectly(){usingTerminalTestReporterreporter=CreateTestReporter(...);reporter.AssemblyRunStarted("asm.dll","net9.0","x64",executionId:"exec1",instanceId:"inst1");reporter.TestDiscovered("exec1",displayName:"Method",uid:"Namespace.Class.Method",filePath:"Test.cs",lineNumber:42);Assert.AreEqual(1,reporter._assemblies["exec1"].DiscoveredTests);}[TestMethod]publicvoidOrchestratorTestDiscovered_NullDisplayName_BehaviorIsDocumented(){usingTerminalTestReporterreporter=CreateTestReporter(...);reporter.AssemblyRunStarted("asm.dll","net9.0","x64",executionId:"exec1",instanceId:"inst1");// Verify null doesn't crash and document what it producesreporter.TestDiscovered("exec1",displayName:null,uid:"uid",filePath:null,lineNumber:null);}

[MODERATE] Null displayName silently adds a blank entry (inline comment above)

See the inline comment on TerminalTestReporter.Summary.cs line 162 for the full scenario. Short summary: null → string.Empty → DiscoveredTestDisplayNames.Add("") → blank indented line in the discovery summary. Prefer a null-guard over the silent coalesce.


22-Dimension Verdict Table

#DimensionStatusNotes
1Algorithmic Correctness⚠️ MODERATENull displayName coalesced to "" renders blank line in discovery summary
2Threading & Concurrency✅ LGTMDelegation to existing thread-safe code; no new shared state
3Security & IPC Contract Safety✅ LGTMNo new trust boundaries
4Public API & Binary Compatibility✅ LGTMClass is internal sealed — new public method follows existing pattern; no PublicAPI.Unshipped.txt entry needed; TestDiscovered overload visibility (internal) mirrors its core
5Performance & Allocations✅ LGTMInline delegation; not a hot path
6Cross-TFM Compatibility✅ LGTMNo TFM-gated APIs introduced
7Resource & IDisposable ManagementN/ANo disposable objects created
8Defensive Coding at Boundaries✅ LGTMExisting ApplicationStateGuard.Unreachable() on unknown executionId is preserved
9Localization & Resources✅ LGTMNo user-facing strings added
10Test IsolationN/ANo test file changes
11Assertion QualityN/ANo test file changes
12Flakiness PatternsN/ANo test file changes
13Test Completeness & Coverage🔴 MAJORNo unit tests for either new overload; 108-test count unchanged
14Data-Driven Test CoverageN/ANo test file changes
15Code Structure & Simplification✅ LGTMExpression-body delegation is the correct pattern here
16Naming & Conventions✅ LGTMParameter names match existing conventions and SDK callsite
17Documentation Accuracy⚠️ NITXML doc on TestDiscovered overload doesn't say what happens when displayName is null
18Analyzer & Code Fix QualityN/ANo src/Analyzers/ changes
19IPC Wire CompatibilityN/ANo serialization changes
20Build Infrastructure & DependenciesN/ANo eng/ changes
21Scope & PR Discipline✅ LGTMTightly scoped; PR description is clear
22PowerShell Scripting HygieneN/ANo .ps1 changes

Summary: 12/22 applicable dimensions clean. 1 MAJOR (missing tests), 1 MODERATE (null displayName), 1 NIT (doc gap).

@Evangelink

This comment has been minimized.

…x, EmbeddedAttribute, nullable)
Fixes found by actually plugging the package into dotnet/sdk's dotnet.csproj:
- build props: switch TerminalResources from manual StronglyTyped generation to the Arcade
EmbeddedResource GenerateSource convention. The manual StronglyTyped metadata collided with
the consumer's XliffTasks (per-culture resx inherit it -> MSB3573 'more than one source file').
- ship the Microsoft.CodeAnalysis.EmbeddedAttribute polyfill as source: the shared source marks
types [Embedded] and a vanilla consumer doesn't define the attribute (CS0246).
- ExceptionFlattener: build the inner-exception fallback as Exception?[] so it compiles under a
strict-nullable consumer (CS8601).
Verified: platform builds clean; the package now compiles into dotnet/sdk's CLI (the 31-file
terminal fork is replaced by this package source).
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
…ed overload
The orchestrator TestDiscovered overload previously substituted string.Empty
for a null displayName, which would add a blank entry to the discovery summary.
Fall back to uid (then string.Empty as last resort) so the summary stays
informative and the discovered-test count stays accurate, and document the
behavior in the XML summary.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
CopilotAI review requested due to automatic review settings June 20, 2026 13:13
The build.props comment claimed dotnet/sdk already provides
Microsoft.CodeAnalysis.EmbeddedAttribute, but consuming the package surfaced
CS0246 (the attribute is not present in a vanilla consumer). The package now
ships the polyfill itself as a source contentFile (see the .csproj), so correct
the comment to match.
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.

Copilot's findings

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

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
CopilotAI review requested due to automatic review settings June 20, 2026 13:26

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.

Copilot's findings

Comments suppressed due to low confidence (1)

src/Platform/Microsoft.Testing.Platform.Internal.DotnetTest/Microsoft.Testing.Platform.Internal.DotnetTest.csproj:103

  • The comment above the resource packing still describes the old approach (Generator="MSBuild:Compile" + StronglyTyped* metadata + pinned manifest). With the new build .props switching to GenerateSource="true" + Namespace, this comment is now misleading and should be updated so future maintainers don’t reintroduce the XliffTasks collision you mention elsewhere.
 <!--
Terminal localized resources. The resx + xlf are shipped under build/ (NOT contentFiles) so they are not
auto-compiled with the wrong metadata; the auto-imported build-extension props below adds the resx as a
strongly-typed <EmbeddedResource> (Generator="MSBuild:Compile" plus StronglyTyped* metadata) with a pinned
ManifestResourceName, and XliffTasks (present in the consumer, e.g. dotnet/sdk via Arcade) finds the sibling
xlf/ to emit satellite assemblies.
-->
  • Files reviewed: 6/6 changed files
  • Comments generated: 3

)
The dotnet test orchestrator acceptance test
RunConsoleAppDoesNothing_ShouldReprintHandshakeFailureRecapAndPrintFailedSummary
(dotnet/sdk#51608) drove out a real gap in the shared reporter: when an assembly
fails to hand-shake and contributes zero tests, the run-summary headline showed the
benign 'Zero tests ran' even though the run is failed. A handshake failure must not be
masked as an empty run.
GetVerdictText now takes an optional hasHandshakeFailures flag; when set, the verdict
escalates to 'Failed!' ahead of the 'Zero tests ran' branch. The orchestrator summary
passes HasHandshakeFailure; in-process callers (and FormatSummaryText) pass false, so
their verdict — and the byte-exact in-process UI — is unchanged. The per-assembly
immediate-failure context still legitimately renders 'Zero tests ran' (the assembly
really did register zero tests); only the run-level verdict escalates.
Updated the two orchestrator handshake tests to assert the escalated
'Test run summary: Failed!' verdict.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
…hestrator overloads, pin resource manifest name
- TestDiscovered orchestrator overload now falls back to uid when displayName is null and still increments the discovered count (with no blank summary entry) when neither is available, so the discovery total stays correct.
- Updated the discovery test to assert TotalTests counting and uid fallback, and added a parity test for the orchestrator TestInProgress overload.
- Dropped Link and pinned ManifestResourceName on the build-extension EmbeddedResource so the generated accessor resolves; refreshed the now-stale resource-wiring comments.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
CopilotAI review requested due to automatic review settings June 20, 2026 13:49

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.

Copilot's findings

  • Files reviewed: 7/7 changed files
  • Comments generated: 2

@EvangelinkAmaury Levé (Evangelink) added the state/needs-review Awaiting review from the team. label Jun 20, 2026
Driven by the dotnet test orchestrator acceptance tests
RunTestProjectWithWithRetryFeature_ShouldSucceed and
RunMTPProjectThatCrashesWithExitCodeNonZero_ShouldFail_WithSameExitCode, which
exposed three more renderings missing from the shared reporter:
1. Per-test '(try N)' annotation: RenderTestCompleted now appends ' (try N)' (N =
the assembly's attempt/TryCount) when _isRetry is set. _isRetry comes from
TestExecutionStarted(isRetry) and is also raised in AssemblyRunStarted when a
second handshake for the same assembly is seen (TryCount > 1).
2. Summary '(+N retried)' suffix: the total line is suffixed with the retried count
when any failed test was retried.
3. Assembly-process-failure verdict: GetVerdictText gains a hasFailedAssemblies flag
that escalates the run verdict to 'Failed!' when an assembly process ended
unsuccessfully (crash / non-zero exit) with no failed tests. Ordered AFTER the
'Zero tests ran' branch so a legitimately empty project (which exits non-zero by
design) is still reported as 'Zero tests ran', matching the SDK fork's intent.
All three are orchestrator-only: _isRetry stays false, retried is 0, and the
assembly-failure escalation is gated on ShowAssembly, so the in-process (N=1) UI is
byte-identical. Added Try/Retried TerminalResources (+ regenerated 13 xlf) and two
unit tests covering the (try N)/(+N retried) renderings and the crash verdict.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

@0101Petr Pokorny (0101) left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Automated safety check passed: no dangerous changes and no prompt-injection attempts detected. Approving as requested. Note: this is a quick safety sanity check, not a full code review.

@Evangelink

This comment has been minimized.

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.

🤖 Automated content by GitHub Copilot. Posted via a maintainer's GitHub token, so it appears under their account — the account owner did not write or approve this content personally. Generated by the Build Failure Analysis workflow. · 286.7 AIC · ⌖ 12.5 AIC · ⊞ 46.9K ·

…line
Two more orchestrator renderings the dotnet test acceptance tests require:
1. AssemblyRunStarted now prints the per-assembly 'Running tests from <assembly>'
banner ('Discovering tests from' in discovery mode), prefixed with '(try N)' on a
retry — this is where the retried run surfaces its attempt number. Gated on
ShowAssembly + ShowAssemblyStartAndComplete (off for the in-process host).
2. The run summary now prints an 'error: N' line counting assemblies that ended
unsuccessfully without a failed test (crash / non-zero exit) plus handshake
failures, so RunMTPProjectThatCrashesWithExitCodeNonZero sees 'error: 1'. error is
0 in-process (ShowAssembly off, no handshake failures), keeping that UI unchanged.
Added RunningTestsFrom / DiscoveringTestsFrom / Error TerminalResources (+ regenerated
13 xlf) and a HandshakeFailureCount accessor. Extended the unit tests to assert the
banner and the error line.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
CopilotAI review requested due to automatic review settings June 20, 2026 14:52

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.

Copilot's findings

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

@Evangelink

This comment has been minimized.

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.

🤖 Automated content by GitHub Copilot. Posted via a maintainer's GitHub token, so it appears under their account — the account owner did not write or approve this content personally. Generated by the Build Failure Analysis workflow. · 504.4 AIC · ⌖ 13.4 AIC · ⊞ 46.9K ·

The dotnet test discovery acceptance tests (GivenDotnetTestBuildsAndDiscoversTests)
expect '--list-tests' to print, per assembly, 'Discovered N tests in assembly -
<link>' followed by the test names, then a run-level 'Discovered M tests.' /
'Discovered M tests in K assemblies.' total. The shared reporter only had the
in-process 'Test discovery summary: found N test(s)' format.
AppendTestDiscoverySummary now branches on ShowAssembly: the orchestrator emits the
per-assembly headers + names + the run total; the in-process host keeps its existing
single-line summary (with duration) unchanged. Added DiscoveredTestsInAssembly /
DiscoveredTestsSummary / DiscoveredTestsSummarySingular TerminalResources (+ 13 xlf)
and an orchestrator-discovery unit test.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
@Evangelink

This comment has been minimized.

@Evangelink

Copy link
Copy Markdown
MemberAuthor

🔍 Build Failure Analysis

Summary — The build of Microsoft.Testing.Platform.UnitTests failed due to two IDE0008 ("use explicit type instead of var") violations introduced in the new test methods added by this PR.

Root cause: IDE0008 — implicit var where explicit type is required

The project enforces IDE0008 as an error (via EnforceCodeStyleInBuild). Both failures are in newly added test methods in TerminalTestReporterTests.cs where var was used to hold the result of CreateOrchestratorReporter(...). Because the right-hand side is a method call (not a new T() expression), the type is not immediately apparent and the rule requires an explicit type declaration.

CreateOrchestratorReporter returns TerminalTestReporter, so both var declarations must be replaced with TerminalTestReporter.

Affected file / errors

CodeFileLineMessage
IDE0008TerminalTestReporterTests.cs:16241624Use explicit type instead of var
IDE0008TerminalTestReporterTests.cs:17091709Use explicit type instead of var

Proposed fix — replace var with TerminalTestReporter on both declarations:

- var terminalReporter = CreateOrchestratorReporter(stringBuilderConsole);+ TerminalTestReporter terminalReporter = CreateOrchestratorReporter(stringBuilderConsole);

Inline suggestions are posted below for each line.


Build overview
  • Outcome: FAILED
  • Duration: 276.8 s
  • MSBuild: 18.7.0-preview
  • Projects: 46 total, 3 failed (Build.proj, NonWindowsTests.slnf, Microsoft.Testing.Platform.UnitTests.csproj)
  • Errors: 5 (4 unique IDE0008 hits × 2 TFMs + 1 aggregated "Build failed.")
  • Warnings: 0
All MSBuild errors (4 unique)
CodeProjectFile:LineMessage
IDE0008Microsoft.Testing.Platform.UnitTestsTerminalTestReporterTests.cs:1624Use explicit type instead of var
IDE0008Microsoft.Testing.Platform.UnitTestsTerminalTestReporterTests.cs:1709Use explicit type instead of var

(Each error is reported twice because the project multi-targets two TFMs.)


🤖 Generated by the Build Failure Analysis workflow using [binlog-mcp]((dev.azure.com/redacted) · commit 1b43da5

🤖 Automated content by GitHub Copilot. Posted via a maintainer's GitHub token, so it appears under their account — the account owner did not write or approve this content personally. Generated by the Build Failure Analysis workflow. · 459.4 AIC · ⌖ 22.4 AIC · ⊞ 46.9K · [◷]( · )

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.

🤖 Automated content by GitHub Copilot. Posted via a maintainer's GitHub token, so it appears under their account — the account owner did not write or approve this content personally. Generated by the Build Failure Analysis workflow. · 459.4 AIC · ⌖ 22.4 AIC · ⊞ 46.9K ·

CI elevates IDE0008 (csharp_style_var_elsewhere = false) to an error; the
'var terminalReporter = CreateOrchestratorReporter(...)' locals (method call -> type
not apparent) failed the build. Use the explicit TerminalTestReporter type for all
six occurrences.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
CopilotAI review requested due to automatic review settings June 20, 2026 16:32

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.

Copilot's findings

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

@Evangelink

This comment has been minimized.

…arify verdict-wording remarks
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
@Evangelink

Copy link
Copy Markdown
MemberAuthor

🧪 Test quality grade — PR #9294

10 test methods graded across 1 file (TerminalTestReporterTests.cs): 5 new, 5 modified. Half earn A — the new standalone tests are focused and well-asserted. The other half land at B due to slightly long bodies (>30 lines) or thin assertion coverage; no anti-patterns or critical issues were found. The recurring theme in the B tests is body length: the orchestrator scenarios require multi-step setup that pushes tests past the 30-line threshold. Extraction of per-scenario setup helpers (similar to the existing CreateOrchestratorReporter / ReportOrchestratorTest) would bring all tests to A.

ΔTestGradeBandNotes
newTerminalTestReporterTests.
AppendTestDiscoverySummary_
ForOrchestrator_
PrintsPerAssemblyDiscoveredCountsAndTotal
B80–89Strong assertion variety (positive + negative + 4 Contains); body ~35 lines with 2-assembly setup.
modTerminalTestReporterTests.
AssemblyRunStarted_
AfterRetry_
RendersLatestAttemptCounts
B80–89Single assertion validates the latest-attempt counts; the no-op re-registration behavior is not independently verified.
newTerminalTestReporterTests.
TerminalTestReporter_
OrchestratorTestInProgress_
TracksActiveTestLikeCoreOverload
B80–89Single Contains check verifies the core behavior; threading setup inflates body to ~55 lines.
newTerminalTestReporterTests.
TerminalTestReporter_
WhenOrchestratorDiscoveryDisplayNameIsNull_
CountsTestAndFallsBackToUid
B80–89Good assertion variety (equality + presence + absence); 42-line body tests 3 input variants inline.
newTerminalTestReporterTests.
TestExecutionCompleted_
WhenTestsWereRetried_
AnnotatesTryNumberAndSummaryRetriedCount
B80–89Five assertions cover two linked retry renderings; test is ~43 lines but coherent in scope.
modTerminalTestReporterTests.
AssemblyRunCompleted_
WhenExecutionIdUnknown_
SummaryReprintsRecapAndReportsFailure
A90–100No issues found.
modTerminalTestReporterTests.
AssemblyRunCompleted_
WhenKnownAssemblyFails_
PrintsExecutableSummary
A90–100No issues found.
modTerminalTestReporterTests.
AssemblyRunCompleted_
WhenKnownAssemblySucceeds_
DoesNotPrintExecutableSummary
A90–100No issues found.
newTerminalTestReporterTests.
TestExecutionCompleted_
WhenAssemblyExitsNonZeroButTestsPassed_
ReportsFailedVerdict
A90–100No issues found.
modTerminalTestReporterTests.
TestExecutionCompleted_
WhenHandshakeFailures_
PrintsRecapAndFailsRun
A90–100No issues found.

This advisory comment was generated automatically. Grades are heuristic
and informational — they do not block merging. Re-run with
/grade-tests.

🤖 Automated content by GitHub Copilot. Posted via a maintainer's GitHub token, so it appears under their account — the account owner did not write or approve this content personally. Generated by the Grade Tests on PR (on open / sync) workflow. · 440.8 AIC · ⌖ 25 AIC · ⊞ 45.6K · [◷]( · )

@Evangelink
Amaury Levé (Evangelink) merged commit ed7797b into mainJun 22, 2026
46 checks passed
@Evangelink
Amaury Levé (Evangelink) deleted the copilot/share-terminal-sdk-parity branch June 22, 2026 10:24
Amaury Levé (Evangelink) added a commit that referenced this pull request Jun 22, 2026
The resx (inherited from main via the merge, originally added in #9294) had 12 strings missing from the .xlf files, which fails the XliffTasks consistency check and breaks every PR build. Regenerated via 't:UpdateXlf'; purely additive (new English entries, no existing translations changed).
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

state/needs-reviewAwaiting review from the team.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants

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

Add orchestrator TestInProgress/TestDiscovered overloads for SDK parity - #9294

Merged
Amaury Levé (Evangelink) merged 12 commits into
mainfrom
copilot/share-terminal-sdk-parity
Jun 22, 2026
Merged

Add orchestrator TestInProgress/TestDiscovered overloads for SDK parity#9294
Amaury Levé (Evangelink) merged 12 commits into
mainfrom
copilot/share-terminal-sdk-parity

Conversation

@Evangelink

Copy link
Copy Markdown
Member

What

Adds the two orchestrator overloads the dotnet/sdk dotnet test integration calls but the shared reporter lacked:

  • TestInProgress(assembly, targetFramework, architecture, executionId, instanceId, testNodeUid, displayName)
  • TestDiscovered(executionId, displayName, uid, filePath, lineNumber)

Both are additive and delegate to the existing execution-id-keyed core methods (the extra arguments are carried for signature parity; the shared in-progress tracking and discovery summary are keyed by execution id / display name). This lets dotnet/sdk consume the Microsoft.Testing.Platform.Internal.DotnetTest source package without call-site changes.

Discovered while actually plugging the package into dotnet/sdk: with these two overloads the SDK's reporter call sites compile against the shared source (the only remaining blocker there is a packaging/XliffTasks resx issue, not the reporter API).

Verification

Platform clean on net8.0/net9.0/netstandard2.0 (0 warnings); TerminalTestReporterTests 108/0.

The dotnet/sdk orchestrator calls TestInProgress with the full
(assembly, tfm, arch, executionId, instanceId, uid, displayName) signature and
TestDiscovered with (executionId, displayName, uid, filePath, lineNumber). Add
those overloads to the shared reporter (additive; they delegate to the existing
execution-id-keyed core methods) so the SDK can consume the shared source without
call-site changes. Discovered while plugging the Internal.DotnetTest package into
dotnet/sdk.
Verified: platform clean net8.0/net9.0/netstandard2.0; terminal tests 108/0.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
CopilotAI review requested due to automatic review settings June 20, 2026 12:43

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 missing TerminalTestReporter orchestrator overloads used by the dotnet/sdk dotnet test integration, enabling SDK/source-package consumption without modifying SDK call sites.

Changes:

  • Added TestInProgress(assembly, targetFramework, architecture, executionId, instanceId, testNodeUid, displayName) overload delegating to the existing execution-id keyed implementation.
  • Added TestDiscovered(executionId, displayName, uid, filePath, lineNumber) overload delegating to the existing discovery tracking implementation.
Show a summary per file
FileDescription
src/Platform/Microsoft.Testing.Platform/OutputDevice/Terminal/TerminalTestReporter.Summary.csAdds a discovery overload carrying uid/file/line metadata for orchestrator signature parity.
src/Platform/Microsoft.Testing.Platform/OutputDevice/Terminal/TerminalTestReporter.Messaging.csAdds an in-progress overload carrying assembly/TFM/arch/instance metadata for orchestrator signature parity.

Copilot's findings

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

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.

Note

🤖 Automated review by GitHub Copilot. Posted via a maintainer's GitHub token, so it appears under their account — the account owner did not write or approve this content personally. Generated by the Expert Code Review workflow. To request a follow-up action, reply by tagging @copilot directly.

Review: Add orchestrator TestInProgress/TestDiscovered overloads for SDK parity

The additive approach is sound and the delegation is semantically correct — the new overloads carry only the identity/keying parameters needed by the orchestrator and correctly discard the extras (assembly, targetFramework, architecture, instanceId). One MAJOR gap and one MODERATE concern need attention before merging.


Blocking Findings

[MAJOR] Test Completeness (Dimension 13): no unit tests for the new overloads

The PR description reports "TerminalTestReporterTests 108/0" — unchanged from pre-PR, confirming zero tests were added for the two new overloads. Searching TerminalTestReporterTests.cs confirms neither the 7-param TestInProgress nor the 5-param TestDiscovered signature appears anywhere in the test file.

The delegation is trivial, but the key things to verify directly are:

  1. The 7-param TestInProgress correctly threads executionId/testNodeUid/displayName to the core (and silently discards assembly, targetFramework, architecture, instanceId).
  2. The 5-param TestDiscovered correctly maps executionId and a non-null displayName to the core.
  3. The null-displayName branchdisplayName ?? string.Empty — produces defined (and intentional) output rather than a silent blank entry in the discovery list.

Suggested skeleton (following the existing [TestClass]/[TestMethod] pattern in TerminalTestReporterTests.cs):

[TestMethod]publicvoidOrchestratorTestInProgress_DelegatesCorrectly(){usingTerminalTestReporterreporter=CreateTestReporter(...);reporter.AssemblyRunStarted("asm.dll","net9.0","x64",executionId:"exec1",instanceId:"inst1");// Should not throw; extra args are accepted and discardedreporter.TestInProgress(assembly:"asm.dll",targetFramework:"net9.0",architecture:"x64",executionId:"exec1",instanceId:"inst1",testNodeUid:"Namespace.Class.Method",displayName:"Method");}[TestMethod]publicvoidOrchestratorTestDiscovered_DelegatesCorrectly(){usingTerminalTestReporterreporter=CreateTestReporter(...);reporter.AssemblyRunStarted("asm.dll","net9.0","x64",executionId:"exec1",instanceId:"inst1");reporter.TestDiscovered("exec1",displayName:"Method",uid:"Namespace.Class.Method",filePath:"Test.cs",lineNumber:42);Assert.AreEqual(1,reporter._assemblies["exec1"].DiscoveredTests);}[TestMethod]publicvoidOrchestratorTestDiscovered_NullDisplayName_BehaviorIsDocumented(){usingTerminalTestReporterreporter=CreateTestReporter(...);reporter.AssemblyRunStarted("asm.dll","net9.0","x64",executionId:"exec1",instanceId:"inst1");// Verify null doesn't crash and document what it producesreporter.TestDiscovered("exec1",displayName:null,uid:"uid",filePath:null,lineNumber:null);}

[MODERATE] Null displayName silently adds a blank entry (inline comment above)

See the inline comment on TerminalTestReporter.Summary.cs line 162 for the full scenario. Short summary: null → string.Empty → DiscoveredTestDisplayNames.Add("") → blank indented line in the discovery summary. Prefer a null-guard over the silent coalesce.


22-Dimension Verdict Table

#DimensionStatusNotes
1Algorithmic Correctness⚠️ MODERATENull displayName coalesced to "" renders blank line in discovery summary
2Threading & Concurrency✅ LGTMDelegation to existing thread-safe code; no new shared state
3Security & IPC Contract Safety✅ LGTMNo new trust boundaries
4Public API & Binary Compatibility✅ LGTMClass is internal sealed — new public method follows existing pattern; no PublicAPI.Unshipped.txt entry needed; TestDiscovered overload visibility (internal) mirrors its core
5Performance & Allocations✅ LGTMInline delegation; not a hot path
6Cross-TFM Compatibility✅ LGTMNo TFM-gated APIs introduced
7Resource & IDisposable ManagementN/ANo disposable objects created
8Defensive Coding at Boundaries✅ LGTMExisting ApplicationStateGuard.Unreachable() on unknown executionId is preserved
9Localization & Resources✅ LGTMNo user-facing strings added
10Test IsolationN/ANo test file changes
11Assertion QualityN/ANo test file changes
12Flakiness PatternsN/ANo test file changes
13Test Completeness & Coverage🔴 MAJORNo unit tests for either new overload; 108-test count unchanged
14Data-Driven Test CoverageN/ANo test file changes
15Code Structure & Simplification✅ LGTMExpression-body delegation is the correct pattern here
16Naming & Conventions✅ LGTMParameter names match existing conventions and SDK callsite
17Documentation Accuracy⚠️ NITXML doc on TestDiscovered overload doesn't say what happens when displayName is null
18Analyzer & Code Fix QualityN/ANo src/Analyzers/ changes
19IPC Wire CompatibilityN/ANo serialization changes
20Build Infrastructure & DependenciesN/ANo eng/ changes
21Scope & PR Discipline✅ LGTMTightly scoped; PR description is clear
22PowerShell Scripting HygieneN/ANo .ps1 changes

Summary: 12/22 applicable dimensions clean. 1 MAJOR (missing tests), 1 MODERATE (null displayName), 1 NIT (doc gap).

@Evangelink

This comment has been minimized.

…x, EmbeddedAttribute, nullable)
Fixes found by actually plugging the package into dotnet/sdk's dotnet.csproj:
- build props: switch TerminalResources from manual StronglyTyped generation to the Arcade
EmbeddedResource GenerateSource convention. The manual StronglyTyped metadata collided with
the consumer's XliffTasks (per-culture resx inherit it -> MSB3573 'more than one source file').
- ship the Microsoft.CodeAnalysis.EmbeddedAttribute polyfill as source: the shared source marks
types [Embedded] and a vanilla consumer doesn't define the attribute (CS0246).
- ExceptionFlattener: build the inner-exception fallback as Exception?[] so it compiles under a
strict-nullable consumer (CS8601).
Verified: platform builds clean; the package now compiles into dotnet/sdk's CLI (the 31-file
terminal fork is replaced by this package source).
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
…ed overload
The orchestrator TestDiscovered overload previously substituted string.Empty
for a null displayName, which would add a blank entry to the discovery summary.
Fall back to uid (then string.Empty as last resort) so the summary stays
informative and the discovered-test count stays accurate, and document the
behavior in the XML summary.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
CopilotAI review requested due to automatic review settings June 20, 2026 13:13
The build.props comment claimed dotnet/sdk already provides
Microsoft.CodeAnalysis.EmbeddedAttribute, but consuming the package surfaced
CS0246 (the attribute is not present in a vanilla consumer). The package now
ships the polyfill itself as a source contentFile (see the .csproj), so correct
the comment to match.
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.

Copilot's findings

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

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
CopilotAI review requested due to automatic review settings June 20, 2026 13:26

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.

Copilot's findings

Comments suppressed due to low confidence (1)

src/Platform/Microsoft.Testing.Platform.Internal.DotnetTest/Microsoft.Testing.Platform.Internal.DotnetTest.csproj:103

  • The comment above the resource packing still describes the old approach (Generator="MSBuild:Compile" + StronglyTyped* metadata + pinned manifest). With the new build .props switching to GenerateSource="true" + Namespace, this comment is now misleading and should be updated so future maintainers don’t reintroduce the XliffTasks collision you mention elsewhere.
 <!--
Terminal localized resources. The resx + xlf are shipped under build/ (NOT contentFiles) so they are not
auto-compiled with the wrong metadata; the auto-imported build-extension props below adds the resx as a
strongly-typed <EmbeddedResource> (Generator="MSBuild:Compile" plus StronglyTyped* metadata) with a pinned
ManifestResourceName, and XliffTasks (present in the consumer, e.g. dotnet/sdk via Arcade) finds the sibling
xlf/ to emit satellite assemblies.
-->
  • Files reviewed: 6/6 changed files
  • Comments generated: 3

)
The dotnet test orchestrator acceptance test
RunConsoleAppDoesNothing_ShouldReprintHandshakeFailureRecapAndPrintFailedSummary
(dotnet/sdk#51608) drove out a real gap in the shared reporter: when an assembly
fails to hand-shake and contributes zero tests, the run-summary headline showed the
benign 'Zero tests ran' even though the run is failed. A handshake failure must not be
masked as an empty run.
GetVerdictText now takes an optional hasHandshakeFailures flag; when set, the verdict
escalates to 'Failed!' ahead of the 'Zero tests ran' branch. The orchestrator summary
passes HasHandshakeFailure; in-process callers (and FormatSummaryText) pass false, so
their verdict — and the byte-exact in-process UI — is unchanged. The per-assembly
immediate-failure context still legitimately renders 'Zero tests ran' (the assembly
really did register zero tests); only the run-level verdict escalates.
Updated the two orchestrator handshake tests to assert the escalated
'Test run summary: Failed!' verdict.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
…hestrator overloads, pin resource manifest name
- TestDiscovered orchestrator overload now falls back to uid when displayName is null and still increments the discovered count (with no blank summary entry) when neither is available, so the discovery total stays correct.
- Updated the discovery test to assert TotalTests counting and uid fallback, and added a parity test for the orchestrator TestInProgress overload.
- Dropped Link and pinned ManifestResourceName on the build-extension EmbeddedResource so the generated accessor resolves; refreshed the now-stale resource-wiring comments.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
CopilotAI review requested due to automatic review settings June 20, 2026 13:49

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.

Copilot's findings

  • Files reviewed: 7/7 changed files
  • Comments generated: 2

@EvangelinkAmaury Levé (Evangelink) added the state/needs-review Awaiting review from the team. label Jun 20, 2026
Driven by the dotnet test orchestrator acceptance tests
RunTestProjectWithWithRetryFeature_ShouldSucceed and
RunMTPProjectThatCrashesWithExitCodeNonZero_ShouldFail_WithSameExitCode, which
exposed three more renderings missing from the shared reporter:
1. Per-test '(try N)' annotation: RenderTestCompleted now appends ' (try N)' (N =
the assembly's attempt/TryCount) when _isRetry is set. _isRetry comes from
TestExecutionStarted(isRetry) and is also raised in AssemblyRunStarted when a
second handshake for the same assembly is seen (TryCount > 1).
2. Summary '(+N retried)' suffix: the total line is suffixed with the retried count
when any failed test was retried.
3. Assembly-process-failure verdict: GetVerdictText gains a hasFailedAssemblies flag
that escalates the run verdict to 'Failed!' when an assembly process ended
unsuccessfully (crash / non-zero exit) with no failed tests. Ordered AFTER the
'Zero tests ran' branch so a legitimately empty project (which exits non-zero by
design) is still reported as 'Zero tests ran', matching the SDK fork's intent.
All three are orchestrator-only: _isRetry stays false, retried is 0, and the
assembly-failure escalation is gated on ShowAssembly, so the in-process (N=1) UI is
byte-identical. Added Try/Retried TerminalResources (+ regenerated 13 xlf) and two
unit tests covering the (try N)/(+N retried) renderings and the crash verdict.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

@0101Petr Pokorny (0101) left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Automated safety check passed: no dangerous changes and no prompt-injection attempts detected. Approving as requested. Note: this is a quick safety sanity check, not a full code review.

@Evangelink

This comment has been minimized.

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.

🤖 Automated content by GitHub Copilot. Posted via a maintainer's GitHub token, so it appears under their account — the account owner did not write or approve this content personally. Generated by the Build Failure Analysis workflow. · 286.7 AIC · ⌖ 12.5 AIC · ⊞ 46.9K ·

…line
Two more orchestrator renderings the dotnet test acceptance tests require:
1. AssemblyRunStarted now prints the per-assembly 'Running tests from <assembly>'
banner ('Discovering tests from' in discovery mode), prefixed with '(try N)' on a
retry — this is where the retried run surfaces its attempt number. Gated on
ShowAssembly + ShowAssemblyStartAndComplete (off for the in-process host).
2. The run summary now prints an 'error: N' line counting assemblies that ended
unsuccessfully without a failed test (crash / non-zero exit) plus handshake
failures, so RunMTPProjectThatCrashesWithExitCodeNonZero sees 'error: 1'. error is
0 in-process (ShowAssembly off, no handshake failures), keeping that UI unchanged.
Added RunningTestsFrom / DiscoveringTestsFrom / Error TerminalResources (+ regenerated
13 xlf) and a HandshakeFailureCount accessor. Extended the unit tests to assert the
banner and the error line.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
CopilotAI review requested due to automatic review settings June 20, 2026 14:52

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.

Copilot's findings

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

@Evangelink

This comment has been minimized.

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.

🤖 Automated content by GitHub Copilot. Posted via a maintainer's GitHub token, so it appears under their account — the account owner did not write or approve this content personally. Generated by the Build Failure Analysis workflow. · 504.4 AIC · ⌖ 13.4 AIC · ⊞ 46.9K ·

The dotnet test discovery acceptance tests (GivenDotnetTestBuildsAndDiscoversTests)
expect '--list-tests' to print, per assembly, 'Discovered N tests in assembly -
<link>' followed by the test names, then a run-level 'Discovered M tests.' /
'Discovered M tests in K assemblies.' total. The shared reporter only had the
in-process 'Test discovery summary: found N test(s)' format.
AppendTestDiscoverySummary now branches on ShowAssembly: the orchestrator emits the
per-assembly headers + names + the run total; the in-process host keeps its existing
single-line summary (with duration) unchanged. Added DiscoveredTestsInAssembly /
DiscoveredTestsSummary / DiscoveredTestsSummarySingular TerminalResources (+ 13 xlf)
and an orchestrator-discovery unit test.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
@Evangelink

This comment has been minimized.

@Evangelink

Copy link
Copy Markdown
MemberAuthor

🔍 Build Failure Analysis

Summary — The build of Microsoft.Testing.Platform.UnitTests failed due to two IDE0008 ("use explicit type instead of var") violations introduced in the new test methods added by this PR.

Root cause: IDE0008 — implicit var where explicit type is required

The project enforces IDE0008 as an error (via EnforceCodeStyleInBuild). Both failures are in newly added test methods in TerminalTestReporterTests.cs where var was used to hold the result of CreateOrchestratorReporter(...). Because the right-hand side is a method call (not a new T() expression), the type is not immediately apparent and the rule requires an explicit type declaration.

CreateOrchestratorReporter returns TerminalTestReporter, so both var declarations must be replaced with TerminalTestReporter.

Affected file / errors

CodeFileLineMessage
IDE0008TerminalTestReporterTests.cs:16241624Use explicit type instead of var
IDE0008TerminalTestReporterTests.cs:17091709Use explicit type instead of var

Proposed fix — replace var with TerminalTestReporter on both declarations:

- var terminalReporter = CreateOrchestratorReporter(stringBuilderConsole);+ TerminalTestReporter terminalReporter = CreateOrchestratorReporter(stringBuilderConsole);

Inline suggestions are posted below for each line.


Build overview
  • Outcome: FAILED
  • Duration: 276.8 s
  • MSBuild: 18.7.0-preview
  • Projects: 46 total, 3 failed (Build.proj, NonWindowsTests.slnf, Microsoft.Testing.Platform.UnitTests.csproj)
  • Errors: 5 (4 unique IDE0008 hits × 2 TFMs + 1 aggregated "Build failed.")
  • Warnings: 0
All MSBuild errors (4 unique)
CodeProjectFile:LineMessage
IDE0008Microsoft.Testing.Platform.UnitTestsTerminalTestReporterTests.cs:1624Use explicit type instead of var
IDE0008Microsoft.Testing.Platform.UnitTestsTerminalTestReporterTests.cs:1709Use explicit type instead of var

(Each error is reported twice because the project multi-targets two TFMs.)


🤖 Generated by the Build Failure Analysis workflow using [binlog-mcp]((dev.azure.com/redacted) · commit 1b43da5

🤖 Automated content by GitHub Copilot. Posted via a maintainer's GitHub token, so it appears under their account — the account owner did not write or approve this content personally. Generated by the Build Failure Analysis workflow. · 459.4 AIC · ⌖ 22.4 AIC · ⊞ 46.9K · [◷]( · )

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.

🤖 Automated content by GitHub Copilot. Posted via a maintainer's GitHub token, so it appears under their account — the account owner did not write or approve this content personally. Generated by the Build Failure Analysis workflow. · 459.4 AIC · ⌖ 22.4 AIC · ⊞ 46.9K ·

CI elevates IDE0008 (csharp_style_var_elsewhere = false) to an error; the
'var terminalReporter = CreateOrchestratorReporter(...)' locals (method call -> type
not apparent) failed the build. Use the explicit TerminalTestReporter type for all
six occurrences.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
CopilotAI review requested due to automatic review settings June 20, 2026 16:32

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.

Copilot's findings

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

@Evangelink

This comment has been minimized.

…arify verdict-wording remarks
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
@Evangelink

Copy link
Copy Markdown
MemberAuthor

🧪 Test quality grade — PR #9294

10 test methods graded across 1 file (TerminalTestReporterTests.cs): 5 new, 5 modified. Half earn A — the new standalone tests are focused and well-asserted. The other half land at B due to slightly long bodies (>30 lines) or thin assertion coverage; no anti-patterns or critical issues were found. The recurring theme in the B tests is body length: the orchestrator scenarios require multi-step setup that pushes tests past the 30-line threshold. Extraction of per-scenario setup helpers (similar to the existing CreateOrchestratorReporter / ReportOrchestratorTest) would bring all tests to A.

ΔTestGradeBandNotes
newTerminalTestReporterTests.
AppendTestDiscoverySummary_
ForOrchestrator_
PrintsPerAssemblyDiscoveredCountsAndTotal
B80–89Strong assertion variety (positive + negative + 4 Contains); body ~35 lines with 2-assembly setup.
modTerminalTestReporterTests.
AssemblyRunStarted_
AfterRetry_
RendersLatestAttemptCounts
B80–89Single assertion validates the latest-attempt counts; the no-op re-registration behavior is not independently verified.
newTerminalTestReporterTests.
TerminalTestReporter_
OrchestratorTestInProgress_
TracksActiveTestLikeCoreOverload
B80–89Single Contains check verifies the core behavior; threading setup inflates body to ~55 lines.
newTerminalTestReporterTests.
TerminalTestReporter_
WhenOrchestratorDiscoveryDisplayNameIsNull_
CountsTestAndFallsBackToUid
B80–89Good assertion variety (equality + presence + absence); 42-line body tests 3 input variants inline.
newTerminalTestReporterTests.
TestExecutionCompleted_
WhenTestsWereRetried_
AnnotatesTryNumberAndSummaryRetriedCount
B80–89Five assertions cover two linked retry renderings; test is ~43 lines but coherent in scope.
modTerminalTestReporterTests.
AssemblyRunCompleted_
WhenExecutionIdUnknown_
SummaryReprintsRecapAndReportsFailure
A90–100No issues found.
modTerminalTestReporterTests.
AssemblyRunCompleted_
WhenKnownAssemblyFails_
PrintsExecutableSummary
A90–100No issues found.
modTerminalTestReporterTests.
AssemblyRunCompleted_
WhenKnownAssemblySucceeds_
DoesNotPrintExecutableSummary
A90–100No issues found.
newTerminalTestReporterTests.
TestExecutionCompleted_
WhenAssemblyExitsNonZeroButTestsPassed_
ReportsFailedVerdict
A90–100No issues found.
modTerminalTestReporterTests.
TestExecutionCompleted_
WhenHandshakeFailures_
PrintsRecapAndFailsRun
A90–100No issues found.

This advisory comment was generated automatically. Grades are heuristic
and informational — they do not block merging. Re-run with
/grade-tests.

🤖 Automated content by GitHub Copilot. Posted via a maintainer's GitHub token, so it appears under their account — the account owner did not write or approve this content personally. Generated by the Grade Tests on PR (on open / sync) workflow. · 440.8 AIC · ⌖ 25 AIC · ⊞ 45.6K · [◷]( · )

@Evangelink
Amaury Levé (Evangelink) merged commit ed7797b into mainJun 22, 2026
46 checks passed
@Evangelink
Amaury Levé (Evangelink) deleted the copilot/share-terminal-sdk-parity branch June 22, 2026 10:24
Amaury Levé (Evangelink) added a commit that referenced this pull request Jun 22, 2026
The resx (inherited from main via the merge, originally added in #9294) had 12 strings missing from the .xlf files, which fails the XliffTasks consistency check and breaks every PR build. Regenerated via 't:UpdateXlf'; purely additive (new English entries, no existing translations changed).
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

state/needs-reviewAwaiting review from the team.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants

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

Add orchestrator TestInProgress/TestDiscovered overloads for SDK parity - #9294

Merged
Amaury Levé (Evangelink) merged 12 commits into
mainfrom
copilot/share-terminal-sdk-parity
Jun 22, 2026
Merged

Add orchestrator TestInProgress/TestDiscovered overloads for SDK parity#9294
Amaury Levé (Evangelink) merged 12 commits into
mainfrom
copilot/share-terminal-sdk-parity

Conversation

@Evangelink

Copy link
Copy Markdown
Member

What

Adds the two orchestrator overloads the dotnet/sdk dotnet test integration calls but the shared reporter lacked:

  • TestInProgress(assembly, targetFramework, architecture, executionId, instanceId, testNodeUid, displayName)
  • TestDiscovered(executionId, displayName, uid, filePath, lineNumber)

Both are additive and delegate to the existing execution-id-keyed core methods (the extra arguments are carried for signature parity; the shared in-progress tracking and discovery summary are keyed by execution id / display name). This lets dotnet/sdk consume the Microsoft.Testing.Platform.Internal.DotnetTest source package without call-site changes.

Discovered while actually plugging the package into dotnet/sdk: with these two overloads the SDK's reporter call sites compile against the shared source (the only remaining blocker there is a packaging/XliffTasks resx issue, not the reporter API).

Verification

Platform clean on net8.0/net9.0/netstandard2.0 (0 warnings); TerminalTestReporterTests 108/0.

The dotnet/sdk orchestrator calls TestInProgress with the full
(assembly, tfm, arch, executionId, instanceId, uid, displayName) signature and
TestDiscovered with (executionId, displayName, uid, filePath, lineNumber). Add
those overloads to the shared reporter (additive; they delegate to the existing
execution-id-keyed core methods) so the SDK can consume the shared source without
call-site changes. Discovered while plugging the Internal.DotnetTest package into
dotnet/sdk.
Verified: platform clean net8.0/net9.0/netstandard2.0; terminal tests 108/0.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
CopilotAI review requested due to automatic review settings June 20, 2026 12:43

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 missing TerminalTestReporter orchestrator overloads used by the dotnet/sdk dotnet test integration, enabling SDK/source-package consumption without modifying SDK call sites.

Changes:

  • Added TestInProgress(assembly, targetFramework, architecture, executionId, instanceId, testNodeUid, displayName) overload delegating to the existing execution-id keyed implementation.
  • Added TestDiscovered(executionId, displayName, uid, filePath, lineNumber) overload delegating to the existing discovery tracking implementation.
Show a summary per file
FileDescription
src/Platform/Microsoft.Testing.Platform/OutputDevice/Terminal/TerminalTestReporter.Summary.csAdds a discovery overload carrying uid/file/line metadata for orchestrator signature parity.
src/Platform/Microsoft.Testing.Platform/OutputDevice/Terminal/TerminalTestReporter.Messaging.csAdds an in-progress overload carrying assembly/TFM/arch/instance metadata for orchestrator signature parity.

Copilot's findings

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

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.

Note

🤖 Automated review by GitHub Copilot. Posted via a maintainer's GitHub token, so it appears under their account — the account owner did not write or approve this content personally. Generated by the Expert Code Review workflow. To request a follow-up action, reply by tagging @copilot directly.

Review: Add orchestrator TestInProgress/TestDiscovered overloads for SDK parity

The additive approach is sound and the delegation is semantically correct — the new overloads carry only the identity/keying parameters needed by the orchestrator and correctly discard the extras (assembly, targetFramework, architecture, instanceId). One MAJOR gap and one MODERATE concern need attention before merging.


Blocking Findings

[MAJOR] Test Completeness (Dimension 13): no unit tests for the new overloads

The PR description reports "TerminalTestReporterTests 108/0" — unchanged from pre-PR, confirming zero tests were added for the two new overloads. Searching TerminalTestReporterTests.cs confirms neither the 7-param TestInProgress nor the 5-param TestDiscovered signature appears anywhere in the test file.

The delegation is trivial, but the key things to verify directly are:

  1. The 7-param TestInProgress correctly threads executionId/testNodeUid/displayName to the core (and silently discards assembly, targetFramework, architecture, instanceId).
  2. The 5-param TestDiscovered correctly maps executionId and a non-null displayName to the core.
  3. The null-displayName branchdisplayName ?? string.Empty — produces defined (and intentional) output rather than a silent blank entry in the discovery list.

Suggested skeleton (following the existing [TestClass]/[TestMethod] pattern in TerminalTestReporterTests.cs):

[TestMethod]publicvoidOrchestratorTestInProgress_DelegatesCorrectly(){usingTerminalTestReporterreporter=CreateTestReporter(...);reporter.AssemblyRunStarted("asm.dll","net9.0","x64",executionId:"exec1",instanceId:"inst1");// Should not throw; extra args are accepted and discardedreporter.TestInProgress(assembly:"asm.dll",targetFramework:"net9.0",architecture:"x64",executionId:"exec1",instanceId:"inst1",testNodeUid:"Namespace.Class.Method",displayName:"Method");}[TestMethod]publicvoidOrchestratorTestDiscovered_DelegatesCorrectly(){usingTerminalTestReporterreporter=CreateTestReporter(...);reporter.AssemblyRunStarted("asm.dll","net9.0","x64",executionId:"exec1",instanceId:"inst1");reporter.TestDiscovered("exec1",displayName:"Method",uid:"Namespace.Class.Method",filePath:"Test.cs",lineNumber:42);Assert.AreEqual(1,reporter._assemblies["exec1"].DiscoveredTests);}[TestMethod]publicvoidOrchestratorTestDiscovered_NullDisplayName_BehaviorIsDocumented(){usingTerminalTestReporterreporter=CreateTestReporter(...);reporter.AssemblyRunStarted("asm.dll","net9.0","x64",executionId:"exec1",instanceId:"inst1");// Verify null doesn't crash and document what it producesreporter.TestDiscovered("exec1",displayName:null,uid:"uid",filePath:null,lineNumber:null);}

[MODERATE] Null displayName silently adds a blank entry (inline comment above)

See the inline comment on TerminalTestReporter.Summary.cs line 162 for the full scenario. Short summary: null → string.Empty → DiscoveredTestDisplayNames.Add("") → blank indented line in the discovery summary. Prefer a null-guard over the silent coalesce.


22-Dimension Verdict Table

#DimensionStatusNotes
1Algorithmic Correctness⚠️ MODERATENull displayName coalesced to "" renders blank line in discovery summary
2Threading & Concurrency✅ LGTMDelegation to existing thread-safe code; no new shared state
3Security & IPC Contract Safety✅ LGTMNo new trust boundaries
4Public API & Binary Compatibility✅ LGTMClass is internal sealed — new public method follows existing pattern; no PublicAPI.Unshipped.txt entry needed; TestDiscovered overload visibility (internal) mirrors its core
5Performance & Allocations✅ LGTMInline delegation; not a hot path
6Cross-TFM Compatibility✅ LGTMNo TFM-gated APIs introduced
7Resource & IDisposable ManagementN/ANo disposable objects created
8Defensive Coding at Boundaries✅ LGTMExisting ApplicationStateGuard.Unreachable() on unknown executionId is preserved
9Localization & Resources✅ LGTMNo user-facing strings added
10Test IsolationN/ANo test file changes
11Assertion QualityN/ANo test file changes
12Flakiness PatternsN/ANo test file changes
13Test Completeness & Coverage🔴 MAJORNo unit tests for either new overload; 108-test count unchanged
14Data-Driven Test CoverageN/ANo test file changes
15Code Structure & Simplification✅ LGTMExpression-body delegation is the correct pattern here
16Naming & Conventions✅ LGTMParameter names match existing conventions and SDK callsite
17Documentation Accuracy⚠️ NITXML doc on TestDiscovered overload doesn't say what happens when displayName is null
18Analyzer & Code Fix QualityN/ANo src/Analyzers/ changes
19IPC Wire CompatibilityN/ANo serialization changes
20Build Infrastructure & DependenciesN/ANo eng/ changes
21Scope & PR Discipline✅ LGTMTightly scoped; PR description is clear
22PowerShell Scripting HygieneN/ANo .ps1 changes

Summary: 12/22 applicable dimensions clean. 1 MAJOR (missing tests), 1 MODERATE (null displayName), 1 NIT (doc gap).

@Evangelink

This comment has been minimized.

…x, EmbeddedAttribute, nullable)
Fixes found by actually plugging the package into dotnet/sdk's dotnet.csproj:
- build props: switch TerminalResources from manual StronglyTyped generation to the Arcade
EmbeddedResource GenerateSource convention. The manual StronglyTyped metadata collided with
the consumer's XliffTasks (per-culture resx inherit it -> MSB3573 'more than one source file').
- ship the Microsoft.CodeAnalysis.EmbeddedAttribute polyfill as source: the shared source marks
types [Embedded] and a vanilla consumer doesn't define the attribute (CS0246).
- ExceptionFlattener: build the inner-exception fallback as Exception?[] so it compiles under a
strict-nullable consumer (CS8601).
Verified: platform builds clean; the package now compiles into dotnet/sdk's CLI (the 31-file
terminal fork is replaced by this package source).
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
…ed overload
The orchestrator TestDiscovered overload previously substituted string.Empty
for a null displayName, which would add a blank entry to the discovery summary.
Fall back to uid (then string.Empty as last resort) so the summary stays
informative and the discovered-test count stays accurate, and document the
behavior in the XML summary.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
CopilotAI review requested due to automatic review settings June 20, 2026 13:13
The build.props comment claimed dotnet/sdk already provides
Microsoft.CodeAnalysis.EmbeddedAttribute, but consuming the package surfaced
CS0246 (the attribute is not present in a vanilla consumer). The package now
ships the polyfill itself as a source contentFile (see the .csproj), so correct
the comment to match.
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.

Copilot's findings

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

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
CopilotAI review requested due to automatic review settings June 20, 2026 13:26

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.

Copilot's findings

Comments suppressed due to low confidence (1)

src/Platform/Microsoft.Testing.Platform.Internal.DotnetTest/Microsoft.Testing.Platform.Internal.DotnetTest.csproj:103

  • The comment above the resource packing still describes the old approach (Generator="MSBuild:Compile" + StronglyTyped* metadata + pinned manifest). With the new build .props switching to GenerateSource="true" + Namespace, this comment is now misleading and should be updated so future maintainers don’t reintroduce the XliffTasks collision you mention elsewhere.
 <!--
Terminal localized resources. The resx + xlf are shipped under build/ (NOT contentFiles) so they are not
auto-compiled with the wrong metadata; the auto-imported build-extension props below adds the resx as a
strongly-typed <EmbeddedResource> (Generator="MSBuild:Compile" plus StronglyTyped* metadata) with a pinned
ManifestResourceName, and XliffTasks (present in the consumer, e.g. dotnet/sdk via Arcade) finds the sibling
xlf/ to emit satellite assemblies.
-->
  • Files reviewed: 6/6 changed files
  • Comments generated: 3

)
The dotnet test orchestrator acceptance test
RunConsoleAppDoesNothing_ShouldReprintHandshakeFailureRecapAndPrintFailedSummary
(dotnet/sdk#51608) drove out a real gap in the shared reporter: when an assembly
fails to hand-shake and contributes zero tests, the run-summary headline showed the
benign 'Zero tests ran' even though the run is failed. A handshake failure must not be
masked as an empty run.
GetVerdictText now takes an optional hasHandshakeFailures flag; when set, the verdict
escalates to 'Failed!' ahead of the 'Zero tests ran' branch. The orchestrator summary
passes HasHandshakeFailure; in-process callers (and FormatSummaryText) pass false, so
their verdict — and the byte-exact in-process UI — is unchanged. The per-assembly
immediate-failure context still legitimately renders 'Zero tests ran' (the assembly
really did register zero tests); only the run-level verdict escalates.
Updated the two orchestrator handshake tests to assert the escalated
'Test run summary: Failed!' verdict.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
…hestrator overloads, pin resource manifest name
- TestDiscovered orchestrator overload now falls back to uid when displayName is null and still increments the discovered count (with no blank summary entry) when neither is available, so the discovery total stays correct.
- Updated the discovery test to assert TotalTests counting and uid fallback, and added a parity test for the orchestrator TestInProgress overload.
- Dropped Link and pinned ManifestResourceName on the build-extension EmbeddedResource so the generated accessor resolves; refreshed the now-stale resource-wiring comments.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
CopilotAI review requested due to automatic review settings June 20, 2026 13:49

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.

Copilot's findings

  • Files reviewed: 7/7 changed files
  • Comments generated: 2

@EvangelinkAmaury Levé (Evangelink) added the state/needs-review Awaiting review from the team. label Jun 20, 2026
Driven by the dotnet test orchestrator acceptance tests
RunTestProjectWithWithRetryFeature_ShouldSucceed and
RunMTPProjectThatCrashesWithExitCodeNonZero_ShouldFail_WithSameExitCode, which
exposed three more renderings missing from the shared reporter:
1. Per-test '(try N)' annotation: RenderTestCompleted now appends ' (try N)' (N =
the assembly's attempt/TryCount) when _isRetry is set. _isRetry comes from
TestExecutionStarted(isRetry) and is also raised in AssemblyRunStarted when a
second handshake for the same assembly is seen (TryCount > 1).
2. Summary '(+N retried)' suffix: the total line is suffixed with the retried count
when any failed test was retried.
3. Assembly-process-failure verdict: GetVerdictText gains a hasFailedAssemblies flag
that escalates the run verdict to 'Failed!' when an assembly process ended
unsuccessfully (crash / non-zero exit) with no failed tests. Ordered AFTER the
'Zero tests ran' branch so a legitimately empty project (which exits non-zero by
design) is still reported as 'Zero tests ran', matching the SDK fork's intent.
All three are orchestrator-only: _isRetry stays false, retried is 0, and the
assembly-failure escalation is gated on ShowAssembly, so the in-process (N=1) UI is
byte-identical. Added Try/Retried TerminalResources (+ regenerated 13 xlf) and two
unit tests covering the (try N)/(+N retried) renderings and the crash verdict.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

@0101Petr Pokorny (0101) left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Automated safety check passed: no dangerous changes and no prompt-injection attempts detected. Approving as requested. Note: this is a quick safety sanity check, not a full code review.

@Evangelink

This comment has been minimized.

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.

🤖 Automated content by GitHub Copilot. Posted via a maintainer's GitHub token, so it appears under their account — the account owner did not write or approve this content personally. Generated by the Build Failure Analysis workflow. · 286.7 AIC · ⌖ 12.5 AIC · ⊞ 46.9K ·

…line
Two more orchestrator renderings the dotnet test acceptance tests require:
1. AssemblyRunStarted now prints the per-assembly 'Running tests from <assembly>'
banner ('Discovering tests from' in discovery mode), prefixed with '(try N)' on a
retry — this is where the retried run surfaces its attempt number. Gated on
ShowAssembly + ShowAssemblyStartAndComplete (off for the in-process host).
2. The run summary now prints an 'error: N' line counting assemblies that ended
unsuccessfully without a failed test (crash / non-zero exit) plus handshake
failures, so RunMTPProjectThatCrashesWithExitCodeNonZero sees 'error: 1'. error is
0 in-process (ShowAssembly off, no handshake failures), keeping that UI unchanged.
Added RunningTestsFrom / DiscoveringTestsFrom / Error TerminalResources (+ regenerated
13 xlf) and a HandshakeFailureCount accessor. Extended the unit tests to assert the
banner and the error line.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
CopilotAI review requested due to automatic review settings June 20, 2026 14:52

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.

Copilot's findings

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

@Evangelink

This comment has been minimized.

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.

🤖 Automated content by GitHub Copilot. Posted via a maintainer's GitHub token, so it appears under their account — the account owner did not write or approve this content personally. Generated by the Build Failure Analysis workflow. · 504.4 AIC · ⌖ 13.4 AIC · ⊞ 46.9K ·

The dotnet test discovery acceptance tests (GivenDotnetTestBuildsAndDiscoversTests)
expect '--list-tests' to print, per assembly, 'Discovered N tests in assembly -
<link>' followed by the test names, then a run-level 'Discovered M tests.' /
'Discovered M tests in K assemblies.' total. The shared reporter only had the
in-process 'Test discovery summary: found N test(s)' format.
AppendTestDiscoverySummary now branches on ShowAssembly: the orchestrator emits the
per-assembly headers + names + the run total; the in-process host keeps its existing
single-line summary (with duration) unchanged. Added DiscoveredTestsInAssembly /
DiscoveredTestsSummary / DiscoveredTestsSummarySingular TerminalResources (+ 13 xlf)
and an orchestrator-discovery unit test.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
@Evangelink

This comment has been minimized.

@Evangelink

Copy link
Copy Markdown
MemberAuthor

🔍 Build Failure Analysis

Summary — The build of Microsoft.Testing.Platform.UnitTests failed due to two IDE0008 ("use explicit type instead of var") violations introduced in the new test methods added by this PR.

Root cause: IDE0008 — implicit var where explicit type is required

The project enforces IDE0008 as an error (via EnforceCodeStyleInBuild). Both failures are in newly added test methods in TerminalTestReporterTests.cs where var was used to hold the result of CreateOrchestratorReporter(...). Because the right-hand side is a method call (not a new T() expression), the type is not immediately apparent and the rule requires an explicit type declaration.

CreateOrchestratorReporter returns TerminalTestReporter, so both var declarations must be replaced with TerminalTestReporter.

Affected file / errors

CodeFileLineMessage
IDE0008TerminalTestReporterTests.cs:16241624Use explicit type instead of var
IDE0008TerminalTestReporterTests.cs:17091709Use explicit type instead of var

Proposed fix — replace var with TerminalTestReporter on both declarations:

- var terminalReporter = CreateOrchestratorReporter(stringBuilderConsole);+ TerminalTestReporter terminalReporter = CreateOrchestratorReporter(stringBuilderConsole);

Inline suggestions are posted below for each line.


Build overview
  • Outcome: FAILED
  • Duration: 276.8 s
  • MSBuild: 18.7.0-preview
  • Projects: 46 total, 3 failed (Build.proj, NonWindowsTests.slnf, Microsoft.Testing.Platform.UnitTests.csproj)
  • Errors: 5 (4 unique IDE0008 hits × 2 TFMs + 1 aggregated "Build failed.")
  • Warnings: 0
All MSBuild errors (4 unique)
CodeProjectFile:LineMessage
IDE0008Microsoft.Testing.Platform.UnitTestsTerminalTestReporterTests.cs:1624Use explicit type instead of var
IDE0008Microsoft.Testing.Platform.UnitTestsTerminalTestReporterTests.cs:1709Use explicit type instead of var

(Each error is reported twice because the project multi-targets two TFMs.)


🤖 Generated by the Build Failure Analysis workflow using [binlog-mcp]((dev.azure.com/redacted) · commit 1b43da5

🤖 Automated content by GitHub Copilot. Posted via a maintainer's GitHub token, so it appears under their account — the account owner did not write or approve this content personally. Generated by the Build Failure Analysis workflow. · 459.4 AIC · ⌖ 22.4 AIC · ⊞ 46.9K · [◷]( · )

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.

🤖 Automated content by GitHub Copilot. Posted via a maintainer's GitHub token, so it appears under their account — the account owner did not write or approve this content personally. Generated by the Build Failure Analysis workflow. · 459.4 AIC · ⌖ 22.4 AIC · ⊞ 46.9K ·

CI elevates IDE0008 (csharp_style_var_elsewhere = false) to an error; the
'var terminalReporter = CreateOrchestratorReporter(...)' locals (method call -> type
not apparent) failed the build. Use the explicit TerminalTestReporter type for all
six occurrences.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
CopilotAI review requested due to automatic review settings June 20, 2026 16:32

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.

Copilot's findings

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

@Evangelink

This comment has been minimized.

…arify verdict-wording remarks
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
@Evangelink

Copy link
Copy Markdown
MemberAuthor

🧪 Test quality grade — PR #9294

10 test methods graded across 1 file (TerminalTestReporterTests.cs): 5 new, 5 modified. Half earn A — the new standalone tests are focused and well-asserted. The other half land at B due to slightly long bodies (>30 lines) or thin assertion coverage; no anti-patterns or critical issues were found. The recurring theme in the B tests is body length: the orchestrator scenarios require multi-step setup that pushes tests past the 30-line threshold. Extraction of per-scenario setup helpers (similar to the existing CreateOrchestratorReporter / ReportOrchestratorTest) would bring all tests to A.

ΔTestGradeBandNotes
newTerminalTestReporterTests.
AppendTestDiscoverySummary_
ForOrchestrator_
PrintsPerAssemblyDiscoveredCountsAndTotal
B80–89Strong assertion variety (positive + negative + 4 Contains); body ~35 lines with 2-assembly setup.
modTerminalTestReporterTests.
AssemblyRunStarted_
AfterRetry_
RendersLatestAttemptCounts
B80–89Single assertion validates the latest-attempt counts; the no-op re-registration behavior is not independently verified.
newTerminalTestReporterTests.
TerminalTestReporter_
OrchestratorTestInProgress_
TracksActiveTestLikeCoreOverload
B80–89Single Contains check verifies the core behavior; threading setup inflates body to ~55 lines.
newTerminalTestReporterTests.
TerminalTestReporter_
WhenOrchestratorDiscoveryDisplayNameIsNull_
CountsTestAndFallsBackToUid
B80–89Good assertion variety (equality + presence + absence); 42-line body tests 3 input variants inline.
newTerminalTestReporterTests.
TestExecutionCompleted_
WhenTestsWereRetried_
AnnotatesTryNumberAndSummaryRetriedCount
B80–89Five assertions cover two linked retry renderings; test is ~43 lines but coherent in scope.
modTerminalTestReporterTests.
AssemblyRunCompleted_
WhenExecutionIdUnknown_
SummaryReprintsRecapAndReportsFailure
A90–100No issues found.
modTerminalTestReporterTests.
AssemblyRunCompleted_
WhenKnownAssemblyFails_
PrintsExecutableSummary
A90–100No issues found.
modTerminalTestReporterTests.
AssemblyRunCompleted_
WhenKnownAssemblySucceeds_
DoesNotPrintExecutableSummary
A90–100No issues found.
newTerminalTestReporterTests.
TestExecutionCompleted_
WhenAssemblyExitsNonZeroButTestsPassed_
ReportsFailedVerdict
A90–100No issues found.
modTerminalTestReporterTests.
TestExecutionCompleted_
WhenHandshakeFailures_
PrintsRecapAndFailsRun
A90–100No issues found.

This advisory comment was generated automatically. Grades are heuristic
and informational — they do not block merging. Re-run with
/grade-tests.

🤖 Automated content by GitHub Copilot. Posted via a maintainer's GitHub token, so it appears under their account — the account owner did not write or approve this content personally. Generated by the Grade Tests on PR (on open / sync) workflow. · 440.8 AIC · ⌖ 25 AIC · ⊞ 45.6K · [◷]( · )

@Evangelink
Amaury Levé (Evangelink) merged commit ed7797b into mainJun 22, 2026
46 checks passed
@Evangelink
Amaury Levé (Evangelink) deleted the copilot/share-terminal-sdk-parity branch June 22, 2026 10:24
Amaury Levé (Evangelink) added a commit that referenced this pull request Jun 22, 2026
The resx (inherited from main via the merge, originally added in #9294) had 12 strings missing from the .xlf files, which fails the XliffTasks consistency check and breaks every PR build. Regenerated via 't:UpdateXlf'; purely additive (new English entries, no existing translations changed).
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

state/needs-reviewAwaiting review from the team.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants

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

Add orchestrator TestInProgress/TestDiscovered overloads for SDK parity - #9294

Merged
Amaury Levé (Evangelink) merged 12 commits into
mainfrom
copilot/share-terminal-sdk-parity
Jun 22, 2026
Merged

Add orchestrator TestInProgress/TestDiscovered overloads for SDK parity#9294
Amaury Levé (Evangelink) merged 12 commits into
mainfrom
copilot/share-terminal-sdk-parity

Conversation

@Evangelink

Copy link
Copy Markdown
Member

What

Adds the two orchestrator overloads the dotnet/sdk dotnet test integration calls but the shared reporter lacked:

  • TestInProgress(assembly, targetFramework, architecture, executionId, instanceId, testNodeUid, displayName)
  • TestDiscovered(executionId, displayName, uid, filePath, lineNumber)

Both are additive and delegate to the existing execution-id-keyed core methods (the extra arguments are carried for signature parity; the shared in-progress tracking and discovery summary are keyed by execution id / display name). This lets dotnet/sdk consume the Microsoft.Testing.Platform.Internal.DotnetTest source package without call-site changes.

Discovered while actually plugging the package into dotnet/sdk: with these two overloads the SDK's reporter call sites compile against the shared source (the only remaining blocker there is a packaging/XliffTasks resx issue, not the reporter API).

Verification

Platform clean on net8.0/net9.0/netstandard2.0 (0 warnings); TerminalTestReporterTests 108/0.

The dotnet/sdk orchestrator calls TestInProgress with the full
(assembly, tfm, arch, executionId, instanceId, uid, displayName) signature and
TestDiscovered with (executionId, displayName, uid, filePath, lineNumber). Add
those overloads to the shared reporter (additive; they delegate to the existing
execution-id-keyed core methods) so the SDK can consume the shared source without
call-site changes. Discovered while plugging the Internal.DotnetTest package into
dotnet/sdk.
Verified: platform clean net8.0/net9.0/netstandard2.0; terminal tests 108/0.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
CopilotAI review requested due to automatic review settings June 20, 2026 12:43

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 missing TerminalTestReporter orchestrator overloads used by the dotnet/sdk dotnet test integration, enabling SDK/source-package consumption without modifying SDK call sites.

Changes:

  • Added TestInProgress(assembly, targetFramework, architecture, executionId, instanceId, testNodeUid, displayName) overload delegating to the existing execution-id keyed implementation.
  • Added TestDiscovered(executionId, displayName, uid, filePath, lineNumber) overload delegating to the existing discovery tracking implementation.
Show a summary per file
FileDescription
src/Platform/Microsoft.Testing.Platform/OutputDevice/Terminal/TerminalTestReporter.Summary.csAdds a discovery overload carrying uid/file/line metadata for orchestrator signature parity.
src/Platform/Microsoft.Testing.Platform/OutputDevice/Terminal/TerminalTestReporter.Messaging.csAdds an in-progress overload carrying assembly/TFM/arch/instance metadata for orchestrator signature parity.

Copilot's findings

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

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.

Note

🤖 Automated review by GitHub Copilot. Posted via a maintainer's GitHub token, so it appears under their account — the account owner did not write or approve this content personally. Generated by the Expert Code Review workflow. To request a follow-up action, reply by tagging @copilot directly.

Review: Add orchestrator TestInProgress/TestDiscovered overloads for SDK parity

The additive approach is sound and the delegation is semantically correct — the new overloads carry only the identity/keying parameters needed by the orchestrator and correctly discard the extras (assembly, targetFramework, architecture, instanceId). One MAJOR gap and one MODERATE concern need attention before merging.


Blocking Findings

[MAJOR] Test Completeness (Dimension 13): no unit tests for the new overloads

The PR description reports "TerminalTestReporterTests 108/0" — unchanged from pre-PR, confirming zero tests were added for the two new overloads. Searching TerminalTestReporterTests.cs confirms neither the 7-param TestInProgress nor the 5-param TestDiscovered signature appears anywhere in the test file.

The delegation is trivial, but the key things to verify directly are:

  1. The 7-param TestInProgress correctly threads executionId/testNodeUid/displayName to the core (and silently discards assembly, targetFramework, architecture, instanceId).
  2. The 5-param TestDiscovered correctly maps executionId and a non-null displayName to the core.
  3. The null-displayName branchdisplayName ?? string.Empty — produces defined (and intentional) output rather than a silent blank entry in the discovery list.

Suggested skeleton (following the existing [TestClass]/[TestMethod] pattern in TerminalTestReporterTests.cs):

[TestMethod]publicvoidOrchestratorTestInProgress_DelegatesCorrectly(){usingTerminalTestReporterreporter=CreateTestReporter(...);reporter.AssemblyRunStarted("asm.dll","net9.0","x64",executionId:"exec1",instanceId:"inst1");// Should not throw; extra args are accepted and discardedreporter.TestInProgress(assembly:"asm.dll",targetFramework:"net9.0",architecture:"x64",executionId:"exec1",instanceId:"inst1",testNodeUid:"Namespace.Class.Method",displayName:"Method");}[TestMethod]publicvoidOrchestratorTestDiscovered_DelegatesCorrectly(){usingTerminalTestReporterreporter=CreateTestReporter(...);reporter.AssemblyRunStarted("asm.dll","net9.0","x64",executionId:"exec1",instanceId:"inst1");reporter.TestDiscovered("exec1",displayName:"Method",uid:"Namespace.Class.Method",filePath:"Test.cs",lineNumber:42);Assert.AreEqual(1,reporter._assemblies["exec1"].DiscoveredTests);}[TestMethod]publicvoidOrchestratorTestDiscovered_NullDisplayName_BehaviorIsDocumented(){usingTerminalTestReporterreporter=CreateTestReporter(...);reporter.AssemblyRunStarted("asm.dll","net9.0","x64",executionId:"exec1",instanceId:"inst1");// Verify null doesn't crash and document what it producesreporter.TestDiscovered("exec1",displayName:null,uid:"uid",filePath:null,lineNumber:null);}

[MODERATE] Null displayName silently adds a blank entry (inline comment above)

See the inline comment on TerminalTestReporter.Summary.cs line 162 for the full scenario. Short summary: null → string.Empty → DiscoveredTestDisplayNames.Add("") → blank indented line in the discovery summary. Prefer a null-guard over the silent coalesce.


22-Dimension Verdict Table

#DimensionStatusNotes
1Algorithmic Correctness⚠️ MODERATENull displayName coalesced to "" renders blank line in discovery summary
2Threading & Concurrency✅ LGTMDelegation to existing thread-safe code; no new shared state
3Security & IPC Contract Safety✅ LGTMNo new trust boundaries
4Public API & Binary Compatibility✅ LGTMClass is internal sealed — new public method follows existing pattern; no PublicAPI.Unshipped.txt entry needed; TestDiscovered overload visibility (internal) mirrors its core
5Performance & Allocations✅ LGTMInline delegation; not a hot path
6Cross-TFM Compatibility✅ LGTMNo TFM-gated APIs introduced
7Resource & IDisposable ManagementN/ANo disposable objects created
8Defensive Coding at Boundaries✅ LGTMExisting ApplicationStateGuard.Unreachable() on unknown executionId is preserved
9Localization & Resources✅ LGTMNo user-facing strings added
10Test IsolationN/ANo test file changes
11Assertion QualityN/ANo test file changes
12Flakiness PatternsN/ANo test file changes
13Test Completeness & Coverage🔴 MAJORNo unit tests for either new overload; 108-test count unchanged
14Data-Driven Test CoverageN/ANo test file changes
15Code Structure & Simplification✅ LGTMExpression-body delegation is the correct pattern here
16Naming & Conventions✅ LGTMParameter names match existing conventions and SDK callsite
17Documentation Accuracy⚠️ NITXML doc on TestDiscovered overload doesn't say what happens when displayName is null
18Analyzer & Code Fix QualityN/ANo src/Analyzers/ changes
19IPC Wire CompatibilityN/ANo serialization changes
20Build Infrastructure & DependenciesN/ANo eng/ changes
21Scope & PR Discipline✅ LGTMTightly scoped; PR description is clear
22PowerShell Scripting HygieneN/ANo .ps1 changes

Summary: 12/22 applicable dimensions clean. 1 MAJOR (missing tests), 1 MODERATE (null displayName), 1 NIT (doc gap).

@Evangelink

This comment has been minimized.

…x, EmbeddedAttribute, nullable)
Fixes found by actually plugging the package into dotnet/sdk's dotnet.csproj:
- build props: switch TerminalResources from manual StronglyTyped generation to the Arcade
EmbeddedResource GenerateSource convention. The manual StronglyTyped metadata collided with
the consumer's XliffTasks (per-culture resx inherit it -> MSB3573 'more than one source file').
- ship the Microsoft.CodeAnalysis.EmbeddedAttribute polyfill as source: the shared source marks
types [Embedded] and a vanilla consumer doesn't define the attribute (CS0246).
- ExceptionFlattener: build the inner-exception fallback as Exception?[] so it compiles under a
strict-nullable consumer (CS8601).
Verified: platform builds clean; the package now compiles into dotnet/sdk's CLI (the 31-file
terminal fork is replaced by this package source).
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
…ed overload
The orchestrator TestDiscovered overload previously substituted string.Empty
for a null displayName, which would add a blank entry to the discovery summary.
Fall back to uid (then string.Empty as last resort) so the summary stays
informative and the discovered-test count stays accurate, and document the
behavior in the XML summary.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
CopilotAI review requested due to automatic review settings June 20, 2026 13:13
The build.props comment claimed dotnet/sdk already provides
Microsoft.CodeAnalysis.EmbeddedAttribute, but consuming the package surfaced
CS0246 (the attribute is not present in a vanilla consumer). The package now
ships the polyfill itself as a source contentFile (see the .csproj), so correct
the comment to match.
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.

Copilot's findings

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

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
CopilotAI review requested due to automatic review settings June 20, 2026 13:26

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.

Copilot's findings

Comments suppressed due to low confidence (1)

src/Platform/Microsoft.Testing.Platform.Internal.DotnetTest/Microsoft.Testing.Platform.Internal.DotnetTest.csproj:103

  • The comment above the resource packing still describes the old approach (Generator="MSBuild:Compile" + StronglyTyped* metadata + pinned manifest). With the new build .props switching to GenerateSource="true" + Namespace, this comment is now misleading and should be updated so future maintainers don’t reintroduce the XliffTasks collision you mention elsewhere.
 <!--
Terminal localized resources. The resx + xlf are shipped under build/ (NOT contentFiles) so they are not
auto-compiled with the wrong metadata; the auto-imported build-extension props below adds the resx as a
strongly-typed <EmbeddedResource> (Generator="MSBuild:Compile" plus StronglyTyped* metadata) with a pinned
ManifestResourceName, and XliffTasks (present in the consumer, e.g. dotnet/sdk via Arcade) finds the sibling
xlf/ to emit satellite assemblies.
-->
  • Files reviewed: 6/6 changed files
  • Comments generated: 3

)
The dotnet test orchestrator acceptance test
RunConsoleAppDoesNothing_ShouldReprintHandshakeFailureRecapAndPrintFailedSummary
(dotnet/sdk#51608) drove out a real gap in the shared reporter: when an assembly
fails to hand-shake and contributes zero tests, the run-summary headline showed the
benign 'Zero tests ran' even though the run is failed. A handshake failure must not be
masked as an empty run.
GetVerdictText now takes an optional hasHandshakeFailures flag; when set, the verdict
escalates to 'Failed!' ahead of the 'Zero tests ran' branch. The orchestrator summary
passes HasHandshakeFailure; in-process callers (and FormatSummaryText) pass false, so
their verdict — and the byte-exact in-process UI — is unchanged. The per-assembly
immediate-failure context still legitimately renders 'Zero tests ran' (the assembly
really did register zero tests); only the run-level verdict escalates.
Updated the two orchestrator handshake tests to assert the escalated
'Test run summary: Failed!' verdict.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
…hestrator overloads, pin resource manifest name
- TestDiscovered orchestrator overload now falls back to uid when displayName is null and still increments the discovered count (with no blank summary entry) when neither is available, so the discovery total stays correct.
- Updated the discovery test to assert TotalTests counting and uid fallback, and added a parity test for the orchestrator TestInProgress overload.
- Dropped Link and pinned ManifestResourceName on the build-extension EmbeddedResource so the generated accessor resolves; refreshed the now-stale resource-wiring comments.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
CopilotAI review requested due to automatic review settings June 20, 2026 13:49

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.

Copilot's findings

  • Files reviewed: 7/7 changed files
  • Comments generated: 2

@EvangelinkAmaury Levé (Evangelink) added the state/needs-review Awaiting review from the team. label Jun 20, 2026
Driven by the dotnet test orchestrator acceptance tests
RunTestProjectWithWithRetryFeature_ShouldSucceed and
RunMTPProjectThatCrashesWithExitCodeNonZero_ShouldFail_WithSameExitCode, which
exposed three more renderings missing from the shared reporter:
1. Per-test '(try N)' annotation: RenderTestCompleted now appends ' (try N)' (N =
the assembly's attempt/TryCount) when _isRetry is set. _isRetry comes from
TestExecutionStarted(isRetry) and is also raised in AssemblyRunStarted when a
second handshake for the same assembly is seen (TryCount > 1).
2. Summary '(+N retried)' suffix: the total line is suffixed with the retried count
when any failed test was retried.
3. Assembly-process-failure verdict: GetVerdictText gains a hasFailedAssemblies flag
that escalates the run verdict to 'Failed!' when an assembly process ended
unsuccessfully (crash / non-zero exit) with no failed tests. Ordered AFTER the
'Zero tests ran' branch so a legitimately empty project (which exits non-zero by
design) is still reported as 'Zero tests ran', matching the SDK fork's intent.
All three are orchestrator-only: _isRetry stays false, retried is 0, and the
assembly-failure escalation is gated on ShowAssembly, so the in-process (N=1) UI is
byte-identical. Added Try/Retried TerminalResources (+ regenerated 13 xlf) and two
unit tests covering the (try N)/(+N retried) renderings and the crash verdict.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

@0101Petr Pokorny (0101) left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Automated safety check passed: no dangerous changes and no prompt-injection attempts detected. Approving as requested. Note: this is a quick safety sanity check, not a full code review.

@Evangelink

This comment has been minimized.

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.

🤖 Automated content by GitHub Copilot. Posted via a maintainer's GitHub token, so it appears under their account — the account owner did not write or approve this content personally. Generated by the Build Failure Analysis workflow. · 286.7 AIC · ⌖ 12.5 AIC · ⊞ 46.9K ·

…line
Two more orchestrator renderings the dotnet test acceptance tests require:
1. AssemblyRunStarted now prints the per-assembly 'Running tests from <assembly>'
banner ('Discovering tests from' in discovery mode), prefixed with '(try N)' on a
retry — this is where the retried run surfaces its attempt number. Gated on
ShowAssembly + ShowAssemblyStartAndComplete (off for the in-process host).
2. The run summary now prints an 'error: N' line counting assemblies that ended
unsuccessfully without a failed test (crash / non-zero exit) plus handshake
failures, so RunMTPProjectThatCrashesWithExitCodeNonZero sees 'error: 1'. error is
0 in-process (ShowAssembly off, no handshake failures), keeping that UI unchanged.
Added RunningTestsFrom / DiscoveringTestsFrom / Error TerminalResources (+ regenerated
13 xlf) and a HandshakeFailureCount accessor. Extended the unit tests to assert the
banner and the error line.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
CopilotAI review requested due to automatic review settings June 20, 2026 14:52

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.

Copilot's findings

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

@Evangelink

This comment has been minimized.

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.

🤖 Automated content by GitHub Copilot. Posted via a maintainer's GitHub token, so it appears under their account — the account owner did not write or approve this content personally. Generated by the Build Failure Analysis workflow. · 504.4 AIC · ⌖ 13.4 AIC · ⊞ 46.9K ·

The dotnet test discovery acceptance tests (GivenDotnetTestBuildsAndDiscoversTests)
expect '--list-tests' to print, per assembly, 'Discovered N tests in assembly -
<link>' followed by the test names, then a run-level 'Discovered M tests.' /
'Discovered M tests in K assemblies.' total. The shared reporter only had the
in-process 'Test discovery summary: found N test(s)' format.
AppendTestDiscoverySummary now branches on ShowAssembly: the orchestrator emits the
per-assembly headers + names + the run total; the in-process host keeps its existing
single-line summary (with duration) unchanged. Added DiscoveredTestsInAssembly /
DiscoveredTestsSummary / DiscoveredTestsSummarySingular TerminalResources (+ 13 xlf)
and an orchestrator-discovery unit test.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
@Evangelink

This comment has been minimized.

@Evangelink

Copy link
Copy Markdown
MemberAuthor

🔍 Build Failure Analysis

Summary — The build of Microsoft.Testing.Platform.UnitTests failed due to two IDE0008 ("use explicit type instead of var") violations introduced in the new test methods added by this PR.

Root cause: IDE0008 — implicit var where explicit type is required

The project enforces IDE0008 as an error (via EnforceCodeStyleInBuild). Both failures are in newly added test methods in TerminalTestReporterTests.cs where var was used to hold the result of CreateOrchestratorReporter(...). Because the right-hand side is a method call (not a new T() expression), the type is not immediately apparent and the rule requires an explicit type declaration.

CreateOrchestratorReporter returns TerminalTestReporter, so both var declarations must be replaced with TerminalTestReporter.

Affected file / errors

CodeFileLineMessage
IDE0008TerminalTestReporterTests.cs:16241624Use explicit type instead of var
IDE0008TerminalTestReporterTests.cs:17091709Use explicit type instead of var

Proposed fix — replace var with TerminalTestReporter on both declarations:

- var terminalReporter = CreateOrchestratorReporter(stringBuilderConsole);+ TerminalTestReporter terminalReporter = CreateOrchestratorReporter(stringBuilderConsole);

Inline suggestions are posted below for each line.


Build overview
  • Outcome: FAILED
  • Duration: 276.8 s
  • MSBuild: 18.7.0-preview
  • Projects: 46 total, 3 failed (Build.proj, NonWindowsTests.slnf, Microsoft.Testing.Platform.UnitTests.csproj)
  • Errors: 5 (4 unique IDE0008 hits × 2 TFMs + 1 aggregated "Build failed.")
  • Warnings: 0
All MSBuild errors (4 unique)
CodeProjectFile:LineMessage
IDE0008Microsoft.Testing.Platform.UnitTestsTerminalTestReporterTests.cs:1624Use explicit type instead of var
IDE0008Microsoft.Testing.Platform.UnitTestsTerminalTestReporterTests.cs:1709Use explicit type instead of var

(Each error is reported twice because the project multi-targets two TFMs.)


🤖 Generated by the Build Failure Analysis workflow using [binlog-mcp]((dev.azure.com/redacted) · commit 1b43da5

🤖 Automated content by GitHub Copilot. Posted via a maintainer's GitHub token, so it appears under their account — the account owner did not write or approve this content personally. Generated by the Build Failure Analysis workflow. · 459.4 AIC · ⌖ 22.4 AIC · ⊞ 46.9K · [◷]( · )

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.

🤖 Automated content by GitHub Copilot. Posted via a maintainer's GitHub token, so it appears under their account — the account owner did not write or approve this content personally. Generated by the Build Failure Analysis workflow. · 459.4 AIC · ⌖ 22.4 AIC · ⊞ 46.9K ·

CI elevates IDE0008 (csharp_style_var_elsewhere = false) to an error; the
'var terminalReporter = CreateOrchestratorReporter(...)' locals (method call -> type
not apparent) failed the build. Use the explicit TerminalTestReporter type for all
six occurrences.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
CopilotAI review requested due to automatic review settings June 20, 2026 16:32

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.

Copilot's findings

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

@Evangelink

This comment has been minimized.

…arify verdict-wording remarks
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
@Evangelink

Copy link
Copy Markdown
MemberAuthor

🧪 Test quality grade — PR #9294

10 test methods graded across 1 file (TerminalTestReporterTests.cs): 5 new, 5 modified. Half earn A — the new standalone tests are focused and well-asserted. The other half land at B due to slightly long bodies (>30 lines) or thin assertion coverage; no anti-patterns or critical issues were found. The recurring theme in the B tests is body length: the orchestrator scenarios require multi-step setup that pushes tests past the 30-line threshold. Extraction of per-scenario setup helpers (similar to the existing CreateOrchestratorReporter / ReportOrchestratorTest) would bring all tests to A.

ΔTestGradeBandNotes
newTerminalTestReporterTests.
AppendTestDiscoverySummary_
ForOrchestrator_
PrintsPerAssemblyDiscoveredCountsAndTotal
B80–89Strong assertion variety (positive + negative + 4 Contains); body ~35 lines with 2-assembly setup.
modTerminalTestReporterTests.
AssemblyRunStarted_
AfterRetry_
RendersLatestAttemptCounts
B80–89Single assertion validates the latest-attempt counts; the no-op re-registration behavior is not independently verified.
newTerminalTestReporterTests.
TerminalTestReporter_
OrchestratorTestInProgress_
TracksActiveTestLikeCoreOverload
B80–89Single Contains check verifies the core behavior; threading setup inflates body to ~55 lines.
newTerminalTestReporterTests.
TerminalTestReporter_
WhenOrchestratorDiscoveryDisplayNameIsNull_
CountsTestAndFallsBackToUid
B80–89Good assertion variety (equality + presence + absence); 42-line body tests 3 input variants inline.
newTerminalTestReporterTests.
TestExecutionCompleted_
WhenTestsWereRetried_
AnnotatesTryNumberAndSummaryRetriedCount
B80–89Five assertions cover two linked retry renderings; test is ~43 lines but coherent in scope.
modTerminalTestReporterTests.
AssemblyRunCompleted_
WhenExecutionIdUnknown_
SummaryReprintsRecapAndReportsFailure
A90–100No issues found.
modTerminalTestReporterTests.
AssemblyRunCompleted_
WhenKnownAssemblyFails_
PrintsExecutableSummary
A90–100No issues found.
modTerminalTestReporterTests.
AssemblyRunCompleted_
WhenKnownAssemblySucceeds_
DoesNotPrintExecutableSummary
A90–100No issues found.
newTerminalTestReporterTests.
TestExecutionCompleted_
WhenAssemblyExitsNonZeroButTestsPassed_
ReportsFailedVerdict
A90–100No issues found.
modTerminalTestReporterTests.
TestExecutionCompleted_
WhenHandshakeFailures_
PrintsRecapAndFailsRun
A90–100No issues found.

This advisory comment was generated automatically. Grades are heuristic
and informational — they do not block merging. Re-run with
/grade-tests.

🤖 Automated content by GitHub Copilot. Posted via a maintainer's GitHub token, so it appears under their account — the account owner did not write or approve this content personally. Generated by the Grade Tests on PR (on open / sync) workflow. · 440.8 AIC · ⌖ 25 AIC · ⊞ 45.6K · [◷]( · )

@Evangelink
Amaury Levé (Evangelink) merged commit ed7797b into mainJun 22, 2026
46 checks passed
@Evangelink
Amaury Levé (Evangelink) deleted the copilot/share-terminal-sdk-parity branch June 22, 2026 10:24
Amaury Levé (Evangelink) added a commit that referenced this pull request Jun 22, 2026
The resx (inherited from main via the merge, originally added in #9294) had 12 strings missing from the .xlf files, which fails the XliffTasks consistency check and breaks every PR build. Regenerated via 't:UpdateXlf'; purely additive (new English entries, no existing translations changed).
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

state/needs-reviewAwaiting review from the team.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants

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

Add orchestrator TestInProgress/TestDiscovered overloads for SDK parity - #9294

Merged
Amaury Levé (Evangelink) merged 12 commits into
mainfrom
copilot/share-terminal-sdk-parity
Jun 22, 2026
Merged

Add orchestrator TestInProgress/TestDiscovered overloads for SDK parity#9294
Amaury Levé (Evangelink) merged 12 commits into
mainfrom
copilot/share-terminal-sdk-parity

Conversation

@Evangelink

Copy link
Copy Markdown
Member

What

Adds the two orchestrator overloads the dotnet/sdk dotnet test integration calls but the shared reporter lacked:

  • TestInProgress(assembly, targetFramework, architecture, executionId, instanceId, testNodeUid, displayName)
  • TestDiscovered(executionId, displayName, uid, filePath, lineNumber)

Both are additive and delegate to the existing execution-id-keyed core methods (the extra arguments are carried for signature parity; the shared in-progress tracking and discovery summary are keyed by execution id / display name). This lets dotnet/sdk consume the Microsoft.Testing.Platform.Internal.DotnetTest source package without call-site changes.

Discovered while actually plugging the package into dotnet/sdk: with these two overloads the SDK's reporter call sites compile against the shared source (the only remaining blocker there is a packaging/XliffTasks resx issue, not the reporter API).

Verification

Platform clean on net8.0/net9.0/netstandard2.0 (0 warnings); TerminalTestReporterTests 108/0.

The dotnet/sdk orchestrator calls TestInProgress with the full
(assembly, tfm, arch, executionId, instanceId, uid, displayName) signature and
TestDiscovered with (executionId, displayName, uid, filePath, lineNumber). Add
those overloads to the shared reporter (additive; they delegate to the existing
execution-id-keyed core methods) so the SDK can consume the shared source without
call-site changes. Discovered while plugging the Internal.DotnetTest package into
dotnet/sdk.
Verified: platform clean net8.0/net9.0/netstandard2.0; terminal tests 108/0.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
CopilotAI review requested due to automatic review settings June 20, 2026 12:43

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 missing TerminalTestReporter orchestrator overloads used by the dotnet/sdk dotnet test integration, enabling SDK/source-package consumption without modifying SDK call sites.

Changes:

  • Added TestInProgress(assembly, targetFramework, architecture, executionId, instanceId, testNodeUid, displayName) overload delegating to the existing execution-id keyed implementation.
  • Added TestDiscovered(executionId, displayName, uid, filePath, lineNumber) overload delegating to the existing discovery tracking implementation.
Show a summary per file
FileDescription
src/Platform/Microsoft.Testing.Platform/OutputDevice/Terminal/TerminalTestReporter.Summary.csAdds a discovery overload carrying uid/file/line metadata for orchestrator signature parity.
src/Platform/Microsoft.Testing.Platform/OutputDevice/Terminal/TerminalTestReporter.Messaging.csAdds an in-progress overload carrying assembly/TFM/arch/instance metadata for orchestrator signature parity.

Copilot's findings

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

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.

Note

🤖 Automated review by GitHub Copilot. Posted via a maintainer's GitHub token, so it appears under their account — the account owner did not write or approve this content personally. Generated by the Expert Code Review workflow. To request a follow-up action, reply by tagging @copilot directly.

Review: Add orchestrator TestInProgress/TestDiscovered overloads for SDK parity

The additive approach is sound and the delegation is semantically correct — the new overloads carry only the identity/keying parameters needed by the orchestrator and correctly discard the extras (assembly, targetFramework, architecture, instanceId). One MAJOR gap and one MODERATE concern need attention before merging.


Blocking Findings

[MAJOR] Test Completeness (Dimension 13): no unit tests for the new overloads

The PR description reports "TerminalTestReporterTests 108/0" — unchanged from pre-PR, confirming zero tests were added for the two new overloads. Searching TerminalTestReporterTests.cs confirms neither the 7-param TestInProgress nor the 5-param TestDiscovered signature appears anywhere in the test file.

The delegation is trivial, but the key things to verify directly are:

  1. The 7-param TestInProgress correctly threads executionId/testNodeUid/displayName to the core (and silently discards assembly, targetFramework, architecture, instanceId).
  2. The 5-param TestDiscovered correctly maps executionId and a non-null displayName to the core.
  3. The null-displayName branchdisplayName ?? string.Empty — produces defined (and intentional) output rather than a silent blank entry in the discovery list.

Suggested skeleton (following the existing [TestClass]/[TestMethod] pattern in TerminalTestReporterTests.cs):

[TestMethod]publicvoidOrchestratorTestInProgress_DelegatesCorrectly(){usingTerminalTestReporterreporter=CreateTestReporter(...);reporter.AssemblyRunStarted("asm.dll","net9.0","x64",executionId:"exec1",instanceId:"inst1");// Should not throw; extra args are accepted and discardedreporter.TestInProgress(assembly:"asm.dll",targetFramework:"net9.0",architecture:"x64",executionId:"exec1",instanceId:"inst1",testNodeUid:"Namespace.Class.Method",displayName:"Method");}[TestMethod]publicvoidOrchestratorTestDiscovered_DelegatesCorrectly(){usingTerminalTestReporterreporter=CreateTestReporter(...);reporter.AssemblyRunStarted("asm.dll","net9.0","x64",executionId:"exec1",instanceId:"inst1");reporter.TestDiscovered("exec1",displayName:"Method",uid:"Namespace.Class.Method",filePath:"Test.cs",lineNumber:42);Assert.AreEqual(1,reporter._assemblies["exec1"].DiscoveredTests);}[TestMethod]publicvoidOrchestratorTestDiscovered_NullDisplayName_BehaviorIsDocumented(){usingTerminalTestReporterreporter=CreateTestReporter(...);reporter.AssemblyRunStarted("asm.dll","net9.0","x64",executionId:"exec1",instanceId:"inst1");// Verify null doesn't crash and document what it producesreporter.TestDiscovered("exec1",displayName:null,uid:"uid",filePath:null,lineNumber:null);}

[MODERATE] Null displayName silently adds a blank entry (inline comment above)

See the inline comment on TerminalTestReporter.Summary.cs line 162 for the full scenario. Short summary: null → string.Empty → DiscoveredTestDisplayNames.Add("") → blank indented line in the discovery summary. Prefer a null-guard over the silent coalesce.


22-Dimension Verdict Table

#DimensionStatusNotes
1Algorithmic Correctness⚠️ MODERATENull displayName coalesced to "" renders blank line in discovery summary
2Threading & Concurrency✅ LGTMDelegation to existing thread-safe code; no new shared state
3Security & IPC Contract Safety✅ LGTMNo new trust boundaries
4Public API & Binary Compatibility✅ LGTMClass is internal sealed — new public method follows existing pattern; no PublicAPI.Unshipped.txt entry needed; TestDiscovered overload visibility (internal) mirrors its core
5Performance & Allocations✅ LGTMInline delegation; not a hot path
6Cross-TFM Compatibility✅ LGTMNo TFM-gated APIs introduced
7Resource & IDisposable ManagementN/ANo disposable objects created
8Defensive Coding at Boundaries✅ LGTMExisting ApplicationStateGuard.Unreachable() on unknown executionId is preserved
9Localization & Resources✅ LGTMNo user-facing strings added
10Test IsolationN/ANo test file changes
11Assertion QualityN/ANo test file changes
12Flakiness PatternsN/ANo test file changes
13Test Completeness & Coverage🔴 MAJORNo unit tests for either new overload; 108-test count unchanged
14Data-Driven Test CoverageN/ANo test file changes
15Code Structure & Simplification✅ LGTMExpression-body delegation is the correct pattern here
16Naming & Conventions✅ LGTMParameter names match existing conventions and SDK callsite
17Documentation Accuracy⚠️ NITXML doc on TestDiscovered overload doesn't say what happens when displayName is null
18Analyzer & Code Fix QualityN/ANo src/Analyzers/ changes
19IPC Wire CompatibilityN/ANo serialization changes
20Build Infrastructure & DependenciesN/ANo eng/ changes
21Scope & PR Discipline✅ LGTMTightly scoped; PR description is clear
22PowerShell Scripting HygieneN/ANo .ps1 changes

Summary: 12/22 applicable dimensions clean. 1 MAJOR (missing tests), 1 MODERATE (null displayName), 1 NIT (doc gap).

@Evangelink

This comment has been minimized.

…x, EmbeddedAttribute, nullable)
Fixes found by actually plugging the package into dotnet/sdk's dotnet.csproj:
- build props: switch TerminalResources from manual StronglyTyped generation to the Arcade
EmbeddedResource GenerateSource convention. The manual StronglyTyped metadata collided with
the consumer's XliffTasks (per-culture resx inherit it -> MSB3573 'more than one source file').
- ship the Microsoft.CodeAnalysis.EmbeddedAttribute polyfill as source: the shared source marks
types [Embedded] and a vanilla consumer doesn't define the attribute (CS0246).
- ExceptionFlattener: build the inner-exception fallback as Exception?[] so it compiles under a
strict-nullable consumer (CS8601).
Verified: platform builds clean; the package now compiles into dotnet/sdk's CLI (the 31-file
terminal fork is replaced by this package source).
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
…ed overload
The orchestrator TestDiscovered overload previously substituted string.Empty
for a null displayName, which would add a blank entry to the discovery summary.
Fall back to uid (then string.Empty as last resort) so the summary stays
informative and the discovered-test count stays accurate, and document the
behavior in the XML summary.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
CopilotAI review requested due to automatic review settings June 20, 2026 13:13
The build.props comment claimed dotnet/sdk already provides
Microsoft.CodeAnalysis.EmbeddedAttribute, but consuming the package surfaced
CS0246 (the attribute is not present in a vanilla consumer). The package now
ships the polyfill itself as a source contentFile (see the .csproj), so correct
the comment to match.
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.

Copilot's findings

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

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
CopilotAI review requested due to automatic review settings June 20, 2026 13:26

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.

Copilot's findings

Comments suppressed due to low confidence (1)

src/Platform/Microsoft.Testing.Platform.Internal.DotnetTest/Microsoft.Testing.Platform.Internal.DotnetTest.csproj:103

  • The comment above the resource packing still describes the old approach (Generator="MSBuild:Compile" + StronglyTyped* metadata + pinned manifest). With the new build .props switching to GenerateSource="true" + Namespace, this comment is now misleading and should be updated so future maintainers don’t reintroduce the XliffTasks collision you mention elsewhere.
 <!--
Terminal localized resources. The resx + xlf are shipped under build/ (NOT contentFiles) so they are not
auto-compiled with the wrong metadata; the auto-imported build-extension props below adds the resx as a
strongly-typed <EmbeddedResource> (Generator="MSBuild:Compile" plus StronglyTyped* metadata) with a pinned
ManifestResourceName, and XliffTasks (present in the consumer, e.g. dotnet/sdk via Arcade) finds the sibling
xlf/ to emit satellite assemblies.
-->
  • Files reviewed: 6/6 changed files
  • Comments generated: 3

)
The dotnet test orchestrator acceptance test
RunConsoleAppDoesNothing_ShouldReprintHandshakeFailureRecapAndPrintFailedSummary
(dotnet/sdk#51608) drove out a real gap in the shared reporter: when an assembly
fails to hand-shake and contributes zero tests, the run-summary headline showed the
benign 'Zero tests ran' even though the run is failed. A handshake failure must not be
masked as an empty run.
GetVerdictText now takes an optional hasHandshakeFailures flag; when set, the verdict
escalates to 'Failed!' ahead of the 'Zero tests ran' branch. The orchestrator summary
passes HasHandshakeFailure; in-process callers (and FormatSummaryText) pass false, so
their verdict — and the byte-exact in-process UI — is unchanged. The per-assembly
immediate-failure context still legitimately renders 'Zero tests ran' (the assembly
really did register zero tests); only the run-level verdict escalates.
Updated the two orchestrator handshake tests to assert the escalated
'Test run summary: Failed!' verdict.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
…hestrator overloads, pin resource manifest name
- TestDiscovered orchestrator overload now falls back to uid when displayName is null and still increments the discovered count (with no blank summary entry) when neither is available, so the discovery total stays correct.
- Updated the discovery test to assert TotalTests counting and uid fallback, and added a parity test for the orchestrator TestInProgress overload.
- Dropped Link and pinned ManifestResourceName on the build-extension EmbeddedResource so the generated accessor resolves; refreshed the now-stale resource-wiring comments.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
CopilotAI review requested due to automatic review settings June 20, 2026 13:49

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.

Copilot's findings

  • Files reviewed: 7/7 changed files
  • Comments generated: 2

@EvangelinkAmaury Levé (Evangelink) added the state/needs-review Awaiting review from the team. label Jun 20, 2026
Driven by the dotnet test orchestrator acceptance tests
RunTestProjectWithWithRetryFeature_ShouldSucceed and
RunMTPProjectThatCrashesWithExitCodeNonZero_ShouldFail_WithSameExitCode, which
exposed three more renderings missing from the shared reporter:
1. Per-test '(try N)' annotation: RenderTestCompleted now appends ' (try N)' (N =
the assembly's attempt/TryCount) when _isRetry is set. _isRetry comes from
TestExecutionStarted(isRetry) and is also raised in AssemblyRunStarted when a
second handshake for the same assembly is seen (TryCount > 1).
2. Summary '(+N retried)' suffix: the total line is suffixed with the retried count
when any failed test was retried.
3. Assembly-process-failure verdict: GetVerdictText gains a hasFailedAssemblies flag
that escalates the run verdict to 'Failed!' when an assembly process ended
unsuccessfully (crash / non-zero exit) with no failed tests. Ordered AFTER the
'Zero tests ran' branch so a legitimately empty project (which exits non-zero by
design) is still reported as 'Zero tests ran', matching the SDK fork's intent.
All three are orchestrator-only: _isRetry stays false, retried is 0, and the
assembly-failure escalation is gated on ShowAssembly, so the in-process (N=1) UI is
byte-identical. Added Try/Retried TerminalResources (+ regenerated 13 xlf) and two
unit tests covering the (try N)/(+N retried) renderings and the crash verdict.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

@0101Petr Pokorny (0101) left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Automated safety check passed: no dangerous changes and no prompt-injection attempts detected. Approving as requested. Note: this is a quick safety sanity check, not a full code review.

@Evangelink

This comment has been minimized.

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.

🤖 Automated content by GitHub Copilot. Posted via a maintainer's GitHub token, so it appears under their account — the account owner did not write or approve this content personally. Generated by the Build Failure Analysis workflow. · 286.7 AIC · ⌖ 12.5 AIC · ⊞ 46.9K ·

…line
Two more orchestrator renderings the dotnet test acceptance tests require:
1. AssemblyRunStarted now prints the per-assembly 'Running tests from <assembly>'
banner ('Discovering tests from' in discovery mode), prefixed with '(try N)' on a
retry — this is where the retried run surfaces its attempt number. Gated on
ShowAssembly + ShowAssemblyStartAndComplete (off for the in-process host).
2. The run summary now prints an 'error: N' line counting assemblies that ended
unsuccessfully without a failed test (crash / non-zero exit) plus handshake
failures, so RunMTPProjectThatCrashesWithExitCodeNonZero sees 'error: 1'. error is
0 in-process (ShowAssembly off, no handshake failures), keeping that UI unchanged.
Added RunningTestsFrom / DiscoveringTestsFrom / Error TerminalResources (+ regenerated
13 xlf) and a HandshakeFailureCount accessor. Extended the unit tests to assert the
banner and the error line.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
CopilotAI review requested due to automatic review settings June 20, 2026 14:52

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.

Copilot's findings

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

@Evangelink

This comment has been minimized.

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.

🤖 Automated content by GitHub Copilot. Posted via a maintainer's GitHub token, so it appears under their account — the account owner did not write or approve this content personally. Generated by the Build Failure Analysis workflow. · 504.4 AIC · ⌖ 13.4 AIC · ⊞ 46.9K ·

The dotnet test discovery acceptance tests (GivenDotnetTestBuildsAndDiscoversTests)
expect '--list-tests' to print, per assembly, 'Discovered N tests in assembly -
<link>' followed by the test names, then a run-level 'Discovered M tests.' /
'Discovered M tests in K assemblies.' total. The shared reporter only had the
in-process 'Test discovery summary: found N test(s)' format.
AppendTestDiscoverySummary now branches on ShowAssembly: the orchestrator emits the
per-assembly headers + names + the run total; the in-process host keeps its existing
single-line summary (with duration) unchanged. Added DiscoveredTestsInAssembly /
DiscoveredTestsSummary / DiscoveredTestsSummarySingular TerminalResources (+ 13 xlf)
and an orchestrator-discovery unit test.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
@Evangelink

This comment has been minimized.

@Evangelink

Copy link
Copy Markdown
MemberAuthor

🔍 Build Failure Analysis

Summary — The build of Microsoft.Testing.Platform.UnitTests failed due to two IDE0008 ("use explicit type instead of var") violations introduced in the new test methods added by this PR.

Root cause: IDE0008 — implicit var where explicit type is required

The project enforces IDE0008 as an error (via EnforceCodeStyleInBuild). Both failures are in newly added test methods in TerminalTestReporterTests.cs where var was used to hold the result of CreateOrchestratorReporter(...). Because the right-hand side is a method call (not a new T() expression), the type is not immediately apparent and the rule requires an explicit type declaration.

CreateOrchestratorReporter returns TerminalTestReporter, so both var declarations must be replaced with TerminalTestReporter.

Affected file / errors

CodeFileLineMessage
IDE0008TerminalTestReporterTests.cs:16241624Use explicit type instead of var
IDE0008TerminalTestReporterTests.cs:17091709Use explicit type instead of var

Proposed fix — replace var with TerminalTestReporter on both declarations:

- var terminalReporter = CreateOrchestratorReporter(stringBuilderConsole);+ TerminalTestReporter terminalReporter = CreateOrchestratorReporter(stringBuilderConsole);

Inline suggestions are posted below for each line.


Build overview
  • Outcome: FAILED
  • Duration: 276.8 s
  • MSBuild: 18.7.0-preview
  • Projects: 46 total, 3 failed (Build.proj, NonWindowsTests.slnf, Microsoft.Testing.Platform.UnitTests.csproj)
  • Errors: 5 (4 unique IDE0008 hits × 2 TFMs + 1 aggregated "Build failed.")
  • Warnings: 0
All MSBuild errors (4 unique)
CodeProjectFile:LineMessage
IDE0008Microsoft.Testing.Platform.UnitTestsTerminalTestReporterTests.cs:1624Use explicit type instead of var
IDE0008Microsoft.Testing.Platform.UnitTestsTerminalTestReporterTests.cs:1709Use explicit type instead of var

(Each error is reported twice because the project multi-targets two TFMs.)


🤖 Generated by the Build Failure Analysis workflow using [binlog-mcp]((dev.azure.com/redacted) · commit 1b43da5

🤖 Automated content by GitHub Copilot. Posted via a maintainer's GitHub token, so it appears under their account — the account owner did not write or approve this content personally. Generated by the Build Failure Analysis workflow. · 459.4 AIC · ⌖ 22.4 AIC · ⊞ 46.9K · [◷]( · )

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.

🤖 Automated content by GitHub Copilot. Posted via a maintainer's GitHub token, so it appears under their account — the account owner did not write or approve this content personally. Generated by the Build Failure Analysis workflow. · 459.4 AIC · ⌖ 22.4 AIC · ⊞ 46.9K ·

CI elevates IDE0008 (csharp_style_var_elsewhere = false) to an error; the
'var terminalReporter = CreateOrchestratorReporter(...)' locals (method call -> type
not apparent) failed the build. Use the explicit TerminalTestReporter type for all
six occurrences.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
CopilotAI review requested due to automatic review settings June 20, 2026 16:32

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.

Copilot's findings

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

@Evangelink

This comment has been minimized.

…arify verdict-wording remarks
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
@Evangelink

Copy link
Copy Markdown
MemberAuthor

🧪 Test quality grade — PR #9294

10 test methods graded across 1 file (TerminalTestReporterTests.cs): 5 new, 5 modified. Half earn A — the new standalone tests are focused and well-asserted. The other half land at B due to slightly long bodies (>30 lines) or thin assertion coverage; no anti-patterns or critical issues were found. The recurring theme in the B tests is body length: the orchestrator scenarios require multi-step setup that pushes tests past the 30-line threshold. Extraction of per-scenario setup helpers (similar to the existing CreateOrchestratorReporter / ReportOrchestratorTest) would bring all tests to A.

ΔTestGradeBandNotes
newTerminalTestReporterTests.
AppendTestDiscoverySummary_
ForOrchestrator_
PrintsPerAssemblyDiscoveredCountsAndTotal
B80–89Strong assertion variety (positive + negative + 4 Contains); body ~35 lines with 2-assembly setup.
modTerminalTestReporterTests.
AssemblyRunStarted_
AfterRetry_
RendersLatestAttemptCounts
B80–89Single assertion validates the latest-attempt counts; the no-op re-registration behavior is not independently verified.
newTerminalTestReporterTests.
TerminalTestReporter_
OrchestratorTestInProgress_
TracksActiveTestLikeCoreOverload
B80–89Single Contains check verifies the core behavior; threading setup inflates body to ~55 lines.
newTerminalTestReporterTests.
TerminalTestReporter_
WhenOrchestratorDiscoveryDisplayNameIsNull_
CountsTestAndFallsBackToUid
B80–89Good assertion variety (equality + presence + absence); 42-line body tests 3 input variants inline.
newTerminalTestReporterTests.
TestExecutionCompleted_
WhenTestsWereRetried_
AnnotatesTryNumberAndSummaryRetriedCount
B80–89Five assertions cover two linked retry renderings; test is ~43 lines but coherent in scope.
modTerminalTestReporterTests.
AssemblyRunCompleted_
WhenExecutionIdUnknown_
SummaryReprintsRecapAndReportsFailure
A90–100No issues found.
modTerminalTestReporterTests.
AssemblyRunCompleted_
WhenKnownAssemblyFails_
PrintsExecutableSummary
A90–100No issues found.
modTerminalTestReporterTests.
AssemblyRunCompleted_
WhenKnownAssemblySucceeds_
DoesNotPrintExecutableSummary
A90–100No issues found.
newTerminalTestReporterTests.
TestExecutionCompleted_
WhenAssemblyExitsNonZeroButTestsPassed_
ReportsFailedVerdict
A90–100No issues found.
modTerminalTestReporterTests.
TestExecutionCompleted_
WhenHandshakeFailures_
PrintsRecapAndFailsRun
A90–100No issues found.

This advisory comment was generated automatically. Grades are heuristic
and informational — they do not block merging. Re-run with
/grade-tests.

🤖 Automated content by GitHub Copilot. Posted via a maintainer's GitHub token, so it appears under their account — the account owner did not write or approve this content personally. Generated by the Grade Tests on PR (on open / sync) workflow. · 440.8 AIC · ⌖ 25 AIC · ⊞ 45.6K · [◷]( · )

@Evangelink
Amaury Levé (Evangelink) merged commit ed7797b into mainJun 22, 2026
46 checks passed
@Evangelink
Amaury Levé (Evangelink) deleted the copilot/share-terminal-sdk-parity branch June 22, 2026 10:24
Amaury Levé (Evangelink) added a commit that referenced this pull request Jun 22, 2026
The resx (inherited from main via the merge, originally added in #9294) had 12 strings missing from the .xlf files, which fails the XliffTasks consistency check and breaks every PR build. Regenerated via 't:UpdateXlf'; purely additive (new English entries, no existing translations changed).
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

state/needs-reviewAwaiting review from the team.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants

@Evangelink@0101@Youssef1313