< Summary

Class:AvatarReporterController
Assembly:AvatarReporterController
File(s):/tmp/workspace/unity-renderer/unity-renderer/Assets/Scripts/MainScripts/DCL/Components/Avatar/AvatarReporterController/Implementation/AvatarReporterController.cs
Covered lines:8
Uncovered lines:31
Coverable lines:39
Total lines:103
Line coverage:20.5% (8 of 39)
Covered branches:0
Total branches:0

Metrics

MethodBranch coverage Crap Score Cyclomatic complexity NPath complexity Sequence coverage
AvatarReporterController(...)0%110100%
get_reporter()0%2100%
set_reporter(...)0%2100%
SetUp(...)0%6200%
GetcurrentSceneNumberNonAlloc(...)0%2100%
ReportAvatarPosition(...)0%72800%
ReportAvatarRemoved()0%3.462028.57%
CanReport()0%110100%
HasMoved(...)0%2100%
WasInLoadedScene()0%2100%

File(s)

/tmp/workspace/unity-renderer/unity-renderer/Assets/Scripts/MainScripts/DCL/Components/Avatar/AvatarReporterController/Implementation/AvatarReporterController.cs

#LineLine coverage
 1using System.Collections.Generic;
 2using System.Linq;
 3using DCL;
 4using DCL.Configuration;
 5using DCL.Controllers;
 6using DCL.Helpers;
 7using UnityEngine;
 8
 9/// <summary>
 10/// This controller checks if an avatar entered or exited a scene by checking its position every frame
 11/// </summary>
 12public class AvatarReporterController : IAvatarReporterController
 13{
 14    private string avatarId;
 15    private int lastSceneNumber;
 16    private Vector2Int lastCoords;
 17    private Vector3 lastPositionChecked;
 33318    private bool isInitialReport = true;
 19
 20    private readonly IWorldState worldState;
 21
 33322    IReporter IAvatarReporterController.reporter { get; set; } = new Reporter();
 23
 33324    public AvatarReporterController(IWorldState worldState)
 25    {
 33326        this.worldState = worldState;
 33327    }
 28
 29    void IAvatarReporterController.SetUp(int sceneNumber, string avatarId)
 30    {
 31        // NOTE: do not report avatars that doesn't belong to the global scene
 032        if (sceneNumber != EnvironmentSettings.AVATAR_GLOBAL_SCENE_NUMBER)
 033            return;
 34
 035        this.avatarId = avatarId;
 036        isInitialReport = true;
 037        lastSceneNumber = -1;
 038    }
 39
 40    int GetcurrentSceneNumberNonAlloc(Vector2Int coords)
 41    {
 042        return worldState.GetSceneNumberByCoords(coords);
 43    }
 44
 45    void IAvatarReporterController.ReportAvatarPosition(Vector3 position)
 46    {
 047        if (!CanReport())
 048            return;
 49
 050        bool wasInLoadedScene = WasInLoadedScene();
 51
 052        if (wasInLoadedScene && !HasMoved(position))
 053            return;
 54
 055        Vector2Int coords = Utils.WorldToGridPosition(CommonScriptableObjects.worldOffset + position);
 56
 057        if (wasInLoadedScene && lastCoords == coords)
 58        {
 059            return;
 60        }
 61
 062        int currentSceneNumber = GetcurrentSceneNumberNonAlloc(coords);
 63
 064        if (currentSceneNumber == lastSceneNumber && !isInitialReport)
 65        {
 066            return;
 67        }
 68
 069        ((IAvatarReporterController)this).reporter.ReportAvatarSceneChange(avatarId, currentSceneNumber);
 70
 071        lastSceneNumber = currentSceneNumber;
 072        lastCoords = coords;
 073        lastPositionChecked = position;
 074        isInitialReport = false;
 075    }
 76
 77    void IAvatarReporterController.ReportAvatarRemoved()
 78    {
 33879        if (!CanReport())
 33880            return;
 81
 082        ((IAvatarReporterController)this).reporter.ReportAvatarRemoved(avatarId);
 83
 084        avatarId = null;
 085        lastSceneNumber = -1;
 086        isInitialReport = true;
 087    }
 88
 89    private bool CanReport()
 90    {
 33891        return !string.IsNullOrEmpty(avatarId);
 92    }
 93
 94    private bool HasMoved(Vector3 currentPosition)
 95    {
 096        return Vector3.SqrMagnitude(currentPosition - lastPositionChecked) > 0.0001f;
 97    }
 98
 99    private bool WasInLoadedScene()
 100    {
 0101        return lastSceneNumber > 0;
 102    }
 103}