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: