Skip to content

Normalize test project names to .Tests and collapse the test-name probes #38

Description

@matt-edmondson

Test projects are spelled four ways across the live repos, and Sdk.props probes for all four:

Spelling Live projects
.Test 41
.Tests 15
.UiTests 1
.SmokeTest 1

IsTestProject is true only when the project name matches one of the probed spellings. A test
project outside the set is treated as a shippable library. That is currently masked only because
MSTest.Sdk independently sets IsPackable=false, so the guard is coincidental rather than
designed.

Change

Rename every .Test project to .Tests, then collapse the four test-name probes in Sdk.props to
one. That turns the convention from a suggestion into something the SDK enforces.

Test projects are not packable, so no published identity changes. This is mechanical.

Repos with a .Test project

AppDataStorage, BlastMerge, CaseConverter, CodeBlocker, Coder, Containers, CredentialCache,
CrossRepoActions, DeepClone, DelegateTransform, Extensions, Frontmatter, FuzzySearch,
GitIntegration, IconHelper, ImageDescriber, ImGuiProvider, IntervalAction, Invoker,
JsonRequiredConditionally, Keybinding, KtsuTools, Navigation, NJsonSchemaJsonConverter, OAICLI,
PreciseNumber, RoundTripStringJsonConverter, RunCommand, Schema, Sdk, Semantics, SignificantNumber,
SingleAppInstance, Sorting, SvnToGit, TextFilter, ThemeProvider, TUI, UndoRedo, VST.

Sdk carries two of its own, both under examples/demos/: Calculator.Test and Service.Test.

Order

Land the scaffolding-strip change first, so the renamed projects settle on their final identity in
one step rather than two.

Activity

  1. matt-edmondson commented on Sep 8, 2026

    @matt-edmondson
    ContributorAuthor

    Triage

    Priority: Medium Effort: Medium

    What needs to be done: Rename every .Test project (41 repos) plus the two SDK-internal ones to .Tests, then collapse the four test-name probes in Sdk.props into one.

    Suggested next steps / acceptance criteria:

    • Land Sdk#37 first so renamed projects settle in one step
    • Mechanical rename across the 41 listed repos (no published identity changes since test projects aren't packable)
    • Collapse the probe logic in Sdk.props and confirm IsTestProject no longer depends on incidental MSTest.Sdk behavior

    Blockers / dependencies: Depends on Sdk#37 landing first (explicit ordering in the issue). Part of the Sdk#36 naming epic


    Generated by Claude Code

  2. matt-edmondson commented on Sep 25, 2026

    @matt-edmondson
    ContributorAuthor

    Triage

    The recorded blocker has cleared — #37 merged on 2026-09-13 — and nothing here has been re-triaged since. Still not actionable unattended, but for a different reason than the one on file: the routing, not the dependency. Not assigning myself, nothing branched.

    The 2026-09-08 triage says "Depends on Sdk#37 landing first (explicit ordering in the issue)". That is now stale: #37 is closed as completed via #46 (fix: strip scaffolding folder segments from derived project identity). The Order section of this issue is satisfied, so the renames are no longer fighting suppressions that were about to be deleted.

    The premise still holds — verified at main (bafee81)

    Sdk/Sdk.props still probes four spellings in sequence, each falling through to the next (lines 279–298):

    # Probe Line
    1 $(SolutionName).Test 279
    2 $(SolutionName).Tests 285
    3 $(SolutionName)Test 290
    4 $(SolutionName)Tests 295

    So the collapse this issue asks for has not happened.

    Two corrections to the issue body, both worth having before it is scheduled

    1. The four probed spellings are not the four spellings in the table. The issue's table lists .Test / .Tests / .UiTests / .SmokeTest as what live repos use, and says "Sdk.props probes for all four". It does not. The probes are dot-vs-no-dot × singular-vs-plural of the solution name, so .UiTests and .SmokeTest match no probe at all. Those two projects are already in the failure mode this issue describes, today — not merely at risk of it.

    2. The latent gap is narrower and sharper than stated. IsTestProject is set from a single equality:

    <IsTestProject Condition="'$(MSBuildProjectName)' == '$(TestProjectName)'">true</IsTestProject>

    TestProjectName resolves to exactly one value per solution, so at most one project per repository can ever be IsTestProject, whatever it is called. A repo with two test projects has one of them treated as a shippable library regardless of spelling. Renaming to .Tests does not fix that on its own; collapsing to one probe does not either. Whatever lands should address the one-project-per-solution assumption, or the guard stays coincidental in the way the issue rightly objects to.

    3. Sdk's own test projects are three, not two, and not where the issue says. Actual layout:

    • examples/demos/Test/Calculator.Test — .Test
    • examples/analyzers/KTSU0002-MissingInternalsVisibleTo/Service.Test — .Test (under examples/analyzers/, not examples/demos/)
    • test/Sdk.Examples.Tests — already .Tests
    • examples/demos/Namespaces/Testing/Testing.csproj — matches no probe

    Why I stopped rather than starting it

    The work is 43 project renames across 41 repositories, and the probe collapse cannot land until they are all done — a collapsed probe against an unrenamed repo silently turns its test project into a shippable library, which is the exact defect this issue exists to remove. So it is not decomposable into "do the Sdk half now": the ordering runs the other way from #37's.

    That makes it a multi-repo campaign needing a route, and the route is your call:

    • A batch of one-file PRs across runs, one per repo, then the Sdk.props collapse last once all 41 are merged. Slow, visible, and safe — but 41 PRs of org-wide traffic, and the collapse sits unmergeable until the final rename lands.
    • Direct pushes, which is faster but wants your machine.

    This is the same routing question already open on ktsu-dev/.github#5, and for the same reason. Worth answering once for both rather than twice.

    One thing worth deciding in the same breath, since it changes the size: whether .UiTests, .SmokeTest and Testing are renamed to .Tests too, or whether the collapsed probe accepts a suffix match. The issue assumes the former; the latter is a smaller campaign and arguably a better convention, since it lets a repo have more than one test project — which the IsTestProject gap above says it currently cannot.


    Generated by Claude Code

  3. matt-edmondson commented on Sep 28, 2026

    @matt-edmondson
    ContributorAuthor

    Decision (maintainer, 2026-09-28)

    • Routing: rename .Test projects as part of each repository's ci.yml migration (Finish the pull_request paths-ignore sweep on the 16 remaining repos .github#5). There will be no separate per-repository rename PRs. This answers the routing question shared with .github#5 once for both.
    • Probe: use a suffix match rather than one exact name, so a repository can have more than one test project. That fixes the one-IsTestProject-per-solution gap. It is the smaller campaign: .UiTests, .SmokeTest and similar spellings are not force-renamed.

    Next reader: change the Sdk.props test-project detection to a suffix match on the project name, with a test covering a repository that has two test projects. Keep the .Test probe working until the ci.yml migrations have renamed the remaining projects, then drop it. Rename the Sdk repository's own .Test projects (Calculator.Test, Service.Test) in its migration.


    Generated by Claude Code

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions