From cba42933896ce022e706495253dfea148ad7911c Mon Sep 17 00:00:00 2001 From: Koji Hasegawa Date: Mon, 11 Aug 2025 09:44:47 +0900 Subject: [PATCH 01/22] Upgrade test-helper packages --- .../Tests/Runtime/MonkeyTest.cs | 10 +++---- .../UGUIExample/Tests/Runtime/MonkeyTest.cs | 12 ++++---- .../Tests/Runtime/UGUIExample.Tests.asmdef | 5 ++-- Packages/manifest.json | 10 +++---- Packages/packages-lock.json | 28 +++++++++---------- 5 files changed, 33 insertions(+), 32 deletions(-) diff --git a/Assets/InputSystemExample/Tests/Runtime/MonkeyTest.cs b/Assets/InputSystemExample/Tests/Runtime/MonkeyTest.cs index 3149f96..8e52372 100644 --- a/Assets/InputSystemExample/Tests/Runtime/MonkeyTest.cs +++ b/Assets/InputSystemExample/Tests/Runtime/MonkeyTest.cs @@ -1,4 +1,4 @@ -// Copyright (c) 2021-2023 Koji Hasegawa. +// Copyright (c) 2021-2025 Koji Hasegawa. // This software is released under the MIT License. using System.Diagnostics.CodeAnalysis; @@ -45,7 +45,7 @@ public void TearDown() [Test] public async Task MonkeyTesting() { - var random = new RandomImpl(); // 擬似乱数生成器 + var random = new RandomWrapper(); // 擬似乱数生成器 Debug.Log($"Random that monkey uses: {random}"); // シード値をログ出力(再現可能にするため) await SceneManager.LoadSceneAsync("InputSystemExample"); @@ -57,8 +57,8 @@ public async Task MonkeyTesting() using (var tokenSource = new CancellationTokenSource()) { - PressKeys(new RandomImpl(random.Next()), tokenSource.Token).Forget(); - MoveMouse(new RandomImpl(random.Next()), tokenSource.Token).Forget(); + PressKeys(new RandomWrapper(random.Next()), tokenSource.Token).Forget(); + MoveMouse(new RandomWrapper(random.Next()), tokenSource.Token).Forget(); var expireTime = Time.time + 10.0f; // 10秒間動作させる(3分以上にする場合はTimeout属性でタイムアウト時間を延長) while (Time.time < expireTime) @@ -117,7 +117,7 @@ private async UniTask MoveMouse(IRandom random, CancellationToken token) while (true) { var mouseDelta = random.NextNormalizedVector2(); // マウスの移動量を抽選 - _input.Set(mouse.delta, mouseDelta); // マウス移動 + _input.Set(mouse.delta, mouseDelta); // マウス移動 await UniTask.NextFrame(cancellationToken: token); } diff --git a/Assets/UGUIExample/Tests/Runtime/MonkeyTest.cs b/Assets/UGUIExample/Tests/Runtime/MonkeyTest.cs index c116947..e37cd5b 100644 --- a/Assets/UGUIExample/Tests/Runtime/MonkeyTest.cs +++ b/Assets/UGUIExample/Tests/Runtime/MonkeyTest.cs @@ -1,12 +1,12 @@ -// Copyright (c) 2021-2023 Koji Hasegawa. +// Copyright (c) 2021-2025 Koji Hasegawa. // This software is released under the MIT License. using System; using System.Threading.Tasks; using Cysharp.Threading.Tasks; using NUnit.Framework; -using TestHelper.Monkey; using TestHelper.Random; +using TestHelper.UI; using UnityEngine; using UnityEngine.SceneManagement; @@ -22,7 +22,7 @@ public class MonkeyTest [Test] public async Task MonkeyTesting() { - var random = new RandomImpl(); // 擬似乱数生成器 + var random = new RandomWrapper(); // 擬似乱数生成器 Debug.Log($"Random that monkey uses: {random}"); // シード値をログ出力 await SceneManager.LoadSceneAsync("MainMenu"); @@ -30,10 +30,10 @@ public async Task MonkeyTesting() var config = new MonkeyConfig { - Lifetime = TimeSpan.FromSeconds(5), // 5秒間動作(3分以上にする場合はTimeout属性でテスト自体のタイムウトを延ばすこと) - DelayMillis = 200, // 操作間隔は200ms + Lifetime = TimeSpan.FromSeconds(5), // 5秒間動作(3分以上にする場合はTimeout属性でテスト自体のタイムウトを延ばすこと) + DelayMillis = 200, // 操作間隔は200ms SecondsToErrorForNoInteractiveComponent = 5, // 5秒無操作で失敗扱い - Random = random, // 擬似乱数生成器を指定 + Random = random, // 擬似乱数生成器を指定 }; await Monkey.Run(config); diff --git a/Assets/UGUIExample/Tests/Runtime/UGUIExample.Tests.asmdef b/Assets/UGUIExample/Tests/Runtime/UGUIExample.Tests.asmdef index 8f87f01..a3d3576 100644 --- a/Assets/UGUIExample/Tests/Runtime/UGUIExample.Tests.asmdef +++ b/Assets/UGUIExample/Tests/Runtime/UGUIExample.Tests.asmdef @@ -1,13 +1,14 @@ { "name": "UGUIExample.Tests", + "rootNamespace": "", "references": [ "UnityEngine.TestRunner", "UnityEditor.TestRunner", "UGUIExample", "UniTask", "TestHelper", - "TestHelper.Monkey", - "TestHelper.Random" + "TestHelper.Random", + "TestHelper.UI" ], "includePlatforms": [], "excludePlatforms": [], diff --git a/Packages/manifest.json b/Packages/manifest.json index 6f8ac7f..3c3133b 100644 --- a/Packages/manifest.json +++ b/Packages/manifest.json @@ -1,12 +1,12 @@ { "dependencies": { "com.cysharp.unitask": "2.5.0", - "com.nowsprinting.create-script-folders-with-tests": "1.2.1", + "com.nowsprinting.create-script-folders-with-tests": "1.2.3", "com.nowsprinting.local-package-sample": "file:../LocalPackages/com.nowsprinting.local-package-sample", - "com.nowsprinting.test-helper": "0.3.0", - "com.nowsprinting.test-helper.input": "1.0.0", - "com.nowsprinting.test-helper.monkey": "0.5.1", - "com.nowsprinting.test-helper.random": "0.2.0", + "com.nowsprinting.test-helper": "1.2.1", + "com.nowsprinting.test-helper.input": "1.0.1", + "com.nowsprinting.test-helper.random": "1.0.0", + "com.nowsprinting.test-helper.ui": "1.0.1", "com.unity.collab-proxy": "1.14.18", "com.unity.ide.rider": "3.0.34", "com.unity.ide.visualstudio": "2.0.22", diff --git a/Packages/packages-lock.json b/Packages/packages-lock.json index 7423698..8263a61 100644 --- a/Packages/packages-lock.json +++ b/Packages/packages-lock.json @@ -8,7 +8,7 @@ "url": "https://package.openupm.com" }, "com.nowsprinting.create-script-folders-with-tests": { - "version": "1.2.1", + "version": "1.2.3", "depth": 0, "source": "registry", "dependencies": {}, @@ -27,8 +27,8 @@ "dependencies": {} }, "com.nowsprinting.test-helper": { - "version": "0.4.2", - "depth": 1, + "version": "1.2.1", + "depth": 0, "source": "registry", "dependencies": { "com.unity.test-framework": "1.3.4" @@ -36,31 +36,31 @@ "url": "https://package.openupm.com" }, "com.nowsprinting.test-helper.input": { + "version": "1.0.1", + "depth": 0, + "source": "registry", + "dependencies": {}, + "url": "https://package.openupm.com" + }, + "com.nowsprinting.test-helper.random": { "version": "1.0.0", "depth": 0, "source": "registry", "dependencies": {}, "url": "https://package.openupm.com" }, - "com.nowsprinting.test-helper.monkey": { - "version": "0.5.1", + "com.nowsprinting.test-helper.ui": { + "version": "1.0.1", "depth": 0, "source": "registry", "dependencies": { "com.cysharp.unitask": "2.3.3", - "com.nowsprinting.test-helper": "0.4.2", - "com.nowsprinting.test-helper.random": "0.2.0", + "com.nowsprinting.test-helper": "1.1.1", + "com.nowsprinting.test-helper.random": "1.0.0", "com.unity.ugui": "1.0.0" }, "url": "https://package.openupm.com" }, - "com.nowsprinting.test-helper.random": { - "version": "0.2.0", - "depth": 0, - "source": "registry", - "dependencies": {}, - "url": "https://package.openupm.com" - }, "com.unity.addressables": { "version": "1.17.15", "depth": 1, From 573bc53f9cd16bc1e8c19dd4dc21dc648d88a8e9 Mon Sep 17 00:00:00 2001 From: Koji Hasegawa Date: Mon, 11 Aug 2025 06:50:28 +0900 Subject: [PATCH 02/22] Fix BasicExample --- Assets/BasicExample/Scenes/HelloTesting.unity | 396 ------------------ .../Scenes/HelloTesting.unity.meta | 7 - .../Runtime/Entities/CharacterStatus.cs | 16 +- .../Scripts/Runtime/Entities/Enemy.cs | 2 +- .../Scripts/Runtime/Entities/Enums/Element.cs | 84 +--- .../Scripts/Runtime/Entities/IDestructible.cs | 4 +- .../Scripts/Runtime/Entities/Player.cs | 2 +- .../Entities/ScriptableObjects/Race.cs | 2 +- .../Editor/AssetValidators/LevelValidator.cs | 20 +- .../Editor/BasicExample.Editor.Tests.asmdef | 3 +- .../Tests/Runtime/BasicExample.Tests.asmdef | 2 + .../Runtime/Entities/CharacterStatusTest.cs | 62 +-- .../Runtime/Entities/Enums/ElementTest.cs | 30 +- .../Runtime/Entities/PassiveEffectTest.cs | 135 +++--- ProjectSettings/EditorBuildSettings.asset | 4 +- ProjectSettings/ProjectSettings.asset | 191 ++++++++- README.md | 4 +- 17 files changed, 343 insertions(+), 621 deletions(-) delete mode 100644 Assets/BasicExample/Scenes/HelloTesting.unity delete mode 100644 Assets/BasicExample/Scenes/HelloTesting.unity.meta diff --git a/Assets/BasicExample/Scenes/HelloTesting.unity b/Assets/BasicExample/Scenes/HelloTesting.unity deleted file mode 100644 index 1052144..0000000 --- a/Assets/BasicExample/Scenes/HelloTesting.unity +++ /dev/null @@ -1,396 +0,0 @@ -%YAML 1.1 -%TAG !u! tag:unity3d.com,2011: ---- !u!29 &1 -OcclusionCullingSettings: - m_ObjectHideFlags: 0 - serializedVersion: 2 - m_OcclusionBakeSettings: - smallestOccluder: 5 - smallestHole: 0.25 - backfaceThreshold: 100 - m_SceneGUID: 00000000000000000000000000000000 - m_OcclusionCullingData: {fileID: 0} ---- !u!104 &2 -RenderSettings: - m_ObjectHideFlags: 0 - serializedVersion: 9 - m_Fog: 0 - m_FogColor: {r: 0.5, g: 0.5, b: 0.5, a: 1} - m_FogMode: 3 - m_FogDensity: 0.01 - m_LinearFogStart: 0 - m_LinearFogEnd: 300 - m_AmbientSkyColor: {r: 0.212, g: 0.227, b: 0.259, a: 1} - m_AmbientEquatorColor: {r: 0.114, g: 0.125, b: 0.133, a: 1} - m_AmbientGroundColor: {r: 0.047, g: 0.043, b: 0.035, a: 1} - m_AmbientIntensity: 1 - m_AmbientMode: 0 - m_SubtractiveShadowColor: {r: 0.42, g: 0.478, b: 0.627, a: 1} - m_SkyboxMaterial: {fileID: 10304, guid: 0000000000000000f000000000000000, type: 0} - m_HaloStrength: 0.5 - m_FlareStrength: 1 - m_FlareFadeSpeed: 3 - m_HaloTexture: {fileID: 0} - m_SpotCookie: {fileID: 10001, guid: 0000000000000000e000000000000000, type: 0} - m_DefaultReflectionMode: 0 - m_DefaultReflectionResolution: 128 - m_ReflectionBounces: 1 - m_ReflectionIntensity: 1 - m_CustomReflection: {fileID: 0} - m_Sun: {fileID: 0} - m_IndirectSpecularColor: {r: 0.44657838, g: 0.49641234, b: 0.57481676, a: 1} - m_UseRadianceAmbientProbe: 0 ---- !u!157 &3 -LightmapSettings: - m_ObjectHideFlags: 0 - serializedVersion: 12 - m_GIWorkflowMode: 1 - m_GISettings: - serializedVersion: 2 - m_BounceScale: 1 - m_IndirectOutputScale: 1 - m_AlbedoBoost: 1 - m_EnvironmentLightingMode: 0 - m_EnableBakedLightmaps: 1 - m_EnableRealtimeLightmaps: 0 - m_LightmapEditorSettings: - serializedVersion: 12 - m_Resolution: 2 - m_BakeResolution: 40 - m_AtlasSize: 1024 - m_AO: 0 - m_AOMaxDistance: 1 - m_CompAOExponent: 1 - m_CompAOExponentDirect: 0 - m_ExtractAmbientOcclusion: 0 - m_Padding: 2 - m_LightmapParameters: {fileID: 0} - m_LightmapsBakeMode: 1 - m_TextureCompression: 1 - m_FinalGather: 0 - m_FinalGatherFiltering: 1 - m_FinalGatherRayCount: 256 - m_ReflectionCompression: 2 - m_MixedBakeMode: 2 - m_BakeBackend: 1 - m_PVRSampling: 1 - m_PVRDirectSampleCount: 32 - m_PVRSampleCount: 512 - m_PVRBounces: 2 - m_PVREnvironmentSampleCount: 256 - m_PVREnvironmentReferencePointCount: 2048 - m_PVRFilteringMode: 1 - m_PVRDenoiserTypeDirect: 1 - m_PVRDenoiserTypeIndirect: 1 - m_PVRDenoiserTypeAO: 1 - m_PVRFilterTypeDirect: 0 - m_PVRFilterTypeIndirect: 0 - m_PVRFilterTypeAO: 0 - m_PVREnvironmentMIS: 1 - m_PVRCulling: 1 - m_PVRFilteringGaussRadiusDirect: 1 - m_PVRFilteringGaussRadiusIndirect: 5 - m_PVRFilteringGaussRadiusAO: 2 - m_PVRFilteringAtrousPositionSigmaDirect: 0.5 - m_PVRFilteringAtrousPositionSigmaIndirect: 2 - m_PVRFilteringAtrousPositionSigmaAO: 1 - m_ExportTrainingData: 0 - m_TrainingDataDestination: TrainingData - m_LightProbeSampleCountMultiplier: 4 - m_LightingDataAsset: {fileID: 0} - m_LightingSettings: {fileID: 0} ---- !u!196 &4 -NavMeshSettings: - serializedVersion: 2 - m_ObjectHideFlags: 0 - m_BuildSettings: - serializedVersion: 2 - agentTypeID: 0 - agentRadius: 0.5 - agentHeight: 2 - agentSlope: 45 - agentClimb: 0.4 - ledgeDropHeight: 0 - maxJumpAcrossDistance: 0 - minRegionArea: 2 - manualCellSize: 0 - cellSize: 0.16666667 - manualTileSize: 0 - tileSize: 256 - accuratePlacement: 0 - maxJobWorkers: 0 - preserveTilesOutsideBounds: 0 - debug: - m_Flags: 0 - m_NavMeshData: {fileID: 0} ---- !u!1 &659326155 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 659326159} - - component: {fileID: 659326158} - - component: {fileID: 659326157} - - component: {fileID: 659326156} - m_Layer: 0 - m_Name: Cube - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!65 &659326156 -BoxCollider: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 659326155} - m_Material: {fileID: 0} - m_IsTrigger: 0 - m_Enabled: 1 - serializedVersion: 2 - m_Size: {x: 1, y: 1, z: 1} - m_Center: {x: 0, y: 0, z: 0} ---- !u!23 &659326157 -MeshRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 659326155} - m_Enabled: 1 - m_CastShadows: 1 - m_ReceiveShadows: 1 - m_DynamicOccludee: 1 - m_MotionVectors: 1 - m_LightProbeUsage: 1 - m_ReflectionProbeUsage: 1 - m_RayTracingMode: 2 - m_RayTraceProcedural: 0 - m_RenderingLayerMask: 1 - m_RendererPriority: 0 - m_Materials: - - {fileID: 10303, guid: 0000000000000000f000000000000000, type: 0} - m_StaticBatchInfo: - firstSubMesh: 0 - subMeshCount: 0 - m_StaticBatchRoot: {fileID: 0} - m_ProbeAnchor: {fileID: 0} - m_LightProbeVolumeOverride: {fileID: 0} - m_ScaleInLightmap: 1 - m_ReceiveGI: 1 - m_PreserveUVs: 0 - m_IgnoreNormalsForChartDetection: 0 - m_ImportantGI: 0 - m_StitchLightmapSeams: 1 - m_SelectedEditorRenderState: 3 - m_MinimumChartSize: 4 - m_AutoUVMaxDistance: 0.5 - m_AutoUVMaxAngle: 89 - m_LightmapParameters: {fileID: 0} - m_SortingLayerID: 0 - m_SortingLayer: 0 - m_SortingOrder: 0 - m_AdditionalVertexStreams: {fileID: 0} ---- !u!33 &659326158 -MeshFilter: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 659326155} - m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} ---- !u!4 &659326159 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 659326155} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 924.2142, y: 351.34674, z: -17.195045} - m_LocalScale: {x: 1, y: 1, z: 1} - m_Children: [] - m_Father: {fileID: 0} - m_RootOrder: 2 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!1 &1155269674 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 1155269676} - - component: {fileID: 1155269675} - m_Layer: 0 - m_Name: Directional Light - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!108 &1155269675 -Light: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1155269674} - m_Enabled: 1 - serializedVersion: 10 - m_Type: 1 - m_Shape: 0 - m_Color: {r: 1, g: 0.95686275, b: 0.8392157, a: 1} - m_Intensity: 1 - m_Range: 10 - m_SpotAngle: 30 - m_InnerSpotAngle: 21.80208 - m_CookieSize: 10 - m_Shadows: - m_Type: 2 - m_Resolution: -1 - m_CustomResolution: -1 - m_Strength: 1 - m_Bias: 0.05 - m_NormalBias: 0.4 - m_NearPlane: 0.2 - m_CullingMatrixOverride: - e00: 1 - e01: 0 - e02: 0 - e03: 0 - e10: 0 - e11: 1 - e12: 0 - e13: 0 - e20: 0 - e21: 0 - e22: 1 - e23: 0 - e30: 0 - e31: 0 - e32: 0 - e33: 1 - m_UseCullingMatrixOverride: 0 - m_Cookie: {fileID: 0} - m_DrawHalo: 0 - m_Flare: {fileID: 0} - m_RenderMode: 0 - m_CullingMask: - serializedVersion: 2 - m_Bits: 4294967295 - m_RenderingLayerMask: 1 - m_Lightmapping: 4 - m_LightShadowCasterMode: 0 - m_AreaSize: {x: 1, y: 1} - m_BounceIntensity: 1 - m_ColorTemperature: 6570 - m_UseColorTemperature: 0 - m_BoundingSphereOverride: {x: 0, y: 0, z: 0, w: 0} - m_UseBoundingSphereOverride: 0 - m_UseViewFrustumForShadowCasterCull: 1 - m_ShadowRadius: 0 - m_ShadowAngle: 0 ---- !u!4 &1155269676 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1155269674} - m_LocalRotation: {x: 0.40821788, y: -0.23456968, z: 0.10938163, w: 0.8754261} - m_LocalPosition: {x: 0, y: 3, z: 0} - m_LocalScale: {x: 1, y: 1, z: 1} - m_Children: [] - m_Father: {fileID: 0} - m_RootOrder: 1 - m_LocalEulerAnglesHint: {x: 50, y: -30, z: 0} ---- !u!1 &1961294089 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 1961294092} - - component: {fileID: 1961294091} - - component: {fileID: 1961294090} - m_Layer: 0 - m_Name: Main Camera - m_TagString: MainCamera - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!81 &1961294090 -AudioListener: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1961294089} - m_Enabled: 1 ---- !u!20 &1961294091 -Camera: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1961294089} - m_Enabled: 1 - serializedVersion: 2 - m_ClearFlags: 1 - m_BackGroundColor: {r: 0.19215687, g: 0.3019608, b: 0.4745098, a: 0} - m_projectionMatrixMode: 1 - m_GateFitMode: 2 - m_FOVAxisMode: 0 - m_SensorSize: {x: 36, y: 24} - m_LensShift: {x: 0, y: 0} - m_FocalLength: 50 - m_NormalizedViewPortRect: - serializedVersion: 2 - x: 0 - y: 0 - width: 1 - height: 1 - near clip plane: 0.3 - far clip plane: 1000 - field of view: 60 - orthographic: 0 - orthographic size: 5 - m_Depth: -1 - m_CullingMask: - serializedVersion: 2 - m_Bits: 4294967295 - m_RenderingPath: -1 - m_TargetTexture: {fileID: 0} - m_TargetDisplay: 0 - m_TargetEye: 3 - m_HDR: 1 - m_AllowMSAA: 1 - m_AllowDynamicResolution: 0 - m_ForceIntoRT: 0 - m_OcclusionCulling: 1 - m_StereoConvergence: 10 - m_StereoSeparation: 0.022 ---- !u!4 &1961294092 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1961294089} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0, y: 1, z: -10} - m_LocalScale: {x: 1, y: 1, z: 1} - m_Children: [] - m_Father: {fileID: 0} - m_RootOrder: 0 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} diff --git a/Assets/BasicExample/Scenes/HelloTesting.unity.meta b/Assets/BasicExample/Scenes/HelloTesting.unity.meta deleted file mode 100644 index 68c3990..0000000 --- a/Assets/BasicExample/Scenes/HelloTesting.unity.meta +++ /dev/null @@ -1,7 +0,0 @@ -fileFormatVersion: 2 -guid: 6c40ba2f8a021430aa36a5cd247cda1e -DefaultImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/BasicExample/Scripts/Runtime/Entities/CharacterStatus.cs b/Assets/BasicExample/Scripts/Runtime/Entities/CharacterStatus.cs index cae15d1..79fed50 100644 --- a/Assets/BasicExample/Scripts/Runtime/Entities/CharacterStatus.cs +++ b/Assets/BasicExample/Scripts/Runtime/Entities/CharacterStatus.cs @@ -17,24 +17,24 @@ public class CharacterStatus : IDestructible [field: SerializeField, Tooltip("属性")] private Element Element { get; set; } - [field: SerializeField, Tooltip("最大ヒットポイント")] - private int MaxHitPoint { get; set; } - [field: SerializeField, Tooltip("防御力(buff分を除く)")] private int Defense { get; set; } [field: SerializeField, Tooltip("攻撃力(buff分を除く)")] private int Attack { get; set; } - public int HitPoint { get; set; } + [field: SerializeField, Tooltip("最大ヒットポイント")] + private int MaxHitPoint { get; set; } + + internal int HitPoint { get; private set; } private HitPointGaugeSetting _bounds; - public CharacterStatus(Element element = Element.None, int hp = 0, int defense = 0, int attack = 0) + public CharacterStatus(Element element = Element.None, int defense = 0, int attack = 0, int hp = 0) { Element = element; - MaxHitPoint = hp; Defense = defense; Attack = attack; + MaxHitPoint = hp; HitPoint = hp; _bounds = ScriptableObject.CreateInstance(); } @@ -53,9 +53,9 @@ public bool IsDestroyed() } /// - public bool TakeDamage(Element element, int attackPower) + public bool TakeDamage(Element element, int attack) { - var attackPowerWithElement = (int)(attackPower * Element.GetDamageMultiplier(element)); + var attackPowerWithElement = (int)(attack * Element.GetDamageMultiplier(element)); var damage = attackPowerWithElement - Defense; if (damage <= 0) { diff --git a/Assets/BasicExample/Scripts/Runtime/Entities/Enemy.cs b/Assets/BasicExample/Scripts/Runtime/Entities/Enemy.cs index ebea3e0..9bcce78 100644 --- a/Assets/BasicExample/Scripts/Runtime/Entities/Enemy.cs +++ b/Assets/BasicExample/Scripts/Runtime/Entities/Enemy.cs @@ -22,6 +22,6 @@ public class Enemy : MonoBehaviour, IDestructible public bool IsDestroyed() => race.IsDestroyed(); /// - public bool TakeDamage(Element element, int attackPower) => race.TakeDamage(element, attackPower); + public bool TakeDamage(Element element, int attack) => race.TakeDamage(element, attack); } } diff --git a/Assets/BasicExample/Scripts/Runtime/Entities/Enums/Element.cs b/Assets/BasicExample/Scripts/Runtime/Entities/Enums/Element.cs index baa0144..aba775e 100644 --- a/Assets/BasicExample/Scripts/Runtime/Entities/Enums/Element.cs +++ b/Assets/BasicExample/Scripts/Runtime/Entities/Enums/Element.cs @@ -1,4 +1,4 @@ -// Copyright (c) 2021 Koji Hasegawa. +// Copyright (c) 2021-2025 Koji Hasegawa. // This software is released under the MIT License. using System; @@ -8,17 +8,12 @@ namespace BasicExample.Entities.Enums /// /// 元素的な属性 /// - /// - /// 当たり障りなさそうな陰陽五行とします。種類は未来永劫バージョンアップしても増えません(フラグ - /// public enum Element { None, - Wood, Fire, Water, - Earth, - Metal, + Wood, } public static class ElementExtensions @@ -34,16 +29,12 @@ public static string GetName(this Element self) { case Element.None: return "無"; - case Element.Wood: - return "木"; case Element.Fire: return "火"; case Element.Water: return "水"; - case Element.Earth: - return "土"; - case Element.Metal: - return "金"; + case Element.Wood: + return "木"; default: throw new ArgumentException($"Unknown Element: {self.ToString()}"); } @@ -53,61 +44,26 @@ public static string GetName(this Element self) /// 属性攻撃を受けたときの被ダメージ倍率を返す /// /// - /// 攻撃の属性 - /// + /// 攻撃側の属性 + /// 被ダメージ倍率 public static float GetDamageMultiplier(this Element self, Element attack) { - switch (self) + if (self == Element.Wood && attack == Element.Fire) { - case Element.Wood: - switch (attack) - { - case Element.Fire: - return 2.0f; - case Element.Water: - return 0.5f; - default: - return 1.0f; - } - case Element.Fire: - switch (attack) - { - case Element.Water: - return 2.0f; - case Element.Wood: - return 0.5f; - default: - return 1.0f; - } - case Element.Water: - switch (attack) - { - case Element.Wood: - return 2.0f; - case Element.Fire: - return 0.5f; - default: - return 1.0f; - } - case Element.Earth: - switch (attack) - { - case Element.Metal: - return 2.0f; - default: - return 0.5f; - } - case Element.Metal: - switch (attack) - { - case Element.Earth: - return 2.0f; - default: - return 0.5f; - } - default: - return 1.0f; + return 2.0f; + } + + if (self == Element.Fire && attack == Element.Water) + { + return 2.0f; } + + if (self == Element.Water && attack == Element.Wood) + { + return 2.0f; + } + + return 1.0f; } } } diff --git a/Assets/BasicExample/Scripts/Runtime/Entities/IDestructible.cs b/Assets/BasicExample/Scripts/Runtime/Entities/IDestructible.cs index 271b67c..8a8a0d6 100644 --- a/Assets/BasicExample/Scripts/Runtime/Entities/IDestructible.cs +++ b/Assets/BasicExample/Scripts/Runtime/Entities/IDestructible.cs @@ -27,8 +27,8 @@ public interface IDestructible /// 攻撃を与える /// /// 攻撃の属性 - /// 攻撃力 + /// 攻撃力 /// true: 1以上のダメージが入った - bool TakeDamage(Element element, int attackPower); + bool TakeDamage(Element element, int attack); } } diff --git a/Assets/BasicExample/Scripts/Runtime/Entities/Player.cs b/Assets/BasicExample/Scripts/Runtime/Entities/Player.cs index f103d47..00ddf67 100644 --- a/Assets/BasicExample/Scripts/Runtime/Entities/Player.cs +++ b/Assets/BasicExample/Scripts/Runtime/Entities/Player.cs @@ -18,6 +18,6 @@ public class Player : MonoBehaviour, IDestructible public bool IsDestroyed() => status.IsDestroyed(); /// - public bool TakeDamage(Element element, int attackPower) => status.TakeDamage(element, attackPower); + public bool TakeDamage(Element element, int attack) => status.TakeDamage(element, attack); } } diff --git a/Assets/BasicExample/Scripts/Runtime/Entities/ScriptableObjects/Race.cs b/Assets/BasicExample/Scripts/Runtime/Entities/ScriptableObjects/Race.cs index a81ca46..16d9125 100644 --- a/Assets/BasicExample/Scripts/Runtime/Entities/ScriptableObjects/Race.cs +++ b/Assets/BasicExample/Scripts/Runtime/Entities/ScriptableObjects/Race.cs @@ -38,6 +38,6 @@ public class Race : ScriptableObject, IDestructible public bool IsDestroyed() => status.IsDestroyed(); /// - public bool TakeDamage(Element element, int attackPower) => status.TakeDamage(element, attackPower); + public bool TakeDamage(Element element, int attack) => status.TakeDamage(element, attack); } } diff --git a/Assets/BasicExample/Tests/Editor/AssetValidators/LevelValidator.cs b/Assets/BasicExample/Tests/Editor/AssetValidators/LevelValidator.cs index d76d689..3392b6f 100644 --- a/Assets/BasicExample/Tests/Editor/AssetValidators/LevelValidator.cs +++ b/Assets/BasicExample/Tests/Editor/AssetValidators/LevelValidator.cs @@ -1,4 +1,4 @@ -// Copyright (c) 2021 Koji Hasegawa. +// Copyright (c) 2021-2025 Koji Hasegawa. // This software is released under the MIT License. using System.Collections.Generic; @@ -17,36 +17,36 @@ namespace BasicExample.Editor.AssetValidators /// - /// /// - /// の応用例 + /// の応用例 /// public class LevelValidator { private static IEnumerable Levels => AssetDatabase - .FindAssets("t:SceneAsset", new [] { "Assets/BasicExample/Scenes/Levels" }) + .FindAssets("t:SceneAsset", new[] { "Assets/BasicExample/Scenes/Levels" }) .Select(AssetDatabase.GUIDToAssetPath); - [TestCaseSource(nameof(Levels))] - public void Levels下のSceneにSpawnPointが設置されていること(string path) + [Test] + public void Levels下のSceneにSpawnPointが1つ設置されていること([ValueSource(nameof(Levels))] string path) { EditorSceneManager.OpenScene(path); var spawnPoints = Object.FindObjectsOfType(); - Assert.That(spawnPoints.Any, Is.True); + Assert.That(spawnPoints, Has.Length.EqualTo(1)); } - [TestCaseSource(nameof(Levels))] - public void Levels下のSceneにExitPointが設置されていること(string path) + [Test] + public void Levels下のSceneにExitPointが設置されていること([ValueSource(nameof(Levels))] string path) { EditorSceneManager.OpenScene(path); var exitPoints = Object.FindObjectsOfType(); - Assert.That(exitPoints.Length, Is.GreaterThanOrEqualTo(1), "ExitPointは1つ以上設定されている"); + Assert.That(exitPoints, Is.Not.Empty, "ExitPointは1つ以上設定されている"); foreach (var exitPoint in exitPoints) { var obj = exitPoint.gameObject; var colliders = obj.GetComponents(); - Assert.That(colliders.Length, Is.GreaterThanOrEqualTo(1), $"{obj.name}にはコライダが設定されている"); + Assert.That(colliders, Is.Not.Empty, $"{obj.name}にはコライダが設定されている"); } } } diff --git a/Assets/BasicExample/Tests/Editor/BasicExample.Editor.Tests.asmdef b/Assets/BasicExample/Tests/Editor/BasicExample.Editor.Tests.asmdef index cfb51bf..625f125 100644 --- a/Assets/BasicExample/Tests/Editor/BasicExample.Editor.Tests.asmdef +++ b/Assets/BasicExample/Tests/Editor/BasicExample.Editor.Tests.asmdef @@ -5,7 +5,8 @@ "UnityEngine.TestRunner", "UnityEditor.TestRunner", "BasicExample.Editor", - "BasicExample" + "BasicExample", + "BasicExample.Tests" ], "includePlatforms": [ "Editor" diff --git a/Assets/BasicExample/Tests/Runtime/BasicExample.Tests.asmdef b/Assets/BasicExample/Tests/Runtime/BasicExample.Tests.asmdef index 4c8f656..8d5a9f0 100644 --- a/Assets/BasicExample/Tests/Runtime/BasicExample.Tests.asmdef +++ b/Assets/BasicExample/Tests/Runtime/BasicExample.Tests.asmdef @@ -4,6 +4,8 @@ "references": [ "UnityEngine.TestRunner", "UnityEditor.TestRunner", + "NUnit.Analyzers_Unity", + "TestHelper", "BasicExample" ], "includePlatforms": [], diff --git a/Assets/BasicExample/Tests/Runtime/Entities/CharacterStatusTest.cs b/Assets/BasicExample/Tests/Runtime/Entities/CharacterStatusTest.cs index c76ee4a..68a2ac1 100644 --- a/Assets/BasicExample/Tests/Runtime/Entities/CharacterStatusTest.cs +++ b/Assets/BasicExample/Tests/Runtime/Entities/CharacterStatusTest.cs @@ -13,67 +13,81 @@ public class CharacterStatusTest public void IsDestroyed_まだ生きている() { var sut = new CharacterStatus(hp: 1); + Assume.That(sut.HitPoint, Is.EqualTo(1)); Assert.That(sut.IsDestroyed(), Is.False); - Assert.That(sut.HitPoint, Is.EqualTo(1)); } [Test] public void IsDestroyed_もう死んでいる() { - var sut = new CharacterStatus(hp: 1); - sut.TakeDamage(Element.None, 1); + var sut = new CharacterStatus(hp: 0); + Assume.That(sut.HitPoint, Is.EqualTo(0)); Assert.That(sut.IsDestroyed(), Is.True); } [Test] - public void TakeDamage_防御力5に対して攻撃力1_被ダメージなし() + public void TakeDamage_防御力3に対して攻撃力1_ダメージなし() { - var sut = new CharacterStatus(element: Element.None, hp: 2, defense: 5); - var damaged = sut.TakeDamage(Element.None, 1); + // Setup + var sut = new CharacterStatus(Element.None, defense: 3); + + // Exercise + var damage = sut.TakeDamage(Element.None, attack: 1); - Assert.That(damaged, Is.False); + // Verify + Assert.That(damage, Is.False); } [Test] - public void TakeDamage_防御力5に対して攻撃力1_HP減少なし() + public void TakeDamage_防御力3に対して攻撃力1_HP減少なし() { - var sut = new CharacterStatus(element: Element.None, hp: 2, defense: 5); - sut.TakeDamage(Element.None, 1); + // Setup + var beforeHp = 100; + var sut = new CharacterStatus(Element.None, defense: 3, hp: beforeHp); + + // Exercise + sut.TakeDamage(Element.None, attack: 1); - Assert.That(sut.HitPoint, Is.EqualTo(2)); + // Verify + var deltaHp = sut.HitPoint - beforeHp; + Assert.That(deltaHp, Is.EqualTo(0)); } [Test] - public void TakeDamage_防御力0に対して攻撃力1_被ダメージあり() + public void TakeDamage_防御力0に対して攻撃力1_ダメージあり() { - var sut = new CharacterStatus(element: Element.None, hp: 2, defense: 0); - var damaged = sut.TakeDamage(Element.None, 1); + var sut = new CharacterStatus(Element.None, defense: 0); - Assert.That(damaged, Is.True); + var damage = sut.TakeDamage(Element.None, attack: 1); + + Assert.That(damage, Is.True); } [Test] public void TakeDamage_防御力2に対して攻撃力3_HPが1減少() { - var sut = new CharacterStatus(element: Element.None, hp: 5, defense: 2); - sut.TakeDamage(element: Element.None, attackPower: 3); + var beforeHp = 100; + var sut = new CharacterStatus(Element.None, defense: 2, hp: beforeHp); + + sut.TakeDamage(Element.None, attack: 3); - var actual = sut.HitPoint - 5; // delta HP - Assert.That(actual, Is.EqualTo(-1)); + var deltaHp = sut.HitPoint - beforeHp; + Assert.That(deltaHp, Is.EqualTo(-1)); } [TestCase(2, 3, -1)] [TestCase(5, 7, -2)] public void TakeDamage_防御力より攻撃力が大きい_HPが差分だけ減少(int defence, int attackPower, int expected) { - var beforeHp = 5; - var sut = new CharacterStatus(element: Element.None, hp: beforeHp, defense: defence); - sut.TakeDamage(element: Element.None, attackPower: attackPower); + var beforeHp = 100; + var sut = new CharacterStatus(Element.None, defense: defence, hp: beforeHp); + + sut.TakeDamage(Element.None, attack: attackPower); - var actual = sut.HitPoint - beforeHp; // delta HP - Assert.That(actual, Is.EqualTo(expected)); + var deltaHp = sut.HitPoint - beforeHp; + Assert.That(deltaHp, Is.EqualTo(expected)); } } } diff --git a/Assets/BasicExample/Tests/Runtime/Entities/Enums/ElementTest.cs b/Assets/BasicExample/Tests/Runtime/Entities/Enums/ElementTest.cs index abe16b3..2ed5c88 100644 --- a/Assets/BasicExample/Tests/Runtime/Entities/Enums/ElementTest.cs +++ b/Assets/BasicExample/Tests/Runtime/Entities/Enums/ElementTest.cs @@ -18,45 +18,17 @@ public class ElementTest [TestCase(Element.Wood, Element.Fire)] [TestCase(Element.Fire, Element.Water)] [TestCase(Element.Water, Element.Wood)] - [TestCase(Element.Earth, Element.Metal)] - [TestCase(Element.Metal, Element.Earth)] public void GetDamageMultiplier_弱点属性からの攻撃_ダメージ2倍(Element defence, Element attack) { var actual = defence.GetDamageMultiplier(attack); Assert.That(actual, Is.EqualTo(2.0f)); } - [TestCase(Element.Wood, Element.Water)] - [TestCase(Element.Fire, Element.Wood)] - [TestCase(Element.Water, Element.Fire)] - public void GetDamageMultiplier_得意属性からの攻撃_ダメージ半減(Element defence, Element attack) - { - var actual = defence.GetDamageMultiplier(attack); - Assert.That(actual, Is.EqualTo(0.5f)); - } - - [Test] - [ParametrizedIgnore(Element.Earth, Element.Metal)] - [ParametrizedIgnore(Element.Metal, Element.Earth)] - public void GetDamageMultiplier_土金の得意属性_ダメージ半減( - [Values(Element.Earth, Element.Metal)] Element defence, - [Values] Element attack) - { - var actual = defence.GetDamageMultiplier(attack); - Assert.That(actual, Is.EqualTo(0.5f)); - } - [Test] [ParametrizedIgnore(Element.Wood, Element.Fire)] [ParametrizedIgnore(Element.Fire, Element.Water)] [ParametrizedIgnore(Element.Water, Element.Wood)] - [ParametrizedIgnore(Element.Wood, Element.Water)] - [ParametrizedIgnore(Element.Fire, Element.Wood)] - [ParametrizedIgnore(Element.Water, Element.Fire)] - public void GetDamageMultiplier_相性なし_ダメージは等倍( - [Values(Element.None, Element.Wood, Element.Fire, Element.Water)] - Element defence, - [Values] Element attack) + public void GetDamageMultiplier_相性なし_ダメージは等倍([Values] Element defence, [Values] Element attack) { var actual = defence.GetDamageMultiplier(attack); Assert.That(actual, Is.EqualTo(1.0f)); diff --git a/Assets/BasicExample/Tests/Runtime/Entities/PassiveEffectTest.cs b/Assets/BasicExample/Tests/Runtime/Entities/PassiveEffectTest.cs index 9b1d82a..7e2fbd0 100644 --- a/Assets/BasicExample/Tests/Runtime/Entities/PassiveEffectTest.cs +++ b/Assets/BasicExample/Tests/Runtime/Entities/PassiveEffectTest.cs @@ -1,150 +1,143 @@ -// Copyright (c) 2021-2022 Koji Hasegawa. +// Copyright (c) 2021-2025 Koji Hasegawa. // This software is released under the MIT License. using System.Collections; using BasicExample.Entities.Enums; using NUnit.Framework; +using TestHelper.Attributes; using UnityEngine; using UnityEngine.TestTools; -using UnityEngine.TestTools.Utils; namespace BasicExample.Entities { [TestFixture] public class PassiveEffectTest { + private static PassiveEffect CreatePassiveEffect(bool buff = false, bool debuff = false) + { + var passiveEffect = new GameObject().AddComponent(); + + if (buff) + { + passiveEffect.Buff(); + } + + if (debuff) + { + passiveEffect.DeBuff(); + } + + return passiveEffect; + } + [TestFixture] public class 状態遷移テスト { - private static readonly FloatEqualityComparer s_expireTimeComparer = new FloatEqualityComparer(0.1f); - [TestFixture] public class 通常状態からの遷移 { - private PassiveEffect _sut; - - [SetUp] - public void SetUp() - { - _sut = new GameObject().AddComponent(); // 通常状態 - } - [Test] public void デバフ_弱体状態になること() { - _sut.DeBuff(); - Assert.That(_sut.State(), Is.EqualTo(PassiveEffectState.Weakening)); + var sut = CreatePassiveEffect(); + sut.DeBuff(); + Assert.That(sut.State(), Is.EqualTo(PassiveEffectState.Weakening)); } [Test] public void バフ_強化状態になること() { - _sut.Buff(); - Assert.That(_sut.State(), Is.EqualTo(PassiveEffectState.Strengthening)); + var sut = CreatePassiveEffect(); + sut.Buff(); + Assert.That(sut.State(), Is.EqualTo(PassiveEffectState.Strengthening)); } } [TestFixture] public class 弱体状態からの遷移 { - private PassiveEffect _sut; - - [SetUp] - public void SetUp() - { - _sut = new GameObject().AddComponent(); - _sut.DeBuff(); // 弱体状態 - } - - [TearDown] - public void TearDown() + [Test] + public void バフ_通常状態になること() { - Time.timeScale = 1.0f; + var sut = CreatePassiveEffect(debuff: true); + sut.Buff(); + Assert.That(sut.State(), Is.EqualTo(PassiveEffectState.Normal)); } [Test] public void デバフ_弱体状態が維持されること() { - _sut.DeBuff(); - Assert.That(_sut.State(), Is.EqualTo(PassiveEffectState.Weakening)); + var sut = CreatePassiveEffect(debuff: true); + sut.DeBuff(); + Assert.That(sut.State(), Is.EqualTo(PassiveEffectState.Weakening)); } [UnityTest] + [TimeScale(10.0f)] public IEnumerator デバフ_持続時間が30秒にリセットされること() { - Time.timeScale = 100.0f; - yield return new WaitForSeconds(10f); + var sut = CreatePassiveEffect(debuff: true); + yield return new WaitForSeconds(5.0f); + Assume.That(sut.State(), Is.EqualTo(PassiveEffectState.Weakening)); + Assume.That(sut.PassiveEffectExpireTime(), Is.EqualTo(25.0f).Within(0.1f)); - _sut.DeBuff(); - Assert.That(_sut.State(), Is.EqualTo(PassiveEffectState.Weakening)); - Assert.That(_sut.PassiveEffectExpireTime(), Is.EqualTo(30f).Using(s_expireTimeComparer)); - } + sut.DeBuff(); - [Test] - public void バフ_通常状態になること() - { - _sut.Buff(); - Assert.That(_sut.State(), Is.EqualTo(PassiveEffectState.Normal)); + Assert.That(sut.State(), Is.EqualTo(PassiveEffectState.Weakening)); + Assert.That(sut.PassiveEffectExpireTime(), Is.EqualTo(30.0f).Within(0.1f)); } [UnityTest] + [TimeScale(10.0f)] public IEnumerator 時間切れ_通常状態になること() { - Time.timeScale = 100.0f; - yield return new WaitForSeconds(30f); - Assert.That(_sut.State(), Is.EqualTo(PassiveEffectState.Normal)); + var sut = CreatePassiveEffect(debuff: true); + yield return new WaitForSeconds(30.2f); + Assert.That(sut.State(), Is.EqualTo(PassiveEffectState.Normal)); } } [TestFixture] public class 強化状態からの遷移 { - private PassiveEffect _sut; - - [SetUp] - public void SetUp() - { - _sut = new GameObject().AddComponent(); - _sut.Buff(); // 強化状態 - } - - [TearDown] - public void TearDown() - { - Time.timeScale = 1.0f; - } - [Test] public void デバフ_通常状態になること() { - _sut.DeBuff(); - Assert.That(_sut.State(), Is.EqualTo(PassiveEffectState.Normal)); + var sut = CreatePassiveEffect(buff: true); + sut.DeBuff(); + Assert.That(sut.State(), Is.EqualTo(PassiveEffectState.Normal)); } [Test] public void バフ_強化状態が維持されること() { - _sut.Buff(); - Assert.That(_sut.State(), Is.EqualTo(PassiveEffectState.Strengthening)); + var sut = CreatePassiveEffect(buff: true); + sut.Buff(); + Assert.That(sut.State(), Is.EqualTo(PassiveEffectState.Strengthening)); } [UnityTest] + [TimeScale(10.0f)] public IEnumerator バフ_持続時間が30秒にリセットされること() { - Time.timeScale = 100.0f; - yield return new WaitForSeconds(10f); + var sut = CreatePassiveEffect(buff: true); + yield return new WaitForSeconds(5.0f); + Assume.That(sut.State(), Is.EqualTo(PassiveEffectState.Strengthening)); + Assume.That(sut.PassiveEffectExpireTime(), Is.EqualTo(25.0f).Within(0.1f)); + + sut.Buff(); - _sut.Buff(); - Assert.That(_sut.State(), Is.EqualTo(PassiveEffectState.Strengthening)); - Assert.That(_sut.PassiveEffectExpireTime(), Is.EqualTo(30f).Using(s_expireTimeComparer)); + Assert.That(sut.State(), Is.EqualTo(PassiveEffectState.Strengthening)); + Assert.That(sut.PassiveEffectExpireTime(), Is.EqualTo(30.0f).Within(0.1f)); } [UnityTest] + [TimeScale(10.0f)] public IEnumerator 時間切れ_通常状態になること() { - Time.timeScale = 100.0f; - yield return new WaitForSeconds(30f); - Assert.That(_sut.State(), Is.EqualTo(PassiveEffectState.Normal)); + var sut = CreatePassiveEffect(buff: true); + yield return new WaitForSeconds(30.2f); + Assert.That(sut.State(), Is.EqualTo(PassiveEffectState.Normal)); } } } diff --git a/ProjectSettings/EditorBuildSettings.asset b/ProjectSettings/EditorBuildSettings.asset index 6c643e9..06220e9 100644 --- a/ProjectSettings/EditorBuildSettings.asset +++ b/ProjectSettings/EditorBuildSettings.asset @@ -5,9 +5,6 @@ EditorBuildSettings: m_ObjectHideFlags: 0 serializedVersion: 2 m_Scenes: - - enabled: 1 - path: Assets/BasicExample/Scenes/HelloTesting.unity - guid: 6c40ba2f8a021430aa36a5cd247cda1e - enabled: 1 path: Assets/UGUIExample/Scenes/Login.unity guid: e961a5fcab8254ba686099f605955a02 @@ -27,3 +24,4 @@ EditorBuildSettings: path: Assets/InputSystemExample/Scenes/InputSystemExample.unity guid: 780082c79f65c4193aeff19ec9b21382 m_configObjects: {} + m_UseUCBPForAssetBundles: 0 diff --git a/ProjectSettings/ProjectSettings.asset b/ProjectSettings/ProjectSettings.asset index 549aad2..798cd3e 100644 --- a/ProjectSettings/ProjectSettings.asset +++ b/ProjectSettings/ProjectSettings.asset @@ -275,7 +275,196 @@ PlayerSettings: AndroidValidateAppBundleSize: 1 AndroidAppBundleSizeToValidate: 150 m_BuildTargetIcons: [] - m_BuildTargetPlatformIcons: [] + m_BuildTargetPlatformIcons: + - m_BuildTarget: iPhone + m_Icons: + - m_Textures: [] + m_Width: 180 + m_Height: 180 + m_Kind: 0 + m_SubKind: iPhone + - m_Textures: [] + m_Width: 120 + m_Height: 120 + m_Kind: 0 + m_SubKind: iPhone + - m_Textures: [] + m_Width: 167 + m_Height: 167 + m_Kind: 0 + m_SubKind: iPad + - m_Textures: [] + m_Width: 152 + m_Height: 152 + m_Kind: 0 + m_SubKind: iPad + - m_Textures: [] + m_Width: 76 + m_Height: 76 + m_Kind: 0 + m_SubKind: iPad + - m_Textures: [] + m_Width: 120 + m_Height: 120 + m_Kind: 3 + m_SubKind: iPhone + - m_Textures: [] + m_Width: 80 + m_Height: 80 + m_Kind: 3 + m_SubKind: iPhone + - m_Textures: [] + m_Width: 80 + m_Height: 80 + m_Kind: 3 + m_SubKind: iPad + - m_Textures: [] + m_Width: 40 + m_Height: 40 + m_Kind: 3 + m_SubKind: iPad + - m_Textures: [] + m_Width: 87 + m_Height: 87 + m_Kind: 1 + m_SubKind: iPhone + - m_Textures: [] + m_Width: 58 + m_Height: 58 + m_Kind: 1 + m_SubKind: iPhone + - m_Textures: [] + m_Width: 29 + m_Height: 29 + m_Kind: 1 + m_SubKind: iPhone + - m_Textures: [] + m_Width: 58 + m_Height: 58 + m_Kind: 1 + m_SubKind: iPad + - m_Textures: [] + m_Width: 29 + m_Height: 29 + m_Kind: 1 + m_SubKind: iPad + - m_Textures: [] + m_Width: 60 + m_Height: 60 + m_Kind: 2 + m_SubKind: iPhone + - m_Textures: [] + m_Width: 40 + m_Height: 40 + m_Kind: 2 + m_SubKind: iPhone + - m_Textures: [] + m_Width: 40 + m_Height: 40 + m_Kind: 2 + m_SubKind: iPad + - m_Textures: [] + m_Width: 20 + m_Height: 20 + m_Kind: 2 + m_SubKind: iPad + - m_Textures: [] + m_Width: 1024 + m_Height: 1024 + m_Kind: 4 + m_SubKind: App Store + - m_BuildTarget: Android + m_Icons: + - m_Textures: [] + m_Width: 432 + m_Height: 432 + m_Kind: 2 + m_SubKind: + - m_Textures: [] + m_Width: 324 + m_Height: 324 + m_Kind: 2 + m_SubKind: + - m_Textures: [] + m_Width: 216 + m_Height: 216 + m_Kind: 2 + m_SubKind: + - m_Textures: [] + m_Width: 162 + m_Height: 162 + m_Kind: 2 + m_SubKind: + - m_Textures: [] + m_Width: 108 + m_Height: 108 + m_Kind: 2 + m_SubKind: + - m_Textures: [] + m_Width: 81 + m_Height: 81 + m_Kind: 2 + m_SubKind: + - m_Textures: [] + m_Width: 192 + m_Height: 192 + m_Kind: 1 + m_SubKind: + - m_Textures: [] + m_Width: 144 + m_Height: 144 + m_Kind: 1 + m_SubKind: + - m_Textures: [] + m_Width: 96 + m_Height: 96 + m_Kind: 1 + m_SubKind: + - m_Textures: [] + m_Width: 72 + m_Height: 72 + m_Kind: 1 + m_SubKind: + - m_Textures: [] + m_Width: 48 + m_Height: 48 + m_Kind: 1 + m_SubKind: + - m_Textures: [] + m_Width: 36 + m_Height: 36 + m_Kind: 1 + m_SubKind: + - m_Textures: [] + m_Width: 192 + m_Height: 192 + m_Kind: 0 + m_SubKind: + - m_Textures: [] + m_Width: 144 + m_Height: 144 + m_Kind: 0 + m_SubKind: + - m_Textures: [] + m_Width: 96 + m_Height: 96 + m_Kind: 0 + m_SubKind: + - m_Textures: [] + m_Width: 72 + m_Height: 72 + m_Kind: 0 + m_SubKind: + - m_Textures: [] + m_Width: 48 + m_Height: 48 + m_Kind: 0 + m_SubKind: + - m_Textures: [] + m_Width: 36 + m_Height: 36 + m_Kind: 0 + m_SubKind: m_BuildTargetBatching: - m_BuildTarget: Standalone m_StaticBatching: 1 diff --git a/README.md b/README.md index c8de54a..b1b5240 100644 --- a/README.md +++ b/README.md @@ -75,8 +75,8 @@ Assets     │   └── (snip)     └── Tests     ├── Editor -    │   └── AssetValidators -    │      ├── LevelValidator.cs +    │   └── AssetValidators // 「8.4 ValueSource」「10.1 Edit ModeテストでのSceneの使用」 +    │      ├── LevelValidator.cs     │      └── RaceValidator.cs     └── Runtime     └── Entities From edea50d042254e9fa37e3e18fc63f716e3ae0988 Mon Sep 17 00:00:00 2001 From: Koji Hasegawa Date: Tue, 12 Aug 2025 06:14:55 +0900 Subject: [PATCH 03/22] Fix package examples --- .../{Scripts => }/Editor.meta | 0 .../Editor/ExampleForCoverage.cs | 1 + .../Editor/ExampleForCoverage.cs.meta | 0 .../Editor/LocalPackageSample.Editor.asmdef | 0 .../LocalPackageSample.Editor.asmdef.meta | 0 .../{Scripts => }/Runtime.meta | 0 .../Runtime/ExampleForCoverage.cs | 1 + .../Runtime/ExampleForCoverage.cs.meta | 0 .../Runtime/LocalPackageSample.asmdef | 0 .../Runtime/LocalPackageSample.asmdef.meta | 0 ...ackage.unity => SceneInLocalPackage.unity} | 62 ++++++++++++++----- ...ty.meta => SceneInLocalPackage.unity.meta} | 0 .../Scripts.meta | 8 --- .../Editor/BuildAllScenesForTestPlayer.cs | 45 -------------- .../BuildAllScenesForTestPlayer.cs.meta | 3 - .../Tests/Editor/EditorSceneManagerTest.cs | 6 +- .../Runtime/LocalPackageSample.Tests.asmdef | 1 + .../Tests/Runtime/SceneManagerTest.cs | 9 ++- .../Tests/Runtime/Utils.meta | 8 --- .../Tests/Runtime/Utils/TestSceneLoader.cs | 39 ------------ .../Runtime/Utils/TestSceneLoader.cs.meta | 3 - .../{Scripts => }/Editor.meta | 0 .../EmbeddedPackageSample.Editor.asmdef | 0 .../EmbeddedPackageSample.Editor.asmdef.meta | 0 .../Editor/ExampleForCoverage.cs | 1 + .../Editor/ExampleForCoverage.cs.meta | 0 .../{Scripts => }/Runtime.meta | 0 .../Runtime/EmbeddedPackageSample.asmdef | 0 .../Runtime/EmbeddedPackageSample.asmdef.meta | 0 .../Runtime/ExampleForCoverage.cs | 1 + .../Runtime/ExampleForCoverage.cs.meta | 0 ...age.unity => SceneInEmbeddedPackage.unity} | 62 ++++++++++++++----- ...meta => SceneInEmbeddedPackage.unity.meta} | 0 .../Scripts.meta | 8 --- .../Editor/BuildAllScenesForTestPlayer.cs | 45 -------------- .../BuildAllScenesForTestPlayer.cs.meta | 11 ---- .../Tests/Editor/EditorSceneManagerTest.cs | 6 +- .../EmbeddedPackageSample.Tests.asmdef | 1 + .../Tests/Runtime/SceneManagerTest.cs | 9 ++- .../Tests/Runtime/Utils.meta | 3 - .../Tests/Runtime/Utils/TestSceneLoader.cs | 39 ------------ .../Runtime/Utils/TestSceneLoader.cs.meta | 3 - README.md | 12 ++-- 43 files changed, 118 insertions(+), 269 deletions(-) rename LocalPackages/com.nowsprinting.local-package-sample/{Scripts => }/Editor.meta (100%) rename LocalPackages/com.nowsprinting.local-package-sample/{Scripts => }/Editor/ExampleForCoverage.cs (99%) rename LocalPackages/com.nowsprinting.local-package-sample/{Scripts => }/Editor/ExampleForCoverage.cs.meta (100%) rename LocalPackages/com.nowsprinting.local-package-sample/{Scripts => }/Editor/LocalPackageSample.Editor.asmdef (100%) rename LocalPackages/com.nowsprinting.local-package-sample/{Scripts => }/Editor/LocalPackageSample.Editor.asmdef.meta (100%) rename LocalPackages/com.nowsprinting.local-package-sample/{Scripts => }/Runtime.meta (100%) rename LocalPackages/com.nowsprinting.local-package-sample/{Scripts => }/Runtime/ExampleForCoverage.cs (99%) rename LocalPackages/com.nowsprinting.local-package-sample/{Scripts => }/Runtime/ExampleForCoverage.cs.meta (100%) rename LocalPackages/com.nowsprinting.local-package-sample/{Scripts => }/Runtime/LocalPackageSample.asmdef (100%) rename LocalPackages/com.nowsprinting.local-package-sample/{Scripts => }/Runtime/LocalPackageSample.asmdef.meta (100%) rename LocalPackages/com.nowsprinting.local-package-sample/Scenes/{SceneInPackage.unity => SceneInLocalPackage.unity} (90%) rename LocalPackages/com.nowsprinting.local-package-sample/Scenes/{SceneInPackage.unity.meta => SceneInLocalPackage.unity.meta} (100%) delete mode 100644 LocalPackages/com.nowsprinting.local-package-sample/Scripts.meta delete mode 100644 LocalPackages/com.nowsprinting.local-package-sample/Scripts/Editor/BuildAllScenesForTestPlayer.cs delete mode 100644 LocalPackages/com.nowsprinting.local-package-sample/Scripts/Editor/BuildAllScenesForTestPlayer.cs.meta delete mode 100644 LocalPackages/com.nowsprinting.local-package-sample/Tests/Runtime/Utils.meta delete mode 100644 LocalPackages/com.nowsprinting.local-package-sample/Tests/Runtime/Utils/TestSceneLoader.cs delete mode 100644 LocalPackages/com.nowsprinting.local-package-sample/Tests/Runtime/Utils/TestSceneLoader.cs.meta rename Packages/com.nowsprinting.embedded-package-sample/{Scripts => }/Editor.meta (100%) rename Packages/com.nowsprinting.embedded-package-sample/{Scripts => }/Editor/EmbeddedPackageSample.Editor.asmdef (100%) rename Packages/com.nowsprinting.embedded-package-sample/{Scripts => }/Editor/EmbeddedPackageSample.Editor.asmdef.meta (100%) rename Packages/com.nowsprinting.embedded-package-sample/{Scripts => }/Editor/ExampleForCoverage.cs (99%) rename Packages/com.nowsprinting.embedded-package-sample/{Scripts => }/Editor/ExampleForCoverage.cs.meta (100%) rename Packages/com.nowsprinting.embedded-package-sample/{Scripts => }/Runtime.meta (100%) rename Packages/com.nowsprinting.embedded-package-sample/{Scripts => }/Runtime/EmbeddedPackageSample.asmdef (100%) rename Packages/com.nowsprinting.embedded-package-sample/{Scripts => }/Runtime/EmbeddedPackageSample.asmdef.meta (100%) rename Packages/com.nowsprinting.embedded-package-sample/{Scripts => }/Runtime/ExampleForCoverage.cs (99%) rename Packages/com.nowsprinting.embedded-package-sample/{Scripts => }/Runtime/ExampleForCoverage.cs.meta (100%) rename Packages/com.nowsprinting.embedded-package-sample/Scenes/{SceneInPackage.unity => SceneInEmbeddedPackage.unity} (90%) rename Packages/com.nowsprinting.embedded-package-sample/Scenes/{SceneInPackage.unity.meta => SceneInEmbeddedPackage.unity.meta} (100%) delete mode 100644 Packages/com.nowsprinting.embedded-package-sample/Scripts.meta delete mode 100644 Packages/com.nowsprinting.embedded-package-sample/Scripts/Editor/BuildAllScenesForTestPlayer.cs delete mode 100644 Packages/com.nowsprinting.embedded-package-sample/Scripts/Editor/BuildAllScenesForTestPlayer.cs.meta delete mode 100644 Packages/com.nowsprinting.embedded-package-sample/Tests/Runtime/Utils.meta delete mode 100644 Packages/com.nowsprinting.embedded-package-sample/Tests/Runtime/Utils/TestSceneLoader.cs delete mode 100644 Packages/com.nowsprinting.embedded-package-sample/Tests/Runtime/Utils/TestSceneLoader.cs.meta diff --git a/LocalPackages/com.nowsprinting.local-package-sample/Scripts/Editor.meta b/LocalPackages/com.nowsprinting.local-package-sample/Editor.meta similarity index 100% rename from LocalPackages/com.nowsprinting.local-package-sample/Scripts/Editor.meta rename to LocalPackages/com.nowsprinting.local-package-sample/Editor.meta diff --git a/LocalPackages/com.nowsprinting.local-package-sample/Scripts/Editor/ExampleForCoverage.cs b/LocalPackages/com.nowsprinting.local-package-sample/Editor/ExampleForCoverage.cs similarity index 99% rename from LocalPackages/com.nowsprinting.local-package-sample/Scripts/Editor/ExampleForCoverage.cs rename to LocalPackages/com.nowsprinting.local-package-sample/Editor/ExampleForCoverage.cs index e8b8e09..49cc0a9 100644 --- a/LocalPackages/com.nowsprinting.local-package-sample/Scripts/Editor/ExampleForCoverage.cs +++ b/LocalPackages/com.nowsprinting.local-package-sample/Editor/ExampleForCoverage.cs @@ -2,6 +2,7 @@ // This software is released under the MIT License. // ReSharper disable once CheckNamespace (rootNamespace not work in Unity 2019) + namespace LocalPackageSample.Editor { public static class ExampleForCoverage diff --git a/LocalPackages/com.nowsprinting.local-package-sample/Scripts/Editor/ExampleForCoverage.cs.meta b/LocalPackages/com.nowsprinting.local-package-sample/Editor/ExampleForCoverage.cs.meta similarity index 100% rename from LocalPackages/com.nowsprinting.local-package-sample/Scripts/Editor/ExampleForCoverage.cs.meta rename to LocalPackages/com.nowsprinting.local-package-sample/Editor/ExampleForCoverage.cs.meta diff --git a/LocalPackages/com.nowsprinting.local-package-sample/Scripts/Editor/LocalPackageSample.Editor.asmdef b/LocalPackages/com.nowsprinting.local-package-sample/Editor/LocalPackageSample.Editor.asmdef similarity index 100% rename from LocalPackages/com.nowsprinting.local-package-sample/Scripts/Editor/LocalPackageSample.Editor.asmdef rename to LocalPackages/com.nowsprinting.local-package-sample/Editor/LocalPackageSample.Editor.asmdef diff --git a/LocalPackages/com.nowsprinting.local-package-sample/Scripts/Editor/LocalPackageSample.Editor.asmdef.meta b/LocalPackages/com.nowsprinting.local-package-sample/Editor/LocalPackageSample.Editor.asmdef.meta similarity index 100% rename from LocalPackages/com.nowsprinting.local-package-sample/Scripts/Editor/LocalPackageSample.Editor.asmdef.meta rename to LocalPackages/com.nowsprinting.local-package-sample/Editor/LocalPackageSample.Editor.asmdef.meta diff --git a/LocalPackages/com.nowsprinting.local-package-sample/Scripts/Runtime.meta b/LocalPackages/com.nowsprinting.local-package-sample/Runtime.meta similarity index 100% rename from LocalPackages/com.nowsprinting.local-package-sample/Scripts/Runtime.meta rename to LocalPackages/com.nowsprinting.local-package-sample/Runtime.meta diff --git a/LocalPackages/com.nowsprinting.local-package-sample/Scripts/Runtime/ExampleForCoverage.cs b/LocalPackages/com.nowsprinting.local-package-sample/Runtime/ExampleForCoverage.cs similarity index 99% rename from LocalPackages/com.nowsprinting.local-package-sample/Scripts/Runtime/ExampleForCoverage.cs rename to LocalPackages/com.nowsprinting.local-package-sample/Runtime/ExampleForCoverage.cs index 69e4eac..bce28d6 100644 --- a/LocalPackages/com.nowsprinting.local-package-sample/Scripts/Runtime/ExampleForCoverage.cs +++ b/LocalPackages/com.nowsprinting.local-package-sample/Runtime/ExampleForCoverage.cs @@ -2,6 +2,7 @@ // This software is released under the MIT License. // ReSharper disable once CheckNamespace (rootNamespace not work in Unity 2019) + namespace LocalPackageSample { public static class ExampleForCoverage diff --git a/LocalPackages/com.nowsprinting.local-package-sample/Scripts/Runtime/ExampleForCoverage.cs.meta b/LocalPackages/com.nowsprinting.local-package-sample/Runtime/ExampleForCoverage.cs.meta similarity index 100% rename from LocalPackages/com.nowsprinting.local-package-sample/Scripts/Runtime/ExampleForCoverage.cs.meta rename to LocalPackages/com.nowsprinting.local-package-sample/Runtime/ExampleForCoverage.cs.meta diff --git a/LocalPackages/com.nowsprinting.local-package-sample/Scripts/Runtime/LocalPackageSample.asmdef b/LocalPackages/com.nowsprinting.local-package-sample/Runtime/LocalPackageSample.asmdef similarity index 100% rename from LocalPackages/com.nowsprinting.local-package-sample/Scripts/Runtime/LocalPackageSample.asmdef rename to LocalPackages/com.nowsprinting.local-package-sample/Runtime/LocalPackageSample.asmdef diff --git a/LocalPackages/com.nowsprinting.local-package-sample/Scripts/Runtime/LocalPackageSample.asmdef.meta b/LocalPackages/com.nowsprinting.local-package-sample/Runtime/LocalPackageSample.asmdef.meta similarity index 100% rename from LocalPackages/com.nowsprinting.local-package-sample/Scripts/Runtime/LocalPackageSample.asmdef.meta rename to LocalPackages/com.nowsprinting.local-package-sample/Runtime/LocalPackageSample.asmdef.meta diff --git a/LocalPackages/com.nowsprinting.local-package-sample/Scenes/SceneInPackage.unity b/LocalPackages/com.nowsprinting.local-package-sample/Scenes/SceneInLocalPackage.unity similarity index 90% rename from LocalPackages/com.nowsprinting.local-package-sample/Scenes/SceneInPackage.unity rename to LocalPackages/com.nowsprinting.local-package-sample/Scenes/SceneInLocalPackage.unity index 28d9b9d..64ed80f 100644 --- a/LocalPackages/com.nowsprinting.local-package-sample/Scenes/SceneInPackage.unity +++ b/LocalPackages/com.nowsprinting.local-package-sample/Scenes/SceneInLocalPackage.unity @@ -13,7 +13,7 @@ OcclusionCullingSettings: --- !u!104 &2 RenderSettings: m_ObjectHideFlags: 0 - serializedVersion: 9 + serializedVersion: 10 m_Fog: 0 m_FogColor: {r: 0.5, g: 0.5, b: 0.5, a: 1} m_FogMode: 3 @@ -38,13 +38,12 @@ RenderSettings: m_ReflectionIntensity: 1 m_CustomReflection: {fileID: 0} m_Sun: {fileID: 0} - m_IndirectSpecularColor: {r: 0.44657838, g: 0.49641234, b: 0.57481676, a: 1} m_UseRadianceAmbientProbe: 0 --- !u!157 &3 LightmapSettings: m_ObjectHideFlags: 0 - serializedVersion: 12 - m_GIWorkflowMode: 1 + serializedVersion: 13 + m_BakeOnSceneLoad: 0 m_GISettings: serializedVersion: 2 m_BounceScale: 1 @@ -67,9 +66,6 @@ LightmapSettings: m_LightmapParameters: {fileID: 0} m_LightmapsBakeMode: 1 m_TextureCompression: 1 - m_FinalGather: 0 - m_FinalGatherFiltering: 1 - m_FinalGatherRayCount: 256 m_ReflectionCompression: 2 m_MixedBakeMode: 2 m_BakeBackend: 1 @@ -104,7 +100,7 @@ NavMeshSettings: serializedVersion: 2 m_ObjectHideFlags: 0 m_BuildSettings: - serializedVersion: 2 + serializedVersion: 3 agentTypeID: 0 agentRadius: 0.5 agentHeight: 2 @@ -117,7 +113,7 @@ NavMeshSettings: cellSize: 0.16666667 manualTileSize: 0 tileSize: 256 - accuratePlacement: 0 + buildHeightMesh: 0 maxJobWorkers: 0 preserveTilesOutsideBounds: 0 debug: @@ -150,8 +146,17 @@ CapsuleCollider: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 551686857} m_Material: {fileID: 0} + m_IncludeLayers: + serializedVersion: 2 + m_Bits: 0 + m_ExcludeLayers: + serializedVersion: 2 + m_Bits: 0 + m_LayerOverridePriority: 0 m_IsTrigger: 0 + m_ProvidesContacts: 0 m_Enabled: 1 + serializedVersion: 2 m_Radius: 0.5000001 m_Height: 2 m_Direction: 1 @@ -167,11 +172,15 @@ MeshRenderer: m_CastShadows: 1 m_ReceiveShadows: 1 m_DynamicOccludee: 1 + m_StaticShadowCaster: 0 m_MotionVectors: 1 m_LightProbeUsage: 1 m_ReflectionProbeUsage: 1 m_RayTracingMode: 2 m_RayTraceProcedural: 0 + m_RayTracingAccelStructBuildFlagsOverride: 0 + m_RayTracingAccelStructBuildFlags: 1 + m_SmallMeshCulling: 1 m_RenderingLayerMask: 1 m_RendererPriority: 0 m_Materials: @@ -212,12 +221,13 @@ Transform: m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 551686857} + serializedVersion: 2 m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 924.2142, y: 351.34674, z: -17.195045} + m_LocalPosition: {x: 0, y: 0, z: 0} m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 m_Children: [] m_Father: {fileID: 0} - m_RootOrder: 2 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} --- !u!1 &854170358 GameObject: @@ -244,9 +254,8 @@ Light: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 854170358} m_Enabled: 1 - serializedVersion: 10 + serializedVersion: 11 m_Type: 1 - m_Shape: 0 m_Color: {r: 1, g: 0.95686275, b: 0.8392157, a: 1} m_Intensity: 1 m_Range: 10 @@ -296,8 +305,12 @@ Light: m_BoundingSphereOverride: {x: 0, y: 0, z: 0, w: 0} m_UseBoundingSphereOverride: 0 m_UseViewFrustumForShadowCasterCull: 1 + m_ForceVisible: 0 m_ShadowRadius: 0 m_ShadowAngle: 0 + m_LightUnit: 1 + m_LuxAtDistance: 1 + m_EnableSpotReflector: 1 --- !u!4 &854170360 Transform: m_ObjectHideFlags: 0 @@ -305,12 +318,13 @@ Transform: m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 854170358} + serializedVersion: 2 m_LocalRotation: {x: 0.40821788, y: -0.23456968, z: 0.10938163, w: 0.8754261} m_LocalPosition: {x: 0, y: 3, z: 0} m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 m_Children: [] m_Father: {fileID: 0} - m_RootOrder: 1 m_LocalEulerAnglesHint: {x: 50, y: -30, z: 0} --- !u!1 &2006839994 GameObject: @@ -352,9 +366,17 @@ Camera: m_projectionMatrixMode: 1 m_GateFitMode: 2 m_FOVAxisMode: 0 + m_Iso: 200 + m_ShutterSpeed: 0.005 + m_Aperture: 16 + m_FocusDistance: 10 + m_FocalLength: 50 + m_BladeCount: 5 + m_Curvature: {x: 2, y: 11} + m_BarrelClipping: 0.25 + m_Anamorphism: 0 m_SensorSize: {x: 36, y: 24} m_LensShift: {x: 0, y: 0} - m_FocalLength: 50 m_NormalizedViewPortRect: serializedVersion: 2 x: 0 @@ -388,10 +410,18 @@ Transform: m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 2006839994} + serializedVersion: 2 m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} m_LocalPosition: {x: 0, y: 1, z: -10} m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 m_Children: [] m_Father: {fileID: 0} - m_RootOrder: 0 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1660057539 &9223372036854775807 +SceneRoots: + m_ObjectHideFlags: 0 + m_Roots: + - {fileID: 2006839997} + - {fileID: 854170360} + - {fileID: 551686861} diff --git a/LocalPackages/com.nowsprinting.local-package-sample/Scenes/SceneInPackage.unity.meta b/LocalPackages/com.nowsprinting.local-package-sample/Scenes/SceneInLocalPackage.unity.meta similarity index 100% rename from LocalPackages/com.nowsprinting.local-package-sample/Scenes/SceneInPackage.unity.meta rename to LocalPackages/com.nowsprinting.local-package-sample/Scenes/SceneInLocalPackage.unity.meta diff --git a/LocalPackages/com.nowsprinting.local-package-sample/Scripts.meta b/LocalPackages/com.nowsprinting.local-package-sample/Scripts.meta deleted file mode 100644 index e8ca509..0000000 --- a/LocalPackages/com.nowsprinting.local-package-sample/Scripts.meta +++ /dev/null @@ -1,8 +0,0 @@ -fileFormatVersion: 2 -guid: 3c48a046ace8d442c8fd1836d056e41c -folderAsset: yes -DefaultImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: diff --git a/LocalPackages/com.nowsprinting.local-package-sample/Scripts/Editor/BuildAllScenesForTestPlayer.cs b/LocalPackages/com.nowsprinting.local-package-sample/Scripts/Editor/BuildAllScenesForTestPlayer.cs deleted file mode 100644 index 51e5740..0000000 --- a/LocalPackages/com.nowsprinting.local-package-sample/Scripts/Editor/BuildAllScenesForTestPlayer.cs +++ /dev/null @@ -1,45 +0,0 @@ -// Copyright (c) 2021 Koji Hasegawa. -// This software is released under the MIT License. - -using System.Collections.Generic; -using System.Linq; -using LocalPackageSample.Editor; -using UnityEditor; -using UnityEditor.TestTools; - -[assembly: TestPlayerBuildModifier(typeof(BuildAllScenesForTestPlayer))] - -// ReSharper disable once CheckNamespace (rootNamespace not work in Unity 2019) -namespace LocalPackageSample.Editor -{ - /// - /// プレイヤーでのテスト実行前のビルドで、"Scenes in Build"に指定されていないSceneを一時的にビルドに含めます。 - /// これによって、テスト内で を使用してSceneをロードできるようになります。 - /// - /// - /// このスクリプトの利用には、Unity Test Frameworkパッケージ v1.1.13以上が必要です。 - /// 詳細は フォーラムの報告 を参照してください。 - /// - public class BuildAllScenesForTestPlayer : ITestPlayerBuildModifier - { - public BuildPlayerOptions ModifyOptions(BuildPlayerOptions playerOptions) - { - var buildSceneList = new List(playerOptions.scenes); - foreach (var scene in AssetDatabase - .FindAssets("t:SceneAsset", new string[] { "Packages/com.nowsprinting.local-package-sample" }) - .Select(AssetDatabase.GUIDToAssetPath)) - { - if (!buildSceneList.Contains(scene)) - { - buildSceneList.Add(scene); - } - } - // 引数で渡される `playerOptions.scenes` に入っているSceneの順序を変えると、テストが起動しないことがあります。 - // そのため、不足しているSceneだけを後ろに追加しています。 - - playerOptions.scenes = buildSceneList.ToArray(); - - return playerOptions; - } - } -} diff --git a/LocalPackages/com.nowsprinting.local-package-sample/Scripts/Editor/BuildAllScenesForTestPlayer.cs.meta b/LocalPackages/com.nowsprinting.local-package-sample/Scripts/Editor/BuildAllScenesForTestPlayer.cs.meta deleted file mode 100644 index 3ba9f06..0000000 --- a/LocalPackages/com.nowsprinting.local-package-sample/Scripts/Editor/BuildAllScenesForTestPlayer.cs.meta +++ /dev/null @@ -1,3 +0,0 @@ -fileFormatVersion: 2 -guid: b925ede2abfa84db59cdd3cae92c072e -timeCreated: 1622685134 \ No newline at end of file diff --git a/LocalPackages/com.nowsprinting.local-package-sample/Tests/Editor/EditorSceneManagerTest.cs b/LocalPackages/com.nowsprinting.local-package-sample/Tests/Editor/EditorSceneManagerTest.cs index 6cd729d..1aa3fab 100644 --- a/LocalPackages/com.nowsprinting.local-package-sample/Tests/Editor/EditorSceneManagerTest.cs +++ b/LocalPackages/com.nowsprinting.local-package-sample/Tests/Editor/EditorSceneManagerTest.cs @@ -1,11 +1,10 @@ -// Copyright (c) 2021 Koji Hasegawa. +// Copyright (c) 2021-2025 Koji Hasegawa. // This software is released under the MIT License. using NUnit.Framework; using UnityEditor.SceneManagement; using UnityEngine; -// ReSharper disable once CheckNamespace (rootNamespace not work in Unity 2019) namespace LocalPackageSample.Editor { [TestFixture] @@ -14,7 +13,8 @@ public class EditorSceneManagerTest [Test] public void OpenScene_Sceneファイルをロードしてテストを実行する例() { - EditorSceneManager.OpenScene("Packages/com.nowsprinting.local-package-sample/Scenes/SceneInPackage.unity"); + EditorSceneManager.OpenScene( + "Packages/com.nowsprinting.local-package-sample/Scenes/SceneInLocalPackage.unity"); // パスはProjectウィンドウに表示されるパスで指定。ただしパッケージ名の部分は `displayName` でなく `name` を使用。 var cylinder = GameObject.Find("Cylinder"); diff --git a/LocalPackages/com.nowsprinting.local-package-sample/Tests/Runtime/LocalPackageSample.Tests.asmdef b/LocalPackages/com.nowsprinting.local-package-sample/Tests/Runtime/LocalPackageSample.Tests.asmdef index 8b38027..656c0c0 100644 --- a/LocalPackages/com.nowsprinting.local-package-sample/Tests/Runtime/LocalPackageSample.Tests.asmdef +++ b/LocalPackages/com.nowsprinting.local-package-sample/Tests/Runtime/LocalPackageSample.Tests.asmdef @@ -4,6 +4,7 @@ "references": [ "UnityEngine.TestRunner", "UnityEditor.TestRunner", + "TestHelper", "LocalPackageSample" ], "includePlatforms": [], diff --git a/LocalPackages/com.nowsprinting.local-package-sample/Tests/Runtime/SceneManagerTest.cs b/LocalPackages/com.nowsprinting.local-package-sample/Tests/Runtime/SceneManagerTest.cs index 4b0d051..0a49f64 100644 --- a/LocalPackages/com.nowsprinting.local-package-sample/Tests/Runtime/SceneManagerTest.cs +++ b/LocalPackages/com.nowsprinting.local-package-sample/Tests/Runtime/SceneManagerTest.cs @@ -1,23 +1,22 @@ -// Copyright (c) 2021 Koji Hasegawa. +// Copyright (c) 2021-2025 Koji Hasegawa. // This software is released under the MIT License. using System.Collections; using NUnit.Framework; -using LocalPackageSample.Utils; +using TestHelper.Attributes; using UnityEngine; using UnityEngine.TestTools; -// ReSharper disable once CheckNamespace (rootNamespace not work in Unity 2019) namespace LocalPackageSample { [TestFixture] public class SceneManagerTest { [UnityTest] + [LoadScene("../../Scenes/SceneInLocalPackage.unity")] public IEnumerator LoadSceneAsync_ScenesInBuildに含まれていないSceneをロードする例() { - yield return TestSceneLoader.LoadSceneAsync("Packages/com.nowsprinting.local-package-sample/Scenes/SceneInPackage.unity"); - // パスはProjectウィンドウに表示されるパスで指定。ただしパッケージ名の部分は `displayName` でなく `name` を使用。 + yield return null; var cylinder = GameObject.Find("Cylinder"); Assert.That(cylinder, Is.Not.Null); diff --git a/LocalPackages/com.nowsprinting.local-package-sample/Tests/Runtime/Utils.meta b/LocalPackages/com.nowsprinting.local-package-sample/Tests/Runtime/Utils.meta deleted file mode 100644 index 088b90c..0000000 --- a/LocalPackages/com.nowsprinting.local-package-sample/Tests/Runtime/Utils.meta +++ /dev/null @@ -1,8 +0,0 @@ -fileFormatVersion: 2 -guid: cc53feb1308604ddeb5461135729714f -folderAsset: yes -DefaultImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: diff --git a/LocalPackages/com.nowsprinting.local-package-sample/Tests/Runtime/Utils/TestSceneLoader.cs b/LocalPackages/com.nowsprinting.local-package-sample/Tests/Runtime/Utils/TestSceneLoader.cs deleted file mode 100644 index d9ba585..0000000 --- a/LocalPackages/com.nowsprinting.local-package-sample/Tests/Runtime/Utils/TestSceneLoader.cs +++ /dev/null @@ -1,39 +0,0 @@ -// Copyright (c) 2021 Koji Hasegawa. -// This software is released under the MIT License. - -using System.Collections; -using UnityEngine; -using UnityEngine.SceneManagement; - -// ReSharper disable once CheckNamespace (rootNamespace not work in Unity 2019) -namespace LocalPackageSample.Utils -{ - public static class TestSceneLoader - { - /// - /// Play Modeテスト内でSceneをロードする - /// - /// - /// エディター実行では でロード。 - /// プレイヤー実行では を使用して - /// 一時的にビルド対象に含めている前提で でロードしています。 - /// - /// Packages/〜.unityまでのパスで指定 - /// - public static IEnumerator LoadSceneAsync(string path) - { - AsyncOperation loadSceneAsync = null; -#if UNITY_EDITOR - // Use EditorSceneManager at run on Unity-editor - loadSceneAsync = UnityEditor.SceneManagement.EditorSceneManager.LoadSceneAsyncInPlayMode( - path, - new LoadSceneParameters(LoadSceneMode.Single)); -#else - // Use ITestPlayerBuildModifier to change the "Scenes in Build" list before run on player - // see: Editor/BuildAllScenesForTestPlayer.cs - loadSceneAsync = SceneManager.LoadSceneAsync(path); -#endif - yield return loadSceneAsync; - } - } -} diff --git a/LocalPackages/com.nowsprinting.local-package-sample/Tests/Runtime/Utils/TestSceneLoader.cs.meta b/LocalPackages/com.nowsprinting.local-package-sample/Tests/Runtime/Utils/TestSceneLoader.cs.meta deleted file mode 100644 index 1b93d12..0000000 --- a/LocalPackages/com.nowsprinting.local-package-sample/Tests/Runtime/Utils/TestSceneLoader.cs.meta +++ /dev/null @@ -1,3 +0,0 @@ -fileFormatVersion: 2 -guid: fbd3c4354ca3f43888ce0d331ea0099d -timeCreated: 1622684487 \ No newline at end of file diff --git a/Packages/com.nowsprinting.embedded-package-sample/Scripts/Editor.meta b/Packages/com.nowsprinting.embedded-package-sample/Editor.meta similarity index 100% rename from Packages/com.nowsprinting.embedded-package-sample/Scripts/Editor.meta rename to Packages/com.nowsprinting.embedded-package-sample/Editor.meta diff --git a/Packages/com.nowsprinting.embedded-package-sample/Scripts/Editor/EmbeddedPackageSample.Editor.asmdef b/Packages/com.nowsprinting.embedded-package-sample/Editor/EmbeddedPackageSample.Editor.asmdef similarity index 100% rename from Packages/com.nowsprinting.embedded-package-sample/Scripts/Editor/EmbeddedPackageSample.Editor.asmdef rename to Packages/com.nowsprinting.embedded-package-sample/Editor/EmbeddedPackageSample.Editor.asmdef diff --git a/Packages/com.nowsprinting.embedded-package-sample/Scripts/Editor/EmbeddedPackageSample.Editor.asmdef.meta b/Packages/com.nowsprinting.embedded-package-sample/Editor/EmbeddedPackageSample.Editor.asmdef.meta similarity index 100% rename from Packages/com.nowsprinting.embedded-package-sample/Scripts/Editor/EmbeddedPackageSample.Editor.asmdef.meta rename to Packages/com.nowsprinting.embedded-package-sample/Editor/EmbeddedPackageSample.Editor.asmdef.meta diff --git a/Packages/com.nowsprinting.embedded-package-sample/Scripts/Editor/ExampleForCoverage.cs b/Packages/com.nowsprinting.embedded-package-sample/Editor/ExampleForCoverage.cs similarity index 99% rename from Packages/com.nowsprinting.embedded-package-sample/Scripts/Editor/ExampleForCoverage.cs rename to Packages/com.nowsprinting.embedded-package-sample/Editor/ExampleForCoverage.cs index a0e0d5a..c2a9290 100644 --- a/Packages/com.nowsprinting.embedded-package-sample/Scripts/Editor/ExampleForCoverage.cs +++ b/Packages/com.nowsprinting.embedded-package-sample/Editor/ExampleForCoverage.cs @@ -2,6 +2,7 @@ // This software is released under the MIT License. // ReSharper disable once CheckNamespace (rootNamespace not work in Unity 2019) + namespace EmbeddedPackageSample.Editor { public static class ExampleForCoverage diff --git a/Packages/com.nowsprinting.embedded-package-sample/Scripts/Editor/ExampleForCoverage.cs.meta b/Packages/com.nowsprinting.embedded-package-sample/Editor/ExampleForCoverage.cs.meta similarity index 100% rename from Packages/com.nowsprinting.embedded-package-sample/Scripts/Editor/ExampleForCoverage.cs.meta rename to Packages/com.nowsprinting.embedded-package-sample/Editor/ExampleForCoverage.cs.meta diff --git a/Packages/com.nowsprinting.embedded-package-sample/Scripts/Runtime.meta b/Packages/com.nowsprinting.embedded-package-sample/Runtime.meta similarity index 100% rename from Packages/com.nowsprinting.embedded-package-sample/Scripts/Runtime.meta rename to Packages/com.nowsprinting.embedded-package-sample/Runtime.meta diff --git a/Packages/com.nowsprinting.embedded-package-sample/Scripts/Runtime/EmbeddedPackageSample.asmdef b/Packages/com.nowsprinting.embedded-package-sample/Runtime/EmbeddedPackageSample.asmdef similarity index 100% rename from Packages/com.nowsprinting.embedded-package-sample/Scripts/Runtime/EmbeddedPackageSample.asmdef rename to Packages/com.nowsprinting.embedded-package-sample/Runtime/EmbeddedPackageSample.asmdef diff --git a/Packages/com.nowsprinting.embedded-package-sample/Scripts/Runtime/EmbeddedPackageSample.asmdef.meta b/Packages/com.nowsprinting.embedded-package-sample/Runtime/EmbeddedPackageSample.asmdef.meta similarity index 100% rename from Packages/com.nowsprinting.embedded-package-sample/Scripts/Runtime/EmbeddedPackageSample.asmdef.meta rename to Packages/com.nowsprinting.embedded-package-sample/Runtime/EmbeddedPackageSample.asmdef.meta diff --git a/Packages/com.nowsprinting.embedded-package-sample/Scripts/Runtime/ExampleForCoverage.cs b/Packages/com.nowsprinting.embedded-package-sample/Runtime/ExampleForCoverage.cs similarity index 99% rename from Packages/com.nowsprinting.embedded-package-sample/Scripts/Runtime/ExampleForCoverage.cs rename to Packages/com.nowsprinting.embedded-package-sample/Runtime/ExampleForCoverage.cs index d19405b..2a06411 100644 --- a/Packages/com.nowsprinting.embedded-package-sample/Scripts/Runtime/ExampleForCoverage.cs +++ b/Packages/com.nowsprinting.embedded-package-sample/Runtime/ExampleForCoverage.cs @@ -2,6 +2,7 @@ // This software is released under the MIT License. // ReSharper disable once CheckNamespace (rootNamespace not work in Unity 2019) + namespace EmbeddedPackageSample { public static class ExampleForCoverage diff --git a/Packages/com.nowsprinting.embedded-package-sample/Scripts/Runtime/ExampleForCoverage.cs.meta b/Packages/com.nowsprinting.embedded-package-sample/Runtime/ExampleForCoverage.cs.meta similarity index 100% rename from Packages/com.nowsprinting.embedded-package-sample/Scripts/Runtime/ExampleForCoverage.cs.meta rename to Packages/com.nowsprinting.embedded-package-sample/Runtime/ExampleForCoverage.cs.meta diff --git a/Packages/com.nowsprinting.embedded-package-sample/Scenes/SceneInPackage.unity b/Packages/com.nowsprinting.embedded-package-sample/Scenes/SceneInEmbeddedPackage.unity similarity index 90% rename from Packages/com.nowsprinting.embedded-package-sample/Scenes/SceneInPackage.unity rename to Packages/com.nowsprinting.embedded-package-sample/Scenes/SceneInEmbeddedPackage.unity index e207df4..0f47e54 100644 --- a/Packages/com.nowsprinting.embedded-package-sample/Scenes/SceneInPackage.unity +++ b/Packages/com.nowsprinting.embedded-package-sample/Scenes/SceneInEmbeddedPackage.unity @@ -13,7 +13,7 @@ OcclusionCullingSettings: --- !u!104 &2 RenderSettings: m_ObjectHideFlags: 0 - serializedVersion: 9 + serializedVersion: 10 m_Fog: 0 m_FogColor: {r: 0.5, g: 0.5, b: 0.5, a: 1} m_FogMode: 3 @@ -38,13 +38,12 @@ RenderSettings: m_ReflectionIntensity: 1 m_CustomReflection: {fileID: 0} m_Sun: {fileID: 0} - m_IndirectSpecularColor: {r: 0.44657838, g: 0.49641234, b: 0.57481676, a: 1} m_UseRadianceAmbientProbe: 0 --- !u!157 &3 LightmapSettings: m_ObjectHideFlags: 0 - serializedVersion: 12 - m_GIWorkflowMode: 1 + serializedVersion: 13 + m_BakeOnSceneLoad: 0 m_GISettings: serializedVersion: 2 m_BounceScale: 1 @@ -67,9 +66,6 @@ LightmapSettings: m_LightmapParameters: {fileID: 0} m_LightmapsBakeMode: 1 m_TextureCompression: 1 - m_FinalGather: 0 - m_FinalGatherFiltering: 1 - m_FinalGatherRayCount: 256 m_ReflectionCompression: 2 m_MixedBakeMode: 2 m_BakeBackend: 1 @@ -104,7 +100,7 @@ NavMeshSettings: serializedVersion: 2 m_ObjectHideFlags: 0 m_BuildSettings: - serializedVersion: 2 + serializedVersion: 3 agentTypeID: 0 agentRadius: 0.5 agentHeight: 2 @@ -117,7 +113,7 @@ NavMeshSettings: cellSize: 0.16666667 manualTileSize: 0 tileSize: 256 - accuratePlacement: 0 + buildHeightMesh: 0 maxJobWorkers: 0 preserveTilesOutsideBounds: 0 debug: @@ -150,8 +146,17 @@ CapsuleCollider: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 340338593} m_Material: {fileID: 0} + m_IncludeLayers: + serializedVersion: 2 + m_Bits: 0 + m_ExcludeLayers: + serializedVersion: 2 + m_Bits: 0 + m_LayerOverridePriority: 0 m_IsTrigger: 0 + m_ProvidesContacts: 0 m_Enabled: 1 + serializedVersion: 2 m_Radius: 0.5 m_Height: 2 m_Direction: 1 @@ -167,11 +172,15 @@ MeshRenderer: m_CastShadows: 1 m_ReceiveShadows: 1 m_DynamicOccludee: 1 + m_StaticShadowCaster: 0 m_MotionVectors: 1 m_LightProbeUsage: 1 m_ReflectionProbeUsage: 1 m_RayTracingMode: 2 m_RayTraceProcedural: 0 + m_RayTracingAccelStructBuildFlagsOverride: 0 + m_RayTracingAccelStructBuildFlags: 1 + m_SmallMeshCulling: 1 m_RenderingLayerMask: 1 m_RendererPriority: 0 m_Materials: @@ -212,12 +221,13 @@ Transform: m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 340338593} + serializedVersion: 2 m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 924.2142, y: 351.34674, z: -17.195045} + m_LocalPosition: {x: 0, y: 0, z: 0} m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 m_Children: [] m_Father: {fileID: 0} - m_RootOrder: 2 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} --- !u!1 &854170358 GameObject: @@ -244,9 +254,8 @@ Light: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 854170358} m_Enabled: 1 - serializedVersion: 10 + serializedVersion: 11 m_Type: 1 - m_Shape: 0 m_Color: {r: 1, g: 0.95686275, b: 0.8392157, a: 1} m_Intensity: 1 m_Range: 10 @@ -296,8 +305,12 @@ Light: m_BoundingSphereOverride: {x: 0, y: 0, z: 0, w: 0} m_UseBoundingSphereOverride: 0 m_UseViewFrustumForShadowCasterCull: 1 + m_ForceVisible: 0 m_ShadowRadius: 0 m_ShadowAngle: 0 + m_LightUnit: 1 + m_LuxAtDistance: 1 + m_EnableSpotReflector: 1 --- !u!4 &854170360 Transform: m_ObjectHideFlags: 0 @@ -305,12 +318,13 @@ Transform: m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 854170358} + serializedVersion: 2 m_LocalRotation: {x: 0.40821788, y: -0.23456968, z: 0.10938163, w: 0.8754261} m_LocalPosition: {x: 0, y: 3, z: 0} m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 m_Children: [] m_Father: {fileID: 0} - m_RootOrder: 1 m_LocalEulerAnglesHint: {x: 50, y: -30, z: 0} --- !u!1 &2006839994 GameObject: @@ -352,9 +366,17 @@ Camera: m_projectionMatrixMode: 1 m_GateFitMode: 2 m_FOVAxisMode: 0 + m_Iso: 200 + m_ShutterSpeed: 0.005 + m_Aperture: 16 + m_FocusDistance: 10 + m_FocalLength: 50 + m_BladeCount: 5 + m_Curvature: {x: 2, y: 11} + m_BarrelClipping: 0.25 + m_Anamorphism: 0 m_SensorSize: {x: 36, y: 24} m_LensShift: {x: 0, y: 0} - m_FocalLength: 50 m_NormalizedViewPortRect: serializedVersion: 2 x: 0 @@ -388,10 +410,18 @@ Transform: m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 2006839994} + serializedVersion: 2 m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} m_LocalPosition: {x: 0, y: 1, z: -10} m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 m_Children: [] m_Father: {fileID: 0} - m_RootOrder: 0 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1660057539 &9223372036854775807 +SceneRoots: + m_ObjectHideFlags: 0 + m_Roots: + - {fileID: 2006839997} + - {fileID: 854170360} + - {fileID: 340338597} diff --git a/Packages/com.nowsprinting.embedded-package-sample/Scenes/SceneInPackage.unity.meta b/Packages/com.nowsprinting.embedded-package-sample/Scenes/SceneInEmbeddedPackage.unity.meta similarity index 100% rename from Packages/com.nowsprinting.embedded-package-sample/Scenes/SceneInPackage.unity.meta rename to Packages/com.nowsprinting.embedded-package-sample/Scenes/SceneInEmbeddedPackage.unity.meta diff --git a/Packages/com.nowsprinting.embedded-package-sample/Scripts.meta b/Packages/com.nowsprinting.embedded-package-sample/Scripts.meta deleted file mode 100644 index 1de877f..0000000 --- a/Packages/com.nowsprinting.embedded-package-sample/Scripts.meta +++ /dev/null @@ -1,8 +0,0 @@ -fileFormatVersion: 2 -guid: 22670d83d504b4ab1918d0d4765056a3 -folderAsset: yes -DefaultImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Packages/com.nowsprinting.embedded-package-sample/Scripts/Editor/BuildAllScenesForTestPlayer.cs b/Packages/com.nowsprinting.embedded-package-sample/Scripts/Editor/BuildAllScenesForTestPlayer.cs deleted file mode 100644 index cbcc3bd..0000000 --- a/Packages/com.nowsprinting.embedded-package-sample/Scripts/Editor/BuildAllScenesForTestPlayer.cs +++ /dev/null @@ -1,45 +0,0 @@ -// Copyright (c) 2021 Koji Hasegawa. -// This software is released under the MIT License. - -using System.Collections.Generic; -using System.Linq; -using EmbeddedPackageSample.Editor; -using UnityEditor; -using UnityEditor.TestTools; - -[assembly: TestPlayerBuildModifier(typeof(BuildAllScenesForTestPlayer))] - -// ReSharper disable once CheckNamespace (rootNamespace not work in Unity 2019) -namespace EmbeddedPackageSample.Editor -{ - /// - /// プレイヤーでのテスト実行前のビルドで、"Scenes in Build"に指定されていないSceneを一時的にビルドに含めます。 - /// これによって、テスト内で を使用してSceneをロードできるようになります。 - /// - /// - /// このスクリプトの利用には、Unity Test Frameworkパッケージ v1.1.13以上が必要です。 - /// 詳細は フォーラムの報告 を参照してください。 - /// - public class BuildAllScenesForTestPlayer : ITestPlayerBuildModifier - { - public BuildPlayerOptions ModifyOptions(BuildPlayerOptions playerOptions) - { - var buildSceneList = new List(playerOptions.scenes); - foreach (var scene in AssetDatabase - .FindAssets("t:SceneAsset", new [] { "Packages/com.nowsprinting.embedded-package-sample" }) - .Select(AssetDatabase.GUIDToAssetPath)) - { - if (!buildSceneList.Contains(scene)) - { - buildSceneList.Add(scene); - } - } - // 引数で渡される `playerOptions.scenes` に入っているSceneの順序を変えると、テストが起動しないことがあります。 - // そのため、不足しているSceneだけを後ろに追加しています。 - - playerOptions.scenes = buildSceneList.ToArray(); - - return playerOptions; - } - } -} diff --git a/Packages/com.nowsprinting.embedded-package-sample/Scripts/Editor/BuildAllScenesForTestPlayer.cs.meta b/Packages/com.nowsprinting.embedded-package-sample/Scripts/Editor/BuildAllScenesForTestPlayer.cs.meta deleted file mode 100644 index 2f38e5c..0000000 --- a/Packages/com.nowsprinting.embedded-package-sample/Scripts/Editor/BuildAllScenesForTestPlayer.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 6cd4b04aeeb6c48e0a272ed129f0ebb8 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Packages/com.nowsprinting.embedded-package-sample/Tests/Editor/EditorSceneManagerTest.cs b/Packages/com.nowsprinting.embedded-package-sample/Tests/Editor/EditorSceneManagerTest.cs index 43c2e70..bcfaf95 100644 --- a/Packages/com.nowsprinting.embedded-package-sample/Tests/Editor/EditorSceneManagerTest.cs +++ b/Packages/com.nowsprinting.embedded-package-sample/Tests/Editor/EditorSceneManagerTest.cs @@ -1,11 +1,10 @@ -// Copyright (c) 2021 Koji Hasegawa. +// Copyright (c) 2021-2025 Koji Hasegawa. // This software is released under the MIT License. using NUnit.Framework; using UnityEditor.SceneManagement; using UnityEngine; -// ReSharper disable once CheckNamespace (rootNamespace not work in Unity 2019) namespace EmbeddedPackageSample.Editor { [TestFixture] @@ -14,7 +13,8 @@ public class EditorSceneManagerTest [Test] public void OpenScene_Sceneファイルをロードしてテストを実行する例() { - EditorSceneManager.OpenScene("Packages/com.nowsprinting.embedded-package-sample/Scenes/SceneInPackage.unity"); + EditorSceneManager.OpenScene( + "Packages/com.nowsprinting.embedded-package-sample/Scenes/SceneInEmbeddedPackage.unity"); // パスはProjectウィンドウに表示されるパスで指定。ただしパッケージ名の部分は `displayName` でなく `name` を使用。 var capsule = GameObject.Find("Capsule"); diff --git a/Packages/com.nowsprinting.embedded-package-sample/Tests/Runtime/EmbeddedPackageSample.Tests.asmdef b/Packages/com.nowsprinting.embedded-package-sample/Tests/Runtime/EmbeddedPackageSample.Tests.asmdef index 52774ef..dd965bc 100644 --- a/Packages/com.nowsprinting.embedded-package-sample/Tests/Runtime/EmbeddedPackageSample.Tests.asmdef +++ b/Packages/com.nowsprinting.embedded-package-sample/Tests/Runtime/EmbeddedPackageSample.Tests.asmdef @@ -4,6 +4,7 @@ "references": [ "UnityEngine.TestRunner", "UnityEditor.TestRunner", + "TestHelper", "EmbeddedPackageSample" ], "includePlatforms": [], diff --git a/Packages/com.nowsprinting.embedded-package-sample/Tests/Runtime/SceneManagerTest.cs b/Packages/com.nowsprinting.embedded-package-sample/Tests/Runtime/SceneManagerTest.cs index 2869353..9e6b45f 100644 --- a/Packages/com.nowsprinting.embedded-package-sample/Tests/Runtime/SceneManagerTest.cs +++ b/Packages/com.nowsprinting.embedded-package-sample/Tests/Runtime/SceneManagerTest.cs @@ -1,23 +1,22 @@ -// Copyright (c) 2021 Koji Hasegawa. +// Copyright (c) 2021-2025 Koji Hasegawa. // This software is released under the MIT License. using System.Collections; using NUnit.Framework; -using EmbeddedPackageSample.Utils; +using TestHelper.Attributes; using UnityEngine; using UnityEngine.TestTools; -// ReSharper disable once CheckNamespace (rootNamespace not work in Unity 2019) namespace EmbeddedPackageSample { [TestFixture] public class SceneManagerTest { [UnityTest] + [LoadScene("../../Scenes/SceneInEmbeddedPackage.unity")] public IEnumerator LoadSceneAsync_ScenesInBuildに含まれていないSceneをロードする例() { - yield return TestSceneLoader.LoadSceneAsync("Packages/com.nowsprinting.embedded-package-sample/Scenes/SceneInPackage.unity"); - // パスはProjectウィンドウに表示されるパスで指定。ただしパッケージ名の部分は `displayName` でなく `name` を使用。 + yield return null; var capsule = GameObject.Find("Capsule"); Assert.That(capsule, Is.Not.Null); diff --git a/Packages/com.nowsprinting.embedded-package-sample/Tests/Runtime/Utils.meta b/Packages/com.nowsprinting.embedded-package-sample/Tests/Runtime/Utils.meta deleted file mode 100644 index 22f1b24..0000000 --- a/Packages/com.nowsprinting.embedded-package-sample/Tests/Runtime/Utils.meta +++ /dev/null @@ -1,3 +0,0 @@ -fileFormatVersion: 2 -guid: 3d0e241336b74cdf8c8522920f18335c -timeCreated: 1624820735 \ No newline at end of file diff --git a/Packages/com.nowsprinting.embedded-package-sample/Tests/Runtime/Utils/TestSceneLoader.cs b/Packages/com.nowsprinting.embedded-package-sample/Tests/Runtime/Utils/TestSceneLoader.cs deleted file mode 100644 index e7be62b..0000000 --- a/Packages/com.nowsprinting.embedded-package-sample/Tests/Runtime/Utils/TestSceneLoader.cs +++ /dev/null @@ -1,39 +0,0 @@ -// Copyright (c) 2021 Koji Hasegawa. -// This software is released under the MIT License. - -using System.Collections; -using UnityEngine; -using UnityEngine.SceneManagement; - -// ReSharper disable once CheckNamespace (rootNamespace not work in Unity 2019) -namespace EmbeddedPackageSample.Utils -{ - public static class TestSceneLoader - { - /// - /// Play Modeテスト内でSceneをロードする - /// - /// - /// エディター実行では でロード。 - /// プレイヤー実行では を使用して - /// 一時的にビルド対象に含めている前提で でロードしています。 - /// - /// Packages/〜.unityまでのパスで指定 - /// - public static IEnumerator LoadSceneAsync(string path) - { - AsyncOperation loadSceneAsync = null; -#if UNITY_EDITOR - // Use EditorSceneManager at run on Unity-editor - loadSceneAsync = UnityEditor.SceneManagement.EditorSceneManager.LoadSceneAsyncInPlayMode( - path, - new LoadSceneParameters(LoadSceneMode.Single)); -#else - // Use ITestPlayerBuildModifier to change the "Scenes in Build" list before run on player - // see: Editor/BuildAllScenesForTestPlayer.cs - loadSceneAsync = SceneManager.LoadSceneAsync(path); -#endif - yield return loadSceneAsync; - } - } -} diff --git a/Packages/com.nowsprinting.embedded-package-sample/Tests/Runtime/Utils/TestSceneLoader.cs.meta b/Packages/com.nowsprinting.embedded-package-sample/Tests/Runtime/Utils/TestSceneLoader.cs.meta deleted file mode 100644 index edca484..0000000 --- a/Packages/com.nowsprinting.embedded-package-sample/Tests/Runtime/Utils/TestSceneLoader.cs.meta +++ /dev/null @@ -1,3 +0,0 @@ -fileFormatVersion: 2 -guid: bc4f3762b438406bbcd3ee6f6d41f32e -timeCreated: 1624820745 \ No newline at end of file diff --git a/README.md b/README.md index b1b5240..2093fb0 100644 --- a/README.md +++ b/README.md @@ -110,18 +110,18 @@ Assets 第11章 UPM パッケージのテスト -#### 埋め込みパッケージ +#### ローカルパッケージ ``` -Packages -└── com.nowsprinting.embedded-package-sample +LocalPackages +└── com.nowsprinting.local-package-sample ``` -#### ローカルパッケージ +#### 埋め込みパッケージ ``` -LocalPackages -└── com.nowsprinting.local-package-sample +Packages +└── com.nowsprinting.embedded-package-sample ``` ### UGUIExample From d6145b76f02713b614a4def2be452809fd54e56b Mon Sep 17 00:00:00 2001 From: Koji Hasegawa Date: Tue, 12 Aug 2025 05:05:02 +0900 Subject: [PATCH 04/22] Fix APIExample --- .../Scripts/Editor/AssemblyInfo.cs | 6 ++ .../Scripts/Editor/AssemblyInfo.cs.meta | 3 + .../Scripts/Runtime/AssemblyInfo.cs | 8 ++ .../Scripts/Runtime/AssemblyInfo.cs.meta | 3 + Assets/APIExamples/Scripts/Runtime/Element.cs | 9 +- .../Editor/APIExamples.Editor.Tests.asmdef | 2 + .../APIExamples/Tests/Editor/AssemblyInfo.cs | 5 +- .../EditModeTestYieldInstructionExample.cs | 96 +++++++++++++++++-- .../UnityTestAttributeExample.cs | 29 +++--- .../APIExamples/Tests/Runtime/AssemblyInfo.cs | 6 +- .../Runtime/NUnit/CategoryAttributeExample.cs | 17 ++-- .../UnitySetUpAttributeExample.cs | 2 +- .../UnityTestAttributeExample.cs | 23 +++-- 13 files changed, 157 insertions(+), 52 deletions(-) create mode 100644 Assets/APIExamples/Scripts/Editor/AssemblyInfo.cs create mode 100644 Assets/APIExamples/Scripts/Editor/AssemblyInfo.cs.meta create mode 100644 Assets/APIExamples/Scripts/Runtime/AssemblyInfo.cs create mode 100644 Assets/APIExamples/Scripts/Runtime/AssemblyInfo.cs.meta diff --git a/Assets/APIExamples/Scripts/Editor/AssemblyInfo.cs b/Assets/APIExamples/Scripts/Editor/AssemblyInfo.cs new file mode 100644 index 0000000..9298f68 --- /dev/null +++ b/Assets/APIExamples/Scripts/Editor/AssemblyInfo.cs @@ -0,0 +1,6 @@ +// Copyright (c) 2021-2025 Koji Hasegawa. +// This software is released under the MIT License. + +using System.Runtime.CompilerServices; + +[assembly: InternalsVisibleTo("APIExample.Editor.Tests")] diff --git a/Assets/APIExamples/Scripts/Editor/AssemblyInfo.cs.meta b/Assets/APIExamples/Scripts/Editor/AssemblyInfo.cs.meta new file mode 100644 index 0000000..4fe5608 --- /dev/null +++ b/Assets/APIExamples/Scripts/Editor/AssemblyInfo.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: bc037e1c350f40a3a59332c04c1d04db +timeCreated: 1754943039 \ No newline at end of file diff --git a/Assets/APIExamples/Scripts/Runtime/AssemblyInfo.cs b/Assets/APIExamples/Scripts/Runtime/AssemblyInfo.cs new file mode 100644 index 0000000..11d7d2d --- /dev/null +++ b/Assets/APIExamples/Scripts/Runtime/AssemblyInfo.cs @@ -0,0 +1,8 @@ +// Copyright (c) 2021-2025 Koji Hasegawa. +// This software is released under the MIT License. + +using System.Runtime.CompilerServices; + +[assembly: InternalsVisibleTo("APIExample.Editor")] +[assembly: InternalsVisibleTo("APIExample.Editor.Tests")] +[assembly: InternalsVisibleTo("APIExample.Tests")] diff --git a/Assets/APIExamples/Scripts/Runtime/AssemblyInfo.cs.meta b/Assets/APIExamples/Scripts/Runtime/AssemblyInfo.cs.meta new file mode 100644 index 0000000..ede76e1 --- /dev/null +++ b/Assets/APIExamples/Scripts/Runtime/AssemblyInfo.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: e2cc40258a6e456581745f8d7b639e68 +timeCreated: 1754943055 \ No newline at end of file diff --git a/Assets/APIExamples/Scripts/Runtime/Element.cs b/Assets/APIExamples/Scripts/Runtime/Element.cs index e2fb6fc..8ff1d70 100644 --- a/Assets/APIExamples/Scripts/Runtime/Element.cs +++ b/Assets/APIExamples/Scripts/Runtime/Element.cs @@ -6,11 +6,8 @@ namespace APIExamples { /// - /// 元素的な属性. + /// 元素的な属性 /// - /// - /// このenumは BasicExample.Entities.Enums.Element とは異なります(仕様を簡略化しました) - /// public enum Element { None, @@ -22,7 +19,7 @@ public enum Element public static class ElementExtensions { /// - /// 属性名を返す. + /// 属性名を返す /// /// /// @@ -44,7 +41,7 @@ public static string GetName(this Element self) } /// - /// 属性攻撃を受けたときの被ダメージ倍率を返す. + /// 属性攻撃を受けたときの被ダメージ倍率を返す /// /// /// 攻撃側の属性 diff --git a/Assets/APIExamples/Tests/Editor/APIExamples.Editor.Tests.asmdef b/Assets/APIExamples/Tests/Editor/APIExamples.Editor.Tests.asmdef index bc9c284..b480609 100644 --- a/Assets/APIExamples/Tests/Editor/APIExamples.Editor.Tests.asmdef +++ b/Assets/APIExamples/Tests/Editor/APIExamples.Editor.Tests.asmdef @@ -4,6 +4,8 @@ "references": [ "UnityEngine.TestRunner", "UnityEditor.TestRunner", + "NUnit.Analyzers_Unity", + "APIExamples.Tests", "UniTask" ], "includePlatforms": [ diff --git a/Assets/APIExamples/Tests/Editor/AssemblyInfo.cs b/Assets/APIExamples/Tests/Editor/AssemblyInfo.cs index 13b338d..d26dd20 100644 --- a/Assets/APIExamples/Tests/Editor/AssemblyInfo.cs +++ b/Assets/APIExamples/Tests/Editor/AssemblyInfo.cs @@ -1,6 +1,5 @@ -// Copyright (c) 2021-2022 Koji Hasegawa. +// Copyright (c) 2021-2025 Koji Hasegawa. // This software is released under the MIT License. -using NUnit.Framework; -[assembly: Category("APIExamples")] + diff --git a/Assets/APIExamples/Tests/Editor/UnityTestFramework/EditModeTestYieldInstructionExample.cs b/Assets/APIExamples/Tests/Editor/UnityTestFramework/EditModeTestYieldInstructionExample.cs index bfbbd72..f0f57ac 100644 --- a/Assets/APIExamples/Tests/Editor/UnityTestFramework/EditModeTestYieldInstructionExample.cs +++ b/Assets/APIExamples/Tests/Editor/UnityTestFramework/EditModeTestYieldInstructionExample.cs @@ -1,8 +1,9 @@ -// Copyright (c) 2021-2022 Koji Hasegawa. +// Copyright (c) 2021-2025 Koji Hasegawa. // This software is released under the MIT License. using System; using System.Collections; +using System.Diagnostics.CodeAnalysis; using System.IO; using System.Reflection; using System.Threading.Tasks; @@ -16,39 +17,59 @@ namespace APIExamples.Editor.UnityTestFramework /// /// の使用例 /// + [SuppressMessage("Structure", "NUnit1028:The non-test method is public")] public class EditModeTestYieldInstructionExample { + private static bool s_wasInitializeOnEnterPlayModeCalled; + private static bool s_wasRuntimeInitializeOnLoadMethodCalled; + private static bool s_wasOneTimeSetUpCalled; + private static bool s_wasUnitySetUpCalled; + private static bool s_wasSetUpCalled; + private static bool s_wasSetUpAsyncCalled; + private const string CsPath = "Assets/CreateFileExample.cs"; private const string DLLSrcPath = "TestData/NativePluginExample.dll"; private const string DLLDstPath = "Assets/NativePluginExample.dll"; + [InitializeOnEnterPlayMode] + public static void InitializeOnEnterPlayMode() + { + s_wasInitializeOnEnterPlayModeCalled = true; + } + + [RuntimeInitializeOnLoadMethod] + public static void RuntimeInitializeOnLoadMethod() + { + s_wasRuntimeInitializeOnLoadMethodCalled = true; + } + [OneTimeSetUp] public void OneTimeSetUp() { Assume.That(EditorSettings.enterPlayModeOptionsEnabled, Is.False, "Enter Play Mode Options enabled"); // Note: Edit | Project Settings... | Editor | Enter Play Mode Settings が変更されていないことが前提 - Debug.Log("OneTimeSetUpはドメインリロードで再実行されます"); + s_wasOneTimeSetUpCalled = true; } [UnitySetUp] public IEnumerator UnitySetUp() { - Debug.Log("UnitySetUpはドメインリロードで再実行されません"); + s_wasUnitySetUpCalled = true; yield break; } [SetUp] public void SetUp() { - Debug.Log("SetUpはドメインリロードで再実行されます"); + s_wasSetUpCalled = true; } [SetUp] public async Task SetUpAsync() { - Debug.Log("SetUpAsyncはドメインリロードで再実行されます"); - await Task.Delay(1); + s_wasSetUpAsyncCalled = true; + await Task.Yield(); } [TearDown] @@ -60,15 +81,34 @@ public void TearDown() } [UnityTest] - public IEnumerator EnterPlayModeの使用例() + public IEnumerator EnterPlayModeで再生モードに切り替える例() { yield return new EnterPlayMode(); + Assert.That(EditorApplication.isPlaying, Is.True); // Note: 特に後処理をしなくてもテスト終了後に編集モードに戻ります } [UnityTest] - public IEnumerator ExitPlayModeの使用例() + public IEnumerator EnterPlayModeで再生モードに切り替える例_InitializeOnEnterPlayModeが実行される() + { + yield return new EnterPlayMode(); + // Note: staticフィールドの値はドメインリロードで初期化されます + + Assert.That(s_wasInitializeOnEnterPlayModeCalled, Is.True); + } + + [UnityTest] + public IEnumerator EnterPlayModeで再生モードに切り替える例_RuntimeInitializeOnLoadMethodが実行される() + { + yield return new EnterPlayMode(); + // Note: staticフィールドの値はドメインリロードで初期化されます + + Assert.That(s_wasRuntimeInitializeOnLoadMethodCalled, Is.True); + } + + [UnityTest] + public IEnumerator ExitPlayModeで編集モードに切り替える例() { yield return new EnterPlayMode(); Assume.That(EditorApplication.isPlaying, Is.True); @@ -78,7 +118,7 @@ public IEnumerator ExitPlayModeの使用例() } [UnityTest] - public IEnumerator RecompileScriptsでリコンパイルされたクラスのメソッドを呼び出す例() + public IEnumerator RecompileScriptsでリコンパイルを実行する例_リコンパイルされたクラスのメソッドを呼び出せる() { Assume.That(Path.GetFullPath(CsPath), Does.Not.Exist, "Destination file already exists. please remove and re-run this test."); @@ -102,7 +142,7 @@ public IEnumerator RecompileScriptsでリコンパイルされたクラスのメ } [UnityTest] - public IEnumerator WaitForDomainReloadで追加されたアセンブリのメソッドを呼び出す例() + public IEnumerator WaitForDomainReloadでドメインリロードを待機する例_追加されたアセンブリのメソッドを呼び出せる() { Assume.That(Path.GetFullPath(DLLDstPath), Does.Not.Exist, "Destination file already exists. please remove and re-run this test."); @@ -120,5 +160,41 @@ public IEnumerator WaitForDomainReloadで追加されたアセンブリのメソ Assert.That(actual, Is.True); } + + [UnityTest] + public IEnumerator ドメインリロード発生時にOneTimeSetUpは再実行される() + { + yield return new EnterPlayMode(); + // Note: staticフィールドの値はドメインリロードで初期化されます + + Assert.That(s_wasOneTimeSetUpCalled, Is.True); + } + + [UnityTest] + public IEnumerator ドメインリロード発生時にUnitySetUpは再実行さない() + { + yield return new EnterPlayMode(); + // Note: staticフィールドの値はドメインリロードで初期化されます + + Assert.That(s_wasUnitySetUpCalled, Is.False); + } + + [UnityTest] + public IEnumerator ドメインリロード発生時にSetUpは再実行される() + { + yield return new EnterPlayMode(); + // Note: staticフィールドの値はドメインリロードで初期化されます + + Assert.That(s_wasSetUpCalled, Is.True); + } + + [UnityTest] + public IEnumerator ドメインリロード発生時にSetUpAsyncは再実行される() + { + yield return new EnterPlayMode(); + // Note: staticフィールドの値はドメインリロードで初期化されます + + Assert.That(s_wasSetUpAsyncCalled, Is.True); + } } } diff --git a/Assets/APIExamples/Tests/Editor/UnityTestFramework/UnityTestAttributeExample.cs b/Assets/APIExamples/Tests/Editor/UnityTestFramework/UnityTestAttributeExample.cs index 0364c89..0c75cb4 100644 --- a/Assets/APIExamples/Tests/Editor/UnityTestFramework/UnityTestAttributeExample.cs +++ b/Assets/APIExamples/Tests/Editor/UnityTestFramework/UnityTestAttributeExample.cs @@ -1,4 +1,4 @@ -// Copyright (c) 2021-2023 Koji Hasegawa. +// Copyright (c) 2021-2025 Koji Hasegawa. // This software is released under the MIT License. using System; @@ -12,10 +12,9 @@ namespace APIExamples.Editor.UnityTestFramework { /// /// フレームをまたがるテストをで実装する例 - /// UniTaskの使用例を含みます /// /// - /// Runtime/UnityTestFramework/UnityTestAttributeExampleをベースに、Edit Modeで動くもの + /// をベースに、Edit Modeテスト向けに修正したもの /// [TestFixture] public class UnityTestAttributeExample @@ -25,6 +24,7 @@ public IEnumerator YieldReturnNullでフレームを送る例() { var before = Time.frameCount; yield return null; + var actual = Time.frameCount; Assert.That(actual, Is.EqualTo(before)); // Note: Edit Modeテストではそもそもフレームカウントされない @@ -37,23 +37,26 @@ public IEnumerator YieldBreakの例_テストはパスする() } [UnityTest] - [Explicit("Edit ModeテストではWaitForEndOfFrameがエラーとなるため実行対象から除外")] - public IEnumerator YieldInstructionの実装クラスはEditMoteテストでは使用できない_実行時エラー() + [Explicit("Edit Modeテストでは動作しない")] + public IEnumerator YieldInstructionの実装クラス_EditMoteテストでは動作しない() { - var before = Time.frameCount; - yield return new WaitForEndOfFrame(); - var actual = Time.frameCount; + var start = Time.time; // The time at the beginning of this frame + const float WaitSeconds = 0.5f; + yield return new WaitForSeconds(WaitSeconds); + + var actual = Time.time - start; - Assert.That(actual, Is.EqualTo(before)); + Assert.That(actual, Is.EqualTo(WaitSeconds).Within(0.1f)); } [UnityTest] - [Explicit("Edit ModeテストではWaitForSecondsRealtimeが動作しないため実行対象から除外")] - public IEnumerator CustomYieldInstructionの実装クラスはEditMoteテストでは使用できない_動作しない() + [Explicit("Edit Modeテストでは動作しない")] + public IEnumerator CustomYieldInstructionの実装クラス_EditMoteテストでは動作しない() { var start = Time.time; // The time at the beginning of this frame const float WaitSeconds = 0.5f; yield return new WaitForSecondsRealtime(WaitSeconds); + var actual = Time.time - start; Assert.That(actual, Is.EqualTo(WaitSeconds).Within(0.1f)); @@ -83,6 +86,7 @@ public IEnumerator UniTaskでAsyncメソッドを使用するテストの例() = public IEnumerator コルーチンを起動してコールバックを受け取る例() { var actual = 0; + yield return BarCoroutine(i => { actual = i; @@ -91,11 +95,12 @@ public IEnumerator コルーチンを起動してコールバックを受け取 Assert.That(actual, Is.EqualTo(1)); } - [Ignore("Edit Modeテストではテストが終了しないため実行対象から除外/ Freeze in the Edit Mode tests")] [UnityTest] + [Ignore("Edit Modeテストではテストが終了しないため実行対象から除外/ Freeze in the Edit Mode tests")] public IEnumerator UniTaskでコルーチンを起動してコールバックを受け取る例_EditModeテストではテストが終了しない() => UniTask.ToCoroutine(async () => { var actual = 0; + await BarCoroutine(i => { actual = i; diff --git a/Assets/APIExamples/Tests/Runtime/AssemblyInfo.cs b/Assets/APIExamples/Tests/Runtime/AssemblyInfo.cs index 13b338d..c863ac1 100644 --- a/Assets/APIExamples/Tests/Runtime/AssemblyInfo.cs +++ b/Assets/APIExamples/Tests/Runtime/AssemblyInfo.cs @@ -1,6 +1,6 @@ -// Copyright (c) 2021-2022 Koji Hasegawa. +// Copyright (c) 2021-2025 Koji Hasegawa. // This software is released under the MIT License. -using NUnit.Framework; +using System.Runtime.CompilerServices; -[assembly: Category("APIExamples")] +[assembly: InternalsVisibleTo("APIExample.Editor.Tests")] diff --git a/Assets/APIExamples/Tests/Runtime/NUnit/CategoryAttributeExample.cs b/Assets/APIExamples/Tests/Runtime/NUnit/CategoryAttributeExample.cs index 9b04120..b75504a 100644 --- a/Assets/APIExamples/Tests/Runtime/NUnit/CategoryAttributeExample.cs +++ b/Assets/APIExamples/Tests/Runtime/NUnit/CategoryAttributeExample.cs @@ -1,4 +1,4 @@ -// Copyright (c) 2021-2022 Koji Hasegawa. +// Copyright (c) 2021-2025 Koji Hasegawa. // This software is released under the MIT License. using NUnit.Framework; @@ -8,20 +8,23 @@ namespace APIExamples.NUnit /// /// の記述例 /// + /// + /// アセンブリへの配置例は、UGUIExample など統合テスト編サンプルの AssemblyInfo.cs を参照してください。 + /// [TestFixture] - [Category("CategoryExample")] + [Category("CategoryFoo")] public class CategoryAttributeExample { [Test] - [Category("LearningTests")] - public void CategorizedMethodExample() + [Category("CategoryBar")] + public void CategorizedMethod() { } [Test] - [Category("LearningTests")] - [Category("IgnoreCI")] - public void MultiCategorizedMethodExample() + [Category("CategoryBaz")] + [Category("CategoryQux")] + public void MultiCategorizedMethodMethod() { } } diff --git a/Assets/APIExamples/Tests/Runtime/UnityTestFramework/UnitySetUpAttributeExample.cs b/Assets/APIExamples/Tests/Runtime/UnityTestFramework/UnitySetUpAttributeExample.cs index 0d8a36d..84649db 100644 --- a/Assets/APIExamples/Tests/Runtime/UnityTestFramework/UnitySetUpAttributeExample.cs +++ b/Assets/APIExamples/Tests/Runtime/UnityTestFramework/UnitySetUpAttributeExample.cs @@ -22,7 +22,7 @@ public class UnitySetUpAttributeExample [UnitySetUp] public IEnumerator SetUpCoroutine() { - yield return SceneManager.LoadSceneAsync("HelloTesting"); + yield return SceneManager.LoadSceneAsync("ContainScenesInBuild"); } [Test] diff --git a/Assets/APIExamples/Tests/Runtime/UnityTestFramework/UnityTestAttributeExample.cs b/Assets/APIExamples/Tests/Runtime/UnityTestFramework/UnityTestAttributeExample.cs index fcd3da9..a656525 100644 --- a/Assets/APIExamples/Tests/Runtime/UnityTestFramework/UnityTestAttributeExample.cs +++ b/Assets/APIExamples/Tests/Runtime/UnityTestFramework/UnityTestAttributeExample.cs @@ -1,4 +1,4 @@ -// Copyright (c) 2021-2023 Koji Hasegawa. +// Copyright (c) 2021-2025 Koji Hasegawa. // This software is released under the MIT License. using System; @@ -13,7 +13,6 @@ namespace APIExamples.UnityTestFramework { /// /// フレームをまたがるテストをで実装する例 - /// UniTaskの使用例を含みます /// [TestFixture] public class UnityTestAttributeExample @@ -23,6 +22,7 @@ public IEnumerator YieldReturnNullでフレームを送る例() { var before = Time.frameCount; yield return null; + var actual = Time.frameCount; Assert.That(actual, Is.EqualTo(before + 1)); @@ -35,15 +35,15 @@ public IEnumerator YieldBreakの例_テストはパスする() } [UnityTest] - [Category("IgnoreCI")] - [Description("CIでは(Linux Editorでは?)フレームが進んでしまう(648 to 41767)のでとりあえず除外")] public IEnumerator YieldInstructionの実装クラスを使用できる() { - var before = Time.frameCount; - yield return new WaitForEndOfFrame(); - var actual = Time.frameCount; + var start = Time.time; // The time at the beginning of this frame + const float WaitSeconds = 0.5f; + yield return new WaitForSeconds(WaitSeconds); - Assert.That(actual, Is.EqualTo(before)); + var actual = Time.time - start; + + Assert.That(actual, Is.EqualTo(WaitSeconds).Within(0.1f)); } [UnityTest] @@ -52,6 +52,7 @@ public IEnumerator CustomYieldInstructionの実装クラスを使用できる() var start = Time.time; // The time at the beginning of this frame const float WaitSeconds = 0.5f; yield return new WaitForSecondsRealtime(WaitSeconds); + var actual = Time.time - start; Assert.That(actual, Is.EqualTo(WaitSeconds).Within(0.1f)); @@ -60,7 +61,7 @@ public IEnumerator CustomYieldInstructionの実装クラスを使用できる() [UnityTest] public IEnumerator AsyncOperationの終了を待つテストの例() { - yield return SceneManager.LoadSceneAsync("HelloTesting"); + yield return SceneManager.LoadSceneAsync("ContainScenesInBuild"); var cube = GameObject.Find("Cube"); Assert.That((bool)cube, Is.True); @@ -69,7 +70,7 @@ public IEnumerator AsyncOperationの終了を待つテストの例() [UnityTest] public IEnumerator UniTaskでAsyncメソッドを使用するテストの例() => UniTask.ToCoroutine(async () => { - await SceneManager.LoadSceneAsync("HelloTesting"); + await SceneManager.LoadSceneAsync("ContainScenesInBuild"); var cube = GameObject.Find("Cube"); Assert.That((bool)cube, Is.True); @@ -79,6 +80,7 @@ public IEnumerator UniTaskでAsyncメソッドを使用するテストの例() = public IEnumerator コルーチンを起動してコールバックを受け取る例() { var actual = 0; + yield return BarCoroutine(i => { actual = i; @@ -91,6 +93,7 @@ public IEnumerator コルーチンを起動してコールバックを受け取 public IEnumerator UniTaskでコルーチンを起動してコールバックを受け取る例() => UniTask.ToCoroutine(async () => { var actual = 0; + await BarCoroutine(i => { actual = i; From 2aa997b2f3685c51971f312ae4032e47b6b17e5a Mon Sep 17 00:00:00 2001 From: Koji Hasegawa Date: Sun, 31 Aug 2025 02:15:11 +0900 Subject: [PATCH 05/22] Fix TimeoutAttribute examples --- .../Tests/Runtime/APIExamples.Tests.asmdef | 3 +- .../Runtime/NUnit/MaxTimeAttributeExample.cs | 12 +-- .../Runtime/NUnit/TimeoutAttributeExample.cs | 101 +++++++++--------- 3 files changed, 54 insertions(+), 62 deletions(-) diff --git a/Assets/APIExamples/Tests/Runtime/APIExamples.Tests.asmdef b/Assets/APIExamples/Tests/Runtime/APIExamples.Tests.asmdef index 176c69b..eefcc21 100644 --- a/Assets/APIExamples/Tests/Runtime/APIExamples.Tests.asmdef +++ b/Assets/APIExamples/Tests/Runtime/APIExamples.Tests.asmdef @@ -5,7 +5,8 @@ "UnityEngine.TestRunner", "UnityEditor.TestRunner", "APIExamples", - "UniTask" + "UniTask", + "TestHelper" ], "includePlatforms": [], "excludePlatforms": [], diff --git a/Assets/APIExamples/Tests/Runtime/NUnit/MaxTimeAttributeExample.cs b/Assets/APIExamples/Tests/Runtime/NUnit/MaxTimeAttributeExample.cs index fc802c1..e8ed88a 100644 --- a/Assets/APIExamples/Tests/Runtime/NUnit/MaxTimeAttributeExample.cs +++ b/Assets/APIExamples/Tests/Runtime/NUnit/MaxTimeAttributeExample.cs @@ -1,12 +1,12 @@ // Copyright (c) 2021-2025 Koji Hasegawa. // This software is released under the MIT License. +using System; using System.Collections; using System.Threading.Tasks; using NUnit.Framework; using UnityEngine; using UnityEngine.TestTools; -using Debug = UnityEngine.Debug; namespace APIExamples.NUnit { @@ -25,14 +25,10 @@ public class MaxTimeAttributeExample [MaxTime(100)] public void MaxTime属性_指定ミリ秒よりも時間のかかるテストは実行後に失敗() { - var loopCount = 50000000; - var sum = 0f; - for (var i = 0; i < loopCount; i++) + var endTime = DateTime.Now.AddMilliseconds(500); + while (DateTime.Now < endTime) { - sum += Random.value; } - - Debug.Log("テストは最後まで実行されます"); } [UnityTest] @@ -40,7 +36,6 @@ public void MaxTime属性_指定ミリ秒よりも時間のかかるテストは public IEnumerator MaxTime属性_指定ミリ秒よりも時間のかかるテストは実行後に失敗_UnityTest属性() { yield return new WaitForSeconds(0.5f); - Debug.Log("テストは最後まで実行されます"); } [Test] @@ -48,7 +43,6 @@ public IEnumerator MaxTime属性_指定ミリ秒よりも時間のかかるテ public async Task MaxTime属性_指定ミリ秒よりも時間のかかるテストは実行後に失敗_非同期テスト() { await Task.Delay(500); - Debug.Log("テストは最後まで実行されます"); } } } diff --git a/Assets/APIExamples/Tests/Runtime/NUnit/TimeoutAttributeExample.cs b/Assets/APIExamples/Tests/Runtime/NUnit/TimeoutAttributeExample.cs index dacc2d6..1edb39d 100644 --- a/Assets/APIExamples/Tests/Runtime/NUnit/TimeoutAttributeExample.cs +++ b/Assets/APIExamples/Tests/Runtime/NUnit/TimeoutAttributeExample.cs @@ -1,110 +1,107 @@ -// Copyright (c) 2021-2023 Koji Hasegawa. +// Copyright (c) 2021-2025 Koji Hasegawa. // This software is released under the MIT License. using System; using System.Collections; -using System.Diagnostics; using System.Threading.Tasks; +using Cysharp.Threading.Tasks; using NUnit.Framework; +using TestHelper.Attributes; using UnityEngine; using UnityEngine.TestTools; -#pragma warning disable CS0162 - namespace APIExamples.NUnit { /// /// およびデフォルトタイムアウト時間の確認 /// + /// + /// このクラスに書かれている振る舞いは、Unity Test Framework v1.4.6およびv1.5.1のものです。バージョンによって振る舞いが異なりますので注意してください。 + ///
+ /// 非同期 (async) テストでタイムアウト及びTimeout属性が機能しない問題は、Unity Test Framework v1.3.4で修正されました。 + /// + ///
[TestFixture] + [Explicit("Timeout属性によって失敗するテストの例")] public class TimeoutAttributeExample { - private readonly Stopwatch _stopwatch = new Stopwatch(); - private const bool Fail = false; // このフラグをtrueにするとこのクラスのテストはすべて失敗します - - [SetUp] - public void SetUp() + [Test] + [Timeout(2000)] + public void Timeout属性_同期テストではタイムアウトで割り込みは発生しないが終了時に指定時間を超えていたらテスト失敗() { - _stopwatch.Restart(); + var endTime = DateTime.Now.AddSeconds(5d); + while (DateTime.Now < endTime) + { + } } - [TearDown] - public void TearDown() + [UnityTest] + [Timeout(2000)] + public IEnumerator Timeout属性_UnityTest属性でWaitForSeconds_割り込みは発生しないが終了時に指定時間を超えていたらテスト失敗() { - UnityEngine.Debug.Log($"{_stopwatch.ElapsedMilliseconds} [ms]"); - Time.timeScale = 1f; + yield return new WaitForSeconds(5.0f); } - [Explicit("時間がかかるのでExplicit")] [UnityTest] - public IEnumerator タイムアウトのデフォルトは3分() + public IEnumerator タイムアウトのデフォルトは3分_3分でタイムアウト() { - var waitSeconds = 3 * 60 - 1; // タイムアウトのデフォルトは3[min] - if (Fail) + var endTime = DateTime.Now.AddMinutes(3d).AddSeconds(5d); + while (DateTime.Now < endTime) { - waitSeconds++; + yield return null; } - - yield return new WaitForSeconds(waitSeconds); } [UnityTest] [Timeout(2000)] - public IEnumerator タイムアウトを2秒に設定() + public IEnumerator Timeout属性_UnityTest属性でYieldReturnNull_指定ミリ秒でタイムアウト() { - var waitSeconds = 1f; - if (Fail) + var endTime = DateTime.Now.AddSeconds(5d); + while (DateTime.Now < endTime) { - waitSeconds = 10f; + yield return null; } - - yield return new WaitForSeconds(waitSeconds); } [UnityTest] [Timeout(2000)] - public IEnumerator タイムアウト値はTimeScaleに影響されない() + [TimeScale(2.0f)] + public IEnumerator Timeout属性_タイムアウト値はTimeScaleに影響されない_指定ミリ秒でタイムアウト() { - var waitSeconds = 1f; - if (Fail) + var endTime = Time.time + 10.0f; + while (Time.time < endTime) { - waitSeconds = 10f; + yield return null; } - - Time.timeScale = 5f; - yield return new WaitForSecondsRealtime(waitSeconds); } - [UnityTest] + [Test] [Timeout(2000)] - public IEnumerator タイムアウトはWaitForSeconds以外では有効でない_中断されない() + public async Task Timeout属性_非同期テストでDelay_指定ミリ秒でタイムアウト() { - var waitSeconds = 1f; - if (Fail) - { - waitSeconds = 10f; - } + await Task.Delay(TimeSpan.FromSeconds(5.0f)); + } - var startTime = DateTime.Now; - while ((DateTime.Now - startTime).Seconds < waitSeconds) + [Test] + [Timeout(2000)] + public async Task Timeout属性_非同期テストでYield_指定ミリ秒でタイムアウト() + { + var endTime = DateTime.Now.AddSeconds(5d); + while (DateTime.Now < endTime) { - yield return null; // Timeout時間を超えてもテストは中断されない。指定時間を超過していれば失敗と判定はされる + await Task.Yield(); } } [Test] [Timeout(2000)] - // Note: 非同期(async)テストでタイムアウト及びTimeout属性が機能しない問題は、Unity Test Framework v1.3.4で修正された - // See: https://unity3d.atlassian.net/servicedesk/customer/portal/2/IN-28108 - public async Task 非同期テストでタイムアウトを2秒に設定() + public async Task Timeout属性_非同期テストでNextFrame_指定ミリ秒でタイムアウト() { - var waitSeconds = 1f; - if (Fail) + var endTime = DateTime.Now.AddSeconds(5d); + while (DateTime.Now < endTime) { - waitSeconds = 10f; + await UniTask.NextFrame(); } - - await Task.Delay(TimeSpan.FromSeconds(waitSeconds)); } } } From 3e4a74aa7968e5c818127e2c756c4f5df74d69e2 Mon Sep 17 00:00:00 2001 From: Koji Hasegawa Date: Sun, 21 Sep 2025 02:20:43 +0900 Subject: [PATCH 06/22] Add missing script validators --- .../{AssetValidators.meta => Validators.meta} | 0 .../LevelValidator.cs | 27 ++++++---- .../LevelValidator.cs.meta | 0 .../Editor/Validators/PrefabValidator.cs | 48 +++++++++++++++++ .../Editor/Validators/PrefabValidator.cs.meta | 3 ++ .../RaceValidator.cs | 8 +-- .../RaceValidator.cs.meta | 0 .../Tests/Editor/Validators/SceneValidator.cs | 52 +++++++++++++++++++ .../Editor/Validators/SceneValidator.cs.meta | 2 + 9 files changed, 125 insertions(+), 15 deletions(-) rename Assets/BasicExample/Tests/Editor/{AssetValidators.meta => Validators.meta} (100%) rename Assets/BasicExample/Tests/Editor/{AssetValidators => Validators}/LevelValidator.cs (62%) rename Assets/BasicExample/Tests/Editor/{AssetValidators => Validators}/LevelValidator.cs.meta (100%) create mode 100644 Assets/BasicExample/Tests/Editor/Validators/PrefabValidator.cs create mode 100644 Assets/BasicExample/Tests/Editor/Validators/PrefabValidator.cs.meta rename Assets/BasicExample/Tests/Editor/{AssetValidators => Validators}/RaceValidator.cs (80%) rename Assets/BasicExample/Tests/Editor/{AssetValidators => Validators}/RaceValidator.cs.meta (100%) create mode 100644 Assets/BasicExample/Tests/Editor/Validators/SceneValidator.cs create mode 100644 Assets/BasicExample/Tests/Editor/Validators/SceneValidator.cs.meta diff --git a/Assets/BasicExample/Tests/Editor/AssetValidators.meta b/Assets/BasicExample/Tests/Editor/Validators.meta similarity index 100% rename from Assets/BasicExample/Tests/Editor/AssetValidators.meta rename to Assets/BasicExample/Tests/Editor/Validators.meta diff --git a/Assets/BasicExample/Tests/Editor/AssetValidators/LevelValidator.cs b/Assets/BasicExample/Tests/Editor/Validators/LevelValidator.cs similarity index 62% rename from Assets/BasicExample/Tests/Editor/AssetValidators/LevelValidator.cs rename to Assets/BasicExample/Tests/Editor/Validators/LevelValidator.cs index 3392b6f..b1831e0 100644 --- a/Assets/BasicExample/Tests/Editor/AssetValidators/LevelValidator.cs +++ b/Assets/BasicExample/Tests/Editor/Validators/LevelValidator.cs @@ -2,6 +2,7 @@ // This software is released under the MIT License. using System.Collections.Generic; +using System.IO; using System.Linq; using BasicExample.Level; using NUnit.Framework; @@ -9,24 +10,28 @@ using UnityEditor.SceneManagement; using UnityEngine; -namespace BasicExample.Editor.AssetValidators +namespace BasicExample.Editor.Validators { /// - /// Scenes/Levels/下のすべてのSceneに対して、次のコンポーネントが設置されていることを検証する - /// - - /// - + /// Scenes/Levels/ 下のすべての Scene に対して、次のコンポーネントが設置されていることを検証する + /// + /// + /// + /// /// /// - /// の応用例 + /// の使用例 /// + [TestFixture] public class LevelValidator { - private static IEnumerable Levels => AssetDatabase + private static IEnumerable Levels => AssetDatabase .FindAssets("t:SceneAsset", new[] { "Assets/BasicExample/Scenes/Levels" }) - .Select(AssetDatabase.GUIDToAssetPath); + .Select(AssetDatabase.GUIDToAssetPath) + .Select(path => new TestCaseData(path).SetName(Path.GetFileName(path))); - [Test] - public void Levels下のSceneにSpawnPointが1つ設置されていること([ValueSource(nameof(Levels))] string path) + [TestCaseSource(nameof(Levels))] + public void Levels下のSceneにSpawnPointが1つ設置されていること(string path) { EditorSceneManager.OpenScene(path); var spawnPoints = Object.FindObjectsOfType(); @@ -34,8 +39,8 @@ public void Levels下のSceneにSpawnPointが1つ設置されていること([Va Assert.That(spawnPoints, Has.Length.EqualTo(1)); } - [Test] - public void Levels下のSceneにExitPointが設置されていること([ValueSource(nameof(Levels))] string path) + [TestCaseSource(nameof(Levels))] + public void Levels下のSceneにExitPointが設置されていること(string path) { EditorSceneManager.OpenScene(path); var exitPoints = Object.FindObjectsOfType(); diff --git a/Assets/BasicExample/Tests/Editor/AssetValidators/LevelValidator.cs.meta b/Assets/BasicExample/Tests/Editor/Validators/LevelValidator.cs.meta similarity index 100% rename from Assets/BasicExample/Tests/Editor/AssetValidators/LevelValidator.cs.meta rename to Assets/BasicExample/Tests/Editor/Validators/LevelValidator.cs.meta diff --git a/Assets/BasicExample/Tests/Editor/Validators/PrefabValidator.cs b/Assets/BasicExample/Tests/Editor/Validators/PrefabValidator.cs new file mode 100644 index 0000000..5c4eba6 --- /dev/null +++ b/Assets/BasicExample/Tests/Editor/Validators/PrefabValidator.cs @@ -0,0 +1,48 @@ +// Copyright (c) 2021-2025 Koji Hasegawa. +// This software is released under the MIT License. + +using System.Collections.Generic; +using System.IO; +using System.Linq; +using NUnit.Framework; +using UnityEditor; +using UnityEngine; + +namespace BasicExample.Editor.Validators +{ + /// + /// Assets/ 下のすべての Prefab に対して、missing script がないことを検証する. + /// + /// + /// の使用例 + /// + [TestFixture] + public class PrefabValidator + { + private static IEnumerable Prefabs => AssetDatabase + .FindAssets("t:Prefab", new string[] { "Assets/" }) + .Select(AssetDatabase.GUIDToAssetPath) + .Select(path => new TestCaseData(path).SetName(Path.GetFileName(path))); + + private static void AssertMissingScriptRecursive(GameObject gameObject) + { + var components = gameObject.GetComponents(); + foreach (var component in components) + { + Assert.That(component, Is.Not.Null, $"Component in {gameObject.name}"); + } + + foreach (Transform child in gameObject.transform) + { + AssertMissingScriptRecursive(child.gameObject); + } + } + + [TestCaseSource(nameof(Prefabs))] + public void MissingScriptがないこと(string path) + { + var root = AssetDatabase.LoadAssetAtPath(path); + AssertMissingScriptRecursive(root); + } + } +} diff --git a/Assets/BasicExample/Tests/Editor/Validators/PrefabValidator.cs.meta b/Assets/BasicExample/Tests/Editor/Validators/PrefabValidator.cs.meta new file mode 100644 index 0000000..5ce0e64 --- /dev/null +++ b/Assets/BasicExample/Tests/Editor/Validators/PrefabValidator.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: bf0c636a5e5b4c5cb37c516c23a59ce2 +timeCreated: 1758386625 \ No newline at end of file diff --git a/Assets/BasicExample/Tests/Editor/AssetValidators/RaceValidator.cs b/Assets/BasicExample/Tests/Editor/Validators/RaceValidator.cs similarity index 80% rename from Assets/BasicExample/Tests/Editor/AssetValidators/RaceValidator.cs rename to Assets/BasicExample/Tests/Editor/Validators/RaceValidator.cs index 77e9915..be8c9c7 100644 --- a/Assets/BasicExample/Tests/Editor/AssetValidators/RaceValidator.cs +++ b/Assets/BasicExample/Tests/Editor/Validators/RaceValidator.cs @@ -11,19 +11,19 @@ using UnityEditor; using Object = UnityEngine.Object; -namespace BasicExample.Editor.AssetValidators +namespace BasicExample.Editor.Validators { /// - /// ScriptableObjects/Races/下のすべてのSOに対して、フィールドの設定漏れがないことを検証する + /// ScriptableObjects/Races/ 下のすべての ScriptableObject に対して、フィールドの設定漏れがないことを検証する. /// /// - /// の応用例として書いたものの、フィールドは素直にRace型を使うほうがよさそう + /// の応用例として書いたものの、フィールドは素直にRace型を使うほうがよさそう /// public class RaceValidator { // Race型のScriptableObjectを列挙 private static IEnumerable RacePaths => AssetDatabase - .FindAssets("t:Race", new [] { "Assets/BasicExample/ScriptableObjects/Races" }) + .FindAssets("t:Race", new[] { "Assets/BasicExample/ScriptableObjects/Races" }) .Select(AssetDatabase.GUIDToAssetPath); // Race型のフィールドを列挙 diff --git a/Assets/BasicExample/Tests/Editor/AssetValidators/RaceValidator.cs.meta b/Assets/BasicExample/Tests/Editor/Validators/RaceValidator.cs.meta similarity index 100% rename from Assets/BasicExample/Tests/Editor/AssetValidators/RaceValidator.cs.meta rename to Assets/BasicExample/Tests/Editor/Validators/RaceValidator.cs.meta diff --git a/Assets/BasicExample/Tests/Editor/Validators/SceneValidator.cs b/Assets/BasicExample/Tests/Editor/Validators/SceneValidator.cs new file mode 100644 index 0000000..07fc90e --- /dev/null +++ b/Assets/BasicExample/Tests/Editor/Validators/SceneValidator.cs @@ -0,0 +1,52 @@ +// Copyright (c) 2021-2025 Koji Hasegawa. +// This software is released under the MIT License. + +using System.Collections.Generic; +using System.IO; +using System.Linq; +using NUnit.Framework; +using UnityEditor; +using UnityEditor.SceneManagement; +using UnityEngine; + +namespace BasicExample.Editor.Validators +{ + /// + /// Assets/ 下のすべての Scene に対して、missing script がないことを検証する. + /// + /// + /// の使用例 + /// + [TestFixture] + public class SceneValidator + { + private static IEnumerable Scenes => AssetDatabase + .FindAssets("t:SceneAsset", new string[] { "Assets/" }) + .Select(AssetDatabase.GUIDToAssetPath) + .Select(path => new TestCaseData(path).SetName(Path.GetFileName(path))); + + private static void AssertMissingScriptRecursive(GameObject gameObject) + { + var components = gameObject.GetComponents(); + foreach (var component in components) + { + Assert.That(component, Is.Not.Null, $"Component in {gameObject.name}"); + } + + foreach (Transform child in gameObject.transform) + { + AssertMissingScriptRecursive(child.gameObject); + } + } + + [TestCaseSource(nameof(Scenes))] + public void MissingScriptがないこと(string path) + { + var scene = EditorSceneManager.OpenScene(path); + foreach (var root in scene.GetRootGameObjects()) + { + AssertMissingScriptRecursive(root); + } + } + } +} diff --git a/Assets/BasicExample/Tests/Editor/Validators/SceneValidator.cs.meta b/Assets/BasicExample/Tests/Editor/Validators/SceneValidator.cs.meta new file mode 100644 index 0000000..5271dda --- /dev/null +++ b/Assets/BasicExample/Tests/Editor/Validators/SceneValidator.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 54b8dccf49f1c435aa18ab1c2cfe1549 \ No newline at end of file From a9b1dead6de91760371f4585cec9b587189e4eb4 Mon Sep 17 00:00:00 2001 From: Koji Hasegawa Date: Sat, 4 Oct 2025 18:38:38 +0900 Subject: [PATCH 07/22] Upgrade Unity versions used to run tests on CI (Unity 6.2.6f1, test-framework v1.6.0) --- .github/workflows/test-integration.yml | 12 ++++++------ .github/workflows/test.yml | 18 +++++++++++------- 2 files changed, 17 insertions(+), 13 deletions(-) diff --git a/.github/workflows/test-integration.yml b/.github/workflows/test-integration.yml index a506005..46244ee 100644 --- a/.github/workflows/test-integration.yml +++ b/.github/workflows/test-integration.yml @@ -22,7 +22,7 @@ concurrency: group: ${{ github.workflow }}-${{ github.ref }}-${{ github.event.inputs.runner }} cancel-in-progress: true -permissions: {} +permissions: { } defaults: run: @@ -41,15 +41,15 @@ jobs: matrix: unityVersion: # Available versions see: https://game.ci/docs/docker/versions - 2019.4.40f1 - - 2020.3.48f1 + - 2020.3.49f1 - 2021.3.45f1 - - 2022.3.59f1 - - 2023.2.20f1 - - 6000.0.41f1 + - 2022.3.62f1 + - 6000.0.58f1 + - 6000.2.6f1 testMode: - All # run tests in editor include: - - unityVersion: 6000.0.41f1 + - unityVersion: 6000.2.6f1 testMode: Standalone # run tests on player steps: diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index c08470f..81e9adc 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -22,7 +22,7 @@ concurrency: group: ${{ github.workflow }}-${{ github.ref }} cancel-in-progress: true -permissions: {} +permissions: { } defaults: run: @@ -42,17 +42,21 @@ jobs: matrix: unityVersion: # Available versions see: https://game.ci/docs/docker/versions - 2019.4.40f1 - - 2020.3.48f1 + - 2020.3.49f1 - 2021.3.45f1 - - 2022.3.59f1 - - 2023.2.20f1 - - 6000.0.41f1 + - 2022.3.62f1 + - 6000.0.43f1 + - 6000.0.44f1 # pin test-framework v1.5.1 + - 6000.0.58f1 + - 6000.1.17f1 + - 6000.2.5f1 + - 6000.2.6f1 # pin test-framework v1.6.0 testMode: - All # run tests in editor include: - - unityVersion: 6000.0.41f1 + - unityVersion: 6000.2.6f1 octocov: true - - unityVersion: 6000.0.41f1 + - unityVersion: 6000.2.6f1 testMode: Standalone # run tests on player steps: From 56063f4370fa45b74bfdd3c301cf81a26979c320 Mon Sep 17 00:00:00 2001 From: Koji Hasegawa Date: Sat, 4 Oct 2025 18:54:38 +0900 Subject: [PATCH 08/22] Change com.unity.testframework.graphics package to optional --- .../Tests/Runtime/ImageAssertTest.cs | 2 + .../VisualRegressionExample.Tests.asmdef | 8 +++- Packages/manifest.json | 1 - Packages/packages-lock.json | 40 ------------------- README.md | 4 ++ 5 files changed, 13 insertions(+), 42 deletions(-) diff --git a/Assets/VisualRegressionExample/Tests/Runtime/ImageAssertTest.cs b/Assets/VisualRegressionExample/Tests/Runtime/ImageAssertTest.cs index 974647a..031d8c0 100644 --- a/Assets/VisualRegressionExample/Tests/Runtime/ImageAssertTest.cs +++ b/Assets/VisualRegressionExample/Tests/Runtime/ImageAssertTest.cs @@ -1,6 +1,7 @@ // Copyright (c) 2021-2023 Koji Hasegawa. // This software is released under the MIT License. +#if ENABLE_GRAPHICS_TEST_FRAMEWORK using System.Collections; using System.IO; using System.Threading.Tasks; @@ -125,3 +126,4 @@ private class CoroutineRunner : MonoBehaviour } } } +#endif diff --git a/Assets/VisualRegressionExample/Tests/Runtime/VisualRegressionExample.Tests.asmdef b/Assets/VisualRegressionExample/Tests/Runtime/VisualRegressionExample.Tests.asmdef index 2bc2317..b9f18ce 100644 --- a/Assets/VisualRegressionExample/Tests/Runtime/VisualRegressionExample.Tests.asmdef +++ b/Assets/VisualRegressionExample/Tests/Runtime/VisualRegressionExample.Tests.asmdef @@ -19,6 +19,12 @@ "defineConstraints": [ "UNITY_INCLUDE_TESTS" ], - "versionDefines": [], + "versionDefines": [ + { + "name": "com.unity.testframework.graphics", + "expression": "", + "define": "ENABLE_GRAPHICS_TEST_FRAMEWORK" + } + ], "noEngineReferences": false } \ No newline at end of file diff --git a/Packages/manifest.json b/Packages/manifest.json index 3c3133b..26f9d64 100644 --- a/Packages/manifest.json +++ b/Packages/manifest.json @@ -12,7 +12,6 @@ "com.unity.ide.visualstudio": "2.0.22", "com.unity.inputsystem": "1.7.0", "com.unity.test-framework": "1.4.6", - "com.unity.testframework.graphics": "7.17.0-exp.1", "com.unity.testtools.codecoverage": "1.2.4", "com.unity.textmeshpro": "2.1.6", "com.unity.timeline": "1.2.18", diff --git a/Packages/packages-lock.json b/Packages/packages-lock.json index 8263a61..77562c1 100644 --- a/Packages/packages-lock.json +++ b/Packages/packages-lock.json @@ -164,23 +164,6 @@ }, "url": "https://packages.unity.com" }, - "com.unity.testframework.graphics": { - "version": "7.17.0-exp.1", - "depth": 0, - "source": "registry", - "dependencies": { - "com.unity.modules.vr": "1.0.0", - "com.unity.modules.xr": "1.0.0", - "com.unity.addressables": "1.17.15", - "com.unity.xr.management": "4.0.5", - "com.unity.nuget.newtonsoft-json": "2.0.0", - "com.unity.xr.legacyinputhelpers": "2.1.8", - "com.unity.external.test-protocol": "1.0.0-preview", - "com.unity.testtools.codecoverage": "1.2.0", - "com.unity.modules.imageconversion": "1.0.0" - }, - "url": "https://packages.unity.com" - }, "com.unity.testtools.codecoverage": { "version": "1.2.4", "depth": 0, @@ -221,29 +204,6 @@ "com.unity.modules.imgui": "1.0.0" } }, - "com.unity.xr.legacyinputhelpers": { - "version": "2.1.9", - "depth": 1, - "source": "registry", - "dependencies": { - "com.unity.modules.vr": "1.0.0", - "com.unity.modules.xr": "1.0.0" - }, - "url": "https://packages.unity.com" - }, - "com.unity.xr.management": { - "version": "4.0.5", - "depth": 1, - "source": "registry", - "dependencies": { - "com.unity.modules.vr": "1.0.0", - "com.unity.modules.xr": "1.0.0", - "com.unity.modules.subsystems": "1.0.0", - "com.unity.subsystemregistration": "1.0.6", - "com.unity.xr.legacyinputhelpers": "2.1.7" - }, - "url": "https://packages.unity.com" - }, "net.tnrd.nsubstitute": { "version": "4.2.2", "depth": 0, diff --git a/README.md b/README.md index 2093fb0..badcaae 100644 --- a/README.md +++ b/README.md @@ -160,6 +160,10 @@ Assets └── VisualRegressionExample ``` +> [!TIP] +> このテストを実行するには +> [Graphics Test Framework](https://docs.unity3d.com/Packages/com.unity.testframework.graphics@latest) +> パッケージをインストールする必要があります。 ## 備考 From e4771de9d41c6c0c220db11ceb01a250a222f9f5 Mon Sep 17 00:00:00 2001 From: Koji Hasegawa Date: Sat, 4 Oct 2025 22:17:09 +0900 Subject: [PATCH 09/22] Upgrade test-helper package to v1.2.3 --- Packages/manifest.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Packages/manifest.json b/Packages/manifest.json index 26f9d64..ec715ff 100644 --- a/Packages/manifest.json +++ b/Packages/manifest.json @@ -3,7 +3,7 @@ "com.cysharp.unitask": "2.5.0", "com.nowsprinting.create-script-folders-with-tests": "1.2.3", "com.nowsprinting.local-package-sample": "file:../LocalPackages/com.nowsprinting.local-package-sample", - "com.nowsprinting.test-helper": "1.2.1", + "com.nowsprinting.test-helper": "1.2.3", "com.nowsprinting.test-helper.input": "1.0.1", "com.nowsprinting.test-helper.random": "1.0.0", "com.nowsprinting.test-helper.ui": "1.0.1", From 1e3171d27fe926b850ee7d84aaa3be14fb2d770d Mon Sep 17 00:00:00 2001 From: Koji Hasegawa Date: Sat, 4 Oct 2025 18:31:15 +0900 Subject: [PATCH 10/22] Add check test-framework version tests --- .../Editor/APIExamples.Editor.Tests.asmdef | 3 +- .../UnityTestFrameworkVersionTest.cs | 55 +++++++++++++++++++ .../UnityTestFrameworkVersionTest.cs.meta | 3 + 3 files changed, 60 insertions(+), 1 deletion(-) create mode 100644 Assets/APIExamples/Tests/Editor/UnityTestFramework/UnityTestFrameworkVersionTest.cs create mode 100644 Assets/APIExamples/Tests/Editor/UnityTestFramework/UnityTestFrameworkVersionTest.cs.meta diff --git a/Assets/APIExamples/Tests/Editor/APIExamples.Editor.Tests.asmdef b/Assets/APIExamples/Tests/Editor/APIExamples.Editor.Tests.asmdef index b480609..3e283a5 100644 --- a/Assets/APIExamples/Tests/Editor/APIExamples.Editor.Tests.asmdef +++ b/Assets/APIExamples/Tests/Editor/APIExamples.Editor.Tests.asmdef @@ -6,7 +6,8 @@ "UnityEditor.TestRunner", "NUnit.Analyzers_Unity", "APIExamples.Tests", - "UniTask" + "UniTask", + "TestHelper" ], "includePlatforms": [ "Editor" diff --git a/Assets/APIExamples/Tests/Editor/UnityTestFramework/UnityTestFrameworkVersionTest.cs b/Assets/APIExamples/Tests/Editor/UnityTestFramework/UnityTestFrameworkVersionTest.cs new file mode 100644 index 0000000..8506319 --- /dev/null +++ b/Assets/APIExamples/Tests/Editor/UnityTestFramework/UnityTestFrameworkVersionTest.cs @@ -0,0 +1,55 @@ +// Copyright (c) 2021-2025 Koji Hasegawa. +// This software is released under the MIT License. + +using System.Linq; +using System.Threading.Tasks; +using Cysharp.Threading.Tasks; +using NUnit.Framework; +using TestHelper.Attributes; +using UnityEditor.PackageManager; + +namespace APIExamples.Editor.UnityTestFramework +{ + [TestFixture] + public class UnityTestFrameworkVersionTest + { + private async UniTask GetTestFrameworkPackageVersionAsync() + { + var request = Client.List(false, false); + while (!request.IsCompleted) + { + await UniTask.Yield(); + } + + Assume.That(request.Status, Is.EqualTo(StatusCode.Success)); + + return request.Result.Where(x => x.name == "com.unity.test-framework") + .Select(x => x.version) + .FirstOrDefault(); + } + + [Test] + [UnityVersion(olderThan: "6000.0.44f1")] + public async Task Unity6000_0_43f1まで_TestFrameworkバージョンは任意() + { + var actual = await GetTestFrameworkPackageVersionAsync(); + Assert.That(actual, Is.EqualTo("1.4.6")); + } + + [Test] + [UnityVersion(newerThanOrEqual: "6000.0.44f1", olderThan: "6000.2.6f1")] + public async Task Unity6000_0_44f1以降_TestFrameworkはv1_5_1固定() + { + var actual = await GetTestFrameworkPackageVersionAsync(); + Assert.That(actual, Is.EqualTo("1.5.1")); + } + + [Test] + [UnityVersion(newerThanOrEqual: "6000.2.6f1")] + public async Task Unity6000_2_6f1以降_TestFrameworkはv1_6_0固定() + { + var actual = await GetTestFrameworkPackageVersionAsync(); + Assert.That(actual, Is.EqualTo("1.6.0")); + } + } +} diff --git a/Assets/APIExamples/Tests/Editor/UnityTestFramework/UnityTestFrameworkVersionTest.cs.meta b/Assets/APIExamples/Tests/Editor/UnityTestFramework/UnityTestFrameworkVersionTest.cs.meta new file mode 100644 index 0000000..b199776 --- /dev/null +++ b/Assets/APIExamples/Tests/Editor/UnityTestFramework/UnityTestFrameworkVersionTest.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 91e2dca48c4042ac8e1d516baf3e96c5 +timeCreated: 1759567497 \ No newline at end of file From d03b4905b7cedd29c05a2f0e0221208a43b9384b Mon Sep 17 00:00:00 2001 From: Koji Hasegawa Date: Sat, 18 Oct 2025 05:28:39 +0900 Subject: [PATCH 11/22] Fix check test-framework version tests --- .github/workflows/test-integration.yml | 8 ++++--- .github/workflows/test.yml | 10 ++++---- ...t.cs => UnityTestFrameworkVersionCheck.cs} | 24 +++++++++++++++---- ...=> UnityTestFrameworkVersionCheck.cs.meta} | 0 4 files changed, 30 insertions(+), 12 deletions(-) rename Assets/APIExamples/Tests/Editor/UnityTestFramework/{UnityTestFrameworkVersionTest.cs => UnityTestFrameworkVersionCheck.cs} (63%) rename Assets/APIExamples/Tests/Editor/UnityTestFramework/{UnityTestFrameworkVersionTest.cs.meta => UnityTestFrameworkVersionCheck.cs.meta} (100%) diff --git a/.github/workflows/test-integration.yml b/.github/workflows/test-integration.yml index 46244ee..f19ff7b 100644 --- a/.github/workflows/test-integration.yml +++ b/.github/workflows/test-integration.yml @@ -44,12 +44,14 @@ jobs: - 2020.3.49f1 - 2021.3.45f1 - 2022.3.62f1 - - 6000.0.58f1 - - 6000.2.6f1 + - 6000.0.43f1 + - 6000.0.44f1 # pin test-framework v1.5.1 + - 6000.0.59f2 # pin test-framework v1.6.0 + - 6000.2.7f2 testMode: - All # run tests in editor include: - - unityVersion: 6000.2.6f1 + - unityVersion: 6000.2.7f2 testMode: Standalone # run tests on player steps: diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 81e9adc..0afc482 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -47,16 +47,16 @@ jobs: - 2022.3.62f1 - 6000.0.43f1 - 6000.0.44f1 # pin test-framework v1.5.1 - - 6000.0.58f1 - - 6000.1.17f1 - - 6000.2.5f1 + - 6000.0.59f2 # pin test-framework v1.6.0 + - 6000.2.5f1 # pin test-framework v1.5.1 - 6000.2.6f1 # pin test-framework v1.6.0 + - 6000.2.7f2 testMode: - All # run tests in editor include: - - unityVersion: 6000.2.6f1 + - unityVersion: 6000.2.7f2 octocov: true - - unityVersion: 6000.2.6f1 + - unityVersion: 6000.2.7f2 testMode: Standalone # run tests on player steps: diff --git a/Assets/APIExamples/Tests/Editor/UnityTestFramework/UnityTestFrameworkVersionTest.cs b/Assets/APIExamples/Tests/Editor/UnityTestFramework/UnityTestFrameworkVersionCheck.cs similarity index 63% rename from Assets/APIExamples/Tests/Editor/UnityTestFramework/UnityTestFrameworkVersionTest.cs rename to Assets/APIExamples/Tests/Editor/UnityTestFramework/UnityTestFrameworkVersionCheck.cs index 8506319..5a4c958 100644 --- a/Assets/APIExamples/Tests/Editor/UnityTestFramework/UnityTestFrameworkVersionTest.cs +++ b/Assets/APIExamples/Tests/Editor/UnityTestFramework/UnityTestFrameworkVersionCheck.cs @@ -11,9 +11,9 @@ namespace APIExamples.Editor.UnityTestFramework { [TestFixture] - public class UnityTestFrameworkVersionTest + public class UnityTestFrameworkVersionCheck { - private async UniTask GetTestFrameworkPackageVersionAsync() + private static async UniTask GetTestFrameworkPackageVersionAsync() { var request = Client.List(false, false); while (!request.IsCompleted) @@ -37,8 +37,24 @@ public async Task Unity6000_0_43f1まで_TestFrameworkバージョンは任意() } [Test] - [UnityVersion(newerThanOrEqual: "6000.0.44f1", olderThan: "6000.2.6f1")] - public async Task Unity6000_0_44f1以降_TestFrameworkはv1_5_1固定() + [UnityVersion(newerThanOrEqual: "6000.0.44f1", olderThan: "6000.0.59f2")] + public async Task Unity6000_0_44f1から58f2まで_TestFrameworkはv1_5_1固定() + { + var actual = await GetTestFrameworkPackageVersionAsync(); + Assert.That(actual, Is.EqualTo("1.5.1")); + } + + [Test] + [UnityVersion(newerThanOrEqual: "6000.0.59f2", olderThan: "6000.1.0f1")] + public async Task Unity6000_0_59f2以降_TestFrameworkはv1_6_0固定() + { + var actual = await GetTestFrameworkPackageVersionAsync(); + Assert.That(actual, Is.EqualTo("1.6.0")); + } + + [Test] + [UnityVersion(newerThanOrEqual: "6000.1.0f1", olderThan: "6000.2.6f1")] + public async Task Unity6000_1_0f1から6000_2_5f1まで_TestFrameworkはv1_5_1固定() { var actual = await GetTestFrameworkPackageVersionAsync(); Assert.That(actual, Is.EqualTo("1.5.1")); diff --git a/Assets/APIExamples/Tests/Editor/UnityTestFramework/UnityTestFrameworkVersionTest.cs.meta b/Assets/APIExamples/Tests/Editor/UnityTestFramework/UnityTestFrameworkVersionCheck.cs.meta similarity index 100% rename from Assets/APIExamples/Tests/Editor/UnityTestFramework/UnityTestFrameworkVersionTest.cs.meta rename to Assets/APIExamples/Tests/Editor/UnityTestFramework/UnityTestFrameworkVersionCheck.cs.meta From 6d7d18ebea142430267fbdbb46ceba45354afc87 Mon Sep 17 00:00:00 2001 From: Koji Hasegawa Date: Tue, 4 Nov 2025 20:44:11 +0900 Subject: [PATCH 12/22] Fix to reduce delays --- .../Editor/NUnit/AsyncSetupAttributeExample.cs | 6 ++---- .../NUnit/AsyncTearDownAttributeExample.cs | 6 ++---- .../Tests/Editor/NUnit/AsyncTestExample.cs | 13 +++++-------- .../Runtime/NUnit/AsyncSetupAttributeExample.cs | 9 ++------- .../NUnit/AsyncTearDownAttributeExample.cs | 9 ++------- .../Tests/Runtime/NUnit/AsyncTestExample.cs | 16 +++++----------- .../Tests/Runtime/NUnit/ConstraintExample.cs | 2 +- .../Runtime/NUnit/MaxTimeAttributeExample.cs | 6 +++--- .../Tests/Runtime/NUnit/OrderAttributeExample.cs | 2 +- .../Runtime/NUnit/RandomAttributeExample.cs | 2 +- .../Tests/Runtime/NUnit/RangeAttributeExample.cs | 2 +- .../UnityTestFramework/LogAssertExample.cs | 4 ++-- 12 files changed, 27 insertions(+), 50 deletions(-) diff --git a/Assets/APIExamples/Tests/Editor/NUnit/AsyncSetupAttributeExample.cs b/Assets/APIExamples/Tests/Editor/NUnit/AsyncSetupAttributeExample.cs index 02a2f6d..13b4766 100644 --- a/Assets/APIExamples/Tests/Editor/NUnit/AsyncSetupAttributeExample.cs +++ b/Assets/APIExamples/Tests/Editor/NUnit/AsyncSetupAttributeExample.cs @@ -1,12 +1,10 @@ -// Copyright (c) 2021-2023 Koji Hasegawa. +// Copyright (c) 2021-2025 Koji Hasegawa. // This software is released under the MIT License. using System.Threading.Tasks; using NUnit.Framework; using UnityEngine; -#pragma warning disable CS1998 - namespace APIExamples.Editor.NUnit { /// @@ -27,7 +25,7 @@ public class AsyncSetupAttributeExample [SetUp] public async Task SetUp() { - await Task.Delay(200); + await Task.Yield(); Debug.Log($"SetUp, {Time.time}"); } diff --git a/Assets/APIExamples/Tests/Editor/NUnit/AsyncTearDownAttributeExample.cs b/Assets/APIExamples/Tests/Editor/NUnit/AsyncTearDownAttributeExample.cs index 2464845..50938c6 100644 --- a/Assets/APIExamples/Tests/Editor/NUnit/AsyncTearDownAttributeExample.cs +++ b/Assets/APIExamples/Tests/Editor/NUnit/AsyncTearDownAttributeExample.cs @@ -1,12 +1,10 @@ -// Copyright (c) 2021-2023 Koji Hasegawa. +// Copyright (c) 2021-2025 Koji Hasegawa. // This software is released under the MIT License. using System.Threading.Tasks; using NUnit.Framework; using UnityEngine; -#pragma warning disable CS1998 - namespace APIExamples.Editor.NUnit { /// @@ -27,7 +25,7 @@ public class AsyncTearDownAttributeExample [TearDown] public async Task TearDown() { - await Task.Delay(200); + await Task.Yield(); Debug.Log($"TearDown, {Time.time}"); } diff --git a/Assets/APIExamples/Tests/Editor/NUnit/AsyncTestExample.cs b/Assets/APIExamples/Tests/Editor/NUnit/AsyncTestExample.cs index f41e73c..f24bae7 100644 --- a/Assets/APIExamples/Tests/Editor/NUnit/AsyncTestExample.cs +++ b/Assets/APIExamples/Tests/Editor/NUnit/AsyncTestExample.cs @@ -1,4 +1,4 @@ -// Copyright (c) 2021-2023 Koji Hasegawa. +// Copyright (c) 2021-2025 Koji Hasegawa. // This software is released under the MIT License. using System; @@ -8,9 +8,6 @@ using NUnit.Framework; using UnityEngine; -#pragma warning disable CS1998 -// ReSharper disable AccessToStaticMemberViaDerivedType - namespace APIExamples.Editor.NUnit { /// @@ -35,13 +32,13 @@ public async Task 非同期テストの例_Taskをawaitできる() private static async Task Foo(int id) { - await Task.Delay(200); + await Task.Yield(); Debug.Log($"Foo({id})"); } private static async Task Bar(int id) { - await Task.Delay(200); + await Task.Yield(); Debug.Log($"Bar({id})"); return id + 1; } @@ -58,13 +55,13 @@ public async Task 非同期テストの例_UniTaskをawaitできる() private static async UniTask UniTaskFoo(int id) { - await UniTask.Delay(200); + await Task.Yield(); Debug.Log($"UniTaskFoo({id})"); } private static async UniTask UniTaskBar(int id) { - await UniTask.Delay(200); + await Task.Yield(); Debug.Log($"UniTaskBar({id})"); return id + 1; } diff --git a/Assets/APIExamples/Tests/Runtime/NUnit/AsyncSetupAttributeExample.cs b/Assets/APIExamples/Tests/Runtime/NUnit/AsyncSetupAttributeExample.cs index 8404772..05c0992 100644 --- a/Assets/APIExamples/Tests/Runtime/NUnit/AsyncSetupAttributeExample.cs +++ b/Assets/APIExamples/Tests/Runtime/NUnit/AsyncSetupAttributeExample.cs @@ -1,12 +1,9 @@ -// Copyright (c) 2021-2023 Koji Hasegawa. +// Copyright (c) 2021-2025 Koji Hasegawa. // This software is released under the MIT License. using System.Threading.Tasks; using NUnit.Framework; using UnityEngine; -using UnityEngine.TestTools; - -#pragma warning disable CS1998 namespace APIExamples.NUnit { @@ -20,8 +17,6 @@ namespace APIExamples.NUnit /// Required: Unity Test Framework v1.3 or later /// [TestFixture] - [UnityPlatform(exclude = new[] { RuntimePlatform.WebGLPlayer })] - // WebGLではTask.Delayが終了しない(v1.3.9時点) https://unity3d.atlassian.net/servicedesk/customer/portal/2/IN-28109 public class AsyncSetupAttributeExample { /// @@ -30,7 +25,7 @@ public class AsyncSetupAttributeExample [SetUp] public async Task SetUp() { - await Task.Delay(200); + await Task.Yield(); Debug.Log($"SetUp, {Time.time}"); } diff --git a/Assets/APIExamples/Tests/Runtime/NUnit/AsyncTearDownAttributeExample.cs b/Assets/APIExamples/Tests/Runtime/NUnit/AsyncTearDownAttributeExample.cs index c119781..f3d95fa 100644 --- a/Assets/APIExamples/Tests/Runtime/NUnit/AsyncTearDownAttributeExample.cs +++ b/Assets/APIExamples/Tests/Runtime/NUnit/AsyncTearDownAttributeExample.cs @@ -1,12 +1,9 @@ -// Copyright (c) 2021-2023 Koji Hasegawa. +// Copyright (c) 2021-2025 Koji Hasegawa. // This software is released under the MIT License. using System.Threading.Tasks; using NUnit.Framework; using UnityEngine; -using UnityEngine.TestTools; - -#pragma warning disable CS1998 namespace APIExamples.NUnit { @@ -20,8 +17,6 @@ namespace APIExamples.NUnit /// Required: Unity Test Framework v1.3 or later /// [TestFixture] - [UnityPlatform(exclude = new[] { RuntimePlatform.WebGLPlayer })] - // WebGLではTask.Delayが終了しない(v1.3.9時点) https://unity3d.atlassian.net/servicedesk/customer/portal/2/IN-28109 public class AsyncTearDownAttributeExample { /// @@ -30,7 +25,7 @@ public class AsyncTearDownAttributeExample [TearDown] public async Task TearDown() { - await Task.Delay(200); + await Task.Yield(); Debug.Log($"TearDown, {Time.time}"); } diff --git a/Assets/APIExamples/Tests/Runtime/NUnit/AsyncTestExample.cs b/Assets/APIExamples/Tests/Runtime/NUnit/AsyncTestExample.cs index b0491e2..c10197a 100644 --- a/Assets/APIExamples/Tests/Runtime/NUnit/AsyncTestExample.cs +++ b/Assets/APIExamples/Tests/Runtime/NUnit/AsyncTestExample.cs @@ -1,4 +1,4 @@ -// Copyright (c) 2021-2023 Koji Hasegawa. +// Copyright (c) 2021-2025 Koji Hasegawa. // This software is released under the MIT License. using System; @@ -7,10 +7,6 @@ using Cysharp.Threading.Tasks; using NUnit.Framework; using UnityEngine; -using UnityEngine.TestTools; - -#pragma warning disable CS1998 -// ReSharper disable AccessToStaticMemberViaDerivedType namespace APIExamples.NUnit { @@ -26,8 +22,6 @@ public class AsyncTestExample { [Test] [Description("Can await Task")] - [UnityPlatform(exclude = new[] { RuntimePlatform.WebGLPlayer })] - // WebGLではTask.Delayが終了しない(v1.3.9時点) https://unity3d.atlassian.net/servicedesk/customer/portal/2/IN-28109 public async Task 非同期テストの例_Taskをawaitできる() { await Foo(1); @@ -38,13 +32,13 @@ public async Task 非同期テストの例_Taskをawaitできる() private static async Task Foo(int id) { - await Task.Delay(200); + await Task.Yield(); Debug.Log($"Foo({id})"); } private static async Task Bar(int id) { - await Task.Delay(200); + await Task.Yield(); Debug.Log($"Bar({id})"); return id + 1; } @@ -61,13 +55,13 @@ public async Task 非同期テストの例_UniTaskをawaitできる() private static async UniTask UniTaskFoo(int id) { - await UniTask.Delay(200); + await Task.Yield(); Debug.Log($"UniTaskFoo({id})"); } private static async UniTask UniTaskBar(int id) { - await UniTask.Delay(200); + await Task.Yield(); Debug.Log($"UniTaskBar({id})"); return id + 1; } diff --git a/Assets/APIExamples/Tests/Runtime/NUnit/ConstraintExample.cs b/Assets/APIExamples/Tests/Runtime/NUnit/ConstraintExample.cs index f7023ec..b4d49f9 100644 --- a/Assets/APIExamples/Tests/Runtime/NUnit/ConstraintExample.cs +++ b/Assets/APIExamples/Tests/Runtime/NUnit/ConstraintExample.cs @@ -986,7 +986,7 @@ public void DelayedConstraint_Test属性のテストでは無効() public async Task DelayedConstraint_AsyncTestでも無効() { var start = Time.time; // The time at the beginning of this frame - await Task.Delay(0); + await Task.Yield(); Assert.That(() => Time.time, Is.GreaterThan(start + 2.0f).After(2500)); // ミリ秒しか指定できない模様 // 失敗時メッセージ例: diff --git a/Assets/APIExamples/Tests/Runtime/NUnit/MaxTimeAttributeExample.cs b/Assets/APIExamples/Tests/Runtime/NUnit/MaxTimeAttributeExample.cs index e8ed88a..1558af4 100644 --- a/Assets/APIExamples/Tests/Runtime/NUnit/MaxTimeAttributeExample.cs +++ b/Assets/APIExamples/Tests/Runtime/NUnit/MaxTimeAttributeExample.cs @@ -25,7 +25,7 @@ public class MaxTimeAttributeExample [MaxTime(100)] public void MaxTime属性_指定ミリ秒よりも時間のかかるテストは実行後に失敗() { - var endTime = DateTime.Now.AddMilliseconds(500); + var endTime = DateTime.Now.AddMilliseconds(200); while (DateTime.Now < endTime) { } @@ -35,14 +35,14 @@ public void MaxTime属性_指定ミリ秒よりも時間のかかるテストは [MaxTime(100)] public IEnumerator MaxTime属性_指定ミリ秒よりも時間のかかるテストは実行後に失敗_UnityTest属性() { - yield return new WaitForSeconds(0.5f); + yield return new WaitForSeconds(0.2f); } [Test] [MaxTime(100)] public async Task MaxTime属性_指定ミリ秒よりも時間のかかるテストは実行後に失敗_非同期テスト() { - await Task.Delay(500); + await Task.Delay(200); } } } diff --git a/Assets/APIExamples/Tests/Runtime/NUnit/OrderAttributeExample.cs b/Assets/APIExamples/Tests/Runtime/NUnit/OrderAttributeExample.cs index e35a717..3c1f37c 100644 --- a/Assets/APIExamples/Tests/Runtime/NUnit/OrderAttributeExample.cs +++ b/Assets/APIExamples/Tests/Runtime/NUnit/OrderAttributeExample.cs @@ -38,7 +38,7 @@ public void OrderedTest3() public async Task OrderedTest2() { Assert.That(++s_count, Is.EqualTo(3)); - await Task.Delay(0); + await Task.Yield(); } [UnityTest] diff --git a/Assets/APIExamples/Tests/Runtime/NUnit/RandomAttributeExample.cs b/Assets/APIExamples/Tests/Runtime/NUnit/RandomAttributeExample.cs index 0b77f39..1fae3e2 100644 --- a/Assets/APIExamples/Tests/Runtime/NUnit/RandomAttributeExample.cs +++ b/Assets/APIExamples/Tests/Runtime/NUnit/RandomAttributeExample.cs @@ -33,7 +33,7 @@ public async Task Random属性ででたらめな値を与える例_AsyncTest( [Random(0, 5, 3)] int i, [Random(5, 10, 3)] int j) { - await Task.Delay(0); + await Task.Yield(); Assert.That(i + j, Is.InRange((0 + 5), (4 + 9))); } diff --git a/Assets/APIExamples/Tests/Runtime/NUnit/RangeAttributeExample.cs b/Assets/APIExamples/Tests/Runtime/NUnit/RangeAttributeExample.cs index 021cd41..455586b 100644 --- a/Assets/APIExamples/Tests/Runtime/NUnit/RangeAttributeExample.cs +++ b/Assets/APIExamples/Tests/Runtime/NUnit/RangeAttributeExample.cs @@ -34,7 +34,7 @@ public async Task Range属性で数値型に範囲指定する例_AsyncTest( // [Range(0.6f, 0.7f, 0.1f)] float f, [Range(0.08d, 0.09d, 0.005d)] double d) { - await Task.Delay(0); + await Task.Yield(); Assert.That(d + f + l + i, Is.InRange(0, 7)); } diff --git a/Assets/APIExamples/Tests/Runtime/UnityTestFramework/LogAssertExample.cs b/Assets/APIExamples/Tests/Runtime/UnityTestFramework/LogAssertExample.cs index ce08ed9..a38b88f 100644 --- a/Assets/APIExamples/Tests/Runtime/UnityTestFramework/LogAssertExample.cs +++ b/Assets/APIExamples/Tests/Runtime/UnityTestFramework/LogAssertExample.cs @@ -88,7 +88,7 @@ public async Task Expect_非同期テストで先に記述_Yieldを挟んでも if (Fail) { - await Task.Delay(200); + await Task.Yield(); Debug.LogError("expected message"); // フレームが進むとLogAssert.Expectは無効 } } @@ -138,7 +138,7 @@ public async Task Expect_非同期テストでもログメッセージは複数 { Debug.Log("expected message"); - await Task.Delay(200); + await Task.Yield(); LogAssert.Expect(LogType.Log, "expected message"); } From 83e0e28c2e872a35d69764cb9118ad4a6d4d15bf Mon Sep 17 00:00:00 2001 From: Koji Hasegawa Date: Tue, 4 Nov 2025 21:41:59 +0900 Subject: [PATCH 13/22] Fix DelayedConstraint example --- .../Tests/Runtime/NUnit/ConstraintExample.cs | 35 ++----------------- 1 file changed, 3 insertions(+), 32 deletions(-) diff --git a/Assets/APIExamples/Tests/Runtime/NUnit/ConstraintExample.cs b/Assets/APIExamples/Tests/Runtime/NUnit/ConstraintExample.cs index b4d49f9..503aae5 100644 --- a/Assets/APIExamples/Tests/Runtime/NUnit/ConstraintExample.cs +++ b/Assets/APIExamples/Tests/Runtime/NUnit/ConstraintExample.cs @@ -2,7 +2,6 @@ // This software is released under the MIT License. using System; -using System.Collections; using System.Collections.Generic; using System.IO; using System.Threading.Tasks; @@ -969,43 +968,15 @@ public void IsNullで破棄されたGameObjectを検証する例_PlayerではNul public class 遅延 { [Test] - [Explicit("Test属性のテストでは期待通り動作しないので除外")] - public void DelayedConstraint_Test属性のテストでは無効() + public void DelayedConstraint_指定時間経過後に評価される() { - var start = Time.time; // The time at the beginning of this frame + var start = Time.realtimeSinceStartup; // Note: 非同期ではなく同一フレームで遅延処理されるため Time.time は変化しません - Assert.That(() => Time.time, Is.GreaterThan(start + 2.0f).After(2500)); // ミリ秒しか指定できない模様 + Assert.That(() => Time.realtimeSinceStartup, Is.GreaterThan(start + 0.2f).After(500)); // 失敗時メッセージ例: // Expected: greater than 2.33228302f after 2500 millisecond delay // But was: 0.33228299f } - - [Test] - [Explicit("Asyncテストでも期待通り動作しないので除外(Unity Test Framework v1.4.0時点)")] - // https://unity3d.atlassian.net/servicedesk/customer/portal/2/IN-30529 - public async Task DelayedConstraint_AsyncTestでも無効() - { - var start = Time.time; // The time at the beginning of this frame - await Task.Yield(); - - Assert.That(() => Time.time, Is.GreaterThan(start + 2.0f).After(2500)); // ミリ秒しか指定できない模様 - // 失敗時メッセージ例: - // Expected: greater than 2.33228302f after 2500 millisecond delay - // But was: 0.33228299f - } - - [UnityTest] - [Explicit("UnityTest属性のテストでも期待通り動作しないので除外")] - public IEnumerator DelayedConstraint_UnityTest属性のテストでも無効() - { - var start = Time.time; // The time at the beginning of this frame - yield return null; - - Assert.That(() => Time.time, Is.GreaterThan(start + 2.0f).After(2500)); // ミリ秒しか指定できない模様 - // 失敗時メッセージ例: - // Expected: greater than 2.39063787f after 2500 millisecond delay - // But was: 0.390637904f - } } } } From 382f3ae34cabf99bebb0164119b72d0d432dff0f Mon Sep 17 00:00:00 2001 From: Koji Hasegawa Date: Fri, 7 Nov 2025 04:45:09 +0900 Subject: [PATCH 14/22] Fix time thresholds --- .../Runtime/NUnit/TimeoutAttributeExample.cs | 34 +++++++++---------- .../Runtime/Entities/PassiveEffectTest.cs | 2 +- 2 files changed, 18 insertions(+), 18 deletions(-) diff --git a/Assets/APIExamples/Tests/Runtime/NUnit/TimeoutAttributeExample.cs b/Assets/APIExamples/Tests/Runtime/NUnit/TimeoutAttributeExample.cs index 1edb39d..9db3a26 100644 --- a/Assets/APIExamples/Tests/Runtime/NUnit/TimeoutAttributeExample.cs +++ b/Assets/APIExamples/Tests/Runtime/NUnit/TimeoutAttributeExample.cs @@ -26,26 +26,26 @@ namespace APIExamples.NUnit public class TimeoutAttributeExample { [Test] - [Timeout(2000)] + [Timeout(200)] public void Timeout属性_同期テストではタイムアウトで割り込みは発生しないが終了時に指定時間を超えていたらテスト失敗() { - var endTime = DateTime.Now.AddSeconds(5d); + var endTime = DateTime.Now.AddSeconds(0.5d); while (DateTime.Now < endTime) { } } [UnityTest] - [Timeout(2000)] + [Timeout(200)] public IEnumerator Timeout属性_UnityTest属性でWaitForSeconds_割り込みは発生しないが終了時に指定時間を超えていたらテスト失敗() { - yield return new WaitForSeconds(5.0f); + yield return new WaitForSeconds(0.5f); } [UnityTest] public IEnumerator タイムアウトのデフォルトは3分_3分でタイムアウト() { - var endTime = DateTime.Now.AddMinutes(3d).AddSeconds(5d); + var endTime = DateTime.Now.AddMinutes(3d).AddSeconds(1d); while (DateTime.Now < endTime) { yield return null; @@ -53,10 +53,10 @@ public IEnumerator タイムアウトのデフォルトは3分_3分でタイム } [UnityTest] - [Timeout(2000)] + [Timeout(200)] public IEnumerator Timeout属性_UnityTest属性でYieldReturnNull_指定ミリ秒でタイムアウト() { - var endTime = DateTime.Now.AddSeconds(5d); + var endTime = DateTime.Now.AddSeconds(0.5d); while (DateTime.Now < endTime) { yield return null; @@ -64,29 +64,29 @@ public IEnumerator Timeout属性_UnityTest属性でYieldReturnNull_指定ミリ } [UnityTest] - [Timeout(2000)] - [TimeScale(2.0f)] + [Timeout(1000)] + [TimeScale(10.0f)] public IEnumerator Timeout属性_タイムアウト値はTimeScaleに影響されない_指定ミリ秒でタイムアウト() { - var endTime = Time.time + 10.0f; - while (Time.time < endTime) + var endTime = Time.realtimeSinceStartup + 2.0f; + while (Time.realtimeSinceStartup < endTime) { yield return null; } } [Test] - [Timeout(2000)] + [Timeout(200)] public async Task Timeout属性_非同期テストでDelay_指定ミリ秒でタイムアウト() { - await Task.Delay(TimeSpan.FromSeconds(5.0f)); + await Task.Delay(TimeSpan.FromSeconds(0.5f)); } [Test] - [Timeout(2000)] + [Timeout(200)] public async Task Timeout属性_非同期テストでYield_指定ミリ秒でタイムアウト() { - var endTime = DateTime.Now.AddSeconds(5d); + var endTime = DateTime.Now.AddSeconds(0.5d); while (DateTime.Now < endTime) { await Task.Yield(); @@ -94,10 +94,10 @@ public async Task Timeout属性_非同期テストでYield_指定ミリ秒でタ } [Test] - [Timeout(2000)] + [Timeout(200)] public async Task Timeout属性_非同期テストでNextFrame_指定ミリ秒でタイムアウト() { - var endTime = DateTime.Now.AddSeconds(5d); + var endTime = DateTime.Now.AddSeconds(0.5d); while (DateTime.Now < endTime) { await UniTask.NextFrame(); diff --git a/Assets/BasicExample/Tests/Runtime/Entities/PassiveEffectTest.cs b/Assets/BasicExample/Tests/Runtime/Entities/PassiveEffectTest.cs index 7e2fbd0..74ec1d2 100644 --- a/Assets/BasicExample/Tests/Runtime/Entities/PassiveEffectTest.cs +++ b/Assets/BasicExample/Tests/Runtime/Entities/PassiveEffectTest.cs @@ -123,7 +123,7 @@ public IEnumerator バフ_持続時間が30秒にリセットされること() var sut = CreatePassiveEffect(buff: true); yield return new WaitForSeconds(5.0f); Assume.That(sut.State(), Is.EqualTo(PassiveEffectState.Strengthening)); - Assume.That(sut.PassiveEffectExpireTime(), Is.EqualTo(25.0f).Within(0.1f)); + Assume.That(sut.PassiveEffectExpireTime(), Is.EqualTo(25.0f).Within(0.2f)); sut.Buff(); From 120a86062e5e5eb987b9595d5b32c0591f9a64b7 Mon Sep 17 00:00:00 2001 From: Koji Hasegawa Date: Fri, 7 Nov 2025 04:50:37 +0900 Subject: [PATCH 15/22] Update limitations version --- Assets/APIExamples/Tests/Runtime/NUnit/ConstraintExample.cs | 4 ++-- .../Tests/Runtime/NUnit/TimeoutAttributeExample.cs | 2 +- .../Runtime/UnityTestFramework/AllocatingGcMemoryExample.cs | 4 ++-- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/Assets/APIExamples/Tests/Runtime/NUnit/ConstraintExample.cs b/Assets/APIExamples/Tests/Runtime/NUnit/ConstraintExample.cs index 503aae5..d0b043b 100644 --- a/Assets/APIExamples/Tests/Runtime/NUnit/ConstraintExample.cs +++ b/Assets/APIExamples/Tests/Runtime/NUnit/ConstraintExample.cs @@ -800,7 +800,7 @@ void GetNotThrow() { } // But was: およびデフォルトタイムアウト時間の確認 /// /// - /// このクラスに書かれている振る舞いは、Unity Test Framework v1.4.6およびv1.5.1のものです。バージョンによって振る舞いが異なりますので注意してください。 + /// このクラスに書かれている振る舞いは、Unity Test Framework v1.4.6およびv1.6.0のものです。バージョンによって振る舞いが異なりますので注意してください。 ///
/// 非同期 (async) テストでタイムアウト及びTimeout属性が機能しない問題は、Unity Test Framework v1.3.4で修正されました。 /// diff --git a/Assets/APIExamples/Tests/Runtime/UnityTestFramework/AllocatingGcMemoryExample.cs b/Assets/APIExamples/Tests/Runtime/UnityTestFramework/AllocatingGcMemoryExample.cs index 00bb41a..5736210 100644 --- a/Assets/APIExamples/Tests/Runtime/UnityTestFramework/AllocatingGcMemoryExample.cs +++ b/Assets/APIExamples/Tests/Runtime/UnityTestFramework/AllocatingGcMemoryExample.cs @@ -74,7 +74,7 @@ void UseColor() Assert.That(UseColor, Is.Not.AllocatingGCMemory()); } - [Ignore("Is.Not.AllocatingGCMemory()をasyncメソッドに使用するとUnityエディターがフリーズ(Unity Test Framework v1.4.0時点)")] + [Ignore("Is.Not.AllocatingGCMemory()をasyncメソッドに使用するとUnityエディターがフリーズ(Unity Test Framework v1.6.0時点)")] [Test] public async Task プリミティブ型_ヒープアロケーションなしAsync_Unityエディターがフリーズ() { @@ -91,7 +91,7 @@ async Task UsePrimitives() Assert.That(async () => await UsePrimitives(), Is.Not.AllocatingGCMemory()); } - [Explicit("Is.AllocatingGCMemory()をasyncメソッドに使用しても常に成功してしまう(Unity Test Framework v1.4.0時点)")] + [Explicit("Is.AllocatingGCMemory()をasyncメソッドに使用しても常に成功してしまう(Unity Test Framework v1.6.0時点)")] [Test] public async Task String型_ヒープアロケーションありAsync_常に成功してしまう() { From c2f91bb04bc2325915b7ecb1929a24535c1d457c Mon Sep 17 00:00:00 2001 From: Koji Hasegawa Date: Fri, 7 Nov 2025 06:06:56 +0900 Subject: [PATCH 16/22] Fix setup and teardown examples --- .../NUnit/AsyncSetupAttributeExample.cs | 35 +++++++--- .../NUnit/AsyncTearDownAttributeExample.cs | 28 +++++--- .../UnitySetUpAttributeExample.cs | 51 ++++++++++++++ .../UnitySetUpAttributeExample.cs.meta | 3 + .../UnityTearDownAttributeExample.cs | 50 ++++++++++++++ .../UnityTearDownAttributeExample.cs.meta | 3 + .../NUnit/AsyncSetupAttributeExample.cs | 39 ++++++++--- .../NUnit/AsyncTearDownAttributeExample.cs | 30 +++++--- .../NUnit/OneTimeSetupAttributeExample.cs | 66 ++++++++++++++++++ .../OneTimeSetupAttributeExample.cs.meta | 3 + .../NUnit/OneTimeTearDownAttributeExample.cs | 69 +++++++++++++++++++ ...> OneTimeTearDownAttributeExample.cs.meta} | 0 .../Runtime/NUnit/SetupAttributeExample.cs | 42 ++++++----- .../NUnit/SetupAttributeExample.cs.meta | 6 +- .../Runtime/NUnit/TearDownAttributeExample.cs | 52 ++++++++++++++ .../NUnit/TearDownAttributeExample.cs.meta | 3 + .../Tests/Runtime/NUnit/TearDownExample.cs | 45 ------------ .../UnitySetUpAttributeExample.cs | 38 +++++----- .../UnityTearDownAttributeExample.cs | 31 +++++---- 19 files changed, 461 insertions(+), 133 deletions(-) create mode 100644 Assets/APIExamples/Tests/Editor/UnityTestFramework/UnitySetUpAttributeExample.cs create mode 100644 Assets/APIExamples/Tests/Editor/UnityTestFramework/UnitySetUpAttributeExample.cs.meta create mode 100644 Assets/APIExamples/Tests/Editor/UnityTestFramework/UnityTearDownAttributeExample.cs create mode 100644 Assets/APIExamples/Tests/Editor/UnityTestFramework/UnityTearDownAttributeExample.cs.meta create mode 100644 Assets/APIExamples/Tests/Runtime/NUnit/OneTimeSetupAttributeExample.cs create mode 100644 Assets/APIExamples/Tests/Runtime/NUnit/OneTimeSetupAttributeExample.cs.meta create mode 100644 Assets/APIExamples/Tests/Runtime/NUnit/OneTimeTearDownAttributeExample.cs rename Assets/APIExamples/Tests/Runtime/NUnit/{TearDownExample.cs.meta => OneTimeTearDownAttributeExample.cs.meta} (100%) create mode 100644 Assets/APIExamples/Tests/Runtime/NUnit/TearDownAttributeExample.cs create mode 100644 Assets/APIExamples/Tests/Runtime/NUnit/TearDownAttributeExample.cs.meta delete mode 100644 Assets/APIExamples/Tests/Runtime/NUnit/TearDownExample.cs diff --git a/Assets/APIExamples/Tests/Editor/NUnit/AsyncSetupAttributeExample.cs b/Assets/APIExamples/Tests/Editor/NUnit/AsyncSetupAttributeExample.cs index 13b4766..7cf8cfa 100644 --- a/Assets/APIExamples/Tests/Editor/NUnit/AsyncSetupAttributeExample.cs +++ b/Assets/APIExamples/Tests/Editor/NUnit/AsyncSetupAttributeExample.cs @@ -1,44 +1,57 @@ // Copyright (c) 2021-2025 Koji Hasegawa. // This software is released under the MIT License. +using System.Collections; using System.Threading.Tasks; using NUnit.Framework; -using UnityEngine; +using UnityEngine.TestTools; namespace APIExamples.Editor.NUnit { /// - /// 非同期のの例(Edit Modeテスト) - /// はasyncサポートされていない(UTF v1.3時点) + /// 非同期のの使用例(Edit Modeテスト) + /// はasyncサポートされていない(UTF v1.6.0時点) + ///

/// Async SetUp attribute example (in Edit Mode tests) - /// Async OneTimeSetUp attribute is not yet supported in UTF v1.3 + /// Async OneTimeSetUp attribute is not yet supported in UTF v1.6.0 ///

/// /// Required: Unity Test Framework v1.3 or later /// + /// [TestFixture] public class AsyncSetupAttributeExample { + private int _setupCount; + /// /// 各テストメソッドの前に実行されます /// [SetUp] - public async Task SetUp() + public async Task SetUpAsync() { await Task.Yield(); - Debug.Log($"SetUp, {Time.time}"); + _setupCount++; } - [Test] + [Test, Order(0)] public void TestMethod() { - Debug.Log($"TestMethod, {Time.time}"); + Assert.That(_setupCount, Is.EqualTo(1), "最初のテストなのでSetUpは1回実行されている"); + } + + [Test, Order(1)] + public async Task TestMethodAsync() + { + await Task.Yield(); + Assert.That(_setupCount, Is.EqualTo(2), "2番目のテストなのでSetUpは2回実行されている"); } - [Test] - public void TestMethod2() + [UnityTest, Order(2)] + public IEnumerator UnityTestMethod() { - Debug.Log($"TestMethod2, {Time.time}"); + yield return null; + Assert.That(_setupCount, Is.EqualTo(3), "3番目のテストなのでSetUpは3回実行されている"); } } } diff --git a/Assets/APIExamples/Tests/Editor/NUnit/AsyncTearDownAttributeExample.cs b/Assets/APIExamples/Tests/Editor/NUnit/AsyncTearDownAttributeExample.cs index 50938c6..017c3a8 100644 --- a/Assets/APIExamples/Tests/Editor/NUnit/AsyncTearDownAttributeExample.cs +++ b/Assets/APIExamples/Tests/Editor/NUnit/AsyncTearDownAttributeExample.cs @@ -1,21 +1,25 @@ // Copyright (c) 2021-2025 Koji Hasegawa. // This software is released under the MIT License. +using System.Collections; using System.Threading.Tasks; using NUnit.Framework; using UnityEngine; +using UnityEngine.TestTools; namespace APIExamples.Editor.NUnit { /// - /// 非同期のの例(Edit Modeテスト) - /// はasyncサポートされていない(UTF v1.3時点) + /// 非同期のの使用例(Edit Modeテスト) + /// はasyncサポートされていない(UTF v1.6.0時点) + ///

/// Async TearDown attribute example (in Edit Mode tests) - /// Async OneTimeTearDown attribute is not yet supported in UTF v1.3 + /// Async OneTimeTearDown attribute is not yet supported in UTF v1.6.0 ///

/// /// Required: Unity Test Framework v1.3 or later /// + /// [TestFixture] public class AsyncTearDownAttributeExample { @@ -23,22 +27,30 @@ public class AsyncTearDownAttributeExample /// 各テストメソッドの後に実行されます ///
[TearDown] - public async Task TearDown() + public async Task TearDownAsync() { await Task.Yield(); - Debug.Log($"TearDown, {Time.time}"); + Debug.Log($"TearDownAsync"); } [Test] public void TestMethod() { - Debug.Log($"TestMethod, {Time.time}"); + Debug.Log($"TestMethod"); } [Test] - public void TestMethod2() + public async Task TestMethodAsync() { - Debug.Log($"TestMethod2, {Time.time}"); + await Task.Yield(); + Debug.Log($"TestMethodAsync"); + } + + [UnityTest] + public IEnumerator UnityTestMethod() + { + yield return null; + Debug.Log($"UnityTestMethod"); } } } diff --git a/Assets/APIExamples/Tests/Editor/UnityTestFramework/UnitySetUpAttributeExample.cs b/Assets/APIExamples/Tests/Editor/UnityTestFramework/UnitySetUpAttributeExample.cs new file mode 100644 index 0000000..4d94027 --- /dev/null +++ b/Assets/APIExamples/Tests/Editor/UnityTestFramework/UnitySetUpAttributeExample.cs @@ -0,0 +1,51 @@ +// Copyright (c) 2021-2025 Koji Hasegawa. +// This software is released under the MIT License. + +using System.Collections; +using System.Threading.Tasks; +using NUnit.Framework; +using UnityEngine.TestTools; + +namespace APIExamples.Editor.UnityTestFramework +{ + /// + /// の使用例 + /// + /// + [TestFixture] + public class UnitySetUpAttributeExample + { + private int _setupCount; + + /// + /// SetUpをコルーチン書式で記述できます + /// 専用ではなく、通常のTest向けのSetUpとしても使用できます + /// + [UnitySetUp] + public IEnumerator SetUpCoroutine() + { + yield return null; + _setupCount++; + } + + [Test, Order(0)] + public void TestMethod() + { + Assert.That(_setupCount, Is.EqualTo(1), "最初のテストなのでSetUpは1回実行されている"); + } + + [Test, Order(1)] + public async Task TestMethodAsync() + { + await Task.Yield(); + Assert.That(_setupCount, Is.EqualTo(2), "2番目のテストなのでSetUpは2回実行されている"); + } + + [UnityTest, Order(2)] + public IEnumerator UnityTestMethod() + { + yield return null; + Assert.That(_setupCount, Is.EqualTo(3), "3番目のテストなのでSetUpは3回実行されている"); + } + } +} diff --git a/Assets/APIExamples/Tests/Editor/UnityTestFramework/UnitySetUpAttributeExample.cs.meta b/Assets/APIExamples/Tests/Editor/UnityTestFramework/UnitySetUpAttributeExample.cs.meta new file mode 100644 index 0000000..af6b98f --- /dev/null +++ b/Assets/APIExamples/Tests/Editor/UnityTestFramework/UnitySetUpAttributeExample.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: b07d09a814004048af278e139b81f903 +timeCreated: 1762465453 \ No newline at end of file diff --git a/Assets/APIExamples/Tests/Editor/UnityTestFramework/UnityTearDownAttributeExample.cs b/Assets/APIExamples/Tests/Editor/UnityTestFramework/UnityTearDownAttributeExample.cs new file mode 100644 index 0000000..4657374 --- /dev/null +++ b/Assets/APIExamples/Tests/Editor/UnityTestFramework/UnityTearDownAttributeExample.cs @@ -0,0 +1,50 @@ +// Copyright (c) 2021-2025 Koji Hasegawa. +// This software is released under the MIT License. + +using System.Collections; +using System.Threading.Tasks; +using NUnit.Framework; +using UnityEngine; +using UnityEngine.TestTools; + +namespace APIExamples.Editor.UnityTestFramework +{ + /// + /// の使用例 + /// + /// + [TestFixture] + public class UnityTearDownAttributeExample + { + /// + /// TearDownをコルーチン書式で記述できます + /// 専用ではなく、通常のTest向けのTearDownとしても使用できます + /// + [UnityTearDown] + public IEnumerator TearDownCoroutine() + { + yield return null; + Debug.Log($"TearDown"); + } + + [Test] + public void TestMethod() + { + Debug.Log($"TestMethod"); + } + + [Test] + public async Task TestMethodAsync() + { + await Task.Yield(); + Debug.Log($"TestMethodAsync"); + } + + [UnityTest] + public IEnumerator UnityTestMethod() + { + yield return null; + Debug.Log($"UnityTestMethod"); + } + } +} diff --git a/Assets/APIExamples/Tests/Editor/UnityTestFramework/UnityTearDownAttributeExample.cs.meta b/Assets/APIExamples/Tests/Editor/UnityTestFramework/UnityTearDownAttributeExample.cs.meta new file mode 100644 index 0000000..558afc8 --- /dev/null +++ b/Assets/APIExamples/Tests/Editor/UnityTestFramework/UnityTearDownAttributeExample.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 3e67f7d46673461fad71d72b4fd1bbf0 +timeCreated: 1762465453 \ No newline at end of file diff --git a/Assets/APIExamples/Tests/Runtime/NUnit/AsyncSetupAttributeExample.cs b/Assets/APIExamples/Tests/Runtime/NUnit/AsyncSetupAttributeExample.cs index 05c0992..78552e6 100644 --- a/Assets/APIExamples/Tests/Runtime/NUnit/AsyncSetupAttributeExample.cs +++ b/Assets/APIExamples/Tests/Runtime/NUnit/AsyncSetupAttributeExample.cs @@ -1,44 +1,61 @@ // Copyright (c) 2021-2025 Koji Hasegawa. // This software is released under the MIT License. +using System.Collections; +using System.Diagnostics.CodeAnalysis; using System.Threading.Tasks; using NUnit.Framework; -using UnityEngine; +using UnityEngine.TestTools; namespace APIExamples.NUnit { /// - /// 非同期のの例 - /// はasyncサポートされていない(UTF v1.3時点) + /// 非同期のの使用例 + /// はasyncサポートされていない(UTF v1.6.0時点) + ///

