logo SERENITY
Game Systems Foundation
Search Results for

    Show / Hide Table of Contents

    Namespace Serenity.Tests.Editor

    Classes

    AddressablesPathLabelRulesTests

    A module label comes from the module's own location — its media folder, its script folder, its shipped boot task or one of the shipped layout paths — never from a word that happens to appear elsewhere in a path. Only the asset-type words stay word-anywhere, because they say what an asset is.

    AudioChannelGroupReassignerTests

    The Audio Channel Manager's Inconsistencies row says a channel with no usable mixer group can be reassigned "from this tool" — so it can: the row knows which channel it is about, and the reassignment writes the chosen group to that channel's settings through the shipped-content gate.

    ClipSpatialSettingsDraftTests

    The draft is the one carrier of a clip definition's spatial group outside the asset: it starts from the defaults of an untouched definition, writes all five values onto a definition, and applies the same rules as the definition itself.

    CompositeHostedMenuLabelTests

    A composite view hosts its child menus by building owned instances through the menu service, and the menu installer only knows the menu definitions it discovers under the menu label. The shipped composite's child menus live under Media/GeneratedViews, whose folder rule labels them as composite views only, so every boot that installed the menus logged seven "unknown menu definition 'CompositeScreen_*'" warnings and drew the composite empty. A menu definition is a menu wherever it lives: the labeler must say so by its type.

    FoundationEditorIdentityLookupTests

    What an inspector's Id row compares against. Two assets whose Id is still empty share nothing — an empty Id is "not set", never "already in use" — so one asset's inspector never shows a sibling's object chip. And a boot-created service component never exists as an asset of its own, so its inspector does not search the project for one.

    SerenityAddressablesAutoLabelerTests

    Tests for Serenity.Global.Infrastructure.Editor.Utils.SerenityAddressablesAutoLabeler.PartitionCandidates(System.Collections.Generic.IReadOnlyList{System.String},System.Collections.Generic.List{System.String},System.Collections.Generic.List{System.String}): the fix that stops the auto-labeler from only ever seeing .asset imports, so a package asset such as a shipped .wav or .png reaches Serenity.Global.Infrastructure.Editor.Utils.UnityAddressablesLabeler.RetagAssets(System.Collections.Generic.IEnumerable{System.String},System.Collections.Generic.IEnumerable{System.String}) instead of being dropped.

    SerenityAddressablesInstallerTests

    Pins the SessionState bookkeeping Serenity.Global.Infrastructure.Editor.Utils.SerenityAddressablesInstaller.QueueFullRetagAndBuild owns, without letting the deferred ExecutePendingWork pass actually run: the method only schedules that work via EditorApplication.delayCall, which never fires inside a synchronous [Test] method, so asserting the keys right after the call is safe.

    SerenityPackageImportRetaggerTests

    Pure tests for Serenity.Global.Infrastructure.Editor.Utils.SerenityPackageImportRetagger.ContainsPackageContent(System.String[]): the detector that decides whether a completed package import touched Serenity content and must re-arm the full retag.

    UnityAddressablesLabelerCreatorFolderTests

    Every creator of a folder-labelled module writes into a default folder the labeler recognises as that module's: an asset placed there carries the module's label. The creators' own constants are the paths under test, so a creator that moves its default folder without the labeler following fails here.

    UnityAddressablesLabelerModuleLabelOriginTests

    The reverse of DecideLabels_EveryShippedEntry_DerivesNoLabelTheEntryDoesNotAlreadyCarry: every module:* label a committed entry carries is one the labeler derives from the entry's own location, or one an explained exception names. A committed label nothing can derive is a label a retag would never put back, so it can only drift; an exception nothing needs any more is removed.

    UnityAddressablesLabelerRetagNormalizationTests

    EditMode tests for the label-normalization contract Serenity.Global.Infrastructure.Editor.Utils.UnityAddressablesLabeler.RetagAssets(System.Collections.Generic.IEnumerable{System.String},System.Collections.Generic.IEnumerable{System.String}) applies through its AddressablesManagedLabelNormalizer collaborator: module labels are additive-only (a re-evaluation at a new path never strips one an earlier call set), the ownership label (PROJECT_OWNED) is the sole authoritative exception — added or removed to match the asset's current path — and a label outside the managed set is never touched either way. Every fixture is a real asset on disk; the labeler reads real AddressableAssetSettings, so nothing here can be faked in-memory.

    UnityAddressablesLabelerTests

    Tests for the pure path/eligibility logic of Serenity.Global.Infrastructure.Editor.Utils.UnityAddressablesLabeler: Serenity.Global.Infrastructure.Editor.Utils.UnityAddressablesLabeler.IsCandidatePath(System.String) (root-scoped), Serenity.Global.Infrastructure.Editor.Utils.UnityAddressablesLabeler.IsRetagEligible(System.String) (root-agnostic, used by the "Retag Selected" tool) and Serenity.Global.Infrastructure.Editor.Utils.UnityAddressablesLabeler.BuildAddress(System.String). Validates the filtering that decides which assets are eligible for Addressables registration and how their addresses are derived during the retag process.

    UnityAddressablesLabelerWizardFolderTests

    The labels Serenity.Global.Infrastructure.Editor.Utils.UnityAddressablesLabeler derives for what the wizards write into their own default folders, at those literal paths. The Wave Set wizard's stage folder holds both the stage prefab and the wave assets, and the Character wizard writes to a plural folder, so a folder name cannot tell these modules apart: each asset must be labelled by what it is.

    UnityAudioDepthCueGizmoDrawerTests

    The strokes the Play Mode depth-cue gizmo sends to its canvas for one voice, checked against a recording canvas so nothing here touches Handles: a sounding voice is one line from its source to the listener and one label at its source, both in the voice's colour, a voice heard through a portal is two lines through the portal instead of one, and a silent voice draws nothing.

    UnityAudioDepthCueGizmoTests

    The Play Mode depth-cue gizmo: a thin editor-only drawer over a pure model that decides what each voice shows. The line goes from green to red with how occluded the voice is, and the label reads the current cutoff in hertz; nothing of it exists in a player build.

    UnityAudioDepthCueMusicChannelHealthCheckRepairTests

    A music channel with depth cues switched on can never use them, because music channels create no cue filters. The Health Check lists it with a fix that switches the cues off, saves, reports and can be undone, and that fix refuses channels the package ships. A healthy project shows no row.

    UnityAudioDepthCueOcclusionMaskHealthCheckRepairTests

    A channel with depth cues on and no occlusion layer selected is listed in the Health Check with a fix that selects the default physics layers, saves, reports and can be undone, and that fix refuses channels the package ships. A healthy project shows no row.

    UnityAudioDepthCueReverbCapHealthCheckRepairTests

    A channel with the reverb on that allows no reverberated voice can never be heard. The Health Check lists it with a fix that sets the default voice limit, saves, reports and can be undone, and that fix refuses channels the package ships. A healthy project shows no row.

    UnityAudioDepthCueReverbPresetHealthCheckRepairTests

    A channel with the reverb on and the Off preset runs the reverb but starts from a silent room level, so it can never be heard. The Health Check lists it with a fix that selects the default preset, saves and reports, and that fix refuses channels the package ships. A healthy project shows no row.

    UnityAudioDepthCueSettingsDefaultsTests

    The depth-cue settings block must default to "off and inert": a fresh or legacy audio player settings asset behaves exactly as before, and the authored curves are never shared between instances.

    UnityAudioDepthCueSettingsScanTests

    The project-wide scan behind the depth-cue Health Check rows: it names the audio channels whose cues can never react to a wall, whose reverb is silenced by its cap or its preset, and the music channels that carry cues they cannot use (a music channel is listed by the music row only), and stays silent otherwise.

    UnityAudioPlayerClipDefinitionEditorSpatialTests

    The clip definition inspector draws the spatial group under a toggle: the fields are editable only while the toggle is on, and a group the runtime would ignore is reported with the rule it breaks. The disabled state itself is an IMGUI scope, so the contract is held on the two decisions behind it and on a real draw that must not throw.

    UnityAudioPlayerClipDefinitionShippedContentTests

    A clip definition whose stored Audio Clip Path drifted from its clip shows an "Update Audio Clip Path" button. On a definition the package ships the button must refuse — the next package update overwrites that file, which is why the import postprocessor already skips it — and the inspector must say why, while on the author's own copy the button still stores the current path.

    The button runs Serenity.AudioPlayer.Infrastructure.Settings.Editor.UnityAudioPlayerClipPathSync.SyncIfStale(Serenity.AudioPlayer.Infrastructure.Settings.UnityAudioPlayerClipDefinition) and nothing else, so the click is driven through that method: an IMGUI click cannot be synthesized headlessly without the button's rect, which only the inspector's own layout knows. The notice is proven through a real inspector draw. The drift is made in memory only, so the shipped file never holds it.

    UnityAudioPlayerClipPathExplicitSyncTests

    A clip definition's stored Audio Clip Path is repaired only when the author asks: moving the clip or changing its Addressables address leaves the definition's file untouched, the Health Check lists the drift with an "Update Audio Clip Paths" fix that saves, reports and can be undone, and that fix refuses definitions the package ships.

    UnityAudioPlayerServiceFrozenSurfaceTests

    Characterization of the public and protected surface of UnityAudioPlayerService. User subclasses and shipped subclasses (the music player service) are compiled against it, so a member may be added but none of the pinned ones may be removed, renamed, retyped, re-scoped or have its virtual flag changed.

    UnityAudioRoomAuthoringNoticesTests

    What an author is told about an Audio Room, collected without a running game: a room that contains nothing (no enabled trigger collider, a collider that cannot answer, a solid collider), a room with no portal under it, and a healthy room that is told nothing. Portals count when they are real children whose nearest room is this one, active or not.

    UnityAudioRoomComponentEditorTests

    The inspector of an Audio Room: Unity builds it for the room, and every notice about the room is shown as an error when it is one (a solid collider) and as a warning otherwise.

    UnityAudioRoomGizmoDrawerTests

    The strokes the scene gizmos of an Audio Room and an Audio Portal send to their canvas, checked against a recording canvas so nothing here touches Handles: a room is the twelve faint edges of its volume, a portal with a room is a line to the room's centre plus a label, a portal without a room is only a label in its own colour, and a room that contains nothing draws nothing.

    In this article
    © 2026 Serenity. All Rights Reserved