[Test Improver] Add unit tests for ExtensionValidationHelper.ValidateUniqueExtension - #8128

Merged
Amaury Levé (Evangelink) merged 2 commits into
mainfrom
test-assist/extension-validation-helper-tests-076ac6cd367e54b7
May 11, 2026
Merged

[Test Improver] Add unit tests for ExtensionValidationHelper.ValidateUniqueExtension#8128
Amaury Levé (Evangelink) merged 2 commits into
mainfrom
test-assist/extension-validation-helper-tests-076ac6cd367e54b7

Conversation

@Evangelink

@EvangelinkAmaury Levé (Evangelink) commented May 11, 2026

Copy link
Copy Markdown
Member

<empty>

15 tests covering:
- ArgumentNullException for null existingExtensions, newExtension, extensionSelector
- No throw for empty collection and when no duplicate UIDs exist
- InvalidOperationException when duplicate UID found (generic overload)
- Error message contains the duplicate UID and all involved type names
- Multiple duplicates: all types appear in error message
- Wrapper-type selector (generic overload): selects via Func<T, IExtension>
- Simple IExtension overload: null guards, no-duplicate, and duplicate paths
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
CopilotAI review requested due to automatic review settings May 11, 2026 14:44

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 unit test coverage to ExtensionValidationHelper.ValidateUniqueExtension (a shared guard used to prevent duplicate extension UIDs during extension registration) within Microsoft.Testing.Platform.UnitTests, addressing the gap described in #8003.

Changes:

  • Adds null-guard tests for both the generic overload and the simple IExtension overload.
  • Adds behavioral tests for non-duplicate and duplicate UID scenarios (including multiple-duplicate/type-list message coverage).
  • Adds tests for the generic overload’s selector-based path using a wrapper type.
Show a summary per file
FileDescription
test/UnitTests/Microsoft.Testing.Platform.UnitTests/Helpers/ExtensionValidationHelperTests.csNew MSTest unit tests covering duplicate UID detection and exception/message behavior for both overloads of ValidateUniqueExtension.

Copilot's findings

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

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.

Summary

Workflow: PR Nitpick Reviewer 🔍
Date: 2026-05-11
Repository: microsoft/testfx

Key Findings

  1. [Important] Duplicated fake-extension class bodiesFakeExtension, FakeExtensionA/B/C have identical IExtension implementations; only the class name differs. A shared base class would eliminate the duplication and make future IExtension contract changes a single-site edit.

  2. [Important] Weak type-name assertion in ...ErrorMessageContainsTypeNames — both existing and newExtension are FakeExtension, so the single Assert.Contains(existing.GetType().ToString(), ...) passes even if the new extension's type is absent from the error message. Using distinct types for the two variables would actually exercise the full allDuplicates list the source builds.

  3. [Minor] Mixed collection-creation stylesnew[] { ... } / new IExtension[] { ... } sit alongside collection expressions ([], [a, b]). Prefer collection expressions throughout for consistency.

  4. [Minor] existing.GetType().ToString() vs typeof(T).ToString() — adjacent tests use the static typeof form; this one uses a runtime expression on a variable whose static type is known.

  5. [Minor] Inconsistent duplicate-UID sentinel strings"my-duplicate-uid" (generic overload tests) vs "duplicated" (simple overload). No functional difference, but a consistent string makes related test cases easier to scan together.

Positive Highlights

  • Clear, well-named test methods following MethodUnderTest_Scenario_ExpectedResult convention throughout.
  • Good separation of generic and simple-overload test groups with section comments.
  • Complete coverage of null-guard paths for all three parameters of the generic overload.
  • Nice use of the ExtensionWrapper record to exercise the selector overload — a non-obvious but important test scenario.

Generated by PR Nitpick Reviewer

🔍 Meticulously inspected by PR Nitpick Reviewer 🔍

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.

Summary

Workflow: Test Expert Reviewer 🧪
Date: 2026-05-11
Repository: microsoft/testfx

Key Findings

The tests are well-structured, fully isolated, and cover the happy paths and null-guard contracts for both overloads of ValidateUniqueExtension. No flakiness risks or shared-state issues were found.

Three improvements worth considering:

  1. [Assertion — Weak]_ErrorMessageContainsTypeNames creates both existing and newExtension as the same type (FakeExtension), so the single Assert.Contains(existing.GetType().ToString(), ...) assertion doesn't independently verify the new extension's type in the message. A regression that drops the new type would go undetected.

  2. [Structure — Redundant]_WhenDuplicateUidExists_ThrowsInvalidOperationException is a strict subset of _WhenDuplicateUidExists_ErrorMessageContainsUid, which already asserts the exception type. The first test can be removed.

  3. [Coverage — Missing edge case] No test documents whether UID comparison is case-sensitive. The production code uses == (ordinal, case-sensitive), but this is unverified and undocumented in tests.

Recommendations

  • Strengthen _ErrorMessageContainsTypeNames by using distinct types for existing vs. new extension (similar to _WhenMultipleDuplicatesExist_ErrorMessageContainsAllTypes).
  • Remove the redundant _ThrowsInvalidOperationException test.
  • Add a case-sensitivity test for UID comparison to document the contract.

Generated by Test Expert Reviewer

🧪 Test quality reviewed by Test Expert Reviewer 🧪

@Evangelink

Copy link
Copy Markdown
MemberAuthor

Copilot address review comments

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.

Summary

Workflow: Expert Code Reviewer 🧠
Date: 2026-05-11
Repository: microsoft/testfx

Key Findings

No issues found across all review categories:

  • Correctness: All test assertions are logically correct and match the expected behavior of ExtensionValidationHelper.ValidateUniqueExtension. The Assert.Contains(substring, container) argument order follows the project convention.
  • Threading: Tests are synchronous and self-contained; no shared mutable state.
  • Performance: Test-only code; no hot-path concerns.
  • API Compat: No public API surface changes.
  • Cross-TFM: No TFM-specific APIs used.
  • Resources: No disposable resources involved.
  • Security / IPC: Not applicable to test helpers.
  • Defensive coding: Null guard tests correctly exercise the three ArgumentNullException paths in the implementation.

Positive Observations

  • Tests cover both overloads (generic selector and simple IEnumerable<IExtension>).
  • Error-message content is verified for UID and all involved type names, including the multi-duplicate case.
  • The ExtensionWrapper test correctly exercises the selector indirection path.
  • Assertion style is consistent with the rest of Microsoft.Testing.Platform.UnitTests (MSTest Assert.ThrowsExactly / Assert.Contains; no AwesomeAssertions).

Recommendations

None required.


Generated by Expert Code Reviewer

🧠 Reviewed by Expert Code Reviewer 🧠

Co-authored-by: Evangelink <11340282+Evangelink@users.noreply.github.com>

CopilotAI commented May 11, 2026

Copy link
Copy Markdown
Contributor

Copilot address review comments

Done in 5518819. I addressed the actionable review comments, updated the tests accordingly, and validated with targeted + full Microsoft.Testing.Platform.UnitTests runs and final parallel validation.