/// Async SetUp attribute example - /// Async OneTimeSetUp attribute is not yet supported in UTF v1.3 + /// Async OneTimeSetUp attribute is not yet supported in UTF v1.6.0 ///

/// /// Required: Unity Test Framework v1.3 or later /// + /// + /// + /// [TestFixture] + [SuppressMessage("ReSharper", "AccessToStaticMemberViaDerivedType")] public class AsyncSetupAttributeExample { + private int _setupCount; + /// /// 各テストメソッドの前に実行されます /// [SetUp] - public async Task SetUp() + public async Task SetUpAsync() { await Task.Yield(); - Debug.Log($"SetUp, {Time.time}"); + _setupCount++; } - [Test] + [Test, Order(0)] public void TestMethod() { - Debug.Log($"TestMethod, {Time.time}"); + Assert.That(_setupCount, Is.EqualTo(1), "最初のテストなのでSetUpは1回実行されている"); + } + + [Test, Order(1)] + public async Task TestMethodAsync() + { + await Task.Yield(); + Assert.That(_setupCount, Is.EqualTo(2), "2番目のテストなのでSetUpは2回実行されている"); } - [Test] - public void TestMethod2() + [UnityTest, Order(2)] + public IEnumerator UnityTestMethod() { - Debug.Log($"TestMethod2, {Time.time}"); + yield return null; + Assert.That(_setupCount, Is.EqualTo(3), "3番目のテストなのでSetUpは3回実行されている"); } } } diff --git a/Assets/APIExamples/Tests/Runtime/NUnit/AsyncTearDownAttributeExample.cs b/Assets/APIExamples/Tests/Runtime/NUnit/AsyncTearDownAttributeExample.cs index f3d95fa..4b0719a 100644 --- a/Assets/APIExamples/Tests/Runtime/NUnit/AsyncTearDownAttributeExample.cs +++ b/Assets/APIExamples/Tests/Runtime/NUnit/AsyncTearDownAttributeExample.cs @@ -1,21 +1,27 @@ // Copyright (c) 2021-2025 Koji Hasegawa. // This software is released under the MIT License. +using System.Collections; using System.Threading.Tasks; using NUnit.Framework; using UnityEngine; +using UnityEngine.TestTools; namespace APIExamples.NUnit { /// - /// 非同期のの例 - /// はasyncサポートされていない(UTF v1.3時点) + /// 非同期のの使用例 + /// はasyncサポートされていない(UTF v1.6.0時点) + ///

