From 0c33977f5afa8fd6f8d0f017d6e1d01340305db7 Mon Sep 17 00:00:00 2001 From: neuecc Date: Tue, 9 Jun 2020 11:25:45 +0900 Subject: [PATCH] timer and delay skip current frame --- .../Runtime/Linq/UnityExtensions/Timer.cs | 58 +- .../Plugins/UniTask/Runtime/UniTask.Delay.cs | 44 +- src/UniTask/Assets/Scenes/SandboxMain.cs | 89 ++- src/UniTask/Assets/Tests/AsyncTest.cs | 3 +- src/UniTask/Assets/Tests/CachelikeTest.cs | 97 +++ .../Assets/Tests/CachelikeTest.cs.meta | 11 + src/UniTask/Assets/Tests/DelayTest.cs | 394 ++++++++++++ src/UniTask/Assets/Tests/DelayTest.cs.meta | 11 + .../Assets/Tests/Editor/AsyncTestEditor.cs | 604 +++++++++--------- .../Assets/Tests/Editor/RunTestEditor.cs | 168 ++--- .../Assets/Tests/Editor/WhenAnyTestEditor.cs | 78 +-- src/UniTask/Assets/Tests/Preserve.cs | 18 +- src/UniTask/Assets/Tests/UniTask.Tests.asmdef | 3 +- 13 files changed, 1130 insertions(+), 448 deletions(-) create mode 100644 src/UniTask/Assets/Tests/CachelikeTest.cs create mode 100644 src/UniTask/Assets/Tests/CachelikeTest.cs.meta create mode 100644 src/UniTask/Assets/Tests/DelayTest.cs create mode 100644 src/UniTask/Assets/Tests/DelayTest.cs.meta diff --git a/src/UniTask/Assets/Plugins/UniTask/Runtime/Linq/UnityExtensions/Timer.cs b/src/UniTask/Assets/Plugins/UniTask/Runtime/Linq/UnityExtensions/Timer.cs index 473949b..35aaf91 100644 --- a/src/UniTask/Assets/Plugins/UniTask/Runtime/Linq/UnityExtensions/Timer.cs +++ b/src/UniTask/Assets/Plugins/UniTask/Runtime/Linq/UnityExtensions/Timer.cs @@ -1,5 +1,6 @@ using System; using System.Threading; +using UnityEngine; namespace Cysharp.Threading.Tasks.Linq { @@ -22,16 +23,34 @@ namespace Cysharp.Threading.Tasks.Linq public static IUniTaskAsyncEnumerable TimerFrame(int dueTimeFrameCount, PlayerLoopTiming updateTiming = PlayerLoopTiming.Update) { + if (dueTimeFrameCount < 0) + { + throw new ArgumentOutOfRangeException("Delay does not allow minus delayFrameCount. dueTimeFrameCount:" + dueTimeFrameCount); + } + return new TimerFrame(dueTimeFrameCount, null, updateTiming); } public static IUniTaskAsyncEnumerable TimerFrame(int dueTimeFrameCount, int periodFrameCount, PlayerLoopTiming updateTiming = PlayerLoopTiming.Update) { + if (dueTimeFrameCount < 0) + { + throw new ArgumentOutOfRangeException("Delay does not allow minus delayFrameCount. dueTimeFrameCount:" + dueTimeFrameCount); + } + if (periodFrameCount < 0) + { + throw new ArgumentOutOfRangeException("Delay does not allow minus periodFrameCount. periodFrameCount:" + dueTimeFrameCount); + } + return new TimerFrame(dueTimeFrameCount, periodFrameCount, updateTiming); } public static IUniTaskAsyncEnumerable IntervalFrame(int intervalFrameCount, PlayerLoopTiming updateTiming = PlayerLoopTiming.Update) { + if (intervalFrameCount < 0) + { + throw new ArgumentOutOfRangeException("Delay does not allow minus intervalFrameCount. intervalFrameCount:" + intervalFrameCount); + } return new TimerFrame(intervalFrameCount, intervalFrameCount, updateTiming); } } @@ -64,6 +83,7 @@ namespace Cysharp.Threading.Tasks.Linq readonly bool ignoreTimeScale; CancellationToken cancellationToken; + int initialFrame; float elapsed; bool dueTimePhase; bool completed; @@ -80,6 +100,7 @@ namespace Cysharp.Threading.Tasks.Linq if (this.period <= 0) this.period = 1; } + this.initialFrame = Time.frameCount; this.dueTimePhase = true; this.updateTiming = updateTiming; this.ignoreTimeScale = ignoreTimeScale; @@ -119,9 +140,19 @@ namespace Cysharp.Threading.Tasks.Linq return false; } - elapsed += (ignoreTimeScale) ? UnityEngine.Time.unscaledDeltaTime : UnityEngine.Time.deltaTime; if (dueTimePhase) { + if (elapsed == 0) + { + // skip in initial frame. + if (initialFrame == Time.frameCount) + { + return true; + } + } + + elapsed += (ignoreTimeScale) ? UnityEngine.Time.unscaledDeltaTime : UnityEngine.Time.deltaTime; + if (elapsed >= dueTime) { dueTimePhase = false; @@ -137,6 +168,8 @@ namespace Cysharp.Threading.Tasks.Linq return false; } + elapsed += (ignoreTimeScale) ? UnityEngine.Time.unscaledDeltaTime : UnityEngine.Time.deltaTime; + if (elapsed >= period) { completionSource.TrySetResult(true); @@ -172,6 +205,7 @@ namespace Cysharp.Threading.Tasks.Linq readonly int? periodFrameCount; CancellationToken cancellationToken; + int initialFrame; int currentFrame; bool dueTimePhase; bool completed; @@ -185,6 +219,7 @@ namespace Cysharp.Threading.Tasks.Linq if (periodFrameCount <= 0) periodFrameCount = 1; } + this.initialFrame = Time.frameCount; this.dueTimePhase = true; this.dueTimeFrameCount = dueTimeFrameCount; this.periodFrameCount = periodFrameCount; @@ -228,11 +263,30 @@ namespace Cysharp.Threading.Tasks.Linq if (dueTimePhase) { - if (currentFrame++ >= dueTimeFrameCount) + if (currentFrame == 0) + { + if (dueTimeFrameCount == 0) + { + dueTimePhase = false; + completionSource.TrySetResult(true); + return true; + } + + // skip in initial frame. + if (initialFrame == Time.frameCount) + { + return true; + } + } + + if (++currentFrame >= dueTimeFrameCount) { dueTimePhase = false; completionSource.TrySetResult(true); } + else + { + } } else { diff --git a/src/UniTask/Assets/Plugins/UniTask/Runtime/UniTask.Delay.cs b/src/UniTask/Assets/Plugins/UniTask/Runtime/UniTask.Delay.cs index bbdff39..a45bb32 100644 --- a/src/UniTask/Assets/Plugins/UniTask/Runtime/UniTask.Delay.cs +++ b/src/UniTask/Assets/Plugins/UniTask/Runtime/UniTask.Delay.cs @@ -303,11 +303,12 @@ namespace Cysharp.Threading.Tasks TaskPool.RegisterSizeGetter(typeof(DelayFramePromise), () => pool.Size); } + int initialFrame; int delayFrameCount; CancellationToken cancellationToken; int currentFrameCount; - UniTaskCompletionSourceCore core; + UniTaskCompletionSourceCore core; DelayFramePromise() { @@ -327,6 +328,7 @@ namespace Cysharp.Threading.Tasks result.delayFrameCount = delayFrameCount; result.cancellationToken = cancellationToken; + result.initialFrame = Time.frameCount; TaskTracker.TrackActiveTask(result, 3); @@ -371,13 +373,27 @@ namespace Cysharp.Threading.Tasks return false; } - if (currentFrameCount == delayFrameCount) + if (currentFrameCount == 0) { - core.TrySetResult(null); + if (delayFrameCount == 0) // same as Yield + { + core.TrySetResult(AsyncUnit.Default); + return false; + } + + // skip in initial frame. + if (initialFrame == Time.frameCount) + { + return true; + } + } + + if (++currentFrameCount >= delayFrameCount) + { + core.TrySetResult(AsyncUnit.Default); return false; } - currentFrameCount++; return true; } @@ -410,6 +426,7 @@ namespace Cysharp.Threading.Tasks TaskPool.RegisterSizeGetter(typeof(DelayPromise), () => pool.Size); } + int initialFrame; float delayFrameTimeSpan; float elapsed; CancellationToken cancellationToken; @@ -435,6 +452,7 @@ namespace Cysharp.Threading.Tasks result.elapsed = 0.0f; result.delayFrameTimeSpan = (float)delayFrameTimeSpan.TotalSeconds; result.cancellationToken = cancellationToken; + result.initialFrame = Time.frameCount; TaskTracker.TrackActiveTask(result, 3); @@ -479,6 +497,14 @@ namespace Cysharp.Threading.Tasks return false; } + if (elapsed == 0.0f) + { + if (initialFrame == Time.frameCount) + { + return true; + } + } + elapsed += Time.deltaTime; if (elapsed >= delayFrameTimeSpan) { @@ -520,6 +546,7 @@ namespace Cysharp.Threading.Tasks float delayFrameTimeSpan; float elapsed; + int initialFrame; CancellationToken cancellationToken; UniTaskCompletionSourceCore core; @@ -542,6 +569,7 @@ namespace Cysharp.Threading.Tasks result.elapsed = 0.0f; result.delayFrameTimeSpan = (float)delayFrameTimeSpan.TotalSeconds; + result.initialFrame = Time.frameCount; result.cancellationToken = cancellationToken; TaskTracker.TrackActiveTask(result, 3); @@ -587,6 +615,14 @@ namespace Cysharp.Threading.Tasks return false; } + if (elapsed == 0.0f) + { + if (initialFrame == Time.frameCount) + { + return true; + } + } + elapsed += Time.unscaledDeltaTime; if (elapsed >= delayFrameTimeSpan) { diff --git a/src/UniTask/Assets/Scenes/SandboxMain.cs b/src/UniTask/Assets/Scenes/SandboxMain.cs index 5de9373..90d7cee 100644 --- a/src/UniTask/Assets/Scenes/SandboxMain.cs +++ b/src/UniTask/Assets/Scenes/SandboxMain.cs @@ -378,7 +378,39 @@ public class SandboxMain : MonoBehaviour private void FixedUpdate() { - Debug.Log("FixedUpdate:" + Time.frameCount + ", " + PlayerLoopInfo.CurrentLoopType); + // Debug.Log("FixedUpdate:" + Time.frameCount + ", " + PlayerLoopInfo.CurrentLoopType); + } + + async UniTaskVoid DelayFrame3_Pre() + { + await UniTask.Yield(PlayerLoopTiming.PreUpdate); + Debug.Log("Before framecount:" + Time.frameCount); + await UniTask.DelayFrame(3); + Debug.Log("After framecount:" + Time.frameCount); + } + + async UniTaskVoid DelayFrame3_Post() + { + await UniTask.Yield(PlayerLoopTiming.PostLateUpdate); + Debug.Log("Before framecount:" + Time.frameCount); + await UniTask.DelayFrame(3); + Debug.Log("After framecount:" + Time.frameCount); + } + + async UniTask TestCoroutine() + { + await UniTask.Yield(); + throw new Exception("foobarbaz"); + } + + async UniTask DelayCheck() + { + await UniTask.Yield(PlayerLoopTiming.PreUpdate); + Debug.Log("before"); + var t = UniTask.Delay(TimeSpan.FromSeconds(1), ignoreTimeScale: false); + + await t; + Debug.Log("after"); } @@ -386,13 +418,29 @@ public class SandboxMain : MonoBehaviour { PlayerLoopInfo.Inject(); - _ = AsyncFixedUpdate(); - StartCoroutine(CoroutineFixedUpdate()); + //_ = AsyncFixedUpdate(); + //StartCoroutine(CoroutineFixedUpdate()); + + //StartCoroutine(TestCoroutine().ToCoroutine()); + + Application.logMessageReceived += Application_logMessageReceived; + + + + - okButton.onClick.AddListener(UniTask.UnityAction(async () => { + { + var xs = await UniTaskAsyncEnumerable.TimerFrame(1).ToArrayAsync(); + } + Debug.Log("------------------"); + { + var xs = await UniTaskAsyncEnumerable.TimerFrame(1).ToArrayAsync(); + } + + //await DelayCheck(); /* UnityEngine.Debug.Log("click:" + PlayerLoopInfo.CurrentLoopType); StartCoroutine(CoroutineRun()); @@ -401,8 +449,8 @@ public class SandboxMain : MonoBehaviour _ = AsyncLastUpdate(); _ = AsyncLastLast(); */ - await UniTask.Yield(); - _ = Test2(); + //await UniTask.Yield(); + //_ = Test2(); // EarlyUpdate.ExecuteMainThreadJobs // _ = Test2(); @@ -420,10 +468,17 @@ public class SandboxMain : MonoBehaviour //StartCoroutine(CoroutineRun2()); ////StartCoroutine(CoroutineRun()); //UnityEngine.Debug.Log("FOO?"); + + //_ = DelayFrame3_Pre(); + //await UniTask.Yield(); + })); cancelButton.onClick.AddListener(UniTask.UnityAction(async () => { + _ = DelayFrame3_Post(); + await UniTask.Yield(); + //await UniTask.Yield(PlayerLoopTiming.LastPreUpdate); //UnityEngine.Debug.Log("before update:" + Time.frameCount); //await UniTask.NextFrame(); @@ -435,13 +490,13 @@ public class SandboxMain : MonoBehaviour //UnityEngine.Debug.Log("click:" + PlayerLoopInfo.CurrentLoopType); //_ = Yieldding(); - var cts = new CancellationTokenSource(); + //var cts = new CancellationTokenSource(); - UnityEngine.Debug.Log("click:" + PlayerLoopInfo.CurrentLoopType + ":" + Time.frameCount); - var la = SceneManager.LoadSceneAsync("Scenes/ExceptionExamples").WithCancellation(cts.Token); - //cts.Cancel(); - await la; - UnityEngine.Debug.Log("End LoadSceneAsync" + PlayerLoopInfo.CurrentLoopType + ":" + Time.frameCount); + //UnityEngine.Debug.Log("click:" + PlayerLoopInfo.CurrentLoopType + ":" + Time.frameCount); + //var la = SceneManager.LoadSceneAsync("Scenes/ExceptionExamples").WithCancellation(cts.Token); + ////cts.Cancel(); + //await la; + //UnityEngine.Debug.Log("End LoadSceneAsync" + PlayerLoopInfo.CurrentLoopType + ":" + Time.frameCount); })); //return; @@ -571,6 +626,16 @@ public class SandboxMain : MonoBehaviour } + private void Application_logMessageReceived2(string condition, string stackTrace, LogType type) + { + throw new NotImplementedException(); + } + + private void Application_logMessageReceived1(string condition, string stackTrace, LogType type) + { + throw new NotImplementedException(); + } + async UniTaskVoid UpdateUniTask() { while (true) diff --git a/src/UniTask/Assets/Tests/AsyncTest.cs b/src/UniTask/Assets/Tests/AsyncTest.cs index 55df71b..e6b80e8 100644 --- a/src/UniTask/Assets/Tests/AsyncTest.cs +++ b/src/UniTask/Assets/Tests/AsyncTest.cs @@ -269,7 +269,8 @@ namespace Cysharp.Threading.TasksTests var first = Time.frameCount; var canceled = await UniTask.DelayFrame(100, cancellationToken: cts.Token).SuppressCancellationThrow(); - (Time.frameCount - first).Should().Be(11); // 10 frame canceled + var r = (Time.frameCount - first); + (9 < r && r < 11).Should().BeTrue(); canceled.Should().Be(true); }); diff --git a/src/UniTask/Assets/Tests/CachelikeTest.cs b/src/UniTask/Assets/Tests/CachelikeTest.cs new file mode 100644 index 0000000..3a11830 --- /dev/null +++ b/src/UniTask/Assets/Tests/CachelikeTest.cs @@ -0,0 +1,97 @@ +using Cysharp.Threading.Tasks; +using Cysharp.Threading.Tasks.Linq; +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; +using UnityEngine.TestTools; + +namespace Cysharp.Threading.TasksTests +{ + public class Cachelike + { + [UnityTest] + public IEnumerator Check() => UniTask.ToCoroutine(async () => + { + { + var v = await CachedCheck("foo", 10); + v.Should().Be(10); + + var v2 = await CachedCheck("bar", 20); + v2.Should().Be(20); + + var v3 = await CachedCheck("baz", 30); + v3.Should().Be(30); + } + { + var v = await CachedCheck("foo", 10); + v.Should().Be(10); + + var v2 = await CachedCheck("bar", 20); + v2.Should().Be(20); + + var v3 = await CachedCheck("baz", 30); + v3.Should().Be(30); + } + { + var v = CachedCheck("foo", 10); + var v2 = CachedCheck("bar", 20); + var v3 = CachedCheck("baz", 30); + + (await v).Should().Be(10); + (await v2).Should().Be(20); + (await v3).Should().Be(30); + } + { + var v = CachedCheck("foo", 10, true); + var v2 = CachedCheck("bar", 20, true); + var v3 = CachedCheck("baz", 30, true); + + (await v).Should().Be(10); + (await v2).Should().Be(20); + (await v3).Should().Be(30); + } + }); + + + static Dictionary cacheDict = new Dictionary(); + + async UniTask CachedCheck(string cache, int value, bool yield = false) + { + if (!cacheDict.ContainsKey(cache)) + { + await UniTask.Yield(); + } + + if (yield) + { + await UniTask.Yield(); + } + + if (cacheDict.TryGetValue(cache, out var v)) + { + return v; + } + + cacheDict.Add(cache, value); + + return value; + } + + + + } + + + + + + + + +} diff --git a/src/UniTask/Assets/Tests/CachelikeTest.cs.meta b/src/UniTask/Assets/Tests/CachelikeTest.cs.meta new file mode 100644 index 0000000..e7a9bca --- /dev/null +++ b/src/UniTask/Assets/Tests/CachelikeTest.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 416e0e77b4408b0498792eb218ed2870 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/src/UniTask/Assets/Tests/DelayTest.cs b/src/UniTask/Assets/Tests/DelayTest.cs new file mode 100644 index 0000000..d416fb9 --- /dev/null +++ b/src/UniTask/Assets/Tests/DelayTest.cs @@ -0,0 +1,394 @@ +using Cysharp.Threading.Tasks; +using Cysharp.Threading.Tasks.Linq; +using FluentAssertions; +using NUnit.Framework; +using System; +using System.Collections; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading; +using System.Threading.Tasks; +using UnityEngine; +using UnityEngine.TestTools; + +namespace Cysharp.Threading.TasksTests +{ + public class DelayTest + { + //[UnityTest] + //public IEnumerator DelayFrame() => UniTask.ToCoroutine(async () => + //{ + // for (int i = 1; i < 5; i++) + // { + // await UniTask.Yield(PlayerLoopTiming.PreUpdate); + // var frameCount = Time.frameCount; + // await UniTask.DelayFrame(i); + // Time.frameCount.Should().Be(frameCount + i); + // } + + // for (int i = 1; i < 5; i++) + // { + // await UniTask.Yield(PlayerLoopTiming.PostLateUpdate); + // var frameCount = Time.frameCount; + // await UniTask.DelayFrame(i); + // Time.frameCount.Should().Be(frameCount + i); + // } + //}); + + //[UnityTest] + //public IEnumerator DelayFrameZero() => UniTask.ToCoroutine(async () => + //{ + // { + // await UniTask.Yield(PlayerLoopTiming.PreUpdate); + // var frameCount = Time.frameCount; + // await UniTask.DelayFrame(0); + // Time.frameCount.Should().Be(frameCount); // same frame + // } + // { + // await UniTask.Yield(PlayerLoopTiming.PostLateUpdate); + // var frameCount = Time.frameCount; + // await UniTask.DelayFrame(0); + // Time.frameCount.Should().Be(frameCount + 1); // next frame + // } + //}); + + + + //[UnityTest] + //public IEnumerator TimerFramePre() => UniTask.ToCoroutine(async () => + //{ + // await UniTask.Yield(PlayerLoopTiming.PreUpdate); + + // var initialFrame = Time.frameCount; + // var xs = await UniTaskAsyncEnumerable.TimerFrame(2, 3).Take(5).Select(_ => Time.frameCount).ToArrayAsync(); + + // xs[0].Should().Be(initialFrame + 2); + // xs[1].Should().Be(initialFrame + 2 + (3 * 1)); + // xs[2].Should().Be(initialFrame + 2 + (3 * 2)); + // xs[3].Should().Be(initialFrame + 2 + (3 * 3)); + // xs[4].Should().Be(initialFrame + 2 + (3 * 4)); + //}); + + + //[UnityTest] + //public IEnumerator TimerFramePost() => UniTask.ToCoroutine(async () => + //{ + // await UniTask.Yield(PlayerLoopTiming.PostLateUpdate); + + // var initialFrame = Time.frameCount; + // var xs = await UniTaskAsyncEnumerable.TimerFrame(2, 3).Take(5).Select(_ => Time.frameCount).ToArrayAsync(); + + // xs[0].Should().Be(initialFrame + 2); + // xs[1].Should().Be(initialFrame + 2 + (3 * 1)); + // xs[2].Should().Be(initialFrame + 2 + (3 * 2)); + // xs[3].Should().Be(initialFrame + 2 + (3 * 3)); + // xs[4].Should().Be(initialFrame + 2 + (3 * 4)); + //}); + + + //[UnityTest] + //public IEnumerator TimerFrameTest() => UniTask.ToCoroutine(async () => + //{ + // await UniTask.Yield(PlayerLoopTiming.PreUpdate); + + // var initialFrame = Time.frameCount; + // var xs = await UniTaskAsyncEnumerable.TimerFrame(0, 0).Take(5).Select(_ => Time.frameCount).ToArrayAsync(); + + // xs[0].Should().Be(initialFrame); + // xs[1].Should().Be(initialFrame + 1); + // xs[2].Should().Be(initialFrame + 2); + // xs[3].Should().Be(initialFrame + 3); + // xs[4].Should().Be(initialFrame + 4); + //}); + + [UnityTest] + public IEnumerator TimerFrameSinglePre2() => UniTask.ToCoroutine(async () => + { + { + var xs = await UniTaskAsyncEnumerable.TimerFrame(1).ToArrayAsync(); + } + //Debug.Log("------------------"); + //{ + // var xs = await UniTaskAsyncEnumerable.TimerFrame(1).ToArrayAsync(); + //} + }); + + + //[UnityTest] + //public IEnumerator TimerFrameSinglePre2() => UniTask.ToCoroutine(async () => + //{ + // { + // var initialFrame = Time.frameCount; + // var xs = await new MyTimerFrame(0, null)/*.Select(_ => Time.frameCount)*/.ToArrayAsync(); + // Debug.Log("OK 0 ------------------"); + // } + // { + // var xs = await new MyTimerFrame(1, null)/*.Select(_ => + // { + // var t = Time.frameCount; + // UnityEngine.Debug.Log("store frameCount:" + t); + // return t; + // })*/.ToArrayAsync(); + // } + //}); + + //[UnityTest] + //public IEnumerator TimerFrameSinglePre() => UniTask.ToCoroutine(async () => + //{ + // { + // await UniTask.Yield(PlayerLoopTiming.PreUpdate); + // var initialFrame = Time.frameCount; + // var xs = await UniTaskAsyncEnumerable.Return(UniTask.Yield(PlayerLoopTiming.Update, CancellationToken.None))/*.Select(_ => Time.frameCount)*/.ToArrayAsync(); + // xs[0].Should().Be(initialFrame); + // Debug.Log("OK 0 ------------------"); + // } + // { + // await UniTask.Yield(PlayerLoopTiming.PreUpdate); + // var initialFrame = Time.frameCount; + // Debug.Log("initialFrame:" + initialFrame); + // var xs = await UniTaskAsyncEnumerable.Return(UniTask.Yield(PlayerLoopTiming.Update, CancellationToken.None))/*.Select(_ => + // { + // var t = Time.frameCount; + // UnityEngine.Debug.Log("store frameCount:" + t); + // return t; + // })*/.ToArrayAsync(); + // Debug.Log("xs len:" + xs.Length); + // Debug.Log("xs[0]:" + xs[0]); + + // xs[0].Should().Be(initialFrame + 1); + // Debug.Log("OK 1"); + // } + // { + // //await UniTask.Yield(PlayerLoopTiming.PreUpdate); + // var initialFrame = Time.frameCount; + // var xs = await UniTaskAsyncEnumerable.TimerFrame(2).Select(_ => Time.frameCount).ToArrayAsync(); + // xs[0].Should().Be(initialFrame + 2); + // Debug.Log("OK 2"); + // } + //}); + + + //[UnityTest] + //public IEnumerator TimerFrameSinglePost() => UniTask.ToCoroutine(async () => + //{ + // { + // //await UniTask.Yield(PlayerLoopTiming.PostLateUpdate); + // //var initialFrame = Time.frameCount; + // //var xs = await UniTaskAsyncEnumerable.TimerFrame(0).Select(_ => Time.frameCount).ToArrayAsync(); + // //xs[0].Should().Be(initialFrame); + // } + // { + // //await UniTask.Yield(PlayerLoopTiming.PostLateUpdate); + // var initialFrame = Time.frameCount; + // var xs = await UniTaskAsyncEnumerable.TimerFrame(1).Select(_ => Time.frameCount).ToArrayAsync(); + // xs[0].Should().Be(initialFrame + 1); + // } + // { + // //await UniTask.Yield(PlayerLoopTiming.PostLateUpdate); + // var initialFrame = Time.frameCount; + // var xs = await UniTaskAsyncEnumerable.TimerFrame(2).Select(_ => Time.frameCount).ToArrayAsync(); + // xs[0].Should().Be(initialFrame + 2); + // } + //}); + + + + //[UnityTest] + //public IEnumerator Timer() => UniTask.ToCoroutine(async () => + //{ + // await UniTask.Yield(PlayerLoopTiming.PreUpdate); + + // { + // var initialSeconds = Time.realtimeSinceStartup; + // var xs = await UniTaskAsyncEnumerable.Timer(TimeSpan.FromSeconds(2)).Select(_ => Time.realtimeSinceStartup).ToArrayAsync(); + + // Mathf.Approximately(initialSeconds, xs[0]).Should().BeFalse(); + // Debug.Log("Init:" + initialSeconds); + // Debug.Log("After:" + xs[0]); + // } + //}); + + + + + } + + public class DelayTest2 + { + [UnityTest] + public IEnumerator TimerFrameSinglePre2() => UniTask.ToCoroutine(async () => + { + { + var xs = await UniTaskAsyncEnumerable.TimerFrame(1).ToArrayAsync(); + } + Debug.Log("------------------"); + { + var xs = await UniTaskAsyncEnumerable.TimerFrame(1).ToArrayAsync(); + } + }); + } + + + public class ThreadRunner + { + Thread thread; + + public void Start(IPlayerLoopItem runner) + { + thread = new Thread(() => + { + Thread.Sleep(30); + while (runner.MoveNext()) + { + Thread.Sleep(30); + } + }); + + thread.Start(); + } + } + + internal class MyTimerFrame : IUniTaskAsyncEnumerable + { + //readonly PlayerLoopTiming updateTiming; + readonly int dueTimeFrameCount; + readonly int? periodFrameCount; + + public MyTimerFrame(int dueTimeFrameCount, int? periodFrameCount) + { + //this.updateTiming = updateTiming; + this.dueTimeFrameCount = dueTimeFrameCount; + this.periodFrameCount = periodFrameCount; + } + + public IUniTaskAsyncEnumerator GetAsyncEnumerator(CancellationToken cancellationToken = default) + { + return new _TimerFrame(dueTimeFrameCount, periodFrameCount, cancellationToken); + } + + class _TimerFrame : MoveNextSource, IUniTaskAsyncEnumerator, IPlayerLoopItem + { + readonly int dueTimeFrameCount; + readonly int? periodFrameCount; + CancellationToken cancellationToken; + + int initialFrame; + int currentFrame; + bool dueTimePhase; + bool completed; + bool disposed; + ThreadRunner runner; + + public _TimerFrame(int dueTimeFrameCount, int? periodFrameCount, CancellationToken cancellationToken) + { + if (dueTimeFrameCount <= 0) dueTimeFrameCount = 0; + if (periodFrameCount != null) + { + if (periodFrameCount <= 0) periodFrameCount = 1; + } + + //this.initialFrame = Time.frameCount; + this.dueTimePhase = true; + this.dueTimeFrameCount = dueTimeFrameCount; + this.periodFrameCount = periodFrameCount; + + //TaskTracker.TrackActiveTask(this, 2); + //PlayerLoopHelper.AddAction(updateTiming, this); + + runner = new ThreadRunner(); + runner.Start(this); + } + + public AsyncUnit Current => default; + + public UniTask MoveNextAsync() + { + // return false instead of throw + if (disposed || cancellationToken.IsCancellationRequested || completed) return default; + + + // reset value here. + this.currentFrame = 0; + + completionSource.Reset(); + return new UniTask(this, completionSource.Version); + } + + public UniTask DisposeAsync() + { + if (!disposed) + { + disposed = true; + TaskTracker.RemoveTracking(this); + } + return default; + } + + public bool MoveNext() + { + UnityEngine.Debug.Log("Called MoveNext"); + if (disposed || cancellationToken.IsCancellationRequested) + { + UnityEngine.Debug.Log("Disposing"); + completionSource.TrySetResult(false); + return false; + } + + if (dueTimePhase) + { + UnityEngine.Debug.Log("In DueTime Phase"); + if (currentFrame == 0) + { + if (dueTimeFrameCount == 0) + { + dueTimePhase = false; + completionSource.TrySetResult(true); + return true; + } + + // skip in initial frame. + /* + UnityEngine.Debug.Log("(Init, frameConut)" + (initialFrame, Time.frameCount)); + if (initialFrame == Time.frameCount) + { + UnityEngine.Debug.Log("Skip Here"); + return true; + } + */ + } + + UnityEngine.Debug.Log("Which Go?"); + if (++currentFrame >= dueTimeFrameCount) + { + UnityEngine.Debug.Log("END Go?"); + dueTimePhase = false; + completionSource.TrySetResult(true); + } + else + { + UnityEngine.Debug.Log("NG Go?"); + } + } + else + { + if (periodFrameCount == null) + { + UnityEngine.Debug.Log("PERIOD"); + completed = true; + completionSource.TrySetResult(false); + return false; + } + + if (++currentFrame >= periodFrameCount) + { + completionSource.TrySetResult(true); + } + } + + return true; + } + } + } + +} diff --git a/src/UniTask/Assets/Tests/DelayTest.cs.meta b/src/UniTask/Assets/Tests/DelayTest.cs.meta new file mode 100644 index 0000000..46731fb --- /dev/null +++ b/src/UniTask/Assets/Tests/DelayTest.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 1376b93d9e1083a4a9b4081e08f3a7b7 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/src/UniTask/Assets/Tests/Editor/AsyncTestEditor.cs b/src/UniTask/Assets/Tests/Editor/AsyncTestEditor.cs index 9c36a1c..e5e42b6 100644 --- a/src/UniTask/Assets/Tests/Editor/AsyncTestEditor.cs +++ b/src/UniTask/Assets/Tests/Editor/AsyncTestEditor.cs @@ -1,400 +1,400 @@ -#if !(UNITY_4_5 || UNITY_4_6 || UNITY_4_7 || UNITY_5_0 || UNITY_5_1 || UNITY_5_2) -#pragma warning disable CS1591 // Missing XML comment for publicly visible type or member +//#if !(UNITY_4_5 || UNITY_4_6 || UNITY_4_7 || UNITY_5_0 || UNITY_5_1 || UNITY_5_2) +//#pragma warning disable CS1591 // Missing XML comment for publicly visible type or member -using UnityEngine; -using System; -using System.Collections; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using UnityEngine.UI; -using UnityEngine.Scripting; -using Cysharp.Threading.Tasks; -using UnityEngine.SceneManagement; -#if CSHARP_7_OR_LATER || (UNITY_2018_3_OR_NEWER && (NET_STANDARD_2_0 || NET_4_6)) -using System.Threading.Tasks; -#endif -using UnityEngine.Networking; +//using UnityEngine; +//using System; +//using System.Collections; +//using System.Collections.Generic; +//using System.Linq; +//using System.Text; +//using UnityEngine.UI; +//using UnityEngine.Scripting; +//using Cysharp.Threading.Tasks; +//using UnityEngine.SceneManagement; +//#if CSHARP_7_OR_LATER || (UNITY_2018_3_OR_NEWER && (NET_STANDARD_2_0 || NET_4_6)) +//using System.Threading.Tasks; +//#endif +//using UnityEngine.Networking; -#if !UNITY_2019_3_OR_NEWER -using UnityEngine.Experimental.LowLevel; -#else -using UnityEngine.LowLevel; -#endif +//#if !UNITY_2019_3_OR_NEWER +//using UnityEngine.Experimental.LowLevel; +//#else +//using UnityEngine.LowLevel; +//#endif -#if !UNITY_WSA -using Unity.Jobs; -#endif -using Unity.Collections; -using System.Threading; -using NUnit.Framework; -using UnityEngine.TestTools; -using FluentAssertions; +//#if !UNITY_WSA +//using Unity.Jobs; +//#endif +//using Unity.Collections; +//using System.Threading; +//using NUnit.Framework; +//using UnityEngine.TestTools; +//using FluentAssertions; -namespace Cysharp.Threading.TasksTests -{ - public class AsyncTest - { -#if CSHARP_7_OR_LATER || (UNITY_2018_3_OR_NEWER && (NET_STANDARD_2_0 || NET_4_6)) -#if !UNITY_WSA +//namespace Cysharp.Threading.TasksTests +//{ +// public class AsyncTest +// { +//#if CSHARP_7_OR_LATER || (UNITY_2018_3_OR_NEWER && (NET_STANDARD_2_0 || NET_4_6)) +//#if !UNITY_WSA - public struct MyJob : IJob - { - public int loopCount; - public NativeArray inOut; - public int result; +// public struct MyJob : IJob +// { +// public int loopCount; +// public NativeArray inOut; +// public int result; - public void Execute() - { - result = 0; - for (int i = 0; i < loopCount; i++) - { - result++; - } - inOut[0] = result; - } - } +// public void Execute() +// { +// result = 0; +// for (int i = 0; i < loopCount; i++) +// { +// result++; +// } +// inOut[0] = result; +// } +// } - [UnityTest] - public IEnumerator DelayAnd() => UniTask.ToCoroutine(async () => - { - await UniTask.Yield(PlayerLoopTiming.PostLateUpdate); +// [UnityTest] +// public IEnumerator DelayAnd() => UniTask.ToCoroutine(async () => +// { +// await UniTask.Yield(PlayerLoopTiming.PostLateUpdate); - var time = Time.realtimeSinceStartup; +// var time = Time.realtimeSinceStartup; - Time.timeScale = 0.5f; - try - { - await UniTask.Delay(TimeSpan.FromSeconds(3)); +// Time.timeScale = 0.5f; +// try +// { +// await UniTask.Delay(TimeSpan.FromSeconds(3)); - var elapsed = Time.realtimeSinceStartup - time; - ((int)Math.Round(TimeSpan.FromSeconds(elapsed).TotalSeconds, MidpointRounding.ToEven)).Should().Be(6); - } - finally - { - Time.timeScale = 1.0f; - } - }); +// var elapsed = Time.realtimeSinceStartup - time; +// ((int)Math.Round(TimeSpan.FromSeconds(elapsed).TotalSeconds, MidpointRounding.ToEven)).Should().Be(6); +// } +// finally +// { +// Time.timeScale = 1.0f; +// } +// }); - [UnityTest] - public IEnumerator DelayIgnore() => UniTask.ToCoroutine(async () => - { - var time = Time.realtimeSinceStartup; +// [UnityTest] +// public IEnumerator DelayIgnore() => UniTask.ToCoroutine(async () => +// { +// var time = Time.realtimeSinceStartup; - Time.timeScale = 0.5f; - try - { - await UniTask.Delay(TimeSpan.FromSeconds(3), ignoreTimeScale: true); +// Time.timeScale = 0.5f; +// try +// { +// await UniTask.Delay(TimeSpan.FromSeconds(3), ignoreTimeScale: true); - var elapsed = Time.realtimeSinceStartup - time; - ((int)Math.Round(TimeSpan.FromSeconds(elapsed).TotalSeconds, MidpointRounding.ToEven)).Should().Be(3); - } - finally - { - Time.timeScale = 1.0f; - } - }); +// var elapsed = Time.realtimeSinceStartup - time; +// ((int)Math.Round(TimeSpan.FromSeconds(elapsed).TotalSeconds, MidpointRounding.ToEven)).Should().Be(3); +// } +// finally +// { +// Time.timeScale = 1.0f; +// } +// }); - [UnityTest] - public IEnumerator WhenAll() => UniTask.ToCoroutine(async () => - { - var a = UniTask.FromResult(999); - var b = UniTask.Yield(PlayerLoopTiming.Update, CancellationToken.None).AsAsyncUnitUniTask(); - var c = UniTask.DelayFrame(99).AsAsyncUnitUniTask(); +// [UnityTest] +// public IEnumerator WhenAll() => UniTask.ToCoroutine(async () => +// { +// var a = UniTask.FromResult(999); +// var b = UniTask.Yield(PlayerLoopTiming.Update, CancellationToken.None).AsAsyncUnitUniTask(); +// var c = UniTask.DelayFrame(99).AsAsyncUnitUniTask(); - var (a2, b2, c2) = await UniTask.WhenAll(a, b, c); - a2.Should().Be(999); - b2.Should().Be(AsyncUnit.Default); - c2.Should().Be(AsyncUnit.Default); - }); +// var (a2, b2, c2) = await UniTask.WhenAll(a, b, c); +// a2.Should().Be(999); +// b2.Should().Be(AsyncUnit.Default); +// c2.Should().Be(AsyncUnit.Default); +// }); - [UnityTest] - public IEnumerator WhenAny() => UniTask.ToCoroutine(async () => - { - var a = UniTask.FromResult(999); - var b = UniTask.Yield(PlayerLoopTiming.Update, CancellationToken.None).AsAsyncUnitUniTask(); - var c = UniTask.DelayFrame(99).AsAsyncUnitUniTask(); +// [UnityTest] +// public IEnumerator WhenAny() => UniTask.ToCoroutine(async () => +// { +// var a = UniTask.FromResult(999); +// var b = UniTask.Yield(PlayerLoopTiming.Update, CancellationToken.None).AsAsyncUnitUniTask(); +// var c = UniTask.DelayFrame(99).AsAsyncUnitUniTask(); - var (win, a2, b2, c2) = await UniTask.WhenAny(a, b, c); - win.Should().Be(0); - a2.Should().Be(999); - }); +// var (win, a2, b2, c2) = await UniTask.WhenAny(a, b, c); +// win.Should().Be(0); +// a2.Should().Be(999); +// }); - [UnityTest] - public IEnumerator BothEnumeratorCheck() => UniTask.ToCoroutine(async () => - { - await ToaruCoroutineEnumerator(); // wait 5 frame:) - }); +// [UnityTest] +// public IEnumerator BothEnumeratorCheck() => UniTask.ToCoroutine(async () => +// { +// await ToaruCoroutineEnumerator(); // wait 5 frame:) +// }); - [UnityTest] - public IEnumerator JobSystem() => UniTask.ToCoroutine(async () => - { - var job = new MyJob() { loopCount = 999, inOut = new NativeArray(1, Allocator.TempJob) }; - JobHandle.ScheduleBatchedJobs(); - await job.Schedule(); - job.inOut[0].Should().Be(999); - job.inOut.Dispose(); - }); +// [UnityTest] +// public IEnumerator JobSystem() => UniTask.ToCoroutine(async () => +// { +// var job = new MyJob() { loopCount = 999, inOut = new NativeArray(1, Allocator.TempJob) }; +// JobHandle.ScheduleBatchedJobs(); +// await job.Schedule(); +// job.inOut[0].Should().Be(999); +// job.inOut.Dispose(); +// }); - class MyMyClass - { - public int MyProperty { get; set; } - } +// class MyMyClass +// { +// public int MyProperty { get; set; } +// } - [UnityTest] - public IEnumerator WaitUntil() => UniTask.ToCoroutine(async () => - { - bool t = false; +// [UnityTest] +// public IEnumerator WaitUntil() => UniTask.ToCoroutine(async () => +// { +// bool t = false; - await UniTask.Yield(PlayerLoopTiming.PostLateUpdate); +// await UniTask.Yield(PlayerLoopTiming.PostLateUpdate); - UniTask.DelayFrame(10,PlayerLoopTiming.PostLateUpdate).ContinueWith(() => t = true).Forget(); +// UniTask.DelayFrame(10,PlayerLoopTiming.PostLateUpdate).ContinueWith(() => t = true).Forget(); - var startFrame = Time.frameCount; - await UniTask.WaitUntil(() => t, PlayerLoopTiming.EarlyUpdate); +// var startFrame = Time.frameCount; +// await UniTask.WaitUntil(() => t, PlayerLoopTiming.EarlyUpdate); - var diff = Time.frameCount - startFrame; - diff.Should().Be(11); - }); +// var diff = Time.frameCount - startFrame; +// diff.Should().Be(11); +// }); - [UnityTest] - public IEnumerator WaitWhile() => UniTask.ToCoroutine(async () => - { - bool t = true; +// [UnityTest] +// public IEnumerator WaitWhile() => UniTask.ToCoroutine(async () => +// { +// bool t = true; - UniTask.DelayFrame(10, PlayerLoopTiming.PostLateUpdate).ContinueWith(() => t = false).Forget(); +// UniTask.DelayFrame(10, PlayerLoopTiming.PostLateUpdate).ContinueWith(() => t = false).Forget(); - var startFrame = Time.frameCount; - await UniTask.WaitWhile(() => t, PlayerLoopTiming.EarlyUpdate); +// var startFrame = Time.frameCount; +// await UniTask.WaitWhile(() => t, PlayerLoopTiming.EarlyUpdate); - var diff = Time.frameCount - startFrame; - diff.Should().Be(11); - }); +// var diff = Time.frameCount - startFrame; +// diff.Should().Be(11); +// }); - [UnityTest] - public IEnumerator WaitUntilValueChanged() => UniTask.ToCoroutine(async () => - { - var v = new MyMyClass { MyProperty = 99 }; +// [UnityTest] +// public IEnumerator WaitUntilValueChanged() => UniTask.ToCoroutine(async () => +// { +// var v = new MyMyClass { MyProperty = 99 }; - UniTask.DelayFrame(10, PlayerLoopTiming.PostLateUpdate).ContinueWith(() => v.MyProperty = 1000).Forget(); +// UniTask.DelayFrame(10, PlayerLoopTiming.PostLateUpdate).ContinueWith(() => v.MyProperty = 1000).Forget(); - var startFrame = Time.frameCount; - await UniTask.WaitUntilValueChanged(v, x => x.MyProperty, PlayerLoopTiming.EarlyUpdate); +// var startFrame = Time.frameCount; +// await UniTask.WaitUntilValueChanged(v, x => x.MyProperty, PlayerLoopTiming.EarlyUpdate); - var diff = Time.frameCount - startFrame; - diff.Should().Be(11); - }); +// var diff = Time.frameCount - startFrame; +// diff.Should().Be(11); +// }); - [UnityTest] - public IEnumerator SwitchTo() => UniTask.ToCoroutine(async () => - { - await UniTask.Yield(); +// [UnityTest] +// public IEnumerator SwitchTo() => UniTask.ToCoroutine(async () => +// { +// await UniTask.Yield(); - var currentThreadId = Thread.CurrentThread.ManagedThreadId; +// var currentThreadId = Thread.CurrentThread.ManagedThreadId; - await UniTask.SwitchToThreadPool(); - //await UniTask.SwitchToThreadPool(); - //await UniTask.SwitchToThreadPool(); +// await UniTask.SwitchToThreadPool(); +// //await UniTask.SwitchToThreadPool(); +// //await UniTask.SwitchToThreadPool(); - var switchedThreadId = Thread.CurrentThread.ManagedThreadId; +// var switchedThreadId = Thread.CurrentThread.ManagedThreadId; - currentThreadId.Should().NotBe(switchedThreadId); +// currentThreadId.Should().NotBe(switchedThreadId); - await UniTask.Yield(); +// await UniTask.Yield(); - var switchedThreadId2 = Thread.CurrentThread.ManagedThreadId; +// var switchedThreadId2 = Thread.CurrentThread.ManagedThreadId; - currentThreadId.Should().Be(switchedThreadId2); - }); +// currentThreadId.Should().Be(switchedThreadId2); +// }); - //[UnityTest] - //public IEnumerator ObservableConversion() => UniTask.ToCoroutine(async () => - //{ - // var v = await Observable.Range(1, 10).ToUniTask(); - // v.Is(10); +// //[UnityTest] +// //public IEnumerator ObservableConversion() => UniTask.ToCoroutine(async () => +// //{ +// // var v = await Observable.Range(1, 10).ToUniTask(); +// // v.Is(10); - // v = await Observable.Range(1, 10).ToUniTask(useFirstValue: true); - // v.Is(1); +// // v = await Observable.Range(1, 10).ToUniTask(useFirstValue: true); +// // v.Is(1); - // v = await UniTask.DelayFrame(10).ToObservable().ToTask(); - // v.Is(10); +// // v = await UniTask.DelayFrame(10).ToObservable().ToTask(); +// // v.Is(10); - // v = await UniTask.FromResult(99).ToObservable(); - // v.Is(99); - //}); +// // v = await UniTask.FromResult(99).ToObservable(); +// // v.Is(99); +// //}); - //[UnityTest] - //public IEnumerator AwaitableReactiveProperty() => UniTask.ToCoroutine(async () => - //{ - // var rp1 = new ReactiveProperty(99); +// //[UnityTest] +// //public IEnumerator AwaitableReactiveProperty() => UniTask.ToCoroutine(async () => +// //{ +// // var rp1 = new ReactiveProperty(99); - // UniTask.DelayFrame(100).ContinueWith(x => rp1.Value = x).Forget(); +// // UniTask.DelayFrame(100).ContinueWith(x => rp1.Value = x).Forget(); - // await rp1; +// // await rp1; - // rp1.Value.Is(100); +// // rp1.Value.Is(100); - // // var delay2 = UniTask.DelayFrame(10); - // // var (a, b ) = await UniTask.WhenAll(rp1.WaitUntilValueChangedAsync(), delay2); +// // // var delay2 = UniTask.DelayFrame(10); +// // // var (a, b ) = await UniTask.WhenAll(rp1.WaitUntilValueChangedAsync(), delay2); - //}); +// //}); - //[UnityTest] - //public IEnumerator AwaitableReactiveCommand() => UniTask.ToCoroutine(async () => - //{ - // var rc = new ReactiveCommand(); +// //[UnityTest] +// //public IEnumerator AwaitableReactiveCommand() => UniTask.ToCoroutine(async () => +// //{ +// // var rc = new ReactiveCommand(); - // UniTask.DelayFrame(100).ContinueWith(x => rc.Execute(x)).Forget(); +// // UniTask.DelayFrame(100).ContinueWith(x => rc.Execute(x)).Forget(); - // var v = await rc; +// // var v = await rc; - // v.Is(100); - //}); +// // v.Is(100); +// //}); - [UnityTest] - public IEnumerator ExceptionlessCancellation() => UniTask.ToCoroutine(async () => - { - var cts = new CancellationTokenSource(); +// [UnityTest] +// public IEnumerator ExceptionlessCancellation() => UniTask.ToCoroutine(async () => +// { +// var cts = new CancellationTokenSource(); - UniTask.DelayFrame(10).ContinueWith(() => cts.Cancel()).Forget(); +// UniTask.DelayFrame(10).ContinueWith(() => cts.Cancel()).Forget(); - var first = Time.frameCount; - var canceled = await UniTask.DelayFrame(100, cancellationToken: cts.Token).SuppressCancellationThrow(); +// var first = Time.frameCount; +// var canceled = await UniTask.DelayFrame(100, cancellationToken: cts.Token).SuppressCancellationThrow(); - (Time.frameCount - first).Should().Be(11); // 10 frame canceled - canceled.Should().Be(true); - }); +// (Time.frameCount - first).Should().Be(11); // 10 frame canceled +// canceled.Should().Be(true); +// }); - [UnityTest] - public IEnumerator ExceptionCancellation() => UniTask.ToCoroutine(async () => - { - var cts = new CancellationTokenSource(); +// [UnityTest] +// public IEnumerator ExceptionCancellation() => UniTask.ToCoroutine(async () => +// { +// var cts = new CancellationTokenSource(); - UniTask.DelayFrame(10).ContinueWith(() => cts.Cancel()).Forget(); +// UniTask.DelayFrame(10).ContinueWith(() => cts.Cancel()).Forget(); - bool occur = false; - try - { - await UniTask.DelayFrame(100, cancellationToken: cts.Token); - } - catch (OperationCanceledException) - { - occur = true; - } - occur.Should().BeTrue(); - }); +// bool occur = false; +// try +// { +// await UniTask.DelayFrame(100, cancellationToken: cts.Token); +// } +// catch (OperationCanceledException) +// { +// occur = true; +// } +// occur.Should().BeTrue(); +// }); - IEnumerator ToaruCoroutineEnumerator() - { - yield return null; - yield return null; - yield return null; - yield return null; - yield return null; - } +// IEnumerator ToaruCoroutineEnumerator() +// { +// yield return null; +// yield return null; +// yield return null; +// yield return null; +// yield return null; +// } - [UnityTest] - public IEnumerator ExceptionUnobserved1() => UniTask.ToCoroutine(async () => - { - bool calledEx = false; - Action action = exx => - { - calledEx = true; - exx.Message.Should().Be("MyException"); - }; +// [UnityTest] +// public IEnumerator ExceptionUnobserved1() => UniTask.ToCoroutine(async () => +// { +// bool calledEx = false; +// Action action = exx => +// { +// calledEx = true; +// exx.Message.Should().Be("MyException"); +// }; - UniTaskScheduler.UnobservedTaskException += action; +// UniTaskScheduler.UnobservedTaskException += action; - var ex = InException1(); - ex = default(UniTask); +// var ex = InException1(); +// ex = default(UniTask); - await UniTask.DelayFrame(3); +// await UniTask.DelayFrame(3); - GC.Collect(); - GC.WaitForPendingFinalizers(); - GC.Collect(); +// GC.Collect(); +// GC.WaitForPendingFinalizers(); +// GC.Collect(); - await UniTask.DelayFrame(1); +// await UniTask.DelayFrame(1); - calledEx.Should().BeTrue(); +// calledEx.Should().BeTrue(); - UniTaskScheduler.UnobservedTaskException -= action; - }); +// UniTaskScheduler.UnobservedTaskException -= action; +// }); - [UnityTest] - public IEnumerator ExceptionUnobserved2() => UniTask.ToCoroutine(async () => - { - bool calledEx = false; - Action action = exx => - { - calledEx = true; - exx.Message.Should().Be("MyException"); - }; +// [UnityTest] +// public IEnumerator ExceptionUnobserved2() => UniTask.ToCoroutine(async () => +// { +// bool calledEx = false; +// Action action = exx => +// { +// calledEx = true; +// exx.Message.Should().Be("MyException"); +// }; - UniTaskScheduler.UnobservedTaskException += action; +// UniTaskScheduler.UnobservedTaskException += action; - var ex = InException2(); - ex = default(UniTask); +// var ex = InException2(); +// ex = default(UniTask); - await UniTask.DelayFrame(3); +// await UniTask.DelayFrame(3); - GC.Collect(); - GC.WaitForPendingFinalizers(); - GC.Collect(); +// GC.Collect(); +// GC.WaitForPendingFinalizers(); +// GC.Collect(); - await UniTask.DelayFrame(1); +// await UniTask.DelayFrame(1); - calledEx.Should().BeTrue(); +// calledEx.Should().BeTrue(); - UniTaskScheduler.UnobservedTaskException -= action; - }); +// UniTaskScheduler.UnobservedTaskException -= action; +// }); - async UniTask InException1() - { - await UniTask.Yield(); - throw new Exception("MyException"); - } +// async UniTask InException1() +// { +// await UniTask.Yield(); +// throw new Exception("MyException"); +// } - async UniTask InException2() - { - await UniTask.Yield(); - throw new Exception("MyException"); - } +// async UniTask InException2() +// { +// await UniTask.Yield(); +// throw new Exception("MyException"); +// } - [UnityTest] - public IEnumerator NestedEnumerator() => UniTask.ToCoroutine(async () => - { - var time = Time.realtimeSinceStartup; +// [UnityTest] +// public IEnumerator NestedEnumerator() => UniTask.ToCoroutine(async () => +// { +// var time = Time.realtimeSinceStartup; - await ParentCoroutineEnumerator(); +// await ParentCoroutineEnumerator(); - var elapsed = Time.realtimeSinceStartup - time; - ((int)Math.Round(TimeSpan.FromSeconds(elapsed).TotalSeconds, MidpointRounding.ToEven)).Should().Be(3); - }); +// var elapsed = Time.realtimeSinceStartup - time; +// ((int)Math.Round(TimeSpan.FromSeconds(elapsed).TotalSeconds, MidpointRounding.ToEven)).Should().Be(3); +// }); - IEnumerator ParentCoroutineEnumerator() - { - yield return ChildCoroutineEnumerator(); - } +// IEnumerator ParentCoroutineEnumerator() +// { +// yield return ChildCoroutineEnumerator(); +// } - IEnumerator ChildCoroutineEnumerator() - { - yield return new WaitForSeconds(3); - } +// IEnumerator ChildCoroutineEnumerator() +// { +// yield return new WaitForSeconds(3); +// } -#endif -#endif - } -} +//#endif +//#endif +// } +//} -#endif \ No newline at end of file +//#endif \ No newline at end of file diff --git a/src/UniTask/Assets/Tests/Editor/RunTestEditor.cs b/src/UniTask/Assets/Tests/Editor/RunTestEditor.cs index 7397372..771677d 100644 --- a/src/UniTask/Assets/Tests/Editor/RunTestEditor.cs +++ b/src/UniTask/Assets/Tests/Editor/RunTestEditor.cs @@ -1,95 +1,95 @@ -#if !(UNITY_4_5 || UNITY_4_6 || UNITY_4_7 || UNITY_5_0 || UNITY_5_1 || UNITY_5_2) -#pragma warning disable CS1591 // Missing XML comment for publicly visible type or member +//#if !(UNITY_4_5 || UNITY_4_6 || UNITY_4_7 || UNITY_5_0 || UNITY_5_1 || UNITY_5_2) +//#pragma warning disable CS1591 // Missing XML comment for publicly visible type or member -using UnityEngine; -using System; -using System.Collections; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using UnityEngine.UI; -using UnityEngine.Scripting; -using Cysharp.Threading.Tasks; -using UnityEngine.SceneManagement; -#if CSHARP_7_OR_LATER || (UNITY_2018_3_OR_NEWER && (NET_STANDARD_2_0 || NET_4_6)) -using System.Threading.Tasks; -#endif -using UnityEngine.Networking; +//using UnityEngine; +//using System; +//using System.Collections; +//using System.Collections.Generic; +//using System.Linq; +//using System.Text; +//using UnityEngine.UI; +//using UnityEngine.Scripting; +//using Cysharp.Threading.Tasks; +//using UnityEngine.SceneManagement; +//#if CSHARP_7_OR_LATER || (UNITY_2018_3_OR_NEWER && (NET_STANDARD_2_0 || NET_4_6)) +//using System.Threading.Tasks; +//#endif +//using UnityEngine.Networking; -#if !UNITY_2019_3_OR_NEWER -using UnityEngine.Experimental.LowLevel; -#else -using UnityEngine.LowLevel; -#endif +//#if !UNITY_2019_3_OR_NEWER +//using UnityEngine.Experimental.LowLevel; +//#else +//using UnityEngine.LowLevel; +//#endif -#if !UNITY_WSA -using Unity.Jobs; -#endif -using Unity.Collections; -using System.Threading; -using NUnit.Framework; -using UnityEngine.TestTools; -using FluentAssertions; +//#if !UNITY_WSA +//using Unity.Jobs; +//#endif +//using Unity.Collections; +//using System.Threading; +//using NUnit.Framework; +//using UnityEngine.TestTools; +//using FluentAssertions; -namespace Cysharp.Threading.TasksTests -{ - public class RunTest - { -#if CSHARP_7_OR_LATER || (UNITY_2018_3_OR_NEWER && (NET_STANDARD_2_0 || NET_4_6)) -#if !UNITY_WSA +//namespace Cysharp.Threading.TasksTests +//{ +// public class RunTest +// { +//#if CSHARP_7_OR_LATER || (UNITY_2018_3_OR_NEWER && (NET_STANDARD_2_0 || NET_4_6)) +//#if !UNITY_WSA - //[UnityTest] - //public IEnumerator RunThread() => UniTask.ToCoroutine(async () => - //{ - // var main = Thread.CurrentThread.ManagedThreadId; - // var v = await UniTask.Run(() => { return System.Threading.Thread.CurrentThread.ManagedThreadId; }, false); - // UnityEngine.Debug.Log("Ret Value is:" + v); - // UnityEngine.Debug.Log("Run Here and id:" + System.Threading.Thread.CurrentThread.ManagedThreadId); - // //v.Should().Be(3); - // main.Should().NotBe(Thread.CurrentThread.ManagedThreadId); - //}); +// //[UnityTest] +// //public IEnumerator RunThread() => UniTask.ToCoroutine(async () => +// //{ +// // var main = Thread.CurrentThread.ManagedThreadId; +// // var v = await UniTask.Run(() => { return System.Threading.Thread.CurrentThread.ManagedThreadId; }, false); +// // UnityEngine.Debug.Log("Ret Value is:" + v); +// // UnityEngine.Debug.Log("Run Here and id:" + System.Threading.Thread.CurrentThread.ManagedThreadId); +// // //v.Should().Be(3); +// // main.Should().NotBe(Thread.CurrentThread.ManagedThreadId); +// //}); - [UnityTest] - public IEnumerator RunThreadConfigure() => UniTask.ToCoroutine(async () => - { - var main = Thread.CurrentThread.ManagedThreadId; - var v = await UniTask.Run(() => 3, true); - v.Should().Be(3); - main.Should().Be(Thread.CurrentThread.ManagedThreadId); - }); +// [UnityTest] +// public IEnumerator RunThreadConfigure() => UniTask.ToCoroutine(async () => +// { +// var main = Thread.CurrentThread.ManagedThreadId; +// var v = await UniTask.Run(() => 3, true); +// v.Should().Be(3); +// main.Should().Be(Thread.CurrentThread.ManagedThreadId); +// }); - //[UnityTest] - //public IEnumerator RunThreadException() => UniTask.ToCoroutine(async () => - //{ - // var main = Thread.CurrentThread.ManagedThreadId; - // try - // { - // await UniTask.Run(() => throw new Exception(), false); - // } - // catch - // { - // main.Should().NotBe(Thread.CurrentThread.ManagedThreadId); - // } - //}); +// //[UnityTest] +// //public IEnumerator RunThreadException() => UniTask.ToCoroutine(async () => +// //{ +// // var main = Thread.CurrentThread.ManagedThreadId; +// // try +// // { +// // await UniTask.Run(() => throw new Exception(), false); +// // } +// // catch +// // { +// // main.Should().NotBe(Thread.CurrentThread.ManagedThreadId); +// // } +// //}); - [UnityTest] - public IEnumerator RunThreadExceptionConfigure() => UniTask.ToCoroutine(async () => - { - var main = Thread.CurrentThread.ManagedThreadId; - try - { - await UniTask.Run(() => throw new Exception(), true); - } - catch - { - main.Should().Be(Thread.CurrentThread.ManagedThreadId); - } - }); +// [UnityTest] +// public IEnumerator RunThreadExceptionConfigure() => UniTask.ToCoroutine(async () => +// { +// var main = Thread.CurrentThread.ManagedThreadId; +// try +// { +// await UniTask.Run(() => throw new Exception(), true); +// } +// catch +// { +// main.Should().Be(Thread.CurrentThread.ManagedThreadId); +// } +// }); -#endif -#endif - } -} +//#endif +//#endif +// } +//} -#endif \ No newline at end of file +//#endif \ No newline at end of file diff --git a/src/UniTask/Assets/Tests/Editor/WhenAnyTestEditor.cs b/src/UniTask/Assets/Tests/Editor/WhenAnyTestEditor.cs index 3916a28..e9b7aff 100644 --- a/src/UniTask/Assets/Tests/Editor/WhenAnyTestEditor.cs +++ b/src/UniTask/Assets/Tests/Editor/WhenAnyTestEditor.cs @@ -1,43 +1,43 @@ -#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 +//#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 -using UnityEngine; -using System; -using System.Collections; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using UnityEngine.UI; -using UnityEngine.Scripting; -using Cysharp.Threading.Tasks; -using Unity.Collections; -using System.Threading; -using NUnit.Framework; -using UnityEngine.TestTools; -using FluentAssertions; +//using UnityEngine; +//using System; +//using System.Collections; +//using System.Collections.Generic; +//using System.Linq; +//using System.Text; +//using UnityEngine.UI; +//using UnityEngine.Scripting; +//using Cysharp.Threading.Tasks; +//using Unity.Collections; +//using System.Threading; +//using NUnit.Framework; +//using UnityEngine.TestTools; +//using FluentAssertions; -namespace Cysharp.Threading.TasksTests -{ - public class WhenAnyTest - { - [UnityTest] - public IEnumerator WhenAnyCanceled() => UniTask.ToCoroutine(async () => - { - var cts = new CancellationTokenSource(); - var successDelayTask = UniTask.Delay(TimeSpan.FromSeconds(1)); - var cancelTask = UniTask.Delay(TimeSpan.FromSeconds(1), cancellationToken: cts.Token); - cts.CancelAfterSlim(200); +//namespace Cysharp.Threading.TasksTests +//{ +// public class WhenAnyTest +// { +// [UnityTest] +// public IEnumerator WhenAnyCanceled() => UniTask.ToCoroutine(async () => +// { +// var cts = new CancellationTokenSource(); +// var successDelayTask = UniTask.Delay(TimeSpan.FromSeconds(1)); +// var cancelTask = UniTask.Delay(TimeSpan.FromSeconds(1), cancellationToken: cts.Token); +// cts.CancelAfterSlim(200); - try - { - var r = await UniTask.WhenAny(new[] { successDelayTask, cancelTask }); - } - catch (Exception ex) - { - ex.Should().BeAssignableTo(); - } - }); - } -} +// try +// { +// var r = await UniTask.WhenAny(new[] { successDelayTask, cancelTask }); +// } +// catch (Exception ex) +// { +// ex.Should().BeAssignableTo(); +// } +// }); +// } +//} -#endif \ No newline at end of file +//#endif \ No newline at end of file diff --git a/src/UniTask/Assets/Tests/Preserve.cs b/src/UniTask/Assets/Tests/Preserve.cs index d88b673..5bf328e 100644 --- a/src/UniTask/Assets/Tests/Preserve.cs +++ b/src/UniTask/Assets/Tests/Preserve.cs @@ -6,13 +6,20 @@ using System.Collections; using System.Collections.Generic; using System.Linq; using System.Text; +using System.Threading; using System.Threading.Tasks; +using UnityEngine; using UnityEngine.TestTools; namespace Cysharp.Threading.TasksTests { public class Preserve { + public Preserve() + { + // TaskPool.SetMaxPoolSize(0); + } + [UnityTest] public IEnumerator AwaitTwice() => UniTask.ToCoroutine(async () => { @@ -33,12 +40,17 @@ namespace Cysharp.Threading.TasksTests [UnityTest] public IEnumerator PreserveAllowTwice() => UniTask.ToCoroutine(async () => { + await UniTask.Yield(PlayerLoopTiming.Update); + var delay = UniTask.DelayFrame(5, PlayerLoopTiming.PostLateUpdate).Preserve(); - var before = UnityEngine.Time.frameCount; + + var before = UnityEngine.Time.frameCount; // 0 + await delay; - var afterOne = UnityEngine.Time.frameCount; + var afterOne = UnityEngine.Time.frameCount; // 5 + await delay; - var afterTwo = UnityEngine.Time.frameCount; + var afterTwo = UnityEngine.Time.frameCount; // 5 (afterOne - before).Should().Be(5); afterOne.Should().Be(afterTwo); diff --git a/src/UniTask/Assets/Tests/UniTask.Tests.asmdef b/src/UniTask/Assets/Tests/UniTask.Tests.asmdef index e54ef84..44ea8e0 100644 --- a/src/UniTask/Assets/Tests/UniTask.Tests.asmdef +++ b/src/UniTask/Assets/Tests/UniTask.Tests.asmdef @@ -5,7 +5,8 @@ "UnityEditor.TestRunner", "UniTask", "Unity.ResourceManager", - "DOTween.Modules" + "DOTween.Modules", + "UniTask.Linq" ], "includePlatforms": [], "excludePlatforms": [],