CopilotAI changed the title [Test Improver] Add unit tests for ExtensionValidationHelper.ValidateUniqueExtension&lt;empty&gt;May 11, 2026
@EvangelinkAmaury Levé (Evangelink) changed the title &lt;empty&gt;[Test Improver] Add unit tests for ExtensionValidationHelper.ValidateUniqueExtensionMay 11, 2026
@Evangelink
Amaury Levé (Evangelink) merged commit 27e2855 into mainMay 11, 2026
60 checks passed
@Evangelink
Amaury Levé (Evangelink) deleted the test-assist/extension-validation-helper-tests-076ac6cd367e54b7 branch May 11, 2026 16:26
Amaury Levé (Evangelink) added a commit that referenced this pull request May 12, 2026
…UniqueExtension (#8128)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@Evangelink
, '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

[Test Improver] Add unit tests for ExtensionValidationHelper.ValidateUniqueExtension - #8128

Merged
Amaury Levé (Evangelink) merged 2 commits into
mainfrom
test-assist/extension-validation-helper-tests-076ac6cd367e54b7
May 11, 2026
Merged

[Test Improver] Add unit tests for ExtensionValidationHelper.ValidateUniqueExtension#8128
Amaury Levé (Evangelink) merged 2 commits into
mainfrom
test-assist/extension-validation-helper-tests-076ac6cd367e54b7

Conversation

@Evangelink

@EvangelinkAmaury Levé (Evangelink) commented May 11, 2026

Copy link
Copy Markdown
Member

<empty>

15 tests covering:
- ArgumentNullException for null existingExtensions, newExtension, extensionSelector
- No throw for empty collection and when no duplicate UIDs exist
- InvalidOperationException when duplicate UID found (generic overload)
- Error message contains the duplicate UID and all involved type names
- Multiple duplicates: all types appear in error message
- Wrapper-type selector (generic overload): selects via Func<T, IExtension>
- Simple IExtension overload: null guards, no-duplicate, and duplicate paths
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
CopilotAI review requested due to automatic review settings May 11, 2026 14:44

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 unit test coverage to ExtensionValidationHelper.ValidateUniqueExtension (a shared guard used to prevent duplicate extension UIDs during extension registration) within Microsoft.Testing.Platform.UnitTests, addressing the gap described in #8003.

Changes:

  • Adds null-guard tests for both the generic overload and the simple IExtension overload.
  • Adds behavioral tests for non-duplicate and duplicate UID scenarios (including multiple-duplicate/type-list message coverage).
  • Adds tests for the generic overload’s selector-based path using a wrapper type.
Show a summary per file
FileDescription
test/UnitTests/Microsoft.Testing.Platform.UnitTests/Helpers/ExtensionValidationHelperTests.csNew MSTest unit tests covering duplicate UID detection and exception/message behavior for both overloads of ValidateUniqueExtension.

Copilot's findings

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

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.

Summary

Workflow: PR Nitpick Reviewer 🔍
Date: 2026-05-11
Repository: microsoft/testfx

Key Findings

  1. [Important] Duplicated fake-extension class bodiesFakeExtension, FakeExtensionA/B/C have identical IExtension implementations; only the class name differs. A shared base class would eliminate the duplication and make future IExtension contract changes a single-site edit.

  2. [Important] Weak type-name assertion in ...ErrorMessageContainsTypeNames — both existing and newExtension are FakeExtension, so the single Assert.Contains(existing.GetType().ToString(), ...) passes even if the new extension's type is absent from the error message. Using distinct types for the two variables would actually exercise the full allDuplicates list the source builds.

  3. [Minor] Mixed collection-creation stylesnew[] { ... } / new IExtension[] { ... } sit alongside collection expressions ([], [a, b]). Prefer collection expressions throughout for consistency.

  4. [Minor] existing.GetType().ToString() vs typeof(T).ToString() — adjacent tests use the static typeof form; this one uses a runtime expression on a variable whose static type is known.

  5. [Minor] Inconsistent duplicate-UID sentinel strings"my-duplicate-uid" (generic overload tests) vs "duplicated" (simple overload). No functional difference, but a consistent string makes related test cases easier to scan together.

Positive Highlights

  • Clear, well-named test methods following MethodUnderTest_Scenario_ExpectedResult convention throughout.
  • Good separation of generic and simple-overload test groups with section comments.
  • Complete coverage of null-guard paths for all three parameters of the generic overload.
  • Nice use of the ExtensionWrapper record to exercise the selector overload — a non-obvious but important test scenario.

Generated by PR Nitpick Reviewer

🔍 Meticulously inspected by PR Nitpick Reviewer 🔍

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.

Summary

Workflow: Test Expert Reviewer 🧪
Date: 2026-05-11
Repository: microsoft/testfx

Key Findings

The tests are well-structured, fully isolated, and cover the happy paths and null-guard contracts for both overloads of ValidateUniqueExtension. No flakiness risks or shared-state issues were found.

Three improvements worth considering:

  1. [Assertion — Weak]_ErrorMessageContainsTypeNames creates both existing and newExtension as the same type (FakeExtension), so the single Assert.Contains(existing.GetType().ToString(), ...) assertion doesn't independently verify the new extension's type in the message. A regression that drops the new type would go undetected.

  2. [Structure — Redundant]_WhenDuplicateUidExists_ThrowsInvalidOperationException is a strict subset of _WhenDuplicateUidExists_ErrorMessageContainsUid, which already asserts the exception type. The first test can be removed.

  3. [Coverage — Missing edge case] No test documents whether UID comparison is case-sensitive. The production code uses == (ordinal, case-sensitive), but this is unverified and undocumented in tests.

Recommendations

  • Strengthen _ErrorMessageContainsTypeNames by using distinct types for existing vs. new extension (similar to _WhenMultipleDuplicatesExist_ErrorMessageContainsAllTypes).
  • Remove the redundant _ThrowsInvalidOperationException test.
  • Add a case-sensitivity test for UID comparison to document the contract.

Generated by Test Expert Reviewer

🧪 Test quality reviewed by Test Expert Reviewer 🧪

@Evangelink

Copy link
Copy Markdown
MemberAuthor

Copilot address review comments

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.

Summary

Workflow: Expert Code Reviewer 🧠
Date: 2026-05-11
Repository: microsoft/testfx

Key Findings

No issues found across all review categories:

  • Correctness: All test assertions are logically correct and match the expected behavior of ExtensionValidationHelper.ValidateUniqueExtension. The Assert.Contains(substring, container) argument order follows the project convention.
  • Threading: Tests are synchronous and self-contained; no shared mutable state.
  • Performance: Test-only code; no hot-path concerns.
  • API Compat: No public API surface changes.
  • Cross-TFM: No TFM-specific APIs used.
  • Resources: No disposable resources involved.
  • Security / IPC: Not applicable to test helpers.
  • Defensive coding: Null guard tests correctly exercise the three ArgumentNullException paths in the implementation.

Positive Observations

  • Tests cover both overloads (generic selector and simple IEnumerable<IExtension>).
  • Error-message content is verified for UID and all involved type names, including the multi-duplicate case.
  • The ExtensionWrapper test correctly exercises the selector indirection path.
  • Assertion style is consistent with the rest of Microsoft.Testing.Platform.UnitTests (MSTest Assert.ThrowsExactly / Assert.Contains; no AwesomeAssertions).

Recommendations

None required.


Generated by Expert Code Reviewer

🧠 Reviewed by Expert Code Reviewer 🧠

Co-authored-by: Evangelink <11340282+Evangelink@users.noreply.github.com>

CopilotAI commented May 11, 2026

Copy link
Copy Markdown
Contributor

Copilot address review comments

Done in 5518819. I addressed the actionable review comments, updated the tests accordingly, and validated with targeted + full Microsoft.Testing.Platform.UnitTests runs and final parallel validation.

CopilotAI changed the title [Test Improver] Add unit tests for ExtensionValidationHelper.ValidateUniqueExtension&lt;empty&gt;May 11, 2026
@EvangelinkAmaury Levé (Evangelink) changed the title &lt;empty&gt;[Test Improver] Add unit tests for ExtensionValidationHelper.ValidateUniqueExtensionMay 11, 2026
@Evangelink
Amaury Levé (Evangelink) merged commit 27e2855 into mainMay 11, 2026
60 checks passed
@Evangelink
Amaury Levé (Evangelink) deleted the test-assist/extension-validation-helper-tests-076ac6cd367e54b7 branch May 11, 2026 16:26
Amaury Levé (Evangelink) added a commit that referenced this pull request May 12, 2026
…UniqueExtension (#8128)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@Evangelink
, '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

[Test Improver] Add unit tests for ExtensionValidationHelper.ValidateUniqueExtension - #8128

Merged
Amaury Levé (Evangelink) merged 2 commits into
mainfrom
test-assist/extension-validation-helper-tests-076ac6cd367e54b7
May 11, 2026
Merged

[Test Improver] Add unit tests for ExtensionValidationHelper.ValidateUniqueExtension#8128
Amaury Levé (Evangelink) merged 2 commits into
mainfrom
test-assist/extension-validation-helper-tests-076ac6cd367e54b7

Conversation

@Evangelink

@EvangelinkAmaury Levé (Evangelink) commented May 11, 2026

Copy link
Copy Markdown
Member

<empty>

15 tests covering:
- ArgumentNullException for null existingExtensions, newExtension, extensionSelector
- No throw for empty collection and when no duplicate UIDs exist
- InvalidOperationException when duplicate UID found (generic overload)
- Error message contains the duplicate UID and all involved type names
- Multiple duplicates: all types appear in error message
- Wrapper-type selector (generic overload): selects via Func<T, IExtension>
- Simple IExtension overload: null guards, no-duplicate, and duplicate paths
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
CopilotAI review requested due to automatic review settings May 11, 2026 14:44

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 unit test coverage to ExtensionValidationHelper.ValidateUniqueExtension (a shared guard used to prevent duplicate extension UIDs during extension registration) within Microsoft.Testing.Platform.UnitTests, addressing the gap described in #8003.

Changes:

  • Adds null-guard tests for both the generic overload and the simple IExtension overload.
  • Adds behavioral tests for non-duplicate and duplicate UID scenarios (including multiple-duplicate/type-list message coverage).
  • Adds tests for the generic overload’s selector-based path using a wrapper type.
Show a summary per file
FileDescription
test/UnitTests/Microsoft.Testing.Platform.UnitTests/Helpers/ExtensionValidationHelperTests.csNew MSTest unit tests covering duplicate UID detection and exception/message behavior for both overloads of ValidateUniqueExtension.

Copilot's findings

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

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.

Summary

Workflow: PR Nitpick Reviewer 🔍
Date: 2026-05-11
Repository: microsoft/testfx

Key Findings

  1. [Important] Duplicated fake-extension class bodiesFakeExtension, FakeExtensionA/B/C have identical IExtension implementations; only the class name differs. A shared base class would eliminate the duplication and make future IExtension contract changes a single-site edit.

  2. [Important] Weak type-name assertion in ...ErrorMessageContainsTypeNames — both existing and newExtension are FakeExtension, so the single Assert.Contains(existing.GetType().ToString(), ...) passes even if the new extension's type is absent from the error message. Using distinct types for the two variables would actually exercise the full allDuplicates list the source builds.

  3. [Minor] Mixed collection-creation stylesnew[] { ... } / new IExtension[] { ... } sit alongside collection expressions ([], [a, b]). Prefer collection expressions throughout for consistency.

  4. [Minor] existing.GetType().ToString() vs typeof(T).ToString() — adjacent tests use the static typeof form; this one uses a runtime expression on a variable whose static type is known.

  5. [Minor] Inconsistent duplicate-UID sentinel strings"my-duplicate-uid" (generic overload tests) vs "duplicated" (simple overload). No functional difference, but a consistent string makes related test cases easier to scan together.

Positive Highlights

  • Clear, well-named test methods following MethodUnderTest_Scenario_ExpectedResult convention throughout.
  • Good separation of generic and simple-overload test groups with section comments.
  • Complete coverage of null-guard paths for all three parameters of the generic overload.
  • Nice use of the ExtensionWrapper record to exercise the selector overload — a non-obvious but important test scenario.

Generated by PR Nitpick Reviewer

🔍 Meticulously inspected by PR Nitpick Reviewer 🔍

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.

Summary

Workflow: Test Expert Reviewer 🧪
Date: 2026-05-11
Repository: microsoft/testfx

Key Findings

The tests are well-structured, fully isolated, and cover the happy paths and null-guard contracts for both overloads of ValidateUniqueExtension. No flakiness risks or shared-state issues were found.

Three improvements worth considering:

  1. [Assertion — Weak]_ErrorMessageContainsTypeNames creates both existing and newExtension as the same type (FakeExtension), so the single Assert.Contains(existing.GetType().ToString(), ...) assertion doesn't independently verify the new extension's type in the message. A regression that drops the new type would go undetected.

  2. [Structure — Redundant]_WhenDuplicateUidExists_ThrowsInvalidOperationException is a strict subset of _WhenDuplicateUidExists_ErrorMessageContainsUid, which already asserts the exception type. The first test can be removed.

  3. [Coverage — Missing edge case] No test documents whether UID comparison is case-sensitive. The production code uses == (ordinal, case-sensitive), but this is unverified and undocumented in tests.

Recommendations

  • Strengthen _ErrorMessageContainsTypeNames by using distinct types for existing vs. new extension (similar to _WhenMultipleDuplicatesExist_ErrorMessageContainsAllTypes).
  • Remove the redundant _ThrowsInvalidOperationException test.
  • Add a case-sensitivity test for UID comparison to document the contract.

Generated by Test Expert Reviewer

🧪 Test quality reviewed by Test Expert Reviewer 🧪

@Evangelink

Copy link
Copy Markdown
MemberAuthor

Copilot address review comments

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.

Summary

Workflow: Expert Code Reviewer 🧠
Date: 2026-05-11
Repository: microsoft/testfx

Key Findings

No issues found across all review categories:

  • Correctness: All test assertions are logically correct and match the expected behavior of ExtensionValidationHelper.ValidateUniqueExtension. The Assert.Contains(substring, container) argument order follows the project convention.
  • Threading: Tests are synchronous and self-contained; no shared mutable state.
  • Performance: Test-only code; no hot-path concerns.
  • API Compat: No public API surface changes.
  • Cross-TFM: No TFM-specific APIs used.
  • Resources: No disposable resources involved.
  • Security / IPC: Not applicable to test helpers.
  • Defensive coding: Null guard tests correctly exercise the three ArgumentNullException paths in the implementation.

Positive Observations

  • Tests cover both overloads (generic selector and simple IEnumerable<IExtension>).
  • Error-message content is verified for UID and all involved type names, including the multi-duplicate case.
  • The ExtensionWrapper test correctly exercises the selector indirection path.
  • Assertion style is consistent with the rest of Microsoft.Testing.Platform.UnitTests (MSTest Assert.ThrowsExactly / Assert.Contains; no AwesomeAssertions).

Recommendations

None required.


Generated by Expert Code Reviewer

🧠 Reviewed by Expert Code Reviewer 🧠

Co-authored-by: Evangelink <11340282+Evangelink@users.noreply.github.com>

CopilotAI commented May 11, 2026

Copy link
Copy Markdown
Contributor

Copilot address review comments

Done in 5518819. I addressed the actionable review comments, updated the tests accordingly, and validated with targeted + full Microsoft.Testing.Platform.UnitTests runs and final parallel validation.

CopilotAI changed the title [Test Improver] Add unit tests for ExtensionValidationHelper.ValidateUniqueExtension&lt;empty&gt;May 11, 2026
@EvangelinkAmaury Levé (Evangelink) changed the title &lt;empty&gt;[Test Improver] Add unit tests for ExtensionValidationHelper.ValidateUniqueExtensionMay 11, 2026
@Evangelink
Amaury Levé (Evangelink) merged commit 27e2855 into mainMay 11, 2026
60 checks passed
@Evangelink
Amaury Levé (Evangelink) deleted the test-assist/extension-validation-helper-tests-076ac6cd367e54b7 branch May 11, 2026 16:26
Amaury Levé (Evangelink) added a commit that referenced this pull request May 12, 2026
…UniqueExtension (#8128)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@Evangelink
, '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

[Test Improver] Add unit tests for ExtensionValidationHelper.ValidateUniqueExtension - #8128

Merged
Amaury Levé (Evangelink) merged 2 commits into
mainfrom
test-assist/extension-validation-helper-tests-076ac6cd367e54b7
May 11, 2026
Merged

[Test Improver] Add unit tests for ExtensionValidationHelper.ValidateUniqueExtension#8128
Amaury Levé (Evangelink) merged 2 commits into
mainfrom
test-assist/extension-validation-helper-tests-076ac6cd367e54b7

Conversation

@Evangelink

@EvangelinkAmaury Levé (Evangelink) commented May 11, 2026

Copy link
Copy Markdown
Member

<empty>

15 tests covering:
- ArgumentNullException for null existingExtensions, newExtension, extensionSelector
- No throw for empty collection and when no duplicate UIDs exist
- InvalidOperationException when duplicate UID found (generic overload)
- Error message contains the duplicate UID and all involved type names
- Multiple duplicates: all types appear in error message
- Wrapper-type selector (generic overload): selects via Func<T, IExtension>
- Simple IExtension overload: null guards, no-duplicate, and duplicate paths
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
CopilotAI review requested due to automatic review settings May 11, 2026 14:44

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 unit test coverage to ExtensionValidationHelper.ValidateUniqueExtension (a shared guard used to prevent duplicate extension UIDs during extension registration) within Microsoft.Testing.Platform.UnitTests, addressing the gap described in #8003.

Changes:

  • Adds null-guard tests for both the generic overload and the simple IExtension overload.
  • Adds behavioral tests for non-duplicate and duplicate UID scenarios (including multiple-duplicate/type-list message coverage).
  • Adds tests for the generic overload’s selector-based path using a wrapper type.
Show a summary per file
FileDescription
test/UnitTests/Microsoft.Testing.Platform.UnitTests/Helpers/ExtensionValidationHelperTests.csNew MSTest unit tests covering duplicate UID detection and exception/message behavior for both overloads of ValidateUniqueExtension.

Copilot's findings

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

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.

Summary

Workflow: PR Nitpick Reviewer 🔍
Date: 2026-05-11
Repository: microsoft/testfx

Key Findings

  1. [Important] Duplicated fake-extension class bodiesFakeExtension, FakeExtensionA/B/C have identical IExtension implementations; only the class name differs. A shared base class would eliminate the duplication and make future IExtension contract changes a single-site edit.

  2. [Important] Weak type-name assertion in ...ErrorMessageContainsTypeNames — both existing and newExtension are FakeExtension, so the single Assert.Contains(existing.GetType().ToString(), ...) passes even if the new extension's type is absent from the error message. Using distinct types for the two variables would actually exercise the full allDuplicates list the source builds.

  3. [Minor] Mixed collection-creation stylesnew[] { ... } / new IExtension[] { ... } sit alongside collection expressions ([], [a, b]). Prefer collection expressions throughout for consistency.

  4. [Minor] existing.GetType().ToString() vs typeof(T).ToString() — adjacent tests use the static typeof form; this one uses a runtime expression on a variable whose static type is known.

  5. [Minor] Inconsistent duplicate-UID sentinel strings"my-duplicate-uid" (generic overload tests) vs "duplicated" (simple overload). No functional difference, but a consistent string makes related test cases easier to scan together.

Positive Highlights

  • Clear, well-named test methods following MethodUnderTest_Scenario_ExpectedResult convention throughout.
  • Good separation of generic and simple-overload test groups with section comments.
  • Complete coverage of null-guard paths for all three parameters of the generic overload.
  • Nice use of the ExtensionWrapper record to exercise the selector overload — a non-obvious but important test scenario.

Generated by PR Nitpick Reviewer

🔍 Meticulously inspected by PR Nitpick Reviewer 🔍

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.

Summary

Workflow: Test Expert Reviewer 🧪
Date: 2026-05-11
Repository: microsoft/testfx

Key Findings

The tests are well-structured, fully isolated, and cover the happy paths and null-guard contracts for both overloads of ValidateUniqueExtension. No flakiness risks or shared-state issues were found.

Three improvements worth considering:

  1. [Assertion — Weak]_ErrorMessageContainsTypeNames creates both existing and newExtension as the same type (FakeExtension), so the single Assert.Contains(existing.GetType().ToString(), ...) assertion doesn't independently verify the new extension's type in the message. A regression that drops the new type would go undetected.

  2. [Structure — Redundant]_WhenDuplicateUidExists_ThrowsInvalidOperationException is a strict subset of _WhenDuplicateUidExists_ErrorMessageContainsUid, which already asserts the exception type. The first test can be removed.

  3. [Coverage — Missing edge case] No test documents whether UID comparison is case-sensitive. The production code uses == (ordinal, case-sensitive), but this is unverified and undocumented in tests.

Recommendations

  • Strengthen _ErrorMessageContainsTypeNames by using distinct types for existing vs. new extension (similar to _WhenMultipleDuplicatesExist_ErrorMessageContainsAllTypes).
  • Remove the redundant _ThrowsInvalidOperationException test.
  • Add a case-sensitivity test for UID comparison to document the contract.

Generated by Test Expert Reviewer

🧪 Test quality reviewed by Test Expert Reviewer 🧪

@Evangelink

Copy link
Copy Markdown
MemberAuthor

Copilot address review comments

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.

Summary

Workflow: Expert Code Reviewer 🧠
Date: 2026-05-11
Repository: microsoft/testfx

Key Findings

No issues found across all review categories:

  • Correctness: All test assertions are logically correct and match the expected behavior of ExtensionValidationHelper.ValidateUniqueExtension. The Assert.Contains(substring, container) argument order follows the project convention.
  • Threading: Tests are synchronous and self-contained; no shared mutable state.
  • Performance: Test-only code; no hot-path concerns.
  • API Compat: No public API surface changes.
  • Cross-TFM: No TFM-specific APIs used.
  • Resources: No disposable resources involved.
  • Security / IPC: Not applicable to test helpers.
  • Defensive coding: Null guard tests correctly exercise the three ArgumentNullException paths in the implementation.

Positive Observations

  • Tests cover both overloads (generic selector and simple IEnumerable<IExtension>).
  • Error-message content is verified for UID and all involved type names, including the multi-duplicate case.
  • The ExtensionWrapper test correctly exercises the selector indirection path.
  • Assertion style is consistent with the rest of Microsoft.Testing.Platform.UnitTests (MSTest Assert.ThrowsExactly / Assert.Contains; no AwesomeAssertions).

Recommendations

None required.


Generated by Expert Code Reviewer

🧠 Reviewed by Expert Code Reviewer 🧠

Co-authored-by: Evangelink <11340282+Evangelink@users.noreply.github.com>

CopilotAI commented May 11, 2026

Copy link
Copy Markdown
Contributor

Copilot address review comments

Done in 5518819. I addressed the actionable review comments, updated the tests accordingly, and validated with targeted + full Microsoft.Testing.Platform.UnitTests runs and final parallel validation.

CopilotAI changed the title [Test Improver] Add unit tests for ExtensionValidationHelper.ValidateUniqueExtension&lt;empty&gt;May 11, 2026
@EvangelinkAmaury Levé (Evangelink) changed the title &lt;empty&gt;[Test Improver] Add unit tests for ExtensionValidationHelper.ValidateUniqueExtensionMay 11, 2026
@Evangelink
Amaury Levé (Evangelink) merged commit 27e2855 into mainMay 11, 2026
60 checks passed
@Evangelink
Amaury Levé (Evangelink) deleted the test-assist/extension-validation-helper-tests-076ac6cd367e54b7 branch May 11, 2026 16:26
Amaury Levé (Evangelink) added a commit that referenced this pull request May 12, 2026
…UniqueExtension (#8128)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@Evangelink
, '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

[Test Improver] Add unit tests for ExtensionValidationHelper.ValidateUniqueExtension - #8128

Merged
Amaury Levé (Evangelink) merged 2 commits into
mainfrom
test-assist/extension-validation-helper-tests-076ac6cd367e54b7
May 11, 2026
Merged

[Test Improver] Add unit tests for ExtensionValidationHelper.ValidateUniqueExtension#8128
Amaury Levé (Evangelink) merged 2 commits into
mainfrom
test-assist/extension-validation-helper-tests-076ac6cd367e54b7

Conversation

@Evangelink

@EvangelinkAmaury Levé (Evangelink) commented May 11, 2026

Copy link
Copy Markdown
Member

<empty>

15 tests covering:
- ArgumentNullException for null existingExtensions, newExtension, extensionSelector
- No throw for empty collection and when no duplicate UIDs exist
- InvalidOperationException when duplicate UID found (generic overload)
- Error message contains the duplicate UID and all involved type names
- Multiple duplicates: all types appear in error message
- Wrapper-type selector (generic overload): selects via Func<T, IExtension>
- Simple IExtension overload: null guards, no-duplicate, and duplicate paths
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
CopilotAI review requested due to automatic review settings May 11, 2026 14:44

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 unit test coverage to ExtensionValidationHelper.ValidateUniqueExtension (a shared guard used to prevent duplicate extension UIDs during extension registration) within Microsoft.Testing.Platform.UnitTests, addressing the gap described in #8003.

Changes:

  • Adds null-guard tests for both the generic overload and the simple IExtension overload.
  • Adds behavioral tests for non-duplicate and duplicate UID scenarios (including multiple-duplicate/type-list message coverage).
  • Adds tests for the generic overload’s selector-based path using a wrapper type.
Show a summary per file
FileDescription
test/UnitTests/Microsoft.Testing.Platform.UnitTests/Helpers/ExtensionValidationHelperTests.csNew MSTest unit tests covering duplicate UID detection and exception/message behavior for both overloads of ValidateUniqueExtension.

Copilot's findings

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

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.

Summary

Workflow: PR Nitpick Reviewer 🔍
Date: 2026-05-11
Repository: microsoft/testfx

Key Findings

  1. [Important] Duplicated fake-extension class bodiesFakeExtension, FakeExtensionA/B/C have identical IExtension implementations; only the class name differs. A shared base class would eliminate the duplication and make future IExtension contract changes a single-site edit.

  2. [Important] Weak type-name assertion in ...ErrorMessageContainsTypeNames — both existing and newExtension are FakeExtension, so the single Assert.Contains(existing.GetType().ToString(), ...) passes even if the new extension's type is absent from the error message. Using distinct types for the two variables would actually exercise the full allDuplicates list the source builds.

  3. [Minor] Mixed collection-creation stylesnew[] { ... } / new IExtension[] { ... } sit alongside collection expressions ([], [a, b]). Prefer collection expressions throughout for consistency.

  4. [Minor] existing.GetType().ToString() vs typeof(T).ToString() — adjacent tests use the static typeof form; this one uses a runtime expression on a variable whose static type is known.

  5. [Minor] Inconsistent duplicate-UID sentinel strings"my-duplicate-uid" (generic overload tests) vs "duplicated" (simple overload). No functional difference, but a consistent string makes related test cases easier to scan together.

Positive Highlights

  • Clear, well-named test methods following MethodUnderTest_Scenario_ExpectedResult convention throughout.
  • Good separation of generic and simple-overload test groups with section comments.
  • Complete coverage of null-guard paths for all three parameters of the generic overload.
  • Nice use of the ExtensionWrapper record to exercise the selector overload — a non-obvious but important test scenario.

Generated by PR Nitpick Reviewer

🔍 Meticulously inspected by PR Nitpick Reviewer 🔍

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.

Summary

Workflow: Test Expert Reviewer 🧪
Date: 2026-05-11
Repository: microsoft/testfx

Key Findings

The tests are well-structured, fully isolated, and cover the happy paths and null-guard contracts for both overloads of ValidateUniqueExtension. No flakiness risks or shared-state issues were found.

Three improvements worth considering:

  1. [Assertion — Weak]_ErrorMessageContainsTypeNames creates both existing and newExtension as the same type (FakeExtension), so the single Assert.Contains(existing.GetType().ToString(), ...) assertion doesn't independently verify the new extension's type in the message. A regression that drops the new type would go undetected.

  2. [Structure — Redundant]_WhenDuplicateUidExists_ThrowsInvalidOperationException is a strict subset of _WhenDuplicateUidExists_ErrorMessageContainsUid, which already asserts the exception type. The first test can be removed.

  3. [Coverage — Missing edge case] No test documents whether UID comparison is case-sensitive. The production code uses == (ordinal, case-sensitive), but this is unverified and undocumented in tests.

Recommendations

  • Strengthen _ErrorMessageContainsTypeNames by using distinct types for existing vs. new extension (similar to _WhenMultipleDuplicatesExist_ErrorMessageContainsAllTypes).
  • Remove the redundant _ThrowsInvalidOperationException test.
  • Add a case-sensitivity test for UID comparison to document the contract.

Generated by Test Expert Reviewer

🧪 Test quality reviewed by Test Expert Reviewer 🧪

@Evangelink

Copy link
Copy Markdown
MemberAuthor

Copilot address review comments

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.

Summary

Workflow: Expert Code Reviewer 🧠
Date: 2026-05-11
Repository: microsoft/testfx

Key Findings

No issues found across all review categories:

  • Correctness: All test assertions are logically correct and match the expected behavior of ExtensionValidationHelper.ValidateUniqueExtension. The Assert.Contains(substring, container) argument order follows the project convention.
  • Threading: Tests are synchronous and self-contained; no shared mutable state.
  • Performance: Test-only code; no hot-path concerns.
  • API Compat: No public API surface changes.
  • Cross-TFM: No TFM-specific APIs used.
  • Resources: No disposable resources involved.
  • Security / IPC: Not applicable to test helpers.
  • Defensive coding: Null guard tests correctly exercise the three ArgumentNullException paths in the implementation.

Positive Observations

  • Tests cover both overloads (generic selector and simple IEnumerable<IExtension>).
  • Error-message content is verified for UID and all involved type names, including the multi-duplicate case.
  • The ExtensionWrapper test correctly exercises the selector indirection path.
  • Assertion style is consistent with the rest of Microsoft.Testing.Platform.UnitTests (MSTest Assert.ThrowsExactly / Assert.Contains; no AwesomeAssertions).

Recommendations

None required.


Generated by Expert Code Reviewer

🧠 Reviewed by Expert Code Reviewer 🧠

Co-authored-by: Evangelink <11340282+Evangelink@users.noreply.github.com>

CopilotAI commented May 11, 2026

Copy link
Copy Markdown
Contributor

Copilot address review comments

Done in 5518819. I addressed the actionable review comments, updated the tests accordingly, and validated with targeted + full Microsoft.Testing.Platform.UnitTests runs and final parallel validation.

CopilotAI changed the title [Test Improver] Add unit tests for ExtensionValidationHelper.ValidateUniqueExtension&lt;empty&gt;May 11, 2026
@EvangelinkAmaury Levé (Evangelink) changed the title &lt;empty&gt;[Test Improver] Add unit tests for ExtensionValidationHelper.ValidateUniqueExtensionMay 11, 2026
@Evangelink
Amaury Levé (Evangelink) merged commit 27e2855 into mainMay 11, 2026
60 checks passed
@Evangelink
Amaury Levé (Evangelink) deleted the test-assist/extension-validation-helper-tests-076ac6cd367e54b7 branch May 11, 2026 16:26
Amaury Levé (Evangelink) added a commit that referenced this pull request May 12, 2026
…UniqueExtension (#8128)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@Evangelink
, '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

[Test Improver] Add unit tests for ExtensionValidationHelper.ValidateUniqueExtension - #8128

Merged
Amaury Levé (Evangelink) merged 2 commits into
mainfrom
test-assist/extension-validation-helper-tests-076ac6cd367e54b7
May 11, 2026
Merged

[Test Improver] Add unit tests for ExtensionValidationHelper.ValidateUniqueExtension#8128
Amaury Levé (Evangelink) merged 2 commits into
mainfrom
test-assist/extension-validation-helper-tests-076ac6cd367e54b7

Conversation

@Evangelink

@EvangelinkAmaury Levé (Evangelink) commented May 11, 2026

Copy link
Copy Markdown
Member

<empty>

15 tests covering:
- ArgumentNullException for null existingExtensions, newExtension, extensionSelector
- No throw for empty collection and when no duplicate UIDs exist
- InvalidOperationException when duplicate UID found (generic overload)
- Error message contains the duplicate UID and all involved type names
- Multiple duplicates: all types appear in error message
- Wrapper-type selector (generic overload): selects via Func<T, IExtension>
- Simple IExtension overload: null guards, no-duplicate, and duplicate paths
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
CopilotAI review requested due to automatic review settings May 11, 2026 14:44

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 unit test coverage to ExtensionValidationHelper.ValidateUniqueExtension (a shared guard used to prevent duplicate extension UIDs during extension registration) within Microsoft.Testing.Platform.UnitTests, addressing the gap described in #8003.

Changes:

  • Adds null-guard tests for both the generic overload and the simple IExtension overload.
  • Adds behavioral tests for non-duplicate and duplicate UID scenarios (including multiple-duplicate/type-list message coverage).
  • Adds tests for the generic overload’s selector-based path using a wrapper type.
Show a summary per file
FileDescription
test/UnitTests/Microsoft.Testing.Platform.UnitTests/Helpers/ExtensionValidationHelperTests.csNew MSTest unit tests covering duplicate UID detection and exception/message behavior for both overloads of ValidateUniqueExtension.

Copilot's findings

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

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.

Summary

Workflow: PR Nitpick Reviewer 🔍
Date: 2026-05-11
Repository: microsoft/testfx

Key Findings

  1. [Important] Duplicated fake-extension class bodiesFakeExtension, FakeExtensionA/B/C have identical IExtension implementations; only the class name differs. A shared base class would eliminate the duplication and make future IExtension contract changes a single-site edit.

  2. [Important] Weak type-name assertion in ...ErrorMessageContainsTypeNames — both existing and newExtension are FakeExtension, so the single Assert.Contains(existing.GetType().ToString(), ...) passes even if the new extension's type is absent from the error message. Using distinct types for the two variables would actually exercise the full allDuplicates list the source builds.

  3. [Minor] Mixed collection-creation stylesnew[] { ... } / new IExtension[] { ... } sit alongside collection expressions ([], [a, b]). Prefer collection expressions throughout for consistency.

  4. [Minor] existing.GetType().ToString() vs typeof(T).ToString() — adjacent tests use the static typeof form; this one uses a runtime expression on a variable whose static type is known.

  5. [Minor] Inconsistent duplicate-UID sentinel strings"my-duplicate-uid" (generic overload tests) vs "duplicated" (simple overload). No functional difference, but a consistent string makes related test cases easier to scan together.

Positive Highlights

  • Clear, well-named test methods following MethodUnderTest_Scenario_ExpectedResult convention throughout.
  • Good separation of generic and simple-overload test groups with section comments.
  • Complete coverage of null-guard paths for all three parameters of the generic overload.
  • Nice use of the ExtensionWrapper record to exercise the selector overload — a non-obvious but important test scenario.

Generated by PR Nitpick Reviewer

🔍 Meticulously inspected by PR Nitpick Reviewer 🔍

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.

Summary

Workflow: Test Expert Reviewer 🧪
Date: 2026-05-11
Repository: microsoft/testfx

Key Findings

The tests are well-structured, fully isolated, and cover the happy paths and null-guard contracts for both overloads of ValidateUniqueExtension. No flakiness risks or shared-state issues were found.

Three improvements worth considering:

  1. [Assertion — Weak]_ErrorMessageContainsTypeNames creates both existing and newExtension as the same type (FakeExtension), so the single Assert.Contains(existing.GetType().ToString(), ...) assertion doesn't independently verify the new extension's type in the message. A regression that drops the new type would go undetected.

  2. [Structure — Redundant]_WhenDuplicateUidExists_ThrowsInvalidOperationException is a strict subset of _WhenDuplicateUidExists_ErrorMessageContainsUid, which already asserts the exception type. The first test can be removed.

  3. [Coverage — Missing edge case] No test documents whether UID comparison is case-sensitive. The production code uses == (ordinal, case-sensitive), but this is unverified and undocumented in tests.

Recommendations

  • Strengthen _ErrorMessageContainsTypeNames by using distinct types for existing vs. new extension (similar to _WhenMultipleDuplicatesExist_ErrorMessageContainsAllTypes).
  • Remove the redundant _ThrowsInvalidOperationException test.
  • Add a case-sensitivity test for UID comparison to document the contract.

Generated by Test Expert Reviewer

🧪 Test quality reviewed by Test Expert Reviewer 🧪

@Evangelink

Copy link
Copy Markdown
MemberAuthor

Copilot address review comments

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.

Summary

Workflow: Expert Code Reviewer 🧠
Date: 2026-05-11
Repository: microsoft/testfx

Key Findings

No issues found across all review categories:

  • Correctness: All test assertions are logically correct and match the expected behavior of ExtensionValidationHelper.ValidateUniqueExtension. The Assert.Contains(substring, container) argument order follows the project convention.
  • Threading: Tests are synchronous and self-contained; no shared mutable state.
  • Performance: Test-only code; no hot-path concerns.
  • API Compat: No public API surface changes.
  • Cross-TFM: No TFM-specific APIs used.
  • Resources: No disposable resources involved.
  • Security / IPC: Not applicable to test helpers.
  • Defensive coding: Null guard tests correctly exercise the three ArgumentNullException paths in the implementation.

Positive Observations

  • Tests cover both overloads (generic selector and simple IEnumerable<IExtension>).
  • Error-message content is verified for UID and all involved type names, including the multi-duplicate case.
  • The ExtensionWrapper test correctly exercises the selector indirection path.
  • Assertion style is consistent with the rest of Microsoft.Testing.Platform.UnitTests (MSTest Assert.ThrowsExactly / Assert.Contains; no AwesomeAssertions).

Recommendations

None required.


Generated by Expert Code Reviewer

🧠 Reviewed by Expert Code Reviewer 🧠

Co-authored-by: Evangelink <11340282+Evangelink@users.noreply.github.com>

CopilotAI commented May 11, 2026

Copy link
Copy Markdown
Contributor

Copilot address review comments

Done in 5518819. I addressed the actionable review comments, updated the tests accordingly, and validated with targeted + full Microsoft.Testing.Platform.UnitTests runs and final parallel validation.

CopilotAI changed the title [Test Improver] Add unit tests for ExtensionValidationHelper.ValidateUniqueExtension&lt;empty&gt;May 11, 2026
@EvangelinkAmaury Levé (Evangelink) changed the title &lt;empty&gt;[Test Improver] Add unit tests for ExtensionValidationHelper.ValidateUniqueExtensionMay 11, 2026
@Evangelink
Amaury Levé (Evangelink) merged commit 27e2855 into mainMay 11, 2026
60 checks passed
@Evangelink
Amaury Levé (Evangelink) deleted the test-assist/extension-validation-helper-tests-076ac6cd367e54b7 branch May 11, 2026 16:26
Amaury Levé (Evangelink) added a commit that referenced this pull request May 12, 2026
…UniqueExtension (#8128)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@Evangelink
, '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

[Test Improver] Add unit tests for ExtensionValidationHelper.ValidateUniqueExtension - #8128

Merged
Amaury Levé (Evangelink) merged 2 commits into
mainfrom
test-assist/extension-validation-helper-tests-076ac6cd367e54b7
May 11, 2026
Merged

[Test Improver] Add unit tests for ExtensionValidationHelper.ValidateUniqueExtension#8128
Amaury Levé (Evangelink) merged 2 commits into
mainfrom
test-assist/extension-validation-helper-tests-076ac6cd367e54b7

Conversation

@Evangelink

@EvangelinkAmaury Levé (Evangelink) commented May 11, 2026

Copy link
Copy Markdown
Member

<empty>

15 tests covering:
- ArgumentNullException for null existingExtensions, newExtension, extensionSelector
- No throw for empty collection and when no duplicate UIDs exist
- InvalidOperationException when duplicate UID found (generic overload)
- Error message contains the duplicate UID and all involved type names
- Multiple duplicates: all types appear in error message
- Wrapper-type selector (generic overload): selects via Func<T, IExtension>
- Simple IExtension overload: null guards, no-duplicate, and duplicate paths
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
CopilotAI review requested due to automatic review settings May 11, 2026 14:44

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 unit test coverage to ExtensionValidationHelper.ValidateUniqueExtension (a shared guard used to prevent duplicate extension UIDs during extension registration) within Microsoft.Testing.Platform.UnitTests, addressing the gap described in #8003.

Changes:

  • Adds null-guard tests for both the generic overload and the simple IExtension overload.
  • Adds behavioral tests for non-duplicate and duplicate UID scenarios (including multiple-duplicate/type-list message coverage).
  • Adds tests for the generic overload’s selector-based path using a wrapper type.
Show a summary per file
FileDescription
test/UnitTests/Microsoft.Testing.Platform.UnitTests/Helpers/ExtensionValidationHelperTests.csNew MSTest unit tests covering duplicate UID detection and exception/message behavior for both overloads of ValidateUniqueExtension.

Copilot's findings

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

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.

Summary

Workflow: PR Nitpick Reviewer 🔍
Date: 2026-05-11
Repository: microsoft/testfx

Key Findings

  1. [Important] Duplicated fake-extension class bodiesFakeExtension, FakeExtensionA/B/C have identical IExtension implementations; only the class name differs. A shared base class would eliminate the duplication and make future IExtension contract changes a single-site edit.

  2. [Important] Weak type-name assertion in ...ErrorMessageContainsTypeNames — both existing and newExtension are FakeExtension, so the single Assert.Contains(existing.GetType().ToString(), ...) passes even if the new extension's type is absent from the error message. Using distinct types for the two variables would actually exercise the full allDuplicates list the source builds.

  3. [Minor] Mixed collection-creation stylesnew[] { ... } / new IExtension[] { ... } sit alongside collection expressions ([], [a, b]). Prefer collection expressions throughout for consistency.

  4. [Minor] existing.GetType().ToString() vs typeof(T).ToString() — adjacent tests use the static typeof form; this one uses a runtime expression on a variable whose static type is known.

  5. [Minor] Inconsistent duplicate-UID sentinel strings"my-duplicate-uid" (generic overload tests) vs "duplicated" (simple overload). No functional difference, but a consistent string makes related test cases easier to scan together.

Positive Highlights

  • Clear, well-named test methods following MethodUnderTest_Scenario_ExpectedResult convention throughout.
  • Good separation of generic and simple-overload test groups with section comments.
  • Complete coverage of null-guard paths for all three parameters of the generic overload.
  • Nice use of the ExtensionWrapper record to exercise the selector overload — a non-obvious but important test scenario.

Generated by PR Nitpick Reviewer

🔍 Meticulously inspected by PR Nitpick Reviewer 🔍

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.

Summary

Workflow: Test Expert Reviewer 🧪
Date: 2026-05-11
Repository: microsoft/testfx

Key Findings

The tests are well-structured, fully isolated, and cover the happy paths and null-guard contracts for both overloads of ValidateUniqueExtension. No flakiness risks or shared-state issues were found.

Three improvements worth considering:

  1. [Assertion — Weak]_ErrorMessageContainsTypeNames creates both existing and newExtension as the same type (FakeExtension), so the single Assert.Contains(existing.GetType().ToString(), ...) assertion doesn't independently verify the new extension's type in the message. A regression that drops the new type would go undetected.

  2. [Structure — Redundant]_WhenDuplicateUidExists_ThrowsInvalidOperationException is a strict subset of _WhenDuplicateUidExists_ErrorMessageContainsUid, which already asserts the exception type. The first test can be removed.

  3. [Coverage — Missing edge case] No test documents whether UID comparison is case-sensitive. The production code uses == (ordinal, case-sensitive), but this is unverified and undocumented in tests.

Recommendations

  • Strengthen _ErrorMessageContainsTypeNames by using distinct types for existing vs. new extension (similar to _WhenMultipleDuplicatesExist_ErrorMessageContainsAllTypes).
  • Remove the redundant _ThrowsInvalidOperationException test.
  • Add a case-sensitivity test for UID comparison to document the contract.

Generated by Test Expert Reviewer

🧪 Test quality reviewed by Test Expert Reviewer 🧪

@Evangelink

Copy link
Copy Markdown
MemberAuthor

Copilot address review comments

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.

Summary

Workflow: Expert Code Reviewer 🧠
Date: 2026-05-11
Repository: microsoft/testfx

Key Findings

No issues found across all review categories:

  • Correctness: All test assertions are logically correct and match the expected behavior of ExtensionValidationHelper.ValidateUniqueExtension. The Assert.Contains(substring, container) argument order follows the project convention.
  • Threading: Tests are synchronous and self-contained; no shared mutable state.
  • Performance: Test-only code; no hot-path concerns.
  • API Compat: No public API surface changes.
  • Cross-TFM: No TFM-specific APIs used.
  • Resources: No disposable resources involved.
  • Security / IPC: Not applicable to test helpers.
  • Defensive coding: Null guard tests correctly exercise the three ArgumentNullException paths in the implementation.

Positive Observations

  • Tests cover both overloads (generic selector and simple IEnumerable<IExtension>).
  • Error-message content is verified for UID and all involved type names, including the multi-duplicate case.
  • The ExtensionWrapper test correctly exercises the selector indirection path.
  • Assertion style is consistent with the rest of Microsoft.Testing.Platform.UnitTests (MSTest Assert.ThrowsExactly / Assert.Contains; no AwesomeAssertions).

Recommendations

None required.


Generated by Expert Code Reviewer

🧠 Reviewed by Expert Code Reviewer 🧠

Co-authored-by: Evangelink <11340282+Evangelink@users.noreply.github.com>

CopilotAI commented May 11, 2026

Copy link
Copy Markdown
Contributor

Copilot address review comments

Done in 5518819. I addressed the actionable review comments, updated the tests accordingly, and validated with targeted + full Microsoft.Testing.Platform.UnitTests runs and final parallel validation.

CopilotAI changed the title [Test Improver] Add unit tests for ExtensionValidationHelper.ValidateUniqueExtension&lt;empty&gt;May 11, 2026
@EvangelinkAmaury Levé (Evangelink) changed the title &lt;empty&gt;[Test Improver] Add unit tests for ExtensionValidationHelper.ValidateUniqueExtensionMay 11, 2026
@Evangelink
Amaury Levé (Evangelink) merged commit 27e2855 into mainMay 11, 2026
60 checks passed
@Evangelink
Amaury Levé (Evangelink) deleted the test-assist/extension-validation-helper-tests-076ac6cd367e54b7 branch May 11, 2026 16:26
Amaury Levé (Evangelink) added a commit that referenced this pull request May 12, 2026
…UniqueExtension (#8128)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@Evangelink
, '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

[Test Improver] Add unit tests for ExtensionValidationHelper.ValidateUniqueExtension - #8128

Merged
Amaury Levé (Evangelink) merged 2 commits into
mainfrom
test-assist/extension-validation-helper-tests-076ac6cd367e54b7
May 11, 2026
Merged

[Test Improver] Add unit tests for ExtensionValidationHelper.ValidateUniqueExtension#8128
Amaury Levé (Evangelink) merged 2 commits into
mainfrom
test-assist/extension-validation-helper-tests-076ac6cd367e54b7

Conversation

@Evangelink

@EvangelinkAmaury Levé (Evangelink) commented May 11, 2026

Copy link
Copy Markdown
Member

<empty>

15 tests covering:
- ArgumentNullException for null existingExtensions, newExtension, extensionSelector
- No throw for empty collection and when no duplicate UIDs exist
- InvalidOperationException when duplicate UID found (generic overload)
- Error message contains the duplicate UID and all involved type names
- Multiple duplicates: all types appear in error message
- Wrapper-type selector (generic overload): selects via Func<T, IExtension>
- Simple IExtension overload: null guards, no-duplicate, and duplicate paths
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
CopilotAI review requested due to automatic review settings May 11, 2026 14:44

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 unit test coverage to ExtensionValidationHelper.ValidateUniqueExtension (a shared guard used to prevent duplicate extension UIDs during extension registration) within Microsoft.Testing.Platform.UnitTests, addressing the gap described in #8003.

Changes:

  • Adds null-guard tests for both the generic overload and the simple IExtension overload.
  • Adds behavioral tests for non-duplicate and duplicate UID scenarios (including multiple-duplicate/type-list message coverage).
  • Adds tests for the generic overload’s selector-based path using a wrapper type.
Show a summary per file
FileDescription
test/UnitTests/Microsoft.Testing.Platform.UnitTests/Helpers/ExtensionValidationHelperTests.csNew MSTest unit tests covering duplicate UID detection and exception/message behavior for both overloads of ValidateUniqueExtension.

Copilot's findings

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

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.

Summary

Workflow: PR Nitpick Reviewer 🔍
Date: 2026-05-11
Repository: microsoft/testfx

Key Findings

  1. [Important] Duplicated fake-extension class bodiesFakeExtension, FakeExtensionA/B/C have identical IExtension implementations; only the class name differs. A shared base class would eliminate the duplication and make future IExtension contract changes a single-site edit.

  2. [Important] Weak type-name assertion in ...ErrorMessageContainsTypeNames — both existing and newExtension are FakeExtension, so the single Assert.Contains(existing.GetType().ToString(), ...) passes even if the new extension's type is absent from the error message. Using distinct types for the two variables would actually exercise the full allDuplicates list the source builds.

  3. [Minor] Mixed collection-creation stylesnew[] { ... } / new IExtension[] { ... } sit alongside collection expressions ([], [a, b]). Prefer collection expressions throughout for consistency.

  4. [Minor] existing.GetType().ToString() vs typeof(T).ToString() — adjacent tests use the static typeof form; this one uses a runtime expression on a variable whose static type is known.

  5. [Minor] Inconsistent duplicate-UID sentinel strings"my-duplicate-uid" (generic overload tests) vs "duplicated" (simple overload). No functional difference, but a consistent string makes related test cases easier to scan together.

Positive Highlights

  • Clear, well-named test methods following MethodUnderTest_Scenario_ExpectedResult convention throughout.
  • Good separation of generic and simple-overload test groups with section comments.
  • Complete coverage of null-guard paths for all three parameters of the generic overload.
  • Nice use of the ExtensionWrapper record to exercise the selector overload — a non-obvious but important test scenario.

Generated by PR Nitpick Reviewer

🔍 Meticulously inspected by PR Nitpick Reviewer 🔍

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.

Summary

Workflow: Test Expert Reviewer 🧪
Date: 2026-05-11
Repository: microsoft/testfx

Key Findings

The tests are well-structured, fully isolated, and cover the happy paths and null-guard contracts for both overloads of ValidateUniqueExtension. No flakiness risks or shared-state issues were found.

Three improvements worth considering:

  1. [Assertion — Weak]_ErrorMessageContainsTypeNames creates both existing and newExtension as the same type (FakeExtension), so the single Assert.Contains(existing.GetType().ToString(), ...) assertion doesn't independently verify the new extension's type in the message. A regression that drops the new type would go undetected.

  2. [Structure — Redundant]_WhenDuplicateUidExists_ThrowsInvalidOperationException is a strict subset of _WhenDuplicateUidExists_ErrorMessageContainsUid, which already asserts the exception type. The first test can be removed.

  3. [Coverage — Missing edge case] No test documents whether UID comparison is case-sensitive. The production code uses == (ordinal, case-sensitive), but this is unverified and undocumented in tests.

Recommendations

  • Strengthen _ErrorMessageContainsTypeNames by using distinct types for existing vs. new extension (similar to _WhenMultipleDuplicatesExist_ErrorMessageContainsAllTypes).
  • Remove the redundant _ThrowsInvalidOperationException test.
  • Add a case-sensitivity test for UID comparison to document the contract.

Generated by Test Expert Reviewer

🧪 Test quality reviewed by Test Expert Reviewer 🧪

@Evangelink

Copy link
Copy Markdown
MemberAuthor

Copilot address review comments

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.

Summary

Workflow: Expert Code Reviewer 🧠
Date: 2026-05-11
Repository: microsoft/testfx

Key Findings

No issues found across all review categories:

  • Correctness: All test assertions are logically correct and match the expected behavior of ExtensionValidationHelper.ValidateUniqueExtension. The Assert.Contains(substring, container) argument order follows the project convention.
  • Threading: Tests are synchronous and self-contained; no shared mutable state.
  • Performance: Test-only code; no hot-path concerns.
  • API Compat: No public API surface changes.
  • Cross-TFM: No TFM-specific APIs used.
  • Resources: No disposable resources involved.
  • Security / IPC: Not applicable to test helpers.
  • Defensive coding: Null guard tests correctly exercise the three ArgumentNullException paths in the implementation.

Positive Observations

  • Tests cover both overloads (generic selector and simple IEnumerable<IExtension>).
  • Error-message content is verified for UID and all involved type names, including the multi-duplicate case.
  • The ExtensionWrapper test correctly exercises the selector indirection path.
  • Assertion style is consistent with the rest of Microsoft.Testing.Platform.UnitTests (MSTest Assert.ThrowsExactly / Assert.Contains; no AwesomeAssertions).

Recommendations

None required.


Generated by Expert Code Reviewer

🧠 Reviewed by Expert Code Reviewer 🧠

Co-authored-by: Evangelink <11340282+Evangelink@users.noreply.github.com>

CopilotAI commented May 11, 2026

Copy link
Copy Markdown
Contributor

Copilot address review comments

Done in 5518819. I addressed the actionable review comments, updated the tests accordingly, and validated with targeted + full Microsoft.Testing.Platform.UnitTests runs and final parallel validation.

CopilotAI changed the title [Test Improver] Add unit tests for ExtensionValidationHelper.ValidateUniqueExtension&lt;empty&gt;May 11, 2026
@EvangelinkAmaury Levé (Evangelink) changed the title &lt;empty&gt;[Test Improver] Add unit tests for ExtensionValidationHelper.ValidateUniqueExtensionMay 11, 2026
@Evangelink
Amaury Levé (Evangelink) merged commit 27e2855 into mainMay 11, 2026
60 checks passed
@Evangelink
Amaury Levé (Evangelink) deleted the test-assist/extension-validation-helper-tests-076ac6cd367e54b7 branch May 11, 2026 16:26
Amaury Levé (Evangelink) added a commit that referenced this pull request May 12, 2026
…UniqueExtension (#8128)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@Evangelink