/// Async TearDown attribute example - /// Async OneTimeTearDown attribute is not yet supported in UTF v1.3 + /// Async OneTimeTearDown attribute is not yet supported in UTF v1.6.0 ///

/// /// Required: Unity Test Framework v1.3 or later /// + /// + /// + /// [TestFixture] public class AsyncTearDownAttributeExample { @@ -23,22 +29,30 @@ public class AsyncTearDownAttributeExample /// 各テストメソッドの後に実行されます ///
[TearDown] - public async Task TearDown() + public async Task TearDownAsync() { await Task.Yield(); - Debug.Log($"TearDown, {Time.time}"); + Debug.Log($"TearDownAsync"); } [Test] public void TestMethod() { - Debug.Log($"TestMethod, {Time.time}"); + Debug.Log($"TestMethod"); } [Test] - public void TestMethod2() + public async Task TestMethodAsync() { - Debug.Log($"TestMethod2, {Time.time}"); + await Task.Yield(); + Debug.Log($"TestMethodAsync"); + } + + [UnityTest] + public IEnumerator UnityTestMethod() + { + yield return null; + Debug.Log($"UnityTestMethod"); } } } diff --git a/Assets/APIExamples/Tests/Runtime/NUnit/OneTimeSetupAttributeExample.cs b/Assets/APIExamples/Tests/Runtime/NUnit/OneTimeSetupAttributeExample.cs new file mode 100644 index 0000000..22422ef --- /dev/null +++ b/Assets/APIExamples/Tests/Runtime/NUnit/OneTimeSetupAttributeExample.cs @@ -0,0 +1,66 @@ +// Copyright (c) 2021-2025 Koji Hasegawa. +// This software is released under the MIT License. + +using System.Collections; +using System.Diagnostics.CodeAnalysis; +using System.Threading.Tasks; +using NUnit.Framework; +using UnityEngine.TestTools; + +namespace APIExamples.NUnit +{ + /// + /// の使用例 + /// + /// + /// + /// + [TestFixture] + [SuppressMessage("ReSharper", "AccessToStaticMemberViaDerivedType")] + public class OneTimeSetupAttributeExample + { + private int _oneTimeSetupCount; + private int _setupCount; + + /// + /// テストクラス内の最初のテストの実行前に一度だけ実行されます + /// + [OneTimeSetUp] + public void OneTimeSetUp() + { + _oneTimeSetupCount++; + } + + /// + /// 各テストメソッドの前に実行されます + /// + [SetUp] + public void SetUp() + { + _setupCount++; + } + + [Test, Order(0)] + public void TestMethod() + { + Assert.That(_oneTimeSetupCount, Is.EqualTo(1), "OneTimeSetUpはTestFixtureごとに一度だけ実行される"); + Assert.That(_setupCount, Is.EqualTo(1), "最初のテストなのでSetUpは1回実行されている"); + } + + [Test, Order(1)] + public async Task TestMethodAsync() + { + await Task.Yield(); + Assert.That(_oneTimeSetupCount, Is.EqualTo(1), "OneTimeSetUpはTestFixtureごとに一度だけ実行される"); + Assert.That(_setupCount, Is.EqualTo(2), "2番目のテストなのでSetUpは2回実行されている"); + } + + [UnityTest, Order(2)] + public IEnumerator UnityTestMethod() + { + yield return null; + Assert.That(_oneTimeSetupCount, Is.EqualTo(1), "OneTimeSetUpはTestFixtureごとに一度だけ実行される"); + Assert.That(_setupCount, Is.EqualTo(3), "3番目のテストなのでSetUpは3回実行されている"); + } + } +} diff --git a/Assets/APIExamples/Tests/Runtime/NUnit/OneTimeSetupAttributeExample.cs.meta b/Assets/APIExamples/Tests/Runtime/NUnit/OneTimeSetupAttributeExample.cs.meta new file mode 100644 index 0000000..515f1e2 --- /dev/null +++ b/Assets/APIExamples/Tests/Runtime/NUnit/OneTimeSetupAttributeExample.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: f5debcab7d6f405f9755f7e1955426e8 +timeCreated: 1627036574 \ No newline at end of file diff --git a/Assets/APIExamples/Tests/Runtime/NUnit/OneTimeTearDownAttributeExample.cs b/Assets/APIExamples/Tests/Runtime/NUnit/OneTimeTearDownAttributeExample.cs new file mode 100644 index 0000000..5a12325 --- /dev/null +++ b/Assets/APIExamples/Tests/Runtime/NUnit/OneTimeTearDownAttributeExample.cs @@ -0,0 +1,69 @@ +// Copyright (c) 2021-2025 Koji Hasegawa. +// This software is released under the MIT License. + +using System.Collections; +using System.Diagnostics.CodeAnalysis; +using System.Threading.Tasks; +using NUnit.Framework; +using UnityEngine; +using UnityEngine.TestTools; + +namespace APIExamples.NUnit +{ + /// + /// の使用例 + /// + /// + /// + /// + [TestFixture] + [SuppressMessage("ReSharper", "AccessToStaticMemberViaDerivedType")] + public class OneTimeTearDownAttributeExample + { + private int _oneTimeTeardownCount; + private int _teardownCount; + + /// + /// クラス内の最後のテストの実行後に一度だけ実行されます + /// + [OneTimeTearDown] + public void OneTimeTearDown() + { + Debug.Log($"OneTimeTearDown"); + _oneTimeTeardownCount++; + + Assert.That(_oneTimeTeardownCount, Is.EqualTo(1), "OneTimeTearDownはTestFixtureごとに一度だけ実行される"); + Assert.That(_teardownCount, Is.EqualTo(3), "3つのテストがあるのでTearDownは3回実行されている"); + } + + /// + /// 各テストメソッドの後に実行されます + /// + [TearDown] + public void TearDown() + { + Debug.Log($"TearDown"); + _teardownCount++; + } + + [Test] + public void TestMethod() + { + Debug.Log($"TestMethod"); + } + + [Test] + public async Task TestMethodAsync() + { + await Task.Yield(); + Debug.Log($"TestMethodAsync"); + } + + [UnityTest] + public IEnumerator UnityTestMethod() + { + yield return null; + Debug.Log($"UnityTestMethod"); + } + } +} diff --git a/Assets/APIExamples/Tests/Runtime/NUnit/TearDownExample.cs.meta b/Assets/APIExamples/Tests/Runtime/NUnit/OneTimeTearDownAttributeExample.cs.meta similarity index 100% rename from Assets/APIExamples/Tests/Runtime/NUnit/TearDownExample.cs.meta rename to Assets/APIExamples/Tests/Runtime/NUnit/OneTimeTearDownAttributeExample.cs.meta diff --git a/Assets/APIExamples/Tests/Runtime/NUnit/SetupAttributeExample.cs b/Assets/APIExamples/Tests/Runtime/NUnit/SetupAttributeExample.cs index 4f79fb9..c26ae0e 100644 --- a/Assets/APIExamples/Tests/Runtime/NUnit/SetupAttributeExample.cs +++ b/Assets/APIExamples/Tests/Runtime/NUnit/SetupAttributeExample.cs @@ -1,25 +1,25 @@ -// Copyright (c) 2021-2023 Koji Hasegawa. +// Copyright (c) 2021-2025 Koji Hasegawa. // This software is released under the MIT License. +using System.Collections; +using System.Diagnostics.CodeAnalysis; +using System.Threading.Tasks; using NUnit.Framework; -using UnityEngine; +using UnityEngine.TestTools; namespace APIExamples.NUnit { /// - /// , の例 + /// の使用例 /// + /// + /// + /// [TestFixture] + [SuppressMessage("ReSharper", "AccessToStaticMemberViaDerivedType")] public class SetupAttributeExample { - /// - /// クラス内の最初のテストの実行前に一度だけ実行されます - /// - [OneTimeSetUp] - public void OneTimeSetUp() - { - Debug.Log($"OneTimeSetUp, {Time.time}"); - } + private int _setupCount; /// /// 各テストメソッドの前に実行されます @@ -27,19 +27,27 @@ public void OneTimeSetUp() [SetUp] public void SetUp() { - Debug.Log($"SetUp, {Time.time}"); + _setupCount++; } - [Test] + [Test, Order(0)] public void TestMethod() { - Debug.Log($"TestMethod, {Time.time}"); + Assert.That(_setupCount, Is.EqualTo(1), "最初のテストなのでSetUpは1回実行されている"); + } + + [Test, Order(1)] + public async Task TestMethodAsync() + { + await Task.Yield(); + Assert.That(_setupCount, Is.EqualTo(2), "2番目のテストなのでSetUpは2回実行されている"); } - [Test] - public void TestMethod2() + [UnityTest, Order(2)] + public IEnumerator UnityTestMethod() { - Debug.Log($"TestMethod2, {Time.time}"); + yield return null; + Assert.That(_setupCount, Is.EqualTo(3), "3番目のテストなのでSetUpは3回実行されている"); } } } diff --git a/Assets/APIExamples/Tests/Runtime/NUnit/SetupAttributeExample.cs.meta b/Assets/APIExamples/Tests/Runtime/NUnit/SetupAttributeExample.cs.meta index 515f1e2..91ce4e1 100644 --- a/Assets/APIExamples/Tests/Runtime/NUnit/SetupAttributeExample.cs.meta +++ b/Assets/APIExamples/Tests/Runtime/NUnit/SetupAttributeExample.cs.meta @@ -1,3 +1,3 @@ -fileFormatVersion: 2 -guid: f5debcab7d6f405f9755f7e1955426e8 -timeCreated: 1627036574 \ No newline at end of file +fileFormatVersion: 2 +guid: 2b076d3a9ea94c439e61c97d4cc95168 +timeCreated: 1762465031 \ No newline at end of file diff --git a/Assets/APIExamples/Tests/Runtime/NUnit/TearDownAttributeExample.cs b/Assets/APIExamples/Tests/Runtime/NUnit/TearDownAttributeExample.cs new file mode 100644 index 0000000..4836d43 --- /dev/null +++ b/Assets/APIExamples/Tests/Runtime/NUnit/TearDownAttributeExample.cs @@ -0,0 +1,52 @@ +// Copyright (c) 2021-2025 Koji Hasegawa. +// This software is released under the MIT License. + +using System.Collections; +using System.Diagnostics.CodeAnalysis; +using System.Threading.Tasks; +using NUnit.Framework; +using UnityEngine; +using UnityEngine.TestTools; + +namespace APIExamples.NUnit +{ + /// + /// の使用例 + /// + /// + /// + /// + [TestFixture] + [SuppressMessage("ReSharper", "AccessToStaticMemberViaDerivedType")] + public class TearDownAttributeExample + { + /// + /// 各テストメソッドの後に実行されます + /// + [TearDown] + public void TearDown() + { + Debug.Log($"TearDown"); + } + + [Test] + public void TestMethod() + { + Debug.Log($"TestMethod"); + } + + [Test] + public async Task TestMethodAsync() + { + await Task.Yield(); + Debug.Log($"TestMethodAsync"); + } + + [UnityTest] + public IEnumerator UnityTestMethod() + { + yield return null; + Debug.Log($"UnityTestMethod"); + } + } +} diff --git a/Assets/APIExamples/Tests/Runtime/NUnit/TearDownAttributeExample.cs.meta b/Assets/APIExamples/Tests/Runtime/NUnit/TearDownAttributeExample.cs.meta new file mode 100644 index 0000000..cac434a --- /dev/null +++ b/Assets/APIExamples/Tests/Runtime/NUnit/TearDownAttributeExample.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: a62310a19258496daea6025cba719003 +timeCreated: 1762465043 \ No newline at end of file diff --git a/Assets/APIExamples/Tests/Runtime/NUnit/TearDownExample.cs b/Assets/APIExamples/Tests/Runtime/NUnit/TearDownExample.cs deleted file mode 100644 index 3c63c6e..0000000 --- a/Assets/APIExamples/Tests/Runtime/NUnit/TearDownExample.cs +++ /dev/null @@ -1,45 +0,0 @@ -// Copyright (c) 2021-2023 Koji Hasegawa. -// This software is released under the MIT License. - -using NUnit.Framework; -using UnityEngine; - -namespace APIExamples.NUnit -{ - /// - /// , の例 - /// - [TestFixture] - public class TearDownExample - { - /// - /// クラス内の最後のテストの実行後に一度だけ実行されます - /// - [OneTimeTearDown] - public void OneTimeTearDown() - { - Debug.Log($"OneTimeTearDown, {Time.time}"); - } - - /// - /// 各テストメソッドの後に実行されます - /// - [TearDown] - public void TearDown() - { - Debug.Log($"TearDown, {Time.time}"); - } - - [Test] - public void TestMethod() - { - Debug.Log($"TestMethod, {Time.time}"); - } - - [Test] - public void TestMethod2() - { - Debug.Log($"TestMethod2, {Time.time}"); - } - } -} diff --git a/Assets/APIExamples/Tests/Runtime/UnityTestFramework/UnitySetUpAttributeExample.cs b/Assets/APIExamples/Tests/Runtime/UnityTestFramework/UnitySetUpAttributeExample.cs index 84649db..fc06faa 100644 --- a/Assets/APIExamples/Tests/Runtime/UnityTestFramework/UnitySetUpAttributeExample.cs +++ b/Assets/APIExamples/Tests/Runtime/UnityTestFramework/UnitySetUpAttributeExample.cs @@ -1,10 +1,9 @@ -// Copyright (c) 2021 Koji Hasegawa. +// Copyright (c) 2021-2025 Koji Hasegawa. // This software is released under the MIT License. using System.Collections; +using System.Threading.Tasks; using NUnit.Framework; -using UnityEngine; -using UnityEngine.SceneManagement; using UnityEngine.TestTools; namespace APIExamples.UnityTestFramework @@ -12,36 +11,43 @@ namespace APIExamples.UnityTestFramework /// /// の使用例 /// + /// + /// + /// [TestFixture] public class UnitySetUpAttributeExample { + private int _setupCount; + /// - /// SetUpをコルーチンで記述できます + /// SetUpをコルーチン書式で記述できます /// 専用ではなく、通常のTest向けのSetUpとしても使用できます /// [UnitySetUp] public IEnumerator SetUpCoroutine() { - yield return SceneManager.LoadSceneAsync("ContainScenesInBuild"); + yield return null; + _setupCount++; } - [Test] - public void Test属性テストメソッド() + [Test, Order(0)] + public void TestMethod() { - var cube = GameObject.Find("Cube"); - Object.DestroyImmediate(cube); + Assert.That(_setupCount, Is.EqualTo(1), "最初のテストなのでSetUpは1回実行されている"); + } - Assert.That((bool)cube, Is.False); + [Test, Order(1)] + public async Task TestMethodAsync() + { + await Task.Yield(); + Assert.That(_setupCount, Is.EqualTo(2), "2番目のテストなのでSetUpは2回実行されている"); } - [UnityTest] - public IEnumerator UnityTest属性テストメソッド() + [UnityTest, Order(2)] + public IEnumerator UnityTestMethod() { - var cube = GameObject.Find("Cube"); - Object.Destroy(cube); yield return null; - - Assert.That((bool)cube, Is.False); + Assert.That(_setupCount, Is.EqualTo(3), "3番目のテストなのでSetUpは3回実行されている"); } } } diff --git a/Assets/APIExamples/Tests/Runtime/UnityTestFramework/UnityTearDownAttributeExample.cs b/Assets/APIExamples/Tests/Runtime/UnityTestFramework/UnityTearDownAttributeExample.cs index 0c5c278..cdc5559 100644 --- a/Assets/APIExamples/Tests/Runtime/UnityTestFramework/UnityTearDownAttributeExample.cs +++ b/Assets/APIExamples/Tests/Runtime/UnityTestFramework/UnityTearDownAttributeExample.cs @@ -1,49 +1,52 @@ -// Copyright (c) 2021 Koji Hasegawa. +// Copyright (c) 2021-2025 Koji Hasegawa. // This software is released under the MIT License. using System.Collections; +using System.Threading.Tasks; using NUnit.Framework; using UnityEngine; using UnityEngine.TestTools; -using UnityEngine.TestTools.Utils; namespace APIExamples.UnityTestFramework { /// /// の使用例 /// + /// + /// + /// [TestFixture] public class UnityTearDownAttributeExample { - private Object _cube; - /// - /// TearDownをコルーチンで記述できます + /// TearDownをコルーチン書式で記述できます /// 専用ではなく、通常のTest向けのTearDownとしても使用できます /// [UnityTearDown] public IEnumerator TearDownCoroutine() { - Object.Destroy(_cube); yield return null; - // Note: WebGLでも動作しているか確認するためにここで`Assert.Fail()`したらfailしたので動いている模様 + Debug.Log($"TearDown"); } [Test] - public void Test属性のテストメソッド() + public void TestMethod() { - _cube = Utils.CreatePrimitive(PrimitiveType.Cube); + Debug.Log($"TestMethod"); + } - Assert.That((bool)_cube, Is.True); + [Test] + public async Task TestMethodAsync() + { + await Task.Yield(); + Debug.Log($"TestMethodAsync"); } [UnityTest] - public IEnumerator UnityTest属性のテストメソッド() + public IEnumerator UnityTestMethod() { - _cube = Utils.CreatePrimitive(PrimitiveType.Cube); yield return null; - - Assert.That((bool)_cube, Is.True); + Debug.Log($"UnityTestMethod"); } } } From 78f0afe7260fcd84192021b82b079a196b63d681 Mon Sep 17 00:00:00 2001 From: Koji Hasegawa Date: Sat, 4 Oct 2025 22:40:51 +0900 Subject: [PATCH 17/22] Upgrade Unity version to 6000.0.43f1 --- Packages/manifest.json | 14 +-- Packages/packages-lock.json | 90 +++++++------------ ProjectSettings/MemorySettings.asset | 35 ++++++++ ProjectSettings/MultiplayerManager.asset | 7 ++ ProjectSettings/PackageManagerSettings.asset | 36 ++++---- .../Settings.json | 2 - ProjectSettings/ProjectVersion.txt | 4 +- 7 files changed, 101 insertions(+), 87 deletions(-) create mode 100644 ProjectSettings/MemorySettings.asset create mode 100644 ProjectSettings/MultiplayerManager.asset diff --git a/Packages/manifest.json b/Packages/manifest.json index ec715ff..b752cf8 100644 --- a/Packages/manifest.json +++ b/Packages/manifest.json @@ -7,16 +7,18 @@ "com.nowsprinting.test-helper.input": "1.0.1", "com.nowsprinting.test-helper.random": "1.0.0", "com.nowsprinting.test-helper.ui": "1.0.1", - "com.unity.collab-proxy": "1.14.18", + "com.unity.ai.navigation": "2.0.6", + "com.unity.collab-proxy": "2.7.1", "com.unity.ide.rider": "3.0.34", "com.unity.ide.visualstudio": "2.0.22", - "com.unity.inputsystem": "1.7.0", + "com.unity.inputsystem": "1.13.1", + "com.unity.multiplayer.center": "1.0.0", "com.unity.test-framework": "1.4.6", - "com.unity.testtools.codecoverage": "1.2.4", - "com.unity.textmeshpro": "2.1.6", - "com.unity.timeline": "1.2.18", - "com.unity.ugui": "1.0.0", + "com.unity.testtools.codecoverage": "1.2.6", + "com.unity.timeline": "1.8.7", + "com.unity.ugui": "2.0.0", "net.tnrd.nsubstitute": "4.2.2", + "com.unity.modules.accessibility": "1.0.0", "com.unity.modules.ai": "1.0.0", "com.unity.modules.androidjni": "1.0.0", "com.unity.modules.animation": "1.0.0", diff --git a/Packages/packages-lock.json b/Packages/packages-lock.json index 77562c1..e76d9c8 100644 --- a/Packages/packages-lock.json +++ b/Packages/packages-lock.json @@ -27,7 +27,7 @@ "dependencies": {} }, "com.nowsprinting.test-helper": { - "version": "1.2.1", + "version": "1.2.3", "depth": 0, "source": "registry", "dependencies": { @@ -61,43 +61,29 @@ }, "url": "https://package.openupm.com" }, - "com.unity.addressables": { - "version": "1.17.15", - "depth": 1, + "com.unity.ai.navigation": { + "version": "2.0.6", + "depth": 0, "source": "registry", "dependencies": { - "com.unity.modules.assetbundle": "1.0.0", - "com.unity.modules.jsonserialize": "1.0.0", - "com.unity.modules.imageconversion": "1.0.0", - "com.unity.modules.unitywebrequest": "1.0.0", - "com.unity.scriptablebuildpipeline": "1.17.0", - "com.unity.modules.unitywebrequestassetbundle": "1.0.0" + "com.unity.modules.ai": "1.0.0" }, "url": "https://packages.unity.com" }, "com.unity.collab-proxy": { - "version": "1.14.18", + "version": "2.7.1", "depth": 0, "source": "registry", "dependencies": {}, "url": "https://packages.unity.com" }, "com.unity.ext.nunit": { - "version": "2.0.3", + "version": "2.0.5", "depth": 1, "source": "registry", "dependencies": {}, "url": "https://packages.unity.com" }, - "com.unity.external.test-protocol": { - "version": "1.0.0-preview", - "depth": 1, - "source": "registry", - "dependencies": { - "com.unity.nuget.newtonsoft-json": "2.0.0-preview" - }, - "url": "https://packages.unity.com" - }, "com.unity.ide.rider": { "version": "3.0.34", "depth": 0, @@ -117,7 +103,7 @@ "url": "https://packages.unity.com" }, "com.unity.inputsystem": { - "version": "1.7.0", + "version": "1.13.1", "depth": 0, "source": "registry", "dependencies": { @@ -125,34 +111,21 @@ }, "url": "https://packages.unity.com" }, - "com.unity.nuget.newtonsoft-json": { - "version": "2.0.0", - "depth": 1, - "source": "registry", - "dependencies": {}, - "url": "https://packages.unity.com" - }, - "com.unity.scriptablebuildpipeline": { - "version": "1.17.0", - "depth": 2, - "source": "registry", - "dependencies": {}, - "url": "https://packages.unity.com" + "com.unity.multiplayer.center": { + "version": "1.0.0", + "depth": 0, + "source": "builtin", + "dependencies": { + "com.unity.modules.uielements": "1.0.0" + } }, "com.unity.settings-manager": { - "version": "1.0.1", + "version": "2.0.1", "depth": 1, "source": "registry", "dependencies": {}, "url": "https://packages.unity.com" }, - "com.unity.subsystemregistration": { - "version": "1.0.6", - "depth": 2, - "source": "registry", - "dependencies": {}, - "url": "https://packages.unity.com" - }, "com.unity.test-framework": { "version": "1.4.6", "depth": 0, @@ -165,7 +138,7 @@ "url": "https://packages.unity.com" }, "com.unity.testtools.codecoverage": { - "version": "1.2.4", + "version": "1.2.6", "depth": 0, "source": "registry", "dependencies": { @@ -174,17 +147,8 @@ }, "url": "https://packages.unity.com" }, - "com.unity.textmeshpro": { - "version": "2.1.6", - "depth": 0, - "source": "registry", - "dependencies": { - "com.unity.ugui": "1.0.0" - }, - "url": "https://packages.unity.com" - }, "com.unity.timeline": { - "version": "1.2.18", + "version": "1.8.7", "depth": 0, "source": "registry", "dependencies": { @@ -196,7 +160,7 @@ "url": "https://packages.unity.com" }, "com.unity.ugui": { - "version": "1.0.0", + "version": "2.0.0", "depth": 0, "source": "builtin", "dependencies": { @@ -211,6 +175,12 @@ "dependencies": {}, "url": "https://package.openupm.com" }, + "com.unity.modules.accessibility": { + "version": "1.0.0", + "depth": 0, + "source": "builtin", + "dependencies": {} + }, "com.unity.modules.ai": { "version": "1.0.0", "depth": 0, @@ -258,6 +228,12 @@ "com.unity.modules.animation": "1.0.0" } }, + "com.unity.modules.hierarchycore": { + "version": "1.0.0", + "depth": 1, + "source": "builtin", + "dependencies": {} + }, "com.unity.modules.imageconversion": { "version": "1.0.0", "depth": 0, @@ -344,8 +320,10 @@ "depth": 0, "source": "builtin", "dependencies": { + "com.unity.modules.ui": "1.0.0", "com.unity.modules.imgui": "1.0.0", - "com.unity.modules.jsonserialize": "1.0.0" + "com.unity.modules.jsonserialize": "1.0.0", + "com.unity.modules.hierarchycore": "1.0.0" } }, "com.unity.modules.umbra": { diff --git a/ProjectSettings/MemorySettings.asset b/ProjectSettings/MemorySettings.asset new file mode 100644 index 0000000..5b5face --- /dev/null +++ b/ProjectSettings/MemorySettings.asset @@ -0,0 +1,35 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!387306366 &1 +MemorySettings: + m_ObjectHideFlags: 0 + m_EditorMemorySettings: + m_MainAllocatorBlockSize: -1 + m_ThreadAllocatorBlockSize: -1 + m_MainGfxBlockSize: -1 + m_ThreadGfxBlockSize: -1 + m_CacheBlockSize: -1 + m_TypetreeBlockSize: -1 + m_ProfilerBlockSize: -1 + m_ProfilerEditorBlockSize: -1 + m_BucketAllocatorGranularity: -1 + m_BucketAllocatorBucketsCount: -1 + m_BucketAllocatorBlockSize: -1 + m_BucketAllocatorBlockCount: -1 + m_ProfilerBucketAllocatorGranularity: -1 + m_ProfilerBucketAllocatorBucketsCount: -1 + m_ProfilerBucketAllocatorBlockSize: -1 + m_ProfilerBucketAllocatorBlockCount: -1 + m_TempAllocatorSizeMain: -1 + m_JobTempAllocatorBlockSize: -1 + m_BackgroundJobTempAllocatorBlockSize: -1 + m_JobTempAllocatorReducedBlockSize: -1 + m_TempAllocatorSizeGIBakingWorker: -1 + m_TempAllocatorSizeNavMeshWorker: -1 + m_TempAllocatorSizeAudioWorker: -1 + m_TempAllocatorSizeCloudWorker: -1 + m_TempAllocatorSizeGfx: -1 + m_TempAllocatorSizeJobWorker: -1 + m_TempAllocatorSizeBackgroundWorker: -1 + m_TempAllocatorSizePreloadManager: -1 + m_PlatformMemorySettings: {} diff --git a/ProjectSettings/MultiplayerManager.asset b/ProjectSettings/MultiplayerManager.asset new file mode 100644 index 0000000..2a93664 --- /dev/null +++ b/ProjectSettings/MultiplayerManager.asset @@ -0,0 +1,7 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!655991488 &1 +MultiplayerManager: + m_ObjectHideFlags: 0 + m_EnableMultiplayerRoles: 0 + m_StrippingTypes: {} diff --git a/ProjectSettings/PackageManagerSettings.asset b/ProjectSettings/PackageManagerSettings.asset index abe1834..9688fdf 100644 --- a/ProjectSettings/PackageManagerSettings.asset +++ b/ProjectSettings/PackageManagerSettings.asset @@ -12,15 +12,22 @@ MonoBehaviour: m_Script: {fileID: 13964, guid: 0000000000000000e000000000000000, type: 0} m_Name: m_EditorClassIdentifier: + m_EnablePreReleasePackages: 0 + m_AdvancedSettingsExpanded: 1 m_ScopedRegistriesSettingsExpanded: 1 + m_SeeAllPackageVersions: 0 + m_DismissPreviewPackagesInUse: 0 oneTimeWarningShown: 0 + oneTimeDeprecatedPopUpShown: 0 m_Registries: - m_Id: main m_Name: m_Url: https://packages.unity.com m_Scopes: [] m_IsDefault: 1 - - m_Id: scoped:package.openupm.com + m_Capabilities: 7 + m_ConfigSource: 0 + - m_Id: scoped:project:package.openupm.com m_Name: package.openupm.com m_Url: https://package.openupm.com m_Scopes: @@ -29,26 +36,13 @@ MonoBehaviour: - com.openupm - net.tnrd.nsubstitute m_IsDefault: 0 - m_UserSelectedRegistryName: + m_Capabilities: 0 + m_ConfigSource: 4 + m_UserSelectedRegistryName: package.openupm.com m_UserAddingNewScopedRegistry: 0 m_RegistryInfoDraft: - m_ErrorMessage: - m_Original: - m_Id: scoped:package.openupm.com - m_Name: package.openupm.com - m_Url: https://package.openupm.com - m_Scopes: - - com.cysharp - - com.nowsprinting - - com.openupm - - net.tnrd.nsubstitute - m_IsDefault: 0 m_Modified: 0 - m_Name: package.openupm.com - m_Url: https://package.openupm.com - m_Scopes: - - com.cysharp - - com.nowsprinting - - com.openupm - - net.tnrd.nsubstitute - m_SelectedScopeIndex: 0 + m_ErrorMessage: + m_UserModificationsInstanceId: -870 + m_OriginalInstanceId: -874 + m_LoadAssets: 0 diff --git a/ProjectSettings/Packages/com.unity.testtools.codecoverage/Settings.json b/ProjectSettings/Packages/com.unity.testtools.codecoverage/Settings.json index ad11087..3c7b4c1 100644 --- a/ProjectSettings/Packages/com.unity.testtools.codecoverage/Settings.json +++ b/ProjectSettings/Packages/com.unity.testtools.codecoverage/Settings.json @@ -1,6 +1,4 @@ { - "m_Name": "Settings", - "m_Path": "ProjectSettings/Packages/com.unity.testtools.codecoverage/Settings.json", "m_Dictionary": { "m_DictionaryValues": [] } diff --git a/ProjectSettings/ProjectVersion.txt b/ProjectSettings/ProjectVersion.txt index 4c19129..355f111 100644 --- a/ProjectSettings/ProjectVersion.txt +++ b/ProjectSettings/ProjectVersion.txt @@ -1,2 +1,2 @@ -m_EditorVersion: 2019.4.40f1 -m_EditorVersionWithRevision: 2019.4.40f1 (ffc62b691db5) +m_EditorVersion: 6000.0.43f1 +m_EditorVersionWithRevision: 6000.0.43f1 (97272b72f107) From b384a7ab03fe0aeed2a3d765b3bfe44e708f7e29 Mon Sep 17 00:00:00 2001 From: Koji Hasegawa Date: Sun, 5 Oct 2025 00:08:24 +0900 Subject: [PATCH 18/22] Fix Unity versions used to run tests on CI --- .github/workflows/test-integration.yml | 4 ---- .github/workflows/test.yml | 4 ---- 2 files changed, 8 deletions(-) diff --git a/.github/workflows/test-integration.yml b/.github/workflows/test-integration.yml index f19ff7b..cccca02 100644 --- a/.github/workflows/test-integration.yml +++ b/.github/workflows/test-integration.yml @@ -40,10 +40,6 @@ jobs: fail-fast: false matrix: unityVersion: # Available versions see: https://game.ci/docs/docker/versions - - 2019.4.40f1 - - 2020.3.49f1 - - 2021.3.45f1 - - 2022.3.62f1 - 6000.0.43f1 - 6000.0.44f1 # pin test-framework v1.5.1 - 6000.0.59f2 # pin test-framework v1.6.0 diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 0afc482..f2df688 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -41,10 +41,6 @@ jobs: fail-fast: false matrix: unityVersion: # Available versions see: https://game.ci/docs/docker/versions - - 2019.4.40f1 - - 2020.3.49f1 - - 2021.3.45f1 - - 2022.3.62f1 - 6000.0.43f1 - 6000.0.44f1 # pin test-framework v1.5.1 - 6000.0.59f2 # pin test-framework v1.6.0 From e04015d9dc1e30ef6ef0ea07234b954343b657c7 Mon Sep 17 00:00:00 2001 From: Koji Hasegawa Date: Sun, 5 Oct 2025 00:37:51 +0900 Subject: [PATCH 19/22] Remove suppress C#8.0+ syntax sugar (for under Unity 2020.2 compatibility) --- .editorconfig | 7 ------- 1 file changed, 7 deletions(-) diff --git a/.editorconfig b/.editorconfig index f283fbd..b2af3e1 100644 --- a/.editorconfig +++ b/.editorconfig @@ -267,13 +267,6 @@ resharper_switch_statement_handles_some_known_enum_values_with_default_highlight # BannedApiAnalyzers dotnet_diagnostic.RS0030.severity = error -# Suppress C#8.0+ syntax sugar (for under Unity 2020.2 compatibility) -# See: https://www.jetbrains.com/help/resharper/Reference__Code_Inspections_CSHARP.html -resharper_convert_to_using_declaration_highlighting = none -resharper_convert_to_null_coalescing_compound_assignment_highlighting = none -resharper_merge_into_logical_pattern_highlighting = none -resharper_use_negated_pattern_in_is_expression_highlighting = none - # Test codes for Unity Test Framework [Tests/**/*.cs] From 0da6192dd49801c0cd47cec8a08b552ecdae3305 Mon Sep 17 00:00:00 2001 From: Koji Hasegawa Date: Wed, 5 Nov 2025 01:15:04 +0900 Subject: [PATCH 20/22] Add version defines --- .../Editor/APIExamples.Editor.Tests.asmdef | 20 ++++++++++++++----- .../Tests/Runtime/APIExamples.Tests.asmdef | 17 +++++++++++++--- 2 files changed, 29 insertions(+), 8 deletions(-) diff --git a/Assets/APIExamples/Tests/Editor/APIExamples.Editor.Tests.asmdef b/Assets/APIExamples/Tests/Editor/APIExamples.Editor.Tests.asmdef index 3e283a5..bd148d2 100644 --- a/Assets/APIExamples/Tests/Editor/APIExamples.Editor.Tests.asmdef +++ b/Assets/APIExamples/Tests/Editor/APIExamples.Editor.Tests.asmdef @@ -4,10 +4,9 @@ "references": [ "UnityEngine.TestRunner", "UnityEditor.TestRunner", - "NUnit.Analyzers_Unity", - "APIExamples.Tests", - "UniTask", - "TestHelper" + "APIExamples.Tests", + "UniTask", + "TestHelper" ], "includePlatforms": [ "Editor" @@ -22,6 +21,17 @@ "defineConstraints": [ "UNITY_INCLUDE_TESTS" ], - "versionDefines": [], + "versionDefines": [ + { + "name": "com.unity.test-framework", + "expression": "1.5", + "define": "ENABLE_UTF_1_5" + }, + { + "name": "com.unity.test-framework", + "expression": "1.6", + "define": "ENABLE_UTF_1_6" + } + ], "noEngineReferences": false } \ No newline at end of file diff --git a/Assets/APIExamples/Tests/Runtime/APIExamples.Tests.asmdef b/Assets/APIExamples/Tests/Runtime/APIExamples.Tests.asmdef index eefcc21..fac6e79 100644 --- a/Assets/APIExamples/Tests/Runtime/APIExamples.Tests.asmdef +++ b/Assets/APIExamples/Tests/Runtime/APIExamples.Tests.asmdef @@ -5,8 +5,8 @@ "UnityEngine.TestRunner", "UnityEditor.TestRunner", "APIExamples", - "UniTask", - "TestHelper" + "UniTask", + "TestHelper" ], "includePlatforms": [], "excludePlatforms": [], @@ -19,6 +19,17 @@ "defineConstraints": [ "UNITY_INCLUDE_TESTS" ], - "versionDefines": [], + "versionDefines": [ + { + "name": "com.unity.test-framework", + "expression": "1.5", + "define": "ENABLE_UTF_1_5" + }, + { + "name": "com.unity.test-framework", + "expression": "1.6", + "define": "ENABLE_UTF_1_6" + } + ], "noEngineReferences": false } \ No newline at end of file From 7cc100bb5f4a6b5ccdc523600d028d5f3c9f375b Mon Sep 17 00:00:00 2001 From: Koji Hasegawa Date: Fri, 7 Nov 2025 07:08:37 +0900 Subject: [PATCH 21/22] Add UnityOneTimeSetUp and TearDown attribute examples (UTF 1.5+) --- .../UnityOneTimeSetupAttributeExample.cs | 73 +++++++++++++++++ .../UnityOneTimeSetupAttributeExample.cs.meta | 3 + .../UnityOneTimeTearDownAttributeExample.cs | 76 ++++++++++++++++++ ...ityOneTimeTearDownAttributeExample.cs.meta | 3 + .../UnityOneTimeSetupAttributeExample.cs | 75 ++++++++++++++++++ .../UnityOneTimeSetupAttributeExample.cs.meta | 3 + .../UnityOneTimeTearDownAttributeExample.cs | 78 +++++++++++++++++++ ...ityOneTimeTearDownAttributeExample.cs.meta | 3 + 8 files changed, 314 insertions(+) create mode 100644 Assets/APIExamples/Tests/Editor/UnityTestFramework/UnityOneTimeSetupAttributeExample.cs create mode 100644 Assets/APIExamples/Tests/Editor/UnityTestFramework/UnityOneTimeSetupAttributeExample.cs.meta create mode 100644 Assets/APIExamples/Tests/Editor/UnityTestFramework/UnityOneTimeTearDownAttributeExample.cs create mode 100644 Assets/APIExamples/Tests/Editor/UnityTestFramework/UnityOneTimeTearDownAttributeExample.cs.meta create mode 100644 Assets/APIExamples/Tests/Runtime/UnityTestFramework/UnityOneTimeSetupAttributeExample.cs create mode 100644 Assets/APIExamples/Tests/Runtime/UnityTestFramework/UnityOneTimeSetupAttributeExample.cs.meta create mode 100644 Assets/APIExamples/Tests/Runtime/UnityTestFramework/UnityOneTimeTearDownAttributeExample.cs create mode 100644 Assets/APIExamples/Tests/Runtime/UnityTestFramework/UnityOneTimeTearDownAttributeExample.cs.meta diff --git a/Assets/APIExamples/Tests/Editor/UnityTestFramework/UnityOneTimeSetupAttributeExample.cs b/Assets/APIExamples/Tests/Editor/UnityTestFramework/UnityOneTimeSetupAttributeExample.cs new file mode 100644 index 0000000..ada2be4 --- /dev/null +++ b/Assets/APIExamples/Tests/Editor/UnityTestFramework/UnityOneTimeSetupAttributeExample.cs @@ -0,0 +1,73 @@ +// Copyright (c) 2021-2025 Koji Hasegawa. +// This software is released under the MIT License. + +#if ENABLE_UTF_1_5 +using System.Collections; +using System.Diagnostics.CodeAnalysis; +using System.Threading.Tasks; +using APIExamples.NUnit; +using NUnit.Framework; +using UnityEngine.TestTools; +using Is = APIExamples.NUnit.Is; + +namespace APIExamples.Editor.UnityTestFramework +{ + /// + /// の使用例 + /// + /// + /// Required: Unity Test Framework v1.5 or later + /// + /// + /// + [TestFixture] + [SuppressMessage("ReSharper", "AccessToStaticMemberViaDerivedType")] + public class UnityOneTimeSetupAttributeExample + { + private int _oneTimeSetupCount; + private int _setupCount; + + /// + /// テストクラス内の最初のテストの実行前に一度だけ実行されます + /// + [UnityOneTimeSetUp] + public IEnumerator OneTimeSetUp() + { + yield return null; + _oneTimeSetupCount++; + } + + /// + /// 各テストメソッドの前に実行されます + /// + [SetUp] + public void SetUp() + { + _setupCount++; + } + + [Test, Order(0)] + public void TestMethod() + { + Assert.That(_oneTimeSetupCount, Is.EqualTo(1), "OneTimeSetUpはTestFixtureごとに一度だけ実行される"); + Assert.That(_setupCount, Is.EqualTo(1), "最初のテストなのでSetUpは1回実行されている"); + } + + [Test, Order(1)] + public async Task TestMethodAsync() + { + await Task.Yield(); + Assert.That(_oneTimeSetupCount, Is.EqualTo(1), "OneTimeSetUpはTestFixtureごとに一度だけ実行される"); + Assert.That(_setupCount, Is.EqualTo(2), "2番目のテストなのでSetUpは2回実行されている"); + } + + [UnityTest, Order(2)] + public IEnumerator UnityTestMethod() + { + yield return null; + Assert.That(_oneTimeSetupCount, Is.EqualTo(1), "OneTimeSetUpはTestFixtureごとに一度だけ実行される"); + Assert.That(_setupCount, Is.EqualTo(3), "3番目のテストなのでSetUpは3回実行されている"); + } + } +} +#endif diff --git a/Assets/APIExamples/Tests/Editor/UnityTestFramework/UnityOneTimeSetupAttributeExample.cs.meta b/Assets/APIExamples/Tests/Editor/UnityTestFramework/UnityOneTimeSetupAttributeExample.cs.meta new file mode 100644 index 0000000..7f9627c --- /dev/null +++ b/Assets/APIExamples/Tests/Editor/UnityTestFramework/UnityOneTimeSetupAttributeExample.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: dc4b105e00624aac8b90c524c27db1c7 +timeCreated: 1762467282 \ No newline at end of file diff --git a/Assets/APIExamples/Tests/Editor/UnityTestFramework/UnityOneTimeTearDownAttributeExample.cs b/Assets/APIExamples/Tests/Editor/UnityTestFramework/UnityOneTimeTearDownAttributeExample.cs new file mode 100644 index 0000000..35eb39f --- /dev/null +++ b/Assets/APIExamples/Tests/Editor/UnityTestFramework/UnityOneTimeTearDownAttributeExample.cs @@ -0,0 +1,76 @@ +// Copyright (c) 2021-2025 Koji Hasegawa. +// This software is released under the MIT License. + +#if ENABLE_UTF_1_5 +using System.Collections; +using System.Diagnostics.CodeAnalysis; +using System.Threading.Tasks; +using APIExamples.NUnit; +using NUnit.Framework; +using UnityEngine; +using UnityEngine.TestTools; +using Is = APIExamples.NUnit.Is; + +namespace APIExamples.Editor.UnityTestFramework +{ + /// + /// の使用例 + /// + /// + /// Required: Unity Test Framework v1.5 or later + /// + /// + /// + [TestFixture] + [SuppressMessage("ReSharper", "AccessToStaticMemberViaDerivedType")] + public class UnityOneTimeTearDownAttributeExample + { + private int _oneTimeTeardownCount; + private int _teardownCount; + + /// + /// クラス内の最後のテストの実行後に一度だけ実行されます + /// + [UnityOneTimeTearDown] + public IEnumerator OneTimeTearDown() + { + yield return null; + Debug.Log($"UnityOneTimeTearDown"); + _oneTimeTeardownCount++; + + Assert.That(_oneTimeTeardownCount, Is.EqualTo(1), "OneTimeTearDownはTestFixtureごとに一度だけ実行される"); + Assert.That(_teardownCount, Is.EqualTo(3), "3つのテストがあるのでTearDownは3回実行されている"); + } + + /// + /// 各テストメソッドの後に実行されます + /// + [TearDown] + public void TearDown() + { + Debug.Log($"TearDown"); + _teardownCount++; + } + + [Test] + public void TestMethod() + { + Debug.Log($"TestMethod"); + } + + [Test] + public async Task TestMethodAsync() + { + await Task.Yield(); + Debug.Log($"TestMethodAsync"); + } + + [UnityTest] + public IEnumerator UnityTestMethod() + { + yield return null; + Debug.Log($"UnityTestMethod"); + } + } +} +#endif diff --git a/Assets/APIExamples/Tests/Editor/UnityTestFramework/UnityOneTimeTearDownAttributeExample.cs.meta b/Assets/APIExamples/Tests/Editor/UnityTestFramework/UnityOneTimeTearDownAttributeExample.cs.meta new file mode 100644 index 0000000..46ac3e2 --- /dev/null +++ b/Assets/APIExamples/Tests/Editor/UnityTestFramework/UnityOneTimeTearDownAttributeExample.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: fff43dc8c86648aead6768826c0ee184 +timeCreated: 1762467282 \ No newline at end of file diff --git a/Assets/APIExamples/Tests/Runtime/UnityTestFramework/UnityOneTimeSetupAttributeExample.cs b/Assets/APIExamples/Tests/Runtime/UnityTestFramework/UnityOneTimeSetupAttributeExample.cs new file mode 100644 index 0000000..e2711f3 --- /dev/null +++ b/Assets/APIExamples/Tests/Runtime/UnityTestFramework/UnityOneTimeSetupAttributeExample.cs @@ -0,0 +1,75 @@ +// Copyright (c) 2021-2025 Koji Hasegawa. +// This software is released under the MIT License. + +#if ENABLE_UTF_1_5 +using System.Collections; +using System.Diagnostics.CodeAnalysis; +using System.Threading.Tasks; +using APIExamples.NUnit; +using NUnit.Framework; +using UnityEngine.TestTools; +using Is = APIExamples.NUnit.Is; + +namespace APIExamples.UnityTestFramework +{ + /// + /// の使用例 + /// + /// + /// Required: Unity Test Framework v1.5 or later + /// + /// + /// + /// + /// + [TestFixture] + [SuppressMessage("ReSharper", "AccessToStaticMemberViaDerivedType")] + public class UnityOneTimeSetupAttributeExample + { + private int _oneTimeSetupCount; + private int _setupCount; + + /// + /// テストクラス内の最初のテストの実行前に一度だけ実行されます + /// + [UnityOneTimeSetUp] + public IEnumerator OneTimeSetUp() + { + yield return null; + _oneTimeSetupCount++; + } + + /// + /// 各テストメソッドの前に実行されます + /// + [SetUp] + public void SetUp() + { + _setupCount++; + } + + [Test, Order(0)] + public void TestMethod() + { + Assert.That(_oneTimeSetupCount, Is.EqualTo(1), "OneTimeSetUpはTestFixtureごとに一度だけ実行される"); + Assert.That(_setupCount, Is.EqualTo(1), "最初のテストなのでSetUpは1回実行されている"); + } + + [Test, Order(1)] + public async Task TestMethodAsync() + { + await Task.Yield(); + Assert.That(_oneTimeSetupCount, Is.EqualTo(1), "OneTimeSetUpはTestFixtureごとに一度だけ実行される"); + Assert.That(_setupCount, Is.EqualTo(2), "2番目のテストなのでSetUpは2回実行されている"); + } + + [UnityTest, Order(2)] + public IEnumerator UnityTestMethod() + { + yield return null; + Assert.That(_oneTimeSetupCount, Is.EqualTo(1), "OneTimeSetUpはTestFixtureごとに一度だけ実行される"); + Assert.That(_setupCount, Is.EqualTo(3), "3番目のテストなのでSetUpは3回実行されている"); + } + } +} +#endif diff --git a/Assets/APIExamples/Tests/Runtime/UnityTestFramework/UnityOneTimeSetupAttributeExample.cs.meta b/Assets/APIExamples/Tests/Runtime/UnityTestFramework/UnityOneTimeSetupAttributeExample.cs.meta new file mode 100644 index 0000000..6cd45db --- /dev/null +++ b/Assets/APIExamples/Tests/Runtime/UnityTestFramework/UnityOneTimeSetupAttributeExample.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 229f96c95185415da79ce61b23f777e0 +timeCreated: 1762466846 \ No newline at end of file diff --git a/Assets/APIExamples/Tests/Runtime/UnityTestFramework/UnityOneTimeTearDownAttributeExample.cs b/Assets/APIExamples/Tests/Runtime/UnityTestFramework/UnityOneTimeTearDownAttributeExample.cs new file mode 100644 index 0000000..cdb69ff --- /dev/null +++ b/Assets/APIExamples/Tests/Runtime/UnityTestFramework/UnityOneTimeTearDownAttributeExample.cs @@ -0,0 +1,78 @@ +// Copyright (c) 2021-2025 Koji Hasegawa. +// This software is released under the MIT License. + +#if ENABLE_UTF_1_5 +using System.Collections; +using System.Diagnostics.CodeAnalysis; +using System.Threading.Tasks; +using APIExamples.NUnit; +using NUnit.Framework; +using UnityEngine; +using UnityEngine.TestTools; +using Is = APIExamples.NUnit.Is; + +namespace APIExamples.UnityTestFramework +{ + /// + /// の使用例 + /// + /// + /// Required: Unity Test Framework v1.5 or later + /// + /// + /// + /// + /// + [TestFixture] + [SuppressMessage("ReSharper", "AccessToStaticMemberViaDerivedType")] + public class UnityOneTimeTearDownAttributeExample + { + private int _oneTimeTeardownCount; + private int _teardownCount; + + /// + /// クラス内の最後のテストの実行後に一度だけ実行されます + /// + [UnityOneTimeTearDown] + public IEnumerator OneTimeTearDown() + { + yield return null; + Debug.Log($"UnityOneTimeTearDown"); + _oneTimeTeardownCount++; + + Assert.That(_oneTimeTeardownCount, Is.EqualTo(1), "OneTimeTearDownはTestFixtureごとに一度だけ実行される"); + Assert.That(_teardownCount, Is.EqualTo(3), "3つのテストがあるのでTearDownは3回実行されている"); + } + + /// + /// 各テストメソッドの後に実行されます + /// + [TearDown] + public void TearDown() + { + Debug.Log($"TearDown"); + _teardownCount++; + } + + [Test] + public void TestMethod() + { + Debug.Log($"TestMethod"); + } + + [Test] + public async Task TestMethodAsync() + { + await Task.Yield(); + Debug.Log($"TestMethodAsync"); + } + + [UnityTest] + public IEnumerator UnityTestMethod() + { + yield return null; + Debug.Log($"UnityTestMethod"); + } + } +} +#endif diff --git a/Assets/APIExamples/Tests/Runtime/UnityTestFramework/UnityOneTimeTearDownAttributeExample.cs.meta b/Assets/APIExamples/Tests/Runtime/UnityTestFramework/UnityOneTimeTearDownAttributeExample.cs.meta new file mode 100644 index 0000000..9442aca --- /dev/null +++ b/Assets/APIExamples/Tests/Runtime/UnityTestFramework/UnityOneTimeTearDownAttributeExample.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: cfef6d7d5aab42b1a4fa76ec161a29c4 +timeCreated: 1762466846 \ No newline at end of file From d6ade97a53c37aef0105b7f687ade0800f90c92e Mon Sep 17 00:00:00 2001 From: Koji Hasegawa Date: Fri, 7 Nov 2025 07:51:39 +0900 Subject: [PATCH 22/22] Add IPrebuildSetupWithTestData examples (UTF 1.6+) --- .../PreBuildSetupAttributeExample.cs | 12 ++--- .../PreBuildSetupExample.cs | 19 +++++-- ...eBuildSetupWithTestDataAttributeExample.cs | 28 ++++++++++ ...dSetupWithTestDataAttributeExample.cs.meta | 3 ++ .../PreBuildSetupWithTestDataExample.cs | 51 +++++++++++++++++++ .../PreBuildSetupWithTestDataExample.cs.meta | 3 ++ 6 files changed, 105 insertions(+), 11 deletions(-) create mode 100644 Assets/APIExamples/Tests/Runtime/UnityTestFramework/PreBuildSetupWithTestDataAttributeExample.cs create mode 100644 Assets/APIExamples/Tests/Runtime/UnityTestFramework/PreBuildSetupWithTestDataAttributeExample.cs.meta create mode 100644 Assets/APIExamples/Tests/Runtime/UnityTestFramework/PreBuildSetupWithTestDataExample.cs create mode 100644 Assets/APIExamples/Tests/Runtime/UnityTestFramework/PreBuildSetupWithTestDataExample.cs.meta diff --git a/Assets/APIExamples/Tests/Runtime/UnityTestFramework/PreBuildSetupAttributeExample.cs b/Assets/APIExamples/Tests/Runtime/UnityTestFramework/PreBuildSetupAttributeExample.cs index 0f6bc71..622d56e 100644 --- a/Assets/APIExamples/Tests/Runtime/UnityTestFramework/PreBuildSetupAttributeExample.cs +++ b/Assets/APIExamples/Tests/Runtime/UnityTestFramework/PreBuildSetupAttributeExample.cs @@ -7,13 +7,13 @@ namespace APIExamples.UnityTestFramework { /// - /// で指定した実装クラスの`Setup()`メソッドが使用されます + /// で指定した 実装クラスの Setup メソッドが使用されます + /// + /// 複数のテストに PrebuildSetup 属性が配置されていても、Setup の実行は1回だけです + /// を実装していないクラスを渡した場合、何も起きません(エラーにもなりません) + /// PrebuildSetup 属性は、クラスにもメソッドにも配置できます + /// /// - /// - /// - 複数のテストに属性が付与されていた場合、`Setup()`の実行は1回だけです - /// - を実装していないクラスを渡した場合、何も起きません(エラーにもなりません) - /// - 属性は、クラスにもメソッドにも付与できます - /// [PrebuildSetup(typeof(PreBuildSetupExample))] [PostBuildCleanup(typeof(PreBuildSetupExample))] public class PreBuildSetupAttributeExample diff --git a/Assets/APIExamples/Tests/Runtime/UnityTestFramework/PreBuildSetupExample.cs b/Assets/APIExamples/Tests/Runtime/UnityTestFramework/PreBuildSetupExample.cs index e22a271..42e6621 100644 --- a/Assets/APIExamples/Tests/Runtime/UnityTestFramework/PreBuildSetupExample.cs +++ b/Assets/APIExamples/Tests/Runtime/UnityTestFramework/PreBuildSetupExample.cs @@ -2,25 +2,34 @@ // This software is released under the MIT License. using NUnit.Framework; +using UnityEngine; using UnityEngine.TestTools; namespace APIExamples.UnityTestFramework { + /// + /// ビルド前後に処理を挿むための および の実装例 + /// public class PreBuildSetupExample : IPrebuildSetup, IPostBuildCleanup { /// + /// + /// Unityエディター実行(Edit ModeテストおよびPlay Modeテスト)では、すべてのテストの実行に先立って実行されます。 + /// プレイヤー実行(Play Modeテスト)では、ビルド前に実行されます。 + /// public void Setup() { - // Edit ModeテストおよびPlay Modeテスト(Unityエディター実行)では、すべてのテストの実行に先立って実行される - // Play Modeテスト(プレイヤー実行)では、ビルド前に実行される - // テスト用のビルドにのみResourcesに含めたいアセットをコピーする使用例は `LoadAssetExample` を参照してください + Debug.Log("PreBuildSetupExample.Setup"); } /// + /// + /// Unityエディター実行(Edit ModeテストおよびPlay Modeテスト)では、すべてのテストの実行終了後に実行されます。 + /// プレイヤー実行(Play Modeテスト)では、ビルド後に実行されます。 + /// public void Cleanup() { - // Edit ModeテストおよびPlay Modeテスト(Unityエディター実行)では、すべてのテストの実行終了後に実行される - // Play Modeテスト(プレイヤー実行)では、ビルド後に実行される + Debug.Log("PreBuildSetupExample.Cleanup"); } [Test] diff --git a/Assets/APIExamples/Tests/Runtime/UnityTestFramework/PreBuildSetupWithTestDataAttributeExample.cs b/Assets/APIExamples/Tests/Runtime/UnityTestFramework/PreBuildSetupWithTestDataAttributeExample.cs new file mode 100644 index 0000000..3a04121 --- /dev/null +++ b/Assets/APIExamples/Tests/Runtime/UnityTestFramework/PreBuildSetupWithTestDataAttributeExample.cs @@ -0,0 +1,28 @@ +// Copyright (c) 2021-2025 Koji Hasegawa. +// This software is released under the MIT License. + +#if ENABLE_UTF_1_6 +using NUnit.Framework; +using UnityEngine.TestTools; + +namespace APIExamples.UnityTestFramework +{ + /// + /// で指定した 実装クラスの Setup メソッドが使用されます + /// + /// + /// Required: Unity Test Framework v1.6 or later + /// + /// + [PrebuildSetupWithTestData(typeof(PreBuildSetupWithTestDataExample))] + [PostBuildCleanupWithTestData(typeof(PreBuildSetupWithTestDataExample))] + public class PreBuildSetupWithTestDataAttributeExample + { + [Test] + public void PrebuildSetupWithTestDataAttributeを付与したテストの例() + { + Assert.That(true, Is.True); + } + } +} +#endif diff --git a/Assets/APIExamples/Tests/Runtime/UnityTestFramework/PreBuildSetupWithTestDataAttributeExample.cs.meta b/Assets/APIExamples/Tests/Runtime/UnityTestFramework/PreBuildSetupWithTestDataAttributeExample.cs.meta new file mode 100644 index 0000000..a2af8a7 --- /dev/null +++ b/Assets/APIExamples/Tests/Runtime/UnityTestFramework/PreBuildSetupWithTestDataAttributeExample.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 0119066ebb6b49a5a0f8268a2db3ac5a +timeCreated: 1762468572 \ No newline at end of file diff --git a/Assets/APIExamples/Tests/Runtime/UnityTestFramework/PreBuildSetupWithTestDataExample.cs b/Assets/APIExamples/Tests/Runtime/UnityTestFramework/PreBuildSetupWithTestDataExample.cs new file mode 100644 index 0000000..5f73ee3 --- /dev/null +++ b/Assets/APIExamples/Tests/Runtime/UnityTestFramework/PreBuildSetupWithTestDataExample.cs @@ -0,0 +1,51 @@ +// Copyright (c) 2021-2025 Koji Hasegawa. +// This software is released under the MIT License. + +#if ENABLE_UTF_1_6 +using NUnit.Framework; +using UnityEngine; +using UnityEngine.TestTools; + +namespace APIExamples.UnityTestFramework +{ + /// + /// ビルド前後に処理を挿むための および の実装例 + /// + /// + /// Required: Unity Test Framework v1.6 or later + /// + /// + public class PreBuildSetupWithTestDataExample : IPrebuildSetupWithTestData, IPostbuildCleanupWithTestData + { + /// + /// + /// Unityエディター実行(Edit ModeテストおよびPlay Modeテスト)では、すべてのテストの実行に先立って実行されます。 + /// プレイヤー実行(Play Modeテスト)では、ビルド前に実行されます。 + ///

