< Summary

Class:DCL.ECSRuntime.ECSComponent[ModelType]
Assembly:DCL.ECSRuntime.Components
File(s):/tmp/workspace/unity-renderer/unity-renderer/Assets/Scripts/MainScripts/DCL/WorldRuntime/ECSRuntime/Components/ECSComponent.cs
Covered lines:37
Uncovered lines:4
Coverable lines:41
Total lines:144
Line coverage:90.2% (37 of 41)
Covered branches:0
Total branches:0

Metrics

MethodBranch coverage Crap Score Cyclomatic complexity NPath complexity Sequence coverage
ECSComponent(...)0%110100%
Create(...)0%5.25080%
Remove(...)0%220100%
SetModel(...)0%3.023087.5%
Deserialize(...)0%110100%
HasComponent(...)0%110100%
Get(...)0%2.152066.67%
Get()0%440100%

File(s)

/tmp/workspace/unity-renderer/unity-renderer/Assets/Scripts/MainScripts/DCL/WorldRuntime/ECSRuntime/Components/ECSComponent.cs

#LineLine coverage
 1using System;
 2using System.Collections.Generic;
 3using DCL.Controllers;
 4using DCL.Models;
 5using UnityEngine;
 6
 7namespace DCL.ECSRuntime
 8{
 9    public class ECSComponent<ModelType> : IECSComponent
 10    {
 1611        internal Dictionary<long, ECSComponentData<ModelType>> entities = new Dictionary<long, ECSComponentData<ModelTyp
 1612        internal Dictionary<long, IECSComponentHandler<ModelType>> handlers = new Dictionary<long, IECSComponentHandler<
 13
 14        private readonly Func<IECSComponentHandler<ModelType>> handlerBuilder;
 15        private readonly Func<object, ModelType> deserializer;
 16        private readonly IParcelScene scene;
 17
 1618        public ECSComponent(IParcelScene scene, Func<object, ModelType> deserializer, Func<IECSComponentHandler<ModelTyp
 19        {
 1620            this.scene = scene;
 1621            this.deserializer = deserializer;
 1622            this.handlerBuilder = handlerBuilder;
 1623        }
 24
 25        /// <summary>
 26        /// creates and add component to an entity
 27        /// </summary>
 28        /// <param name="entity">target entity</param>
 29        public void Create(IDCLEntity entity)
 30        {
 4631            var entityId = entity.entityId;
 32
 4633            if (entities.ContainsKey(entityId))
 34            {
 035                Debug.LogError($"entity {entityId} already contains component {typeof(ModelType)}", entity.gameObject);
 036                return;
 37            }
 38
 4639            entities[entityId] = new ECSComponentData<ModelType>()
 40            {
 41                entity = entity,
 42                model = default,
 43                scene = scene
 44            };
 45
 4646            var handler = handlerBuilder?.Invoke();
 47
 4648            if (handler != null)
 49            {
 4650                handlers[entityId] = handler;
 4651                handler.OnComponentCreated(scene, entity);
 52            }
 4653        }
 54
 55        /// <summary>
 56        /// remove component from entity
 57        /// </summary>
 58        /// <param name="entity">target entity</param>
 59        /// <returns>true if component removed successfully, false if entity didn't contain component</returns>
 60        public bool Remove(IDCLEntity entity)
 61        {
 3462            var entityId = entity.entityId;
 3463            if (handlers.TryGetValue(entityId, out IECSComponentHandler<ModelType> handler))
 64            {
 3465                handler.OnComponentRemoved(scene, entity);
 66            }
 3467            handlers.Remove(entityId);
 3468            return entities.Remove(entityId);
 69        }
 70
 71        /// <summary>
 72        /// set component model for entity
 73        /// </summary>
 74        /// <param name="entity">target entity</param>
 75        /// <param name="model">new model</param>
 76        public void SetModel(IDCLEntity entity, ModelType model)
 77        {
 3978            var entityId = entity.entityId;
 3979            if (entities.TryGetValue(entity.entityId, out ECSComponentData<ModelType> data))
 80            {
 3981                data.model = model;
 3982            }
 83            else
 84            {
 085                Debug.LogError($"trying to update model but entity {entityId} does not contains component {typeof(ModelT
 86                    entity.gameObject);
 87            }
 88
 3989            if (handlers.TryGetValue(entityId, out IECSComponentHandler<ModelType> handler))
 90            {
 3991                handler.OnComponentModelUpdated(scene, entity, model);
 92            }
 3993        }
 94
 95        /// <summary>
 96        /// deserialize message and apply a new model for an entity
 97        /// </summary>
 98        /// <param name="entity">target entity</param>
 99        /// <param name="message">message</param>
 100        public void Deserialize(IDCLEntity entity, object message)
 101        {
 8102            SetModel(entity, deserializer.Invoke(message));
 8103        }
 104
 105        /// <summary>
 106        /// check if entity contains component
 107        /// </summary>
 108        /// <param name="entity">target entity</param>
 109        /// <returns>true if entity contains this component</returns>
 110        public bool HasComponent(IDCLEntity entity)
 111        {
 13112            return entities.ContainsKey(entity.entityId);
 113        }
 114
 115        /// <summary>
 116        /// get component data for an entity
 117        /// </summary>
 118        /// <param name="entity">target entity</param>
 119        /// <returns>component data, including model</returns>
 120        public ECSComponentData<ModelType> Get(IDCLEntity entity)
 121        {
 3122            if (entities.TryGetValue(entity.entityId, out ECSComponentData<ModelType> data))
 123            {
 3124                return data;
 125            }
 0126            return null;
 127        }
 128
 129        /// <summary>
 130        /// get every component data for every entity containing this component
 131        /// </summary>
 132        /// <returns>enumerator to iterate through the component data</returns>
 133        public IEnumerator<ECSComponentData<ModelType>> Get()
 134        {
 1135            using (var iterator = entities.GetEnumerator())
 136            {
 6137                while (iterator.MoveNext())
 138                {
 5139                    yield return iterator.Current.Value;
 140                }
 1141            }
 1142        }
 143    }
 144}