< 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_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
 47331        public WorldSceneObjectsTrackingHelper (DataStore dataStore, string sceneId)
 32        {
 47333            logger.Log("A wild WorldSceneObjectsTrackingHelper appears!");
 47334            this.dataStore = dataStore;
 47335            this.sceneId = sceneId;
 36
 47337            if (dataStore.sceneWorldObjects.sceneData.ContainsKey(sceneId))
 038                SetSceneData(dataStore.sceneWorldObjects.sceneData[sceneId]);
 39
 47340            dataStore.sceneWorldObjects.sceneData.OnAdded += OnSceneAdded;
 47341            dataStore.sceneWorldObjects.sceneData.OnRemoved += OnSceneRemoved;
 47342        }
 43
 44        private void OnSceneRemoved(string sceneId, DataStore_WorldObjects.SceneData arg2)
 45        {
 17346            if ( sceneId != this.sceneId )
 047                return;
 48
 49            // Set dummy scene data so null reference exceptions are avoided.
 17350            logger.Log($"Scene {sceneId} was removed! Using dummy scene data.");
 17351            SetSceneData( new DataStore_WorldObjects.SceneData() );
 17352        }
 53
 54        private void OnSceneAdded(string sceneId, DataStore_WorldObjects.SceneData sceneData)
 55        {
 21656            if ( sceneId != this.sceneId )
 057                return;
 58
 21659            logger.Log($"Scene {sceneId} was added!");
 21660            SetSceneData( sceneData );
 21661        }
 62
 63        private void SetSceneData(DataStore_WorldObjects.SceneData sceneData)
 64        {
 38965            Assert.IsNotNull(sceneData, "sceneData should never be null!");
 66
 38967            if ( sceneData == this.sceneData )
 068                return;
 69
 38970            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.
 23076                this.sceneData.renderedObjects.OnAdded -= OnRenderedObjectsAdded;
 23077                this.sceneData.renderedObjects.OnRemoved -= OnRenderedObjectsRemoved;
 78            }
 79
 38980            logger.Log($"Subscribing events for {sceneId}.");
 38981            sceneData.renderedObjects.OnAdded += OnRenderedObjectsAdded;
 38982            sceneData.renderedObjects.OnRemoved += OnRenderedObjectsRemoved;
 83
 38984            this.sceneData = sceneData;
 38985        }
 86
 87        private void OnRenderedObjectsRemoved(Rendereable rendereable)
 88        {
 23789            logger.Log($"Removing rendereable.");
 23790            OnWillRemoveRendereable?.Invoke(rendereable);
 10291        }
 92
 93        private void OnRenderedObjectsAdded(Rendereable rendereable)
 94        {
 28395            logger.Log($"Adding rendereable.");
 28396            OnWillAddRendereable?.Invoke(rendereable);
 28397        }
 98
 99        public void Dispose()
 100        {
 473101            if ( sceneData == null )
 314102                return;
 103
 159104            sceneData.renderedObjects.OnAdded -= OnRenderedObjectsAdded;
 159105            sceneData.renderedObjects.OnRemoved -= OnRenderedObjectsRemoved;
 106
 159107            dataStore.sceneWorldObjects.sceneData.OnAdded -= OnSceneAdded;
 159108            dataStore.sceneWorldObjects.sceneData.OnRemoved -= OnSceneRemoved;
 159109            logger.Log($"Disposing.");
 159110        }
 111    }
 112}