< Summary

Class:DCL.Components.DCLAudioClip
Assembly:MainScripts
File(s):/tmp/workspace/unity-renderer/unity-renderer/Assets/Scripts/MainScripts/DCL/Components/Audio/DCLAudioClip.cs
Covered lines:35
Uncovered lines:17
Coverable lines:52
Total lines:139
Line coverage:67.3% (35 of 52)
Covered branches:0
Total branches:0

Metrics

MethodBranch coverage Crap Score Cyclomatic complexity NPath complexity Sequence coverage
Model()0%110100%
GetDataFromJSON(...)0%110100%
DCLAudioClip()0%110100%
GetClassId()0%2100%
OnComplete(...)0%3.143075%
OnFail(...)0%6200%
TryToLoad()0%550100%
Unload()0%2100%
ApplyChanges()0%14.2512075%
Dispose()0%110100%

File(s)

/tmp/workspace/unity-renderer/unity-renderer/Assets/Scripts/MainScripts/DCL/Components/Audio/DCLAudioClip.cs

#LineLine coverage
 1using System;
 2using System.Collections;
 3using DCL.Helpers;
 4using DCL.Models;
 5using UnityEngine;
 6
 7namespace DCL.Components
 8{
 9    public class DCLAudioClip : BaseDisposable
 10    {
 11        [Serializable]
 12        public class Model : BaseModel
 13        {
 14            public string url;
 15            public bool loop = false;
 5016            public bool shouldTryToLoad = true;
 17
 18            [Range(0f, 1f)]
 5019            public double volume = 1f;
 20
 1721            public override BaseModel GetDataFromJSON(string json) { return Utils.SafeFromJson<Model>(json); }
 22        }
 23
 24        public AudioClip audioClip;
 25        private bool isDisposed = false;
 26        private AssetPromise_AudioClip audioClipPromise = null;
 27
 28        public enum LoadState
 29        {
 30            IDLE,
 31            LOADING_IN_PROGRESS,
 32            LOADING_FAILED,
 33            LOADING_COMPLETED,
 34        }
 35
 036        public LoadState loadingState { get; private set; }
 37        public event Action<DCLAudioClip> OnLoadingFinished;
 38
 1639        public DCLAudioClip()
 40        {
 1641            model = new Model();
 42
 1643            loadingState = LoadState.IDLE;
 1644        }
 45
 046        public double volume => ((Model) model).volume;
 47
 048        public bool isLoop => ((Model) model).loop;
 49
 050        public bool shouldTryLoad => ((Model) model).shouldTryToLoad;
 51
 052        public override int GetClassId() { return (int) CLASS_ID.AUDIO_CLIP; }
 53
 54        void OnComplete(Asset_AudioClip assetAudioClip)
 55        {
 1256            if (assetAudioClip.audioClip != null)
 57            {
 1258                this.audioClip = assetAudioClip.audioClip;
 1259                loadingState = LoadState.LOADING_COMPLETED;
 1260            }
 61            else
 62            {
 063                loadingState = LoadState.LOADING_FAILED;
 64            }
 65
 1266            if (OnLoadingFinished != null)
 67            {
 068                OnLoadingFinished.Invoke(this);
 69            }
 1270        }
 71
 72        void OnFail(Asset_AudioClip assetAudioClip)
 73        {
 074            loadingState = LoadState.LOADING_FAILED;
 75
 076            if (OnLoadingFinished != null)
 77            {
 078                OnLoadingFinished.Invoke(this);
 79            }
 080        }
 81
 82        IEnumerator TryToLoad()
 83        {
 1384            if (loadingState != LoadState.LOADING_IN_PROGRESS
 85                && loadingState != LoadState.LOADING_COMPLETED)
 86            {
 1387                loadingState = LoadState.LOADING_IN_PROGRESS;
 1388                Model model = (Model) this.model;
 89
 1390                audioClipPromise = new AssetPromise_AudioClip(model.url, scene.contentProvider);
 1391                audioClipPromise.OnSuccessEvent += OnComplete;
 1392                audioClipPromise.OnFailEvent += OnFail;
 93
 1394                AssetPromiseKeeper_AudioClip.i.Keep(audioClipPromise);
 95
 1396                yield return audioClipPromise;
 97            }
 1398        }
 99
 100        void Unload()
 101        {
 0102            loadingState = LoadState.IDLE;
 0103            AssetPromiseKeeper_AudioClip.i.Forget(audioClipPromise);
 0104        }
 105
 106        public override IEnumerator ApplyChanges(BaseModel newModel)
 107        {
 34108            yield return new WaitUntil(() => CommonScriptableObjects.rendererState.Get());
 109
 110            //If the scene creates and destroy the component before our renderer has been turned on bad things happen!
 111            //TODO: Analyze if we can catch this upstream and stop the IEnumerator
 17112            if (isDisposed)
 0113                yield break;
 114
 17115            Model model = (Model) newModel;
 116
 17117            if (!string.IsNullOrEmpty(model.url))
 118            {
 13119                if (model.shouldTryToLoad && audioClip == null)
 120                {
 13121                    yield return TryToLoad();
 13122                }
 0123                else if (!model.shouldTryToLoad && audioClip != null)
 124                {
 0125                    Unload();
 126                }
 127            }
 128
 17129            yield return null;
 17130        }
 131
 132        public override void Dispose()
 133        {
 16134            isDisposed = true;
 16135            AssetPromiseKeeper_AudioClip.i.Forget(audioClipPromise);
 16136            base.Dispose();
 16137        }
 138    }
 139}