< Summary

Class:Tests.SceneTests
Assembly:SceneTests
File(s):/tmp/workspace/unity-renderer/unity-renderer/Assets/Scripts/MainScripts/DCL/Controllers/Scene/Tests/SceneTests.cs
Covered lines:160
Uncovered lines:25
Coverable lines:185
Total lines:414
Line coverage:86.4% (160 of 185)
Covered branches:0
Total branches:0

Metrics

MethodBranch coverage Crap Score Cyclomatic complexity NPath complexity Sequence coverage
SetUp()0%330100%
CreateGlobalScene()0%440100%
ParcelScene_TrackDisposables_AfterInitDone()0%110100%
ParcelScene_TrackDisposables_Empty()0%110100%
PerformanceLimitControllerTests()0%10100100%
AssertMetricsModel(...)0%110100%
SceneLoading()0%330100%
SceneUnloading()0%7.067089.47%
SeveralParcelsFromJSON()0%11110100%
PositionParcels()0%440100%
PositionParcels2()0%440100%
ParcelScene_TrackDisposables_OneGLTF()0%12300%
ParcelScene_TrackDisposables_BeforeInitDone()0%2100%
ParcelScene_TrackDisposables_InstantReadyDisposable()0%12300%
ParcelScene_SetEntityParent()0%110100%

File(s)

/tmp/workspace/unity-renderer/unity-renderer/Assets/Scripts/MainScripts/DCL/Controllers/Scene/Tests/SceneTests.cs