+ /// には、テストモード、テストプラットフォーム、実行されるテストのリストが含まれます + /// + public void Setup(TestData testData) + { + Debug.Log($"PreBuildSetupWithTestDataExample.Setup; testData: {testData}"); + } + + /// + /// + /// Unityエディター実行(Edit ModeテストおよびPlay Modeテスト)では、すべてのテストの実行終了後に実行されます。 + /// プレイヤー実行(Play Modeテスト)では、ビルド後に実行されます。 + ///

+ /// には、テストモード、テストプラットフォーム、実行されるテストのリストが含まれます + /// + public void Cleanup(TestData testData) + { + Debug.Log($"PreBuildSetupWithTestDataExample.Cleanup; testData: {testData}"); + } + + [Test] + public void IPrebuildSetupWithTestDataを実装したテストの例() + { + Assert.That(true, Is.True); + } + } +} +#endif diff --git a/Assets/APIExamples/Tests/Runtime/UnityTestFramework/PreBuildSetupWithTestDataExample.cs.meta b/Assets/APIExamples/Tests/Runtime/UnityTestFramework/PreBuildSetupWithTestDataExample.cs.meta new file mode 100644 index 0000000..a1b4026 --- /dev/null +++ b/Assets/APIExamples/Tests/Runtime/UnityTestFramework/PreBuildSetupWithTestDataExample.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: c99ecd621549428f922e512fc2778c1b +timeCreated: 1762468080 \ No newline at end of file