< Summary

Class:DCL.AssetPromise[AssetType]
Assembly:AssetPromiseKeeper
File(s):/tmp/workspace/unity-renderer/unity-renderer/Assets/Scripts/MainScripts/DCL/Controllers/AssetManager/Common/AssetPromise.cs
Covered lines:61
Uncovered lines:12
Coverable lines:73
Total lines:189
Line coverage:83.5% (61 of 73)
Covered branches:0
Total branches:0

Metrics

MethodBranch coverage Crap Score Cyclomatic complexity NPath complexity Sequence coverage
ClearEvents()0%2100%
ForceFail()0%110100%
SetWaitingState()0%2100%
CallAndClearEvents(...)0%660100%
Load()0%5.045088.24%
GetLibraryAssetCheckId()0%110100%
GetAsset(...)0%110100%
OnReuse(...)0%220100%
OnReuseFinished()0%110100%
OnLoadSuccess()0%2.092071.43%
OnLoadFailure()0%110100%
AddToLibrary()0%110100%
Unload()0%220100%
Cleanup()0%440100%
OnForget()0%110100%

File(s)

/tmp/workspace/unity-renderer/unity-renderer/Assets/Scripts/MainScripts/DCL/Controllers/AssetManager/Common/AssetPromise.cs

#LineLine coverage
 1using System;
 2using UnityEngine;
 3
 4namespace DCL
 5{
 6    public enum AssetPromiseState
 7    {
 8        IDLE_AND_EMPTY,
 9        WAITING,
 10        LOADING,
 11        FINISHED
 12    }
 13
 14    /// <summary>
 15    /// AssetPromise is in charge of handling all the logic related to loading the specified AssetType.
 16    /// It also should return the cached asset if applicable.
 17    ///
 18    /// If we need settings related to how the asset should be loaded/handled, we add them here.
 19    ///
 20    /// If we need many ways of loading the same Asset type, we can create different AssetPromise
 21    /// subclasses to do so. This can be useful to attach the GLTFSceneImporter loading logic for
 22    /// materials/textures to system.
 23    /// </summary>
 24    /// <typeparam name="AssetType">The Asset type to be loaded.</typeparam>
 25    public abstract class AssetPromise<AssetType> : CustomYieldInstruction
 26        where AssetType : Asset, new()
 27    {
 28        internal bool isDirty = false;
 29        internal AssetLibrary<AssetType> library;
 030        public AssetType asset { get; protected set; }
 31
 032        public AssetPromiseState state { get; protected set; }
 033        public bool isForgotten { get; protected set; }
 34
 35        internal event Action<AssetPromise<AssetType>> OnPreFinishEvent;
 36        public event Action<AssetType> OnSuccessEvent;
 37        public event Action<AssetType> OnFailEvent;
 38
 715339        public override bool keepWaiting { get { return state == AssetPromiseState.LOADING || state == AssetPromiseState
 40
 41        public void ClearEvents()
 42        {
 043            OnSuccessEvent = null;
 044            OnFailEvent = null;
 045        }
 46
 47        internal void ForceFail()
 48        {
 849            OnPreFinishEvent = null;
 850            CallAndClearEvents(false);
 851            state = AssetPromiseState.IDLE_AND_EMPTY;
 852        }
 53
 54        internal void SetWaitingState()
 55        {
 56            //TODO(Brian): This is made to make the promises yielding not return automatically when the promise is block
 57            //
 58            //             Managing the blocked promises handling entirely in the AssetPromiseKeeper is coupling the cod
 59            //             It's better to have a "WaitForPromise" method here and lighten the APK logic a bit. For now t
 060            state = AssetPromiseState.WAITING;
 061        }
 62
 63        protected void CallAndClearEvents(bool isSuccess = true)
 64        {
 39465            if (asset == null)
 66            {
 1767                isSuccess = false;
 68            }
 69
 39470            OnPreFinishEvent?.Invoke(this);
 39471            OnPreFinishEvent = null;
 72
 39473            Action<AssetType> finalEvent = isSuccess ? OnSuccessEvent : OnFailEvent;
 39474            finalEvent?.Invoke(asset);
 75
 39476            ClearEvents();
 39477        }
 78
 79        internal virtual void Load()
 80        {
 42581            if (state == AssetPromiseState.LOADING || state == AssetPromiseState.FINISHED)
 282                return;
 83
 42384            state = AssetPromiseState.LOADING;
 85
 86            // NOTE(Brian): Get existent library element
 42387            object libraryAssetCheckId = GetLibraryAssetCheckId();
 42388            if (library.Contains(libraryAssetCheckId))
 89            {
 13590                asset = GetAsset(libraryAssetCheckId);
 91
 13592                if (asset != null)
 93                {
 13594                    OnBeforeLoadOrReuse();
 13595                    OnReuse(OnReuseFinished);
 13596                }
 97                else
 98                {
 099                    CallAndClearEvents(false);
 100                }
 101
 0102                return;
 103            }
 104
 105            // NOTE(Brian): Get new library element
 288106            asset = new AssetType();
 288107            OnBeforeLoadOrReuse();
 288108            asset.id = GetId();
 109
 288110            OnLoad(OnLoadSuccess, OnLoadFailure);
 288111        }
 112
 332113        protected virtual object GetLibraryAssetCheckId() { return GetId(); }
 114
 117115        protected virtual AssetType GetAsset(object id) { return library.Get(id); }
 116
 164117        protected virtual void OnReuse(Action OnFinish) { OnFinish?.Invoke(); }
 118
 119        protected void OnReuseFinished()
 120        {
 133121            OnAfterLoadOrReuse();
 133122            state = AssetPromiseState.FINISHED;
 133123            CallAndClearEvents(isSuccess: true);
 133124        }
 125
 126        protected void OnLoadSuccess()
 127        {
 205128            if (AddToLibrary())
 129            {
 205130                OnAfterLoadOrReuse();
 205131                state = AssetPromiseState.FINISHED;
 205132                CallAndClearEvents(isSuccess: true);
 205133            }
 134            else
 135            {
 0136                OnLoadFailure();
 137            }
 0138        }
 139
 140        protected void OnLoadFailure()
 141        {
 48142            CallAndClearEvents(isSuccess: false);
 48143            Cleanup();
 48144        }
 145
 10146        protected virtual bool AddToLibrary() { return library.Add(asset); }
 147
 148        internal virtual void Unload()
 149        {
 272150            if (state == AssetPromiseState.IDLE_AND_EMPTY)
 22151                return;
 152
 250153            Cleanup();
 250154        }
 155
 156        public void Cleanup()
 157        {
 313158            if (state == AssetPromiseState.LOADING)
 159            {
 82160                OnCancelLoading();
 82161                ClearEvents();
 162            }
 163
 313164            state = AssetPromiseState.IDLE_AND_EMPTY;
 165
 313166            if (asset != null)
 167            {
 294168                if (library.Contains(asset))
 214169                    library.Release(asset);
 170                else
 80171                    asset.Cleanup();
 172
 294173                asset = null;
 174            }
 313175        }
 176
 177        internal virtual void OnForget()
 178        {
 558179            isForgotten = true;
 558180            ClearEvents();
 558181        }
 182
 183        protected abstract void OnCancelLoading();
 184        protected abstract void OnLoad(Action OnSuccess, Action OnFail);
 185        protected abstract void OnBeforeLoadOrReuse();
 186        protected abstract void OnAfterLoadOrReuse();
 187        public abstract object GetId();
 188    }
 189}