< Summary

Class:DCL.Helpers.UniTaskUtils
Assembly:UniTaskUtils
File(s):/tmp/workspace/unity-renderer/unity-renderer/Assets/Scripts/MainScripts/DCL/Helpers/Utils/TaskUtils/UniTaskUtils/UniTaskUtils.cs
Covered lines:35
Uncovered lines:7
Coverable lines:42
Total lines:118
Line coverage:83.3% (35 of 42)
Covered branches:0
Total branches:0
Covered methods:10
Total methods:11
Method coverage:90.9% (10 of 11)

Metrics

MethodBranch coverage Crap Score Cyclomatic complexity NPath complexity Sequence coverage
WaitForBoolean(...)0%110100%
Cysharp.Threading.Tasks.ITaskPoolNode<DCL.Helpers.UniTaskUtils.WaitForBooleanPromise>.get_NextNode()0%110100%
WaitForBooleanPromise()0%110100%
WaitForBooleanPromise()0%110100%
Create(...)0%3.013090.91%
GetResult(...)0%110100%
GetStatus(...)0%110100%
UnsafeGetStatus()0%2100%
OnCompleted(...)0%110100%
MoveNext()0%3.653058.33%
TryReturn()0%110100%

File(s)

/tmp/workspace/unity-renderer/unity-renderer/Assets/Scripts/MainScripts/DCL/Helpers/Utils/TaskUtils/UniTaskUtils/UniTaskUtils.cs

#LineLine coverage
 1using Cysharp.Threading.Tasks;
 2using System;
 3using System.Runtime.CompilerServices;
 4using System.Threading;
 5
 6[assembly: InternalsVisibleTo("TaskUtilsTests")]
 7
 8namespace DCL.Helpers
 9{
 10    public unsafe class UniTaskUtils
 11    {
 12        public static UniTask WaitForBoolean(ref bool reference, bool targetValue = true, PlayerLoopTiming timing = Play
 313        {
 14            // fixes the reference in memory within the block only
 315            fixed (bool* pointer = &reference)
 16            {
 17                // But Unity GC is non-compacting so it does not move references
 18                // Thus, it is safe to pass it and save as a class field
 319                return new UniTask(WaitForBooleanPromise.Create(pointer, targetValue, timing, cancellationToken, out var
 20            }
 21        }
 22
 23        internal sealed class WaitForBooleanPromise : IUniTaskSource, IPlayerLoopItem, ITaskPoolNode<WaitForBooleanPromi
 24        {
 25            internal static TaskPool<WaitForBooleanPromise> pool;
 26            private WaitForBooleanPromise nextNode;
 27
 528            ref WaitForBooleanPromise ITaskPoolNode<WaitForBooleanPromise>.NextNode => ref nextNode;
 29
 30            private CancellationToken cancellationToken;
 31
 32            private bool* pointer;
 33            private bool targetValue;
 34
 35            private UniTaskCompletionSourceCore<object> core;
 36
 37            static WaitForBooleanPromise()
 38            {
 139                TaskPool.RegisterSizeGetter(typeof(WaitForBooleanPromise), () => pool.Size);
 140            }
 41
 242            private WaitForBooleanPromise() { }
 43
 44            public static IUniTaskSource Create(bool* pointer, bool targetValue, PlayerLoopTiming timing, CancellationTo
 45            {
 346                if (cancellationToken.IsCancellationRequested)
 047                    return AutoResetUniTaskCompletionSource.CreateFromCanceled(cancellationToken, out token);
 48
 349                if (!pool.TryPop(out var result))
 150                    result = new WaitForBooleanPromise();
 51
 352                result.pointer = pointer;
 353                result.targetValue = targetValue;
 354                result.cancellationToken = cancellationToken;
 55
 356                TaskTracker.TrackActiveTask(result, 3);
 57
 358                PlayerLoopHelper.AddAction(timing, result);
 59
 360                token = result.core.Version;
 361                return result;
 62            }
 63
 64            public void GetResult(short token)
 65            {
 666                try { core.GetResult(token); }
 667                finally { TryReturn(); }
 368            }
 69
 70            public UniTaskStatus GetStatus(short token)
 71            {
 372                return core.GetStatus(token);
 73            }
 74
 75            public UniTaskStatus UnsafeGetStatus()
 76            {
 077                return core.UnsafeGetStatus();
 78            }
 79
 80            public void OnCompleted(Action<object> continuation, object state, short token)
 81            {
 382                core.OnCompleted(continuation, state, token);
 383            }
 84
 85            public bool MoveNext()
 86            {
 5987                if (cancellationToken.IsCancellationRequested)
 88                {
 089                    core.TrySetCanceled(cancellationToken);
 090                    return false;
 91                }
 92
 93                try
 94                {
 5995                    if (*pointer != targetValue)
 5696                        return true;
 397                }
 098                catch (Exception ex)
 99                {
 0100                    core.TrySetException(ex);
 0101                    return false;
 102                }
 103
 3104                core.TrySetResult(null);
 3105                return false;
 56106            }
 107
 108            bool TryReturn()
 109            {
 3110                TaskTracker.RemoveTracking(this);
 3111                core.Reset();
 3112                pointer = default;
 3113                cancellationToken = default;
 3114                return pool.TryPush(this);
 115            }
 116        }
 117    }
 118}