< Summary

Class:DCL.Chat.HUD.PoolChatEntryFactory
Assembly:ChatHUD
File(s):/tmp/workspace/unity-renderer/unity-renderer/Assets/Scripts/MainScripts/DCL/Controllers/HUD/ChatWidgetHUD/PoolChatEntryFactory.cs
Covered lines:1
Uncovered lines:28
Coverable lines:29
Total lines:77
Line coverage:3.4% (1 of 29)
Covered branches:0
Total branches:0

Metrics

MethodBranch coverage Crap Score Cyclomatic complexity NPath complexity Sequence coverage
PoolChatEntryFactory()0%110100%
Create(...)0%72800%
Destroy(...)0%6200%
GetEntryFromPool(...)0%2100%
GetPool(...)0%6200%

File(s)

/tmp/workspace/unity-renderer/unity-renderer/Assets/Scripts/MainScripts/DCL/Controllers/HUD/ChatWidgetHUD/PoolChatEntryFactory.cs

#LineLine coverage
 1using System.Collections.Generic;
 2using DCL.Interface;
 3using UnityEngine;
 4
 5namespace DCL.Chat.HUD
 6{
 7    [CreateAssetMenu(fileName = "PoolChatEntryFactory", menuName = "DCL/Social/PoolChatEntryFactory")]
 8    public class PoolChatEntryFactory : ScriptableObject, IChatEntryFactory
 9    {
 10        private const string POOL_NAME_PREFIX = "ChatMessages_";
 11        private const int PRE_INSTANTIATED_ENTRIES = 30;
 12
 13        [SerializeField] private DefaultChatEntry defaultMessagePrefab;
 14        [SerializeField] private DefaultChatEntry systemMessagePrefab;
 15        [SerializeField] private DefaultChatEntry privateReceivedMessagePrefab;
 16        [SerializeField] private DefaultChatEntry privateSentMessagePrefab;
 17        [SerializeField] private DefaultChatEntry publicReceivedMessagePrefab;
 18        [SerializeField] private DefaultChatEntry publicSentMessagePrefab;
 19
 320        private readonly Dictionary<ChatEntry, PoolableObject> pooledObjects =
 21            new Dictionary<ChatEntry, PoolableObject>();
 22
 23        public ChatEntry Create(ChatEntryModel model)
 24        {
 025            if (model.messageType == ChatMessage.Type.SYSTEM)
 026                return GetEntryFromPool("SYSTEM", systemMessagePrefab);
 27
 028            if (model.messageType == ChatMessage.Type.PUBLIC)
 29            {
 030                if (model.subType == ChatEntryModel.SubType.RECEIVED)
 031                    return GetEntryFromPool("PUBLIC_RECEIVED", publicReceivedMessagePrefab);
 032                if (model.subType == ChatEntryModel.SubType.SENT)
 033                    return GetEntryFromPool("PUBLIC_SENT", publicSentMessagePrefab);
 34            }
 035            else if (model.messageType == ChatMessage.Type.PRIVATE)
 36            {
 037                if (model.subType == ChatEntryModel.SubType.RECEIVED)
 038                    return GetEntryFromPool("PRIVATE_RECEIVED", privateReceivedMessagePrefab);
 039                if (model.subType == ChatEntryModel.SubType.SENT)
 040                    return GetEntryFromPool("PRIVATE_SENT", privateSentMessagePrefab);
 41            }
 042            return GetEntryFromPool("DEFAULT", defaultMessagePrefab);
 43        }
 44
 45        public void Destroy(ChatEntry entry)
 46        {
 047            if (!pooledObjects.TryGetValue(entry, out var pooledObj)) return;
 048            pooledObj.Release();
 049            pooledObjects.Remove(entry);
 050        }
 51
 52        private DefaultChatEntry GetEntryFromPool(string poolName, DefaultChatEntry prefab)
 53        {
 054            var pool = GetPool(poolName, prefab);
 055            var pooledObj = pool.Get();
 056            var entry = pooledObj.gameObject.GetComponent<DefaultChatEntry>();
 057            pooledObjects[entry] = pooledObj;
 058            return entry;
 59        }
 60
 61        private Pool GetPool(string poolName, DefaultChatEntry prefab)
 62        {
 063            var poolId = POOL_NAME_PREFIX + poolName + GetInstanceID();
 064            var entryPool = PoolManager.i.GetPool(poolId);
 065            if (entryPool != null) return entryPool;
 66
 067            entryPool = PoolManager.i.AddPool(
 68                poolId,
 69                Instantiate(prefab).gameObject,
 70                maxPrewarmCount: PRE_INSTANTIATED_ENTRIES,
 71                isPersistent: true);
 072            entryPool.ForcePrewarm();
 73
 074            return entryPool;
 75        }
 76    }
 77}