#LineLine coverage
 1using DCL;
 2using DCL.Components;
 3using DCL.Configuration;
 4using DCL.Controllers;
 5using DCL.Helpers;
 6using DCL.Models;
 7using Newtonsoft.Json;
 8using NUnit.Framework;
 9using System.Collections;
 10using System.Collections.Generic;
 11using System.Linq;
 12using UnityEngine;
 13using UnityEngine.TestTools;
 14
 15namespace Tests
 16{
 17    public class SceneTests : IntegrationTestSuite_Legacy
 18    {
 019        protected override bool enableSceneIntegrityChecker => false;
 20
 21        protected override IEnumerator SetUp()
 22        {
 1023            yield return base.SetUp();
 1024            Environment.i.platform.debugController.SetDebug();
 1025            DCL.Configuration.EnvironmentSettings.DEBUG = true;
 1026        }
 27
 28        [UnityTest]
 29        public IEnumerator CreateGlobalScene()
 30        {
 31            // Position character inside parcel (0,0)
 132            TestHelpers.SetCharacterPosition(Vector3.zero);
 33
 134            string sceneGameObjectNamePrefix = "Global Scene - ";
 135            string sceneId = "Test Global Scene";
 136            sceneController.CreateGlobalScene(JsonUtility.ToJson(new CreateGlobalSceneMessage() { id = sceneId }));
 37
 138            GameObject sceneGo = GameObject.Find(sceneGameObjectNamePrefix + sceneId);
 39
 140            GlobalScene globalScene = Environment.i.world.state.loadedScenes[sceneId] as GlobalScene;
 41
 142            Assert.IsTrue(globalScene != null, "Scene isn't a GlobalScene?");
 143            Assert.IsTrue(sceneGo != null, "scene game object not found!");
 144            Assert.IsTrue(Environment.i.world.state.loadedScenes[sceneId] != null, "Scene not in loaded dictionary!");
 145            Assert.IsTrue(globalScene.unloadWithDistance == false,
 46                "Scene will unload when far!");
 47
 148            Assert.IsTrue(globalScene.IsInsideSceneBoundaries(new Vector2Int(1000, 1000)),
 49                "IsInsideSceneBoundaries() should always return true.");
 150            Assert.IsTrue(globalScene.IsInsideSceneBoundaries(new Vector2Int(-1000, -1000)),
 51                "IsInsideSceneBoundaries() should always return true.");
 52
 153            yield return null;
 54
 55            // Position character inside parcel (0,0)
 156            TestHelpers.SetCharacterPosition(new Vector3(100f, 0f, 100f));
 57
 158            yield return null;
 59
 160            sceneGo = GameObject.Find(sceneGameObjectNamePrefix + sceneId);
 61
 162            Assert.IsTrue(sceneGo != null, "scene game object not found! GlobalScenes must not be unloaded by distance!"
 163            Assert.IsTrue(Environment.i.world.state.loadedScenes[sceneId] != null,
 64                "Scene not in loaded dictionary when far! GlobalScenes must not be unloaded by distance!");
 165        }
 66
 67        [Test]
 68        public void ParcelScene_TrackDisposables_AfterInitDone()
 69        {
 170            SetUp_TestScene();
 171            TestHelpers.CreateEntityWithBoxShape(scene, Vector3.zero, true);
 172            TestHelpers.CreateEntityWithBoxShape(scene, Vector3.zero, true);
 173            TestHelpers.CreateEntityWithBoxShape(scene, Vector3.zero, true);
 74
 175            scene.sceneLifecycleHandler.SetInitMessagesDone();
 76
 177            Assert.AreEqual(0, scene.sceneLifecycleHandler.disposableNotReadyCount);
 178        }
 79
 80        [Test]
 81        public void ParcelScene_TrackDisposables_Empty()
 82        {
 183            SetUp_TestScene();
 184            Assert.AreEqual(0, scene.sceneLifecycleHandler.disposableNotReadyCount);
 185        }
 86
 87        [UnityTest]
 88        public IEnumerator PerformanceLimitControllerTests()
 89        {
 190            yield return new WaitForAllMessagesProcessed();
 91
 192            var scenesToLoad = (Resources.Load("TestJSON/SceneLoadingTest") as TextAsset).text;
 193            sceneController.LoadParcelScenes(scenesToLoad);
 94
 195            yield return new WaitForAllMessagesProcessed();
 96
 197            string loadedSceneID = "0,0";
 198            Assert.IsTrue(Environment.i.world.state.loadedScenes.ContainsKey(loadedSceneID));
 99
 1100            ParcelScene scene = Environment.i.world.state.loadedScenes[loadedSceneID] as ParcelScene;
 101
 1102            var coneShape = TestHelpers.SharedComponentCreate<ConeShape, ConeShape.Model>(scene, DCL.Models.CLASS_ID.CON
 103            {
 104                radiusTop = 1,
 105                radiusBottom = 0
 106            });
 107
 1108            var planeShape = TestHelpers.SharedComponentCreate<PlaneShape, PlaneShape.Model>(scene, DCL.Models.CLASS_ID.
 109            {
 110                height = 1.5f,
 111                width = 1
 112            });
 113
 114
 1115            var shapeEntity = TestHelpers.CreateSceneEntity(scene);
 1116            TestHelpers.SetEntityTransform(scene, shapeEntity, Vector3.one, Quaternion.identity, Vector3.one);
 1117            TestHelpers.SharedComponentAttach(coneShape, shapeEntity);
 118
 1119            TestHelpers.UpdateShape(scene, coneShape.id, JsonUtility.ToJson(new ConeShape.Model()
 120            {
 121                segmentsRadial = 180,
 122                segmentsHeight = 1.5f
 123            }));
 124
 1125            TestHelpers.DetachSharedComponent(scene, shapeEntity.entityId, coneShape.id);
 1126            TestHelpers.SharedComponentAttach(planeShape, shapeEntity);
 127
 1128            var lanternEntity = TestHelpers.CreateSceneEntity(scene);
 1129            var lanternShape = TestHelpers.AttachGLTFShape(lanternEntity, scene, new Vector3(8, 1, 8), new LoadableShape
 130            {
 131                src = TestAssetsUtils.GetPath() + "/GLB/Trunk/Trunk.glb"
 132            });
 1133            yield return TestHelpers.WaitForGLTFLoad(lanternEntity);
 134
 1135            var cesiumManEntity = TestHelpers.CreateSceneEntity(scene);
 1136            var cesiumManShape = TestHelpers.AttachGLTFShape(cesiumManEntity, scene, new Vector3(8, 1, 8), new LoadableS
 137            {
 138                src = TestAssetsUtils.GetPath() + "/GLB/Shark/shark_anim.gltf"
 139            });
 1140            yield return TestHelpers.WaitForGLTFLoad(cesiumManEntity);
 141
 1142            TestHelpers.RemoveSceneEntity(scene, lanternEntity);
 1143            yield return null;
 144
 1145            TestHelpers.DetachSharedComponent(scene, cesiumManEntity.entityId, cesiumManShape.id);
 1146            cesiumManShape = TestHelpers.AttachGLTFShape(cesiumManEntity, scene, new Vector3(8, 1, 8), new LoadableShape
 147            {
 148                src = TestAssetsUtils.GetPath() + "/GLB/Trunk/Trunk.glb"
 149            });
 1150            yield return TestHelpers.WaitForGLTFLoad(cesiumManEntity);
 151
 1152            TestHelpers.InstantiateEntityWithShape(scene, "1", DCL.Models.CLASS_ID.BOX_SHAPE, new Vector3(8, 1, 8));
 1153            TestHelpers.InstantiateEntityWithShape(scene, "2", DCL.Models.CLASS_ID.SPHERE_SHAPE, new Vector3(8, 1, 8));
 154
 1155            AssertMetricsModel(scene,
 156                triangles: 1126,
 157                materials: 2,
 158                entities: 4,
 159                meshes: 4,
 160                bodies: 4,
 161                textures: 0);
 162
 1163            TestHelpers.RemoveSceneEntity(scene, "1");
 1164            TestHelpers.RemoveSceneEntity(scene, "2");
 1165            TestHelpers.RemoveSceneEntity(scene, cesiumManEntity);
 166
 1167            yield return null;
 168
 1169            AssertMetricsModel(scene,
 170                triangles: 4,
 171                materials: 1,
 172                entities: 1,
 173                meshes: 1,
 174                bodies: 1,
 175                textures: 0);
 176
 1177            sceneController.UnloadAllScenes();
 1178            yield return null;
 1179        }
 180
 181        void AssertMetricsModel(ParcelScene scene, int triangles, int materials, int entities, int meshes, int bodies,
 182            int textures)
 183        {
 2184            SceneMetricsModel inputModel = scene.metricsController.GetModel();
 185
 2186            Assert.AreEqual(triangles, inputModel.triangles, "Incorrect triangle count, was: " + triangles);
 2187            Assert.AreEqual(materials, inputModel.materials, "Incorrect materials count");
 2188            Assert.AreEqual(entities, inputModel.entities, "Incorrect entities count");
 2189            Assert.AreEqual(meshes, inputModel.meshes, "Incorrect geometries/meshes count");
 2190            Assert.AreEqual(bodies, inputModel.bodies, "Incorrect bodies count");
 2191            Assert.AreEqual(textures, inputModel.textures, "Incorrect textures count");
 2192        }
 193
 194        [UnityTest]
 195        public IEnumerator SceneLoading()
 196        {
 1197            sceneController.LoadParcelScenes((Resources.Load("TestJSON/SceneLoadingTest") as TextAsset).text);
 1198            yield return new WaitForAllMessagesProcessed();
 199
 1200            string loadedSceneID = "0,0";
 201
 1202            Assert.IsTrue(Environment.i.world.state.loadedScenes.ContainsKey(loadedSceneID));
 1203            Assert.IsTrue(Environment.i.world.state.loadedScenes[loadedSceneID] != null);
 1204        }
 205
 206        [UnityTest]
 207        public IEnumerator SceneUnloading()
 208        {
 1209            sceneController.LoadParcelScenes((Resources.Load("TestJSON/SceneLoadingTest") as TextAsset).text);
 210
 1211            yield return new WaitForAllMessagesProcessed();
 212
 1213            string loadedSceneID = "0,0";
 214
 1215            Assert.IsTrue(Environment.i.world.state.loadedScenes.ContainsKey(loadedSceneID));
 216
 1217            var loadedScene = Environment.i.world.state.loadedScenes[loadedSceneID] as ParcelScene;
 218            // Add 1 entity to the loaded scene
 1219            TestHelpers.CreateSceneEntity(loadedScene, "6");
 220
 1221            var sceneEntities = loadedScene.entities;
 222
 1223            sceneController.UnloadScene(loadedSceneID);
 224
 1225            yield return new WaitForAllMessagesProcessed();
 1226            yield return new WaitForSeconds(0.1f);
 227
 1228            Assert.IsTrue(Environment.i.world.state.loadedScenes.ContainsKey(loadedSceneID) == false);
 229
 1230            Assert.IsTrue(loadedScene == null, "Scene root gameobject reference is not getting destroyed.");
 231
 2232            foreach (var entity in sceneEntities)
 233            {
 0234                Assert.IsFalse(entity.Value.gameObject.activeInHierarchy, "Every entity should be disabled after returni
 235            }
 236
 1237            sceneController.UnloadAllScenes(includePersistent: true);
 238
 1239            yield return null;
 1240        }
 241
 242        [UnityTest]
 243        public IEnumerator SeveralParcelsFromJSON()
 244        {
 1245            string severalParcelsJson = (Resources.Load("TestJSON/TestSceneSeveralParcels") as TextAsset).text;
 246
 247            //Not really elegant, but does the trick
 1248            var jsonScenes = JsonConvert
 249                             .DeserializeObject<LoadParcelScenesMessage.UnityParcelScene[]>(severalParcelsJson)
 22250                             .Select(x => JsonUtility.ToJson(x));
 251
 1252            Assert.AreEqual(Environment.i.world.state.loadedScenes.Count, 1);
 253
 24254            foreach (string jsonScene in jsonScenes)
 255            {
 11256                sceneController.LoadParcelScenes(jsonScene);
 257            }
 258
 1259            yield return new WaitForAllMessagesProcessed();
 260
 1261            var referenceCheck = new List<DCL.Controllers.ParcelScene>();
 262
 26263            foreach (var kvp in Environment.i.world.state.loadedScenes)
 264            {
 12265                referenceCheck.Add(kvp.Value as ParcelScene);
 266            }
 267
 1268            Assert.AreEqual(12, Environment.i.world.state.loadedScenes.Count);
 269
 24270            foreach (var jsonScene in jsonScenes)
 271            {
 11272                sceneController.LoadParcelScenes(jsonScene);
 273            }
 274
 1275            Assert.AreEqual(12, Environment.i.world.state.loadedScenes.Count);
 276
 26277            foreach (var reference in referenceCheck)
 278            {
 12279                Assert.IsTrue(Environment.i.world.state.loadedScenes.ContainsValue(reference), "References must be the s
 280            }
 281
 1282            sceneController.UnloadAllScenes(includePersistent: true);
 1283            yield return null;
 1284        }
 285
 286        [UnityTest]
 287        public IEnumerator PositionParcels()
 288        {
 1289            Assert.AreEqual(1, Environment.i.world.state.loadedScenes.Count);
 290
 1291            var jsonMessageToLoad = "{\"id\":\"xxx\",\"basePosition\":{\"x\":0,\"y\":0},\"parcels\":[{\"x\":-1,\"y\":0},
 1292            sceneController.LoadParcelScenes(jsonMessageToLoad);
 293
 1294            yield return new WaitForAllMessagesProcessed();
 295
 1296            Assert.AreEqual(2, Environment.i.world.state.loadedScenes.Count);
 297
 1298            var theScene = Environment.i.world.state.loadedScenes["xxx"];
 1299            yield return null;
 300
 1301            Assert.AreEqual(3, theScene.sceneData.parcels.Length);
 1302            Assert.AreEqual(3, theScene.GetSceneTransform().childCount);
 303
 1304            Assert.IsTrue(theScene.GetSceneTransform().GetChild(0).localPosition == new Vector3(-ParcelSettings.PARCEL_S
 305                DCL.Configuration.ParcelSettings.DEBUG_FLOOR_HEIGHT, ParcelSettings.PARCEL_SIZE / 2));
 1306            Assert.IsTrue(theScene.GetSceneTransform().GetChild(1).localPosition == new Vector3(ParcelSettings.PARCEL_SI
 307                DCL.Configuration.ParcelSettings.DEBUG_FLOOR_HEIGHT, ParcelSettings.PARCEL_SIZE / 2));
 1308            Assert.IsTrue(theScene.GetSceneTransform().GetChild(2).localPosition == new Vector3(-ParcelSettings.PARCEL_S
 309                DCL.Configuration.ParcelSettings.DEBUG_FLOOR_HEIGHT,
 310                ParcelSettings.PARCEL_SIZE + ParcelSettings.PARCEL_SIZE / 2));
 1311        }
 312
 313        [UnityTest]
 314        public IEnumerator PositionParcels2()
 315        {
 1316            Assert.AreEqual(1, Environment.i.world.state.loadedScenes.Count);
 317
 1318            var jsonMessageToLoad = "{\"id\":\"xxx\",\"basePosition\":{\"x\":90,\"y\":90},\"parcels\":[{\"x\":89,\"y\":9
 1319            sceneController.LoadParcelScenes(jsonMessageToLoad);
 320
 1321            yield return new WaitForAllMessagesProcessed();
 322
 1323            Assert.AreEqual(2, Environment.i.world.state.loadedScenes.Count);
 324
 1325            var theScene = Environment.i.world.state.loadedScenes["xxx"] as ParcelScene;
 1326            yield return null;
 327
 1328            Assert.AreEqual(3, theScene.sceneData.parcels.Length);
 1329            Assert.AreEqual(3, theScene.transform.childCount);
 330
 1331            Assert.IsTrue(theScene.transform.GetChild(0).localPosition == new Vector3(-ParcelSettings.PARCEL_SIZE / 2,
 332                DCL.Configuration.ParcelSettings.DEBUG_FLOOR_HEIGHT, ParcelSettings.PARCEL_SIZE / 2));
 1333            Assert.IsTrue(theScene.transform.GetChild(1).localPosition == new Vector3(ParcelSettings.PARCEL_SIZE / 2,
 334                DCL.Configuration.ParcelSettings.DEBUG_FLOOR_HEIGHT, ParcelSettings.PARCEL_SIZE / 2));
 1335            Assert.IsTrue(theScene.transform.GetChild(2).localPosition == new Vector3(-ParcelSettings.PARCEL_SIZE / 2,
 336                DCL.Configuration.ParcelSettings.DEBUG_FLOOR_HEIGHT,
 337                ParcelSettings.PARCEL_SIZE + ParcelSettings.PARCEL_SIZE / 2));
 1338        }
 339
 340        [UnityTest]
 341        [Explicit]
 342        [Category("Explicit")]
 343        public IEnumerator ParcelScene_TrackDisposables_OneGLTF()
 344        {
 0345            SetUp_TestScene();
 0346            var entity = TestHelpers.CreateSceneEntity(scene);
 347
 0348            TestHelpers.AttachGLTFShape(entity, scene, Vector3.zero, new LoadableShape.Model()
 349            {
 350                src = TestAssetsUtils.GetPath() + "/GLB/Lantern/Lantern.glb"
 351            });
 352
 0353            Assert.AreEqual(1, scene.sceneLifecycleHandler.disposableNotReadyCount);
 0354            scene.sceneLifecycleHandler.SetInitMessagesDone();
 0355            Assert.AreEqual(1, scene.sceneLifecycleHandler.disposableNotReadyCount);
 0356            yield return TestHelpers.WaitForGLTFLoad(entity);
 0357            Assert.AreEqual(0, scene.sceneLifecycleHandler.disposableNotReadyCount);
 0358        }
 359
 360        [Test]
 361        [Explicit]
 362        [Category("Explicit")]
 363        public void ParcelScene_TrackDisposables_BeforeInitDone()
 364        {
 0365            SetUp_TestScene();
 0366            TestHelpers.CreateEntityWithBoxShape(scene, Vector3.zero, true);
 0367            TestHelpers.CreateEntityWithBoxShape(scene, Vector3.zero, true);
 0368            TestHelpers.CreateEntityWithBoxShape(scene, Vector3.zero, true);
 369
 0370            Assert.AreEqual(3, scene.sceneLifecycleHandler.disposableNotReadyCount);
 0371        }
 372
 373        [UnityTest]
 374        [Explicit]
 375        [Category("Explicit")]
 376        public IEnumerator ParcelScene_TrackDisposables_InstantReadyDisposable()
 377        {
 0378            SetUp_TestScene();
 0379            var boxShape = TestHelpers.CreateEntityWithBoxShape(scene, Vector3.zero, true);
 0380            Assert.AreEqual(1, scene.sceneLifecycleHandler.disposableNotReadyCount);
 0381            scene.sceneLifecycleHandler.SetInitMessagesDone();
 0382            Assert.AreEqual(0, scene.sceneLifecycleHandler.disposableNotReadyCount);
 0383            yield return boxShape.routine;
 0384            Assert.AreEqual(0, scene.sceneLifecycleHandler.disposableNotReadyCount);
 0385        }
 386
 387        [Test]
 388        public void ParcelScene_SetEntityParent()
 389        {
 1390            SetUp_TestScene();
 1391            var entityId = "entityId";
 1392            var entity = TestHelpers.CreateSceneEntity(scene, entityId);
 393
 394            // Make sure that it doesn't have a parent
 1395            Assert.IsNull(entity.parent);
 1396            Assert.IsFalse(Environment.i.world.sceneBoundsChecker.WasAddedAsPersistent(entity));
 397
 398            // Set player reference as parent
 1399            TestHelpers.SetEntityParent(scene, entityId, "FirstPersonCameraEntityReference");
 1400            Assert.AreEqual(entity.parent, DCLCharacterController.i.firstPersonCameraReference);
 1401            Assert.IsTrue(Environment.i.world.sceneBoundsChecker.WasAddedAsPersistent(entity));
 402
 403            // Set avatar position reference as parent
 1404            TestHelpers.SetEntityParent(scene, entityId, "AvatarEntityReference");
 1405            Assert.AreEqual(entity.parent, DCLCharacterController.i.avatarReference);
 1406            Assert.IsTrue(Environment.i.world.sceneBoundsChecker.WasAddedAsPersistent(entity));
 407
 408            // Remove all parents
 1409            TestHelpers.SetEntityParent(scene, entityId, "0");
 1410            Assert.IsNull(entity.parent);
 1411            Assert.IsFalse(Environment.i.world.sceneBoundsChecker.WasAddedAsPersistent(entity));
 1412        }
 413    }
 414}