< Summary

Class:DCL.WorldSceneObjectsTrackingHelper
Assembly:DataStore_Rendering_Extensions
File(s):/tmp/workspace/unity-renderer/unity-renderer/Assets/Scripts/MainScripts/DCL/Helpers/DataStore_Rendering_Extensions/WorldSceneObjectsTrackingHelper.cs
Covered lines:42
Uncovered lines:5
Coverable lines:47
Total lines:112
Line coverage:89.3% (42 of 47)
Covered branches:0
Total branches:0

Metrics

MethodBranch coverage Crap Score Cyclomatic complexity NPath complexity Sequence coverage
WorldSceneObjectsTrackingHelper()0%330100%
WorldSceneObjectsTrackingHelper(...)0%2.012088.89%
OnSceneRemoved(...)0%2.032080%
OnSceneAdded(...)0%2.032080%
SetSceneData(...)0%3.013090.91%
OnRenderedObjectsRemoved(...)0%220100%
OnRenderedObjectsAdded(...)0%220100%
Dispose()0%220100%

File(s)

/tmp/workspace/unity-renderer/unity-renderer/Assets/Scripts/MainScripts/DCL/Helpers/DataStore_Rendering_Extensions/WorldSceneObjectsTrackingHelper.cs

#LineLine coverage
 1using System;
 2using UnityEngine;
 3using UnityEngine.Assertions;
 4
 5namespace DCL
 6{
 7    /// <summary>
 8    /// This class wraps around the DataStore's DataStore_WorldObjects instance.
 9    ///
 10    /// The DataStore_WorldObjects scene data objects must be removed aggressively when the
 11    /// DataStore_WorldObjects.SceneData is empty, right after the last object is removed.
 12    ///
 13    /// The DataStore_WorldObjects.SceneData objects can't be removed just when the scene is
 14    /// unloaded because the underlying assets are removed lazily (i.e. by ParcelScenesCleaner).
 15    ///
 16    /// This helper ensures that any events persist even in the case of the scene being removed and then
 17    /// added due to the last object being removed and then added again.
 18    /// </summary>
 19    public class WorldSceneObjectsTrackingHelper : IDisposable
 20    {
 121        private static bool VERBOSE = false;
 122        private static ILogger logger = new Logger(Debug.unityLogger.logHandler) { filterLogType = VERBOSE ? LogType.Log
 23
 024        public DataStore.DataStore_WorldObjects.SceneData sceneData { get; private set; }
 25        public event Action<Rendereable> OnWillAddRendereable;
 26        public event Action<Rendereable> OnWillRemoveRendereable;
 27
 28        private string sceneId;
 29        private DataStore dataStore;
 30
 71031        public WorldSceneObjectsTrackingHelper (DataStore dataStore, string sceneId)
 32        {
 71033            logger.Log("A wild WorldSceneObjectsTrackingHelper appears!");
 71034            this.dataStore = dataStore;
 71035            this.sceneId = sceneId;
 36
 71037            if (dataStore.sceneWorldObjects.sceneData.ContainsKey(sceneId))
 038                SetSceneData(dataStore.sceneWorldObjects.sceneData[sceneId]);
 39
 71040            dataStore.sceneWorldObjects.sceneData.OnAdded += OnSceneAdded;
 71041            dataStore.sceneWorldObjects.sceneData.OnRemoved += OnSceneRemoved;
 71042        }
 43
 44        private void OnSceneRemoved(string sceneId, DataStore.DataStore_WorldObjects.SceneData arg2)
 45        {
 20446            if ( sceneId != this.sceneId )
 047                return;
 48
 49            // Set dummy scene data so null reference exceptions are avoided.
 20450            logger.Log($"Scene {sceneId} was removed! Using dummy scene data.");
 20451            SetSceneData( new DataStore.DataStore_WorldObjects.SceneData() );
 20452        }
 53
 54        private void OnSceneAdded(string sceneId, DataStore.DataStore_WorldObjects.SceneData sceneData)
 55        {
 21256            if ( sceneId != this.sceneId )
 057                return;
 58
 21259            logger.Log($"Scene {sceneId} was added!");
 21260            SetSceneData( sceneData );
 21261        }
 62
 63        private void SetSceneData(DataStore.DataStore_WorldObjects.SceneData sceneData)
 64        {
 41665            Assert.IsNotNull(sceneData, "sceneData should never be null!");
 66
 41667            if ( sceneData == this.sceneData )
 068                return;
 69
 41670            if ( this.sceneData != null )
 71            {
 72                // This should never happen because of how the flow works.
 73                //
 74                // Scenes with the same sceneId shouldn't ever be added twice, and if this happens
 75                // we have an early exit.
 26076                this.sceneData.renderedObjects.OnAdded -= OnRenderedObjectsAdded;
 26077                this.sceneData.renderedObjects.OnRemoved -= OnRenderedObjectsRemoved;
 78            }
 79
 41680            logger.Log($"Subscribing events for {sceneId}.");
 41681            sceneData.renderedObjects.OnAdded += OnRenderedObjectsAdded;
 41682            sceneData.renderedObjects.OnRemoved += OnRenderedObjectsRemoved;
 83
 41684            this.sceneData = sceneData;
 41685        }
 86
 87        private void OnRenderedObjectsRemoved(Rendereable rendereable)
 88        {
 27189            logger.Log($"Removing rendereable.");
 27190            OnWillRemoveRendereable?.Invoke(rendereable);
 10191        }
 92
 93        private void OnRenderedObjectsAdded(Rendereable rendereable)
 94        {
 27895            logger.Log($"Adding rendereable.");
 27896            OnWillAddRendereable?.Invoke(rendereable);
 27897        }
 98
 99        public void Dispose()
 100        {
 710101            if ( sceneData == null )
 554102                return;
 103
 156104            sceneData.renderedObjects.OnAdded -= OnRenderedObjectsAdded;
 156105            sceneData.renderedObjects.OnRemoved -= OnRenderedObjectsRemoved;
 106
 156107            dataStore.sceneWorldObjects.sceneData.OnAdded -= OnSceneAdded;
 156108            dataStore.sceneWorldObjects.sceneData.OnRemoved -= OnSceneRemoved;
 156109            logger.Log($"Disposing.");
 156110        }
 111    }
 112}