From f0d745924a116bf70a447e67796bccc905d17315 Mon Sep 17 00:00:00 2001 From: neuecc Date: Tue, 5 May 2020 22:51:19 +0900 Subject: [PATCH] exception choice --- .../UniTask/Editor/SplitterGUILayout.cs | 4 +- .../UniTask/Editor/UniTaskTrackerTreeView.cs | 4 +- .../UniTask/Editor/UniTaskTrackerWindow.cs | 4 +- .../UniTask/Internal/UnityEqualityComparer.cs | 6 +- .../UniTask/Triggers/AsyncAwakeTrigger.cs | 4 +- .../UniTask/Triggers/AsyncDestroyTrigger.cs | 4 +- .../UniTask/Triggers/AsyncStartTrigger.cs | 4 +- .../UniTask/Triggers/AsyncTriggerBase.cs | 4 +- .../Triggers/AsyncTriggerExtensions.cs | 4 +- .../UniTask/UniTaskCompletionSource.cs | 2 +- .../Plugins/UniTask/UniTaskScheduler.cs | 4 +- .../Assets/Scenes/ExceptionExamples.cs | 75 ++++++ .../Assets/Scenes/ExceptionExamples.cs.meta | 11 + .../Assets/Scenes/ExceptionExamples.unity | 220 ++++++++++++++++++ .../Scenes/ExceptionExamples.unity.meta | 7 + src/UniTask/Assets/Tests/Preserve.cs | 47 ++++ src/UniTask/Assets/Tests/Preserve.cs.meta | 11 + 17 files changed, 383 insertions(+), 32 deletions(-) create mode 100644 src/UniTask/Assets/Scenes/ExceptionExamples.cs create mode 100644 src/UniTask/Assets/Scenes/ExceptionExamples.cs.meta create mode 100644 src/UniTask/Assets/Scenes/ExceptionExamples.unity create mode 100644 src/UniTask/Assets/Scenes/ExceptionExamples.unity.meta create mode 100644 src/UniTask/Assets/Tests/Preserve.cs create mode 100644 src/UniTask/Assets/Tests/Preserve.cs.meta diff --git a/src/UniTask/Assets/Plugins/UniTask/Editor/SplitterGUILayout.cs b/src/UniTask/Assets/Plugins/UniTask/Editor/SplitterGUILayout.cs index dc0bd2a..4189133 100644 --- a/src/UniTask/Assets/Plugins/UniTask/Editor/SplitterGUILayout.cs +++ b/src/UniTask/Assets/Plugins/UniTask/Editor/SplitterGUILayout.cs @@ -1,5 +1,4 @@ -#if CSHARP_7_OR_LATER || (UNITY_2018_3_OR_NEWER && (NET_STANDARD_2_0 || NET_4_6)) -#pragma warning disable CS1591 // Missing XML comment for publicly visible type or member +#pragma warning disable CS1591 // Missing XML comment for publicly visible type or member using System; using System.Linq; @@ -61,4 +60,3 @@ namespace Cysharp.Threading.Tasks.Editor } } -#endif \ No newline at end of file diff --git a/src/UniTask/Assets/Plugins/UniTask/Editor/UniTaskTrackerTreeView.cs b/src/UniTask/Assets/Plugins/UniTask/Editor/UniTaskTrackerTreeView.cs index 377d0da..e7b6269 100644 --- a/src/UniTask/Assets/Plugins/UniTask/Editor/UniTaskTrackerTreeView.cs +++ b/src/UniTask/Assets/Plugins/UniTask/Editor/UniTaskTrackerTreeView.cs @@ -1,5 +1,4 @@ -#if CSHARP_7_OR_LATER || (UNITY_2018_3_OR_NEWER && (NET_STANDARD_2_0 || NET_4_6)) -#pragma warning disable CS1591 // Missing XML comment for publicly visible type or member +#pragma warning disable CS1591 // Missing XML comment for publicly visible type or member using UnityEngine; using UnityEditor; @@ -181,4 +180,3 @@ namespace Cysharp.Threading.Tasks.Editor } -#endif \ No newline at end of file diff --git a/src/UniTask/Assets/Plugins/UniTask/Editor/UniTaskTrackerWindow.cs b/src/UniTask/Assets/Plugins/UniTask/Editor/UniTaskTrackerWindow.cs index 08027a7..242ac6d 100644 --- a/src/UniTask/Assets/Plugins/UniTask/Editor/UniTaskTrackerWindow.cs +++ b/src/UniTask/Assets/Plugins/UniTask/Editor/UniTaskTrackerWindow.cs @@ -1,5 +1,4 @@ -#if CSHARP_7_OR_LATER || (UNITY_2018_3_OR_NEWER && (NET_STANDARD_2_0 || NET_4_6)) -#pragma warning disable CS1591 // Missing XML comment for publicly visible type or member +#pragma warning disable CS1591 // Missing XML comment for publicly visible type or member using UnityEngine; using UnityEditor; @@ -208,4 +207,3 @@ namespace Cysharp.Threading.Tasks.Editor } } -#endif \ No newline at end of file diff --git a/src/UniTask/Assets/Plugins/UniTask/Internal/UnityEqualityComparer.cs b/src/UniTask/Assets/Plugins/UniTask/Internal/UnityEqualityComparer.cs index 2fab3fe..906f3b6 100644 --- a/src/UniTask/Assets/Plugins/UniTask/Internal/UnityEqualityComparer.cs +++ b/src/UniTask/Assets/Plugins/UniTask/Internal/UnityEqualityComparer.cs @@ -1,8 +1,4 @@ -#if CSHARP_7_OR_LATER || (UNITY_2018_3_OR_NEWER && (NET_STANDARD_2_0 || NET_4_6)) -#pragma warning disable CS1591 // Missing XML comment for publicly visible type or member -#endif - -using System; +using System; using System.Collections.Generic; using UnityEngine; diff --git a/src/UniTask/Assets/Plugins/UniTask/Triggers/AsyncAwakeTrigger.cs b/src/UniTask/Assets/Plugins/UniTask/Triggers/AsyncAwakeTrigger.cs index 123c9f2..9c19914 100644 --- a/src/UniTask/Assets/Plugins/UniTask/Triggers/AsyncAwakeTrigger.cs +++ b/src/UniTask/Assets/Plugins/UniTask/Triggers/AsyncAwakeTrigger.cs @@ -1,5 +1,4 @@ -#if CSHARP_7_OR_LATER || (UNITY_2018_3_OR_NEWER && (NET_STANDARD_2_0 || NET_4_6)) -#pragma warning disable CS1591 // Missing XML comment for publicly visible type or member +#pragma warning disable CS1591 // Missing XML comment for publicly visible type or member using System.Threading; using UnityEngine; @@ -74,4 +73,3 @@ namespace Cysharp.Threading.Tasks.Triggers } } -#endif \ No newline at end of file diff --git a/src/UniTask/Assets/Plugins/UniTask/Triggers/AsyncDestroyTrigger.cs b/src/UniTask/Assets/Plugins/UniTask/Triggers/AsyncDestroyTrigger.cs index 7e9bd4a..cf522d5 100644 --- a/src/UniTask/Assets/Plugins/UniTask/Triggers/AsyncDestroyTrigger.cs +++ b/src/UniTask/Assets/Plugins/UniTask/Triggers/AsyncDestroyTrigger.cs @@ -1,5 +1,4 @@ -#if CSHARP_7_OR_LATER || (UNITY_2018_3_OR_NEWER && (NET_STANDARD_2_0 || NET_4_6)) -#pragma warning disable CS1591 // Missing XML comment for publicly visible type or member +#pragma warning disable CS1591 // Missing XML comment for publicly visible type or member using System.Threading; using UnityEngine; @@ -95,4 +94,3 @@ namespace Cysharp.Threading.Tasks.Triggers } } -#endif \ No newline at end of file diff --git a/src/UniTask/Assets/Plugins/UniTask/Triggers/AsyncStartTrigger.cs b/src/UniTask/Assets/Plugins/UniTask/Triggers/AsyncStartTrigger.cs index 4cc4766..94028c2 100644 --- a/src/UniTask/Assets/Plugins/UniTask/Triggers/AsyncStartTrigger.cs +++ b/src/UniTask/Assets/Plugins/UniTask/Triggers/AsyncStartTrigger.cs @@ -1,5 +1,4 @@ -#if CSHARP_7_OR_LATER || (UNITY_2018_3_OR_NEWER && (NET_STANDARD_2_0 || NET_4_6)) -#pragma warning disable CS1591 // Missing XML comment for publicly visible type or member +#pragma warning disable CS1591 // Missing XML comment for publicly visible type or member using System.Threading; using UnityEngine; @@ -84,4 +83,3 @@ namespace Cysharp.Threading.Tasks.Triggers } -#endif \ No newline at end of file diff --git a/src/UniTask/Assets/Plugins/UniTask/Triggers/AsyncTriggerBase.cs b/src/UniTask/Assets/Plugins/UniTask/Triggers/AsyncTriggerBase.cs index 7e87fbc..d959dca 100644 --- a/src/UniTask/Assets/Plugins/UniTask/Triggers/AsyncTriggerBase.cs +++ b/src/UniTask/Assets/Plugins/UniTask/Triggers/AsyncTriggerBase.cs @@ -1,5 +1,4 @@ -#if CSHARP_7_OR_LATER || (UNITY_2018_3_OR_NEWER && (NET_STANDARD_2_0 || NET_4_6)) -#pragma warning disable CS1591 // Missing XML comment for publicly visible type or member +#pragma warning disable CS1591 // Missing XML comment for publicly visible type or member using System; using System.Collections.Generic; @@ -382,4 +381,3 @@ namespace Cysharp.Threading.Tasks.Triggers } } -#endif \ No newline at end of file diff --git a/src/UniTask/Assets/Plugins/UniTask/Triggers/AsyncTriggerExtensions.cs b/src/UniTask/Assets/Plugins/UniTask/Triggers/AsyncTriggerExtensions.cs index a3ae68a..49bc5d2 100644 --- a/src/UniTask/Assets/Plugins/UniTask/Triggers/AsyncTriggerExtensions.cs +++ b/src/UniTask/Assets/Plugins/UniTask/Triggers/AsyncTriggerExtensions.cs @@ -1,5 +1,4 @@ -#if CSHARP_7_OR_LATER || (UNITY_2018_3_OR_NEWER && (NET_STANDARD_2_0 || NET_4_6)) -#pragma warning disable CS1591 // Missing XML comment for publicly visible type or member +#pragma warning disable CS1591 // Missing XML comment for publicly visible type or member using System.Threading; using UnityEngine; @@ -77,4 +76,3 @@ namespace Cysharp.Threading.Tasks.Triggers } } -#endif \ No newline at end of file diff --git a/src/UniTask/Assets/Plugins/UniTask/UniTaskCompletionSource.cs b/src/UniTask/Assets/Plugins/UniTask/UniTaskCompletionSource.cs index e114494..cba8dfa 100644 --- a/src/UniTask/Assets/Plugins/UniTask/UniTaskCompletionSource.cs +++ b/src/UniTask/Assets/Plugins/UniTask/UniTaskCompletionSource.cs @@ -259,7 +259,7 @@ namespace Cysharp.Threading.Tasks { if (token != version) { - throw new InvalidOperationException("token version is not matched."); + throw new InvalidOperationException("token version is not matched, can not await twice."); } } } diff --git a/src/UniTask/Assets/Plugins/UniTask/UniTaskScheduler.cs b/src/UniTask/Assets/Plugins/UniTask/UniTaskScheduler.cs index d047337..d725470 100644 --- a/src/UniTask/Assets/Plugins/UniTask/UniTaskScheduler.cs +++ b/src/UniTask/Assets/Plugins/UniTask/UniTaskScheduler.cs @@ -20,9 +20,9 @@ namespace Cysharp.Threading.Tasks #if UNITY_2018_3_OR_NEWER /// - /// Write log type when catch unobserved exception and not registered UnobservedTaskException. Default is Error. + /// Write log type when catch unobserved exception and not registered UnobservedTaskException. Default is Exception. /// - public static UnityEngine.LogType UnobservedExceptionWriteLogType = UnityEngine.LogType.Error; + public static UnityEngine.LogType UnobservedExceptionWriteLogType = UnityEngine.LogType.Exception; /// /// Dispatch exception event to Unity MainThread. Default is true. diff --git a/src/UniTask/Assets/Scenes/ExceptionExamples.cs b/src/UniTask/Assets/Scenes/ExceptionExamples.cs new file mode 100644 index 0000000..360f070 --- /dev/null +++ b/src/UniTask/Assets/Scenes/ExceptionExamples.cs @@ -0,0 +1,75 @@ +// Provided from: https://github.com/Cysharp/UniTask/issues/40 + +using System; +using System.Threading.Tasks; +using Cysharp.Threading.Tasks; +using UnityEngine; + +/// +/// Example script for comparing how exceptions in unobserved tasks are handled between +/// UniTask and normal tasks. This helps in verifying that unobserved exceptions are +/// logged in a way that it useful to developers. +/// +public class ExceptionExamples : MonoBehaviour +{ + [SerializeField] private LogType _unobservedExceptionLogType = LogType.Exception; + + private void Awake() + { + UniTaskScheduler.UnobservedExceptionWriteLogType = _unobservedExceptionLogType; + } + + private void Start() + { + TaskScheduler.UnobservedTaskException += TaskScheduler_UnobservedTaskException; + + ThrowFromAsyncVoid(); + _ = ThrowFromTask(); + _ = ThrowFromUniTask(); + + ThrowFromNonAsync(); + } + + private void TaskScheduler_UnobservedTaskException(object sender, UnobservedTaskExceptionEventArgs e) + { + UnityEngine.Debug.LogException(e.Exception); + } + + private void ThrowFromNonAsync() + { + throw new Exception("Thrown from non-async function"); + } + + private async void ThrowFromAsyncVoid() + { + await ThrowInner(); + + async Task ThrowInner() + { + await UniTask.Yield(); + throw new Exception("Thrown from `async void` function"); + } + } + + private async Task ThrowFromTask() + { + await ThrowInner(); + + async Task ThrowInner() + { + await UniTask.Yield(); + throw new Exception("Thrown from `async Task` function"); + } + } + + private async UniTask ThrowFromUniTask() + { + await ThrowInner(); + + async UniTask ThrowInner() + { + await UniTask.Yield(); + throw new Exception("Thrown from `async UniTask` function"); + } + } +} \ No newline at end of file diff --git a/src/UniTask/Assets/Scenes/ExceptionExamples.cs.meta b/src/UniTask/Assets/Scenes/ExceptionExamples.cs.meta new file mode 100644 index 0000000..4ebd641 --- /dev/null +++ b/src/UniTask/Assets/Scenes/ExceptionExamples.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 329ff620b32b4ef4abdc99884242ee67 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/src/UniTask/Assets/Scenes/ExceptionExamples.unity b/src/UniTask/Assets/Scenes/ExceptionExamples.unity new file mode 100644 index 0000000..bd45706 --- /dev/null +++ b/src/UniTask/Assets/Scenes/ExceptionExamples.unity @@ -0,0 +1,220 @@ +%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: 3 + m_SubtractiveShadowColor: {r: 0.42, g: 0.478, b: 0.627, a: 1} + m_SkyboxMaterial: {fileID: 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, g: 0, b: 0, a: 1} + m_UseRadianceAmbientProbe: 0 +--- !u!157 &3 +LightmapSettings: + m_ObjectHideFlags: 0 + serializedVersion: 11 + m_GIWorkflowMode: 1 + m_GISettings: + serializedVersion: 2 + m_BounceScale: 1 + m_IndirectOutputScale: 1 + m_AlbedoBoost: 1 + m_EnvironmentLightingMode: 0 + m_EnableBakedLightmaps: 0 + 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_UseShadowmask: 1 +--- !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 + debug: + m_Flags: 0 + m_NavMeshData: {fileID: 0} +--- !u!1 &735985614 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 735985618} + - component: {fileID: 735985617} + - component: {fileID: 735985616} + - component: {fileID: 735985615} + m_Layer: 0 + m_Name: Main Camera + m_TagString: MainCamera + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!114 &735985615 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 735985614} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 329ff620b32b4ef4abdc99884242ee67, type: 3} + m_Name: + m_EditorClassIdentifier: + _unobservedExceptionLogType: 4 +--- !u!81 &735985616 +AudioListener: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 735985614} + m_Enabled: 1 +--- !u!20 &735985617 +Camera: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 735985614} + 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: 1 + 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 &735985618 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 735985614} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, 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/src/UniTask/Assets/Scenes/ExceptionExamples.unity.meta b/src/UniTask/Assets/Scenes/ExceptionExamples.unity.meta new file mode 100644 index 0000000..ac078a0 --- /dev/null +++ b/src/UniTask/Assets/Scenes/ExceptionExamples.unity.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: b5fed17e3ece238439bc796d8747df5d +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/src/UniTask/Assets/Tests/Preserve.cs b/src/UniTask/Assets/Tests/Preserve.cs new file mode 100644 index 0000000..d88b673 --- /dev/null +++ b/src/UniTask/Assets/Tests/Preserve.cs @@ -0,0 +1,47 @@ +using Cysharp.Threading.Tasks; +using FluentAssertions; +using NUnit.Framework; +using System; +using System.Collections; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using UnityEngine.TestTools; + +namespace Cysharp.Threading.TasksTests +{ + public class Preserve + { + [UnityTest] + public IEnumerator AwaitTwice() => UniTask.ToCoroutine(async () => + { + var delay = UniTask.DelayFrame(5); + await delay; + + try + { + await delay; + Assert.Fail("should throw exception."); + } + catch (InvalidOperationException) + { + + } + }); + + [UnityTest] + public IEnumerator PreserveAllowTwice() => UniTask.ToCoroutine(async () => + { + var delay = UniTask.DelayFrame(5, PlayerLoopTiming.PostLateUpdate).Preserve(); + var before = UnityEngine.Time.frameCount; + await delay; + var afterOne = UnityEngine.Time.frameCount; + await delay; + var afterTwo = UnityEngine.Time.frameCount; + + (afterOne - before).Should().Be(5); + afterOne.Should().Be(afterTwo); + }); + } +} diff --git a/src/UniTask/Assets/Tests/Preserve.cs.meta b/src/UniTask/Assets/Tests/Preserve.cs.meta new file mode 100644 index 0000000..7cfee44 --- /dev/null +++ b/src/UniTask/Assets/Tests/Preserve.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 418f4974867e1294b81020613a0b1032 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: