logo SERENITY
Game Systems Foundation
Search Results for

    Show / Hide Table of Contents

    Namespace Serenity.CreateGame.Tests.Editor

    Classes

    AdoptAllRootRulesTests

    Pure EditMode tests for Serenity.CreateGame.Infrastructure.Editor.Steps.AdoptAllRootRules — the root-set decision behind Serenity.CreateGame.Infrastructure.Editor.Steps.SettingsAdoptionFlow.AdoptAll(System.Collections.Generic.IReadOnlyList{Serenity.CreateGame.Infrastructure.Editor.Systems.SerenitySystemConfigurationRow},System.String,System.Boolean,System.Action), resolved purely from a row's state.

    AdoptedReferenceBackfillScopeTests

    EditMode tests for Serenity.CreateGame.Infrastructure.Editor.Adoption.AdoptedReferenceBackfillScope.IsInScope(System.String,System.String,System.Collections.Generic.IReadOnlyCollection{System.String}) — covers the fold onto FoundationReferenceWalker.ShouldWalk: an AssetKey-only holder (an [AssetPathField] string field, never an IFoundationSettings) must be in scope too, not only a foundation-settings asset with its own declared contract row.

    AdoptedReferenceEndToEndTests

    End-to-end EditMode tests adopting REAL shipped systems (never hand-built fixtures) into a shared scratch output root, proving invariant 3 — adopting a later system repairs references an EARLIER adoption run left pointing at package content — through the full SystemAdoptionRunner pipeline: planner, cloner, Id rename, forward remap pass, and back-fill pass, exactly as SettingsAdoptionFlow drives them.

    AdoptedReferenceRemapperTests

    EditMode tests for Serenity.CreateGame.Infrastructure.Editor.Adoption.AdoptedReferenceRemapper: the write side of FoundationReferenceContracts, mirroring SerenityAdoptedReferenceValidatorTests's shipped/adopted scratch-root split, but asserting the VALUE after a rewrite rather than a report entry. A "shipped" fixture lives under Serenity.Global.Infrastructure.Editor.SerenityEditorPaths.AssetsRoot; an "adopted" one lives outside it, already carrying the Id an adoption run would have renamed it to — the state Serenity.CreateGame.Infrastructure.Editor.Adoption.AdoptedReferenceRemapper.Remap(System.Collections.Generic.IReadOnlyList{System.String},Serenity.Global.Infrastructure.Editor.Validation.FoundationReferenceIndex,Serenity.Global.Infrastructure.Editor.Validation.AdoptedAssetKeyIndex,System.Action{System.String}) actually sees, since it always runs after the Id-rename pass.

    BootTaskAdoptionTranslationTests

    EditMode tests for Serenity.CreateGame.Infrastructure.Editor.Wiring.BootTaskAdoptionTranslation.ToAdoptedPaths(System.Collections.Generic.IReadOnlyList{System.String},Serenity.CreateGame.Infrastructure.Editor.Adoption.SystemAdoptionPlan) — a pure lookup over a hand-built SystemAdoptionPlan, so no real assets or adoption run is needed to exercise it.

    BootTaskCanonicalOrderTests

    EditMode tests for Serenity.CreateGame.Infrastructure.Editor.BootTaskCanonicalOrder: read-only checks against the real shipped task assets and profiles — no asset is created, modified or deleted.

    BootTaskGuidArgumentRootsTests

    EditMode tests for Serenity.CreateGame.Infrastructure.Editor.Wiring.BootTaskGuidArgumentRoots.ResolveReferencedAssetPaths(System.Collections.Generic.IReadOnlyList{System.String}) — the piece that lets a boot task's opaque stringArgs[0] Guid argument (e.g. a splash cutscene a PlayInitSplashScreen task plays) become an extra adoption root, since UnityEditor.AssetDatabase.GetDependencies(System.String,System.Boolean) can never see a plain string reference.

    BootTaskRequirementsTests

    EditMode tests for Serenity.CreateGame.Infrastructure.Editor.BootTaskRequirements — the declared "this task needs that system" table. Two of them are guards rather than behavior checks: a requirement naming something outside SerenityInstallableSystemCatalog would silently never gate anything, and a requiring task with no Serenity.CreateGame.Infrastructure.Editor.BootTaskCanonicalOrder slot could never be placed back into a profile.

    BootTaskSelectionRulesTests

    Pure unit tests for FilterBySelection(IReadOnlyList<string>, Func<string, string>, IReadOnlyCollection<string>, IReadOnlyCollection<string>, Func<string, string>) — no AssetDatabase, a fake path-to-method-name resolver stands in for Serenity.Global.Infrastructure.Editor.InitializationPipeline.InstallTaskAuthoring.InstallMethodNameForShippedTaskPath(System.String) and a fake requirement resolver for Serenity.CreateGame.Infrastructure.Editor.BootTaskRequirements.RequiredInstallMethodFor(System.String).

    BootTaskSequenceRulesTests

    Pure unit tests for InsertMissingSelectedTasks(IReadOnlyList<string>, IReadOnlyList<SerenityInstallableSystem>, Func<string, string>, Func<SerenityInstallableSystem, string>, IReadOnlyList<string>) — no AssetDatabase; a synthetic sequence, a synthetic canonical order template and fake path/method-name resolvers stand in for Serenity.CreateGame.Infrastructure.Editor.BootTaskCanonicalOrder and the real project scan SerenityBootTaskCatalog performs in production.

    CreateGameThemeCatalogTests

    EditMode test for Serenity.CreateGame.Infrastructure.Editor.CreateGameThemeCatalog: read-only against the project's real shipped themes under Assets/Serenity/Media/Ui/Themes — no temp folder needed, nothing is written or cleaned up.

    CreateGameWizardCreateFlowTests

    EditMode tests for Serenity.CreateGame.Infrastructure.Editor.CreateGameWizardCreateFlow.PrepareSceneGeneration(System.Func{System.Boolean})'s pure outcome shape — the real EditorSceneManager.SaveCurrentModifiedScenesIfUserWantsTo save-prompt dialog cannot be exercised headless, so every case here injects its own stand-in through the method's saveModifiedScenesIfUserWantsTo seam instead. The TMP-missing branch depends on whether this project has TMP Essential Resources imported, so it is asserted only up to "not declined by the save prompt", matching InitializeSerenityCreateStep's own contract of one log line per outcome rather than one shared blocking message.

    DefaultSettingsAssetCreatorTestSettings

    A throwaway IFoundationSettings asset type for DefaultSettingsAssetCreatorTests. A name of its own (not TestFoundationSettings) is required here: ReflectionActivationUtils.ResolveType falls back to a short-name search across every loaded type, and a second, unrelated TestFoundationSettings already exists (a private nested class in UnityDirectoryClonerTests), which would make that name resolve to nothing.

    DefaultSettingsAssetCreatorTests

    EditMode tests for DefaultSettingsAssetCreator. Every fixture lives under a scratch output root wiped in SetUp()/TearDown(); every test passes registerAsAddressables: false so nothing here touches the Addressables settings.

    InitializeSerenityCreateStepTests

    EditMode tests for Serenity.CreateGame.Infrastructure.Editor.Steps.InitializeSerenityCreateStep.SystemsEligibleForTaskWiring(System.Collections.Generic.IReadOnlyList{Serenity.CreateGame.Infrastructure.Editor.Systems.SerenityInstallableSystem}): a bootstrap system installs unconditionally and never gets its own Initialization Pipeline task, so the Create step's task-wiring fan-out must skip it. Pure — no AssetDatabase, no GUI.

    InitializeSerenityDoneStepComposerTests

    EditMode tests for Serenity.CreateGame.Infrastructure.Editor.InitializeSerenityDoneStepComposer.Build(Serenity.CreateGame.Infrastructure.Editor.Wiring.ProjectWiringResult,System.Int32,Serenity.ProjectRecipe.Infrastructure.Editor.SetupAssistant.MinimalLoopOptions,System.Action{System.String}) — a pure model builder over a ProjectWiringResult, no AssetDatabase writes. Covers the headline naming the wired profile, created-path reporting only naming what this run actually created, and the scene-only next steps appearing exclusively when scene generation succeeded.

    InitializeSerenitySettingsStepTests

    EditMode tests for SettingsRowActionRules: the pure row → action mapping the Settings step's per-row button draws from — no GUI, no AssetDatabase. Also covers Serenity.CreateGame.Infrastructure.Editor.Steps.InitializeSerenitySettingsStep's own row-recompute caching (Serenity.CreateGame.Infrastructure.Editor.Steps.InitializeSerenitySettingsStep.EnsureRowsForTests(System.Collections.Generic.IReadOnlyList{Serenity.CreateGame.Infrastructure.Editor.Systems.SerenityInstallableSystem},System.String)).

    InitializeSerenitySystemsStepTests

    EditMode tests for Serenity.CreateGame.Infrastructure.Editor.Steps.InitializeSerenitySystemsStep's default selection.

    InitializeSerenityWindowOpenWithSystemSelectedTests

    Proves OpenWithSystemSelected(string) against real window state: the Hub's registered Systems entry point (Task A, slice 2) routes a specific system id here so the reader lands directly on it instead of finding and checking it themselves in the Systems checklist.

    InitializeSerenityWindowStepErrorTests

    Proves Serenity.CreateGame.Infrastructure.Editor.InitializeSerenityWindow.StepErrorForTests(System.Int32) against real window state, without an OnGUI pass — mirrors CreateModalWindowStepErrorGateTests's pattern. The Systems case is deliberately a "reports no error" assertion: an empty system selection is allowed (a reader who wants only the wired pipeline itself is not blocked) and must never gate Next/Create, unlike an empty project name or an unacceptable output root.

    InstallableSystemDependencyOrderTests

    EditMode tests for InstallableSystemDependencyOrder against synthetic graphs — no AppDomain scan involved. SerenityInstallableSystemCatalogTests covers the real catalog's end-to-end order.

    PersistenceBackendCreationMenuTests

    EditMode tests for PersistenceBackendCreationMenu: every concrete UnityStructuredBackendDefinition subtype is offered, and creating one lands the asset under the output root's Persistence folder, named after the option's display name.

    PipelineProfileRowActionsTests

    EditMode tests for Serenity.CreateGame.Infrastructure.Editor.Steps.PipelineProfileRowActions: the "Boot pipeline" row's two actions with no dialog and no drawing, so both Serenity.CreateGame.Infrastructure.Editor.Steps.PipelineProfileRowGui (IMGUI) and the Hub "Systems" view's own row report the outcome their own way. Every case here takes the early, file-system-free failure path — a real Adopt/Complete run is covered end to end by ProjectPipelineProfileFactoryTests and ProjectPipelineCompletionTests, neither of which this class duplicates.

    PipelineProfileRowRulesTests

    Pure EditMode tests for Serenity.CreateGame.Infrastructure.Editor.Steps.PipelineProfileRowRules — the Settings step's "Boot pipeline" row state-to-badge mapping, and the one line describing what completing the project's own profile would do.

    PipelineProfileRowStateTests

    EditMode tests for Serenity.CreateGame.Infrastructure.Editor.Steps.PipelineProfileRowState: the "Boot pipeline" row's presentation-free state, resolved once and shared by Serenity.CreateGame.Infrastructure.Editor.Steps.PipelineProfileRowGui (IMGUI) and the Hub "Systems" view's own row. Covers the two branches that never touch the shipped-task preview (Serenity.CreateGame.Infrastructure.Editor.Wiring.ProjectPipelineCompletion.Preview(System.String,System.Collections.Generic.IReadOnlyCollection{System.String},System.String,System.String@)) — Create (no project-owned profile) and Ambiguous (more than one) — so no on-disk scratch profile is needed; the Reuse branch is already covered end to end by PipelineProfileRowRulesTests and the step's own recompute tests.

    ProjectPipelineCompletionRulesTests

    Pure unit tests for Serenity.CreateGame.Infrastructure.Editor.Wiring.ProjectPipelineCompletionRules.Plan(System.Collections.Generic.IReadOnlyList{System.String},System.Collections.Generic.IReadOnlyList{System.String},System.Func{System.String,System.String},System.Func{System.String,System.String},System.Collections.Generic.IReadOnlyList{System.String}) — no AssetDatabase: a synthetic profile task list, synthetic shipped/adopted path pairs and a fake twin resolver stand in for the real project scan Serenity.CreateGame.Infrastructure.Editor.Wiring.ProjectPipelineCompletion performs. The real Serenity.CreateGame.Infrastructure.Editor.BootTaskCanonicalOrder IS the template here, since the placements under test are about the actual splash tasks' real neighbours.

    ProjectPipelineCompletionTests

    EditMode tests for Serenity.CreateGame.Infrastructure.Editor.Wiring.ProjectPipelineCompletion — the Reuse-state counterpart of ProjectPipelineProfileFactoryTests. Every test builds its OWN project profile under a disposable scratch root (never InstallTaskAuthoring.FindProjectOwnedProfiles, which would find the real project's own) by seeding it through Serenity.CreateGame.Infrastructure.Editor.Wiring.ProjectPipelineProfileFactory.TryCreateFromShipped(System.String,System.Collections.Generic.IReadOnlyList{System.String},System.Action{System.String},System.String@,System.String@) with both output seams redirected, then completes it and asserts against the profile on disk. The real project's own content is never touched.

    ProjectPipelineProfileFactoryTests

    EditMode tests for Serenity.CreateGame.Infrastructure.Editor.Wiring.ProjectPipelineProfileFactory. Creating a profile now adopts the shipped canonical one (Serenity.CreateGame.Infrastructure.Editor.Wiring.ProjectPipelineAdoption), which clones into Serenity.CreateGame.Infrastructure.Editor.Wiring.ProjectPipelineAdoption.AdoptionOutputRoot before the adopted profile itself is moved to Serenity.CreateGame.Infrastructure.Editor.Wiring.ProjectPipelineProfileFactory.ProjectProfileFolder — so every test here redirects BOTH seams to the same disposable scratch root via Serenity.CreateGame.Infrastructure.Editor.Wiring.ProjectPipelineProfileFactory.SetProjectProfileFolderOverrideForTests(System.String) and Serenity.CreateGame.Infrastructure.Editor.Wiring.ProjectPipelineAdoption.SetAdoptionOutputRootOverrideForTests(System.String) before running and restores them in TearDown() — the real project's own DefaultOutputFolder and Serenity.Global.Infrastructure.Editor.SerenityUserContentPaths.GameRoot are never touched.

    ProjectWiringPinResolutionTests

    EditMode tests for Serenity.CreateGame.Infrastructure.Editor.Wiring.ProjectWiringRunner.ResolveProjectOwnedSettingsPathOrNothing(System.String), the rule behind the four InheritedObjectReference wiring rows: a generated boot scene is pinned to the project's own settings asset when it has one, and to nothing at all when it does not — leaving the shipped installer prefab's own pin in place rather than writing a package path the next Serenity update overwrites.

    Every candidate is a ProjectWiringPinTestSettings asset created through a ScratchAssetFixture, so the candidate set is exactly what each test says it is: under Serenity.CreateGame.Tests.Editor.ProjectWiringPinResolutionTests.PackageScratchFolder for shipped content, under Serenity.CreateGame.Tests.Editor.ProjectWiringPinResolutionTests.ProjectScratchFolder for the project's own.

    ProjectWiringPinTestSettings

    A throwaway settings asset type for ProjectWiringPinResolutionTests, so the fixture owns every candidate the resolver can find instead of racing the shipped assets of a real settings type. Lives in its own same-named file so Unity can bind its script when the tests create it as an asset (mirrors UnityCollectionSettingsLoaderTestSettings). Carries no Id or Guid on purpose: ProjectWiringRunner.ResolveProjectOwnedSettingsPathOrNothing finds candidates by simple type name and decides between them by asset PATH, so a foundation identity surface would be dead weight.

    ProjectWiringPlannerTests

    EditMode tests for Serenity.CreateGame.Infrastructure.Editor.Wiring.ProjectWiringPlanner against real project state. This dev repo IS the Serenity package itself, so it has zero project-owned initialization pipeline profiles by default (see Engram architecture/boot-task-canonical-order) — the "no profile yet" cases read that real state directly. The "one profile" case creates a disposable scratch profile outside Assets/Serenity (project-owned per FoundationAssetOwnership.IsProjectOwnedPath) and deletes it in TearDown(), without Addressables registration.

    ProjectWiringRulesTests

    EditMode tests for Serenity.CreateGame.Infrastructure.Editor.Wiring.ProjectWiringRules — pure state resolution, no AssetDatabase access, so every case here is a plain input/output assertion.

    ProjectWiringRunnerTests

    EditMode tests for Serenity.CreateGame.Infrastructure.Editor.Wiring.ProjectWiringRunner against a disposable scratch output root — the shipped project tree is never written to. Mirrors SerenityCreateGameSceneGeneratorTests's cleanup pattern: every asset a run's OWN generated content lands under Serenity.CreateGame.Tests.Editor.ProjectWiringRunnerTests.ScratchFolder, so TearDown() strips that one subtree's Addressables entries before deleting it — including the project's own initialization pipeline profile, which Serenity.CreateGame.Infrastructure.Editor.Wiring.ProjectPipelineProfileFactory always creates under its own pinned Serenity.CreateGame.Infrastructure.Editor.Wiring.ProjectPipelineProfileFactory.ProjectProfileFolder regardless of Serenity.CreateGame.Tests.Editor.ProjectWiringRunnerTests.OutputRoot, redirected here to a subfolder of Serenity.CreateGame.Tests.Editor.ProjectWiringRunnerTests.ScratchFolder via Serenity.CreateGame.Infrastructure.Editor.Wiring.ProjectPipelineProfileFactory.SetProjectProfileFolderOverrideForTests(System.String). Creating a profile now adopts the shipped canonical one, cloning into Serenity.CreateGame.Infrastructure.Editor.Wiring.ProjectPipelineAdoption.AdoptionOutputRoot first — also redirected here, to Serenity.CreateGame.Tests.Editor.ProjectWiringRunnerTests.ScratchFolder itself, via Serenity.CreateGame.Infrastructure.Editor.Wiring.ProjectPipelineAdoption.SetAdoptionOutputRootOverrideForTests(System.String) — so the real project's own pipeline folder and Assets/Game content are never touched.

    SerenityBootTaskCatalogTests

    EditMode tests for SerenityBootTaskCatalog's selection-aware overload — subtractive (Serenity.CreateGame.Infrastructure.Editor.BootTaskSelectionRules) plus additive (Serenity.CreateGame.Infrastructure.Editor.BootTaskSequenceRules) — exercised against the real shipped canonical profile (read-only for every system tested here — Score's task asset already ships, so no test in this file writes to the project). Score (InstallScore) stands in for "an attributed system's task"; DisableGameWrapper and InstallTimer stand in for infrastructure tasks the shipped profile also carries; the three Play*SplashScreen tasks stand in for "a task that requires a system without being one" (Serenity.CreateGame.Infrastructure.Editor.BootTaskRequirements).

    SerenityBuildSettingsBinderTests

    EditMode tests for Serenity.CreateGame.Infrastructure.Editor.SerenityBuildSettingsBinder. UnityEditor.EditorBuildSettings.scenes is this dev project's REAL boot configuration (it ships Serenity_InitializationScene + GameScene), so every test snapshots the full array in SetUp() and restores it unconditionally in TearDown() — which then asserts the restore actually landed, so a leak into the shared project state fails loudly in the same run instead of silently corrupting it for whatever runs next.

    SerenityCreateGameBootSceneTests

    EditMode tests for the Create Game boot-scene engine. Every test that touches disk points at a private temp folder — the shipped Serenity.CreateGame.Infrastructure.Editor.CreateGameScenePaths.DefaultRootFolder is never written to — and cleans up both the assets and their Addressables entries in TearDown(), mirroring SerenitySampleSceneGeneratorTests.

    SerenityCreateGameSceneGeneratorTests

    EditMode tests for SerenityCreateGameSceneGenerator. Every test that touches disk points at a private temp folder — the shipped Serenity.CreateGame.Infrastructure.Editor.CreateGameScenePaths.DefaultRootFolder is never written to — and cleans up both the assets and their Addressables entries in TearDown(), mirroring SerenityCreateGameBootSceneTests and SerenitySampleSceneGeneratorTests.

    SerenityInstallableSystemCatalogTests

    EditMode tests for SerenityInstallableSystemCatalog: the reflection scan over every [SerenityInstallableSystem]-decorated Install*() method on UnitySerenityInstaller.

    SerenityInstallableSystemSelectionTests

    EditMode tests for SelectTier(IReadOnlyList<SerenityInstallableSystem>, SerenityInstallableSystemTier): no real installer or AssetDatabase content needed, so the catalog is a small in-memory fixture.

    SerenitySystemConfigurationFreshnessWatcherTests

    EditMode tests for SerenitySystemConfigurationFreshnessWatcher. Every test injects its own subscribe/unsubscribe delegates so none of them touch the real UnityEditor.EditorApplication.projectChanged event — a captured handler stands in for a raised project change.

    SerenitySystemConfigurationResolverTests

    EditMode tests for SerenitySystemConfigurationResolver. Every fixture is a real TestFoundationSettings asset created on disk (the identity checks read SerenityHealthCheckValidator.LoadFoundationAssets, a project-wide AssetDatabase scan, so nothing here can be faked in-memory), created in SetUp and removed in TearDown.

    SettingsAdoptionConfirmationGuiTests

    Pure EditMode tests for SettingsAdoptionConfirmationGui's "Ids that will change" block — built directly from hand-authored SystemAdoptionPlan instances (public constructor), so none of these touch AssetDatabase.

    SettingsReferenceRulesTests

    EditMode tests for SettingsReferenceRules: pure field-type-to-system matching and message building — no UnityEditor or AssetDatabase access.

    SettingsRowActionExecutorTests

    EditMode tests for Serenity.CreateGame.Infrastructure.Editor.Steps.SettingsRowActionExecutor: the Settings row action dispatch extracted out of Serenity.CreateGame.Infrastructure.Editor.Steps.InitializeSerenitySettingsStep. Every case avoids any code path that shows a real EditorUtility.DisplayDialog confirmation (Adopt/AdoptAllAssets are exercised only through their own zero-candidate early returns), since nothing in this suite may block a headless run.

    SettingsRowActionRulesTests

    Unit tests for SettingsRowActionRules: the pure primary/secondary action mapping, with no asset on disk needed.

    SettingsRowAssetsBadgeRulesTests

    Pure EditMode tests for SettingsRowAssetsBadgeRules — every combination of shipped and remaining shipped asset counts the Settings step's second row badge can render.

    SettingsRowBootTaskWiringRulesTests

    Pure unit tests for SettingsRowBootTaskWiringRules — no AssetDatabase.

    SettingsRowDependencyRulesTests

    EditMode tests for SettingsRowDependencyRules: the pure "Depends on: ..." line and dependency-not-ready warning tooltip text behind SettingsRowDependencyGui's row, and shared by the Hub "Systems" view's own row.

    SettingsRowReferenceAuditorTests

    EditMode tests for SettingsRowReferenceAuditor against real scratch assets: a TestReferencingFoundationSettings asset with a reference to TestFoundationSettings that was never assigned keeps the row InProject with a warning, naming the field and the system to configure first, and offers Assign; assigning the sole project-owned candidate through SettingsReferenceInspector clears the warning. A reference that WAS assigned and is now dangling (its target deleted) downgrades the row to Invalid instead. Only a project-owned row (InProject) is audited at all — a shipped (InPackage) row's unassigned reference falls back to the factory default and is never flagged.

    ShippedSystemAssetCatalogTests

    Read-only EditMode tests for ShippedSystemAssetCatalog against the real shipped package — every test but RemainingMemberPaths_AfterMirroringOneMember_ExcludesThatMember() reads the project as-is and creates nothing; that one test mirrors a single member into a scratch, non-Addressable output folder, deleted again in TearDown().

    ShippedSystemAssetCountsTests

    EditMode tests for Serenity.CreateGame.Infrastructure.Editor.Systems.ShippedSystemAssetCounts: the shipped-vs-remaining asset count lookup extracted out of Serenity.CreateGame.Infrastructure.Editor.Steps.InitializeSerenitySettingsStep.

    ShippedSystemAssetMembershipRulesTests

    Pure EditMode tests for ShippedSystemAssetMembershipRules — hand-written paths and a hand-written folder-rule table mirroring the relevant subset of UnityAddressablesLabeler.PathRules, so these never touch AssetDatabase and stay independent of the labeler's internal table shape.

    SystemAdoptionClosureRulesTests

    Pure EditMode tests for SystemAdoptionClosureRules — no AssetDatabase, no assets on disk; already-adopted detection is driven by a fake existence predicate.

    SystemAdoptionFolderSummaryTests

    Pure EditMode tests for SystemAdoptionFolderSummary — hand-written entries, no AssetDatabase calls.

    SystemAdoptionPlannerTests

    EditMode tests for SystemAdoptionPlanner: real fixtures under a scratch package folder (a real shipped asset cannot stand in here, since these tests need to control the closure precisely), wiped in both SetUp() and TearDown().

    SystemAdoptionRunnerTests

    EditMode tests for SystemAdoptionRunner and SystemAdoptionVerifier. Every fixture lives under a scratch package folder and a scratch output root, both owned by a ScratchAssetFixture created in SetUp() and disposed in TearDown().

    SystemBootTaskWiringInspectorTests

    EditMode tests for SystemBootTaskWiringInspector. The profile-scanning half of the question is already covered by InstallTaskAuthoringTests.ProjectOwnedProfileNamesByInstallMethodName_* against real scratch profiles; these tests only need a method name real enough that no project profile coincidentally carries it, so a made-up name stands in without needing a scratch fixture of its own.

    TestFoundationSettings

    A throwaway IFoundationSettings asset type for SerenitySystemConfigurationResolverTests. Lives in its own same-named file so Unity can bind its script when the tests create it as an asset (the same reason SettingsAssetResolutionTestSettings gives).

    TestReferencingFoundationSettings

    A throwaway IFoundationSettings asset type for SettingsRowReferenceAuditorTests, carrying a reference to another settings asset (TestFoundationSettings) so the auditor's unassigned-reference detection has a real field to walk. Lives in its own same-named file so Unity can bind its script when the tests create it as an asset (the same reason TestFoundationSettings gives).

    In this article
    © 2026 Serenity. All Rights Reserved