< Summary

Class:PhysicsCast_Tests
Assembly:PhysicsCastTest
File(s):/tmp/workspace/unity-renderer/unity-renderer/Assets/Scripts/MainScripts/DCL/Controllers/PhysicsCast/Tests/PhysicsCastTest.cs
Covered lines:1
Uncovered lines:126
Coverable lines:127
Total lines:275
Line coverage:0.7% (1 of 127)
Covered branches:0
Total branches:0

Metrics

MethodBranch coverage Crap Score Cyclomatic complexity NPath complexity Sequence coverage
PhysicsCast_Tests()0%110100%
SetUp()0%12300%
ConfigureRaycastQuery(...)0%2100%
HitFirst()0%42600%
HitAll()0%72800%
AreSceneEventsEqual[T, T2](...)0%12300%
AreRaycastResponsesEqual[T](...)0%30500%

File(s)

/tmp/workspace/unity-renderer/unity-renderer/Assets/Scripts/MainScripts/DCL/Controllers/PhysicsCast/Tests/PhysicsCastTest.cs

#LineLine coverage
 1using DCL;
 2using DCL.Components;
 3using DCL.Helpers;
 4using DCL.Interface;
 5using DCL.Models;
 6using Google.Protobuf;
 7using NUnit.Framework;
 8using System.Collections;
 9using System.Collections.Generic;
 10using System.Linq;
 11using UnityEngine;
 12using UnityEngine.TestTools;
 13
 14public class PhysicsCast_Tests : IntegrationTestSuite_Legacy
 15{
 16    const int ENTITIES_COUNT = 3;
 17    PB_RayQuery raycastQuery;
 18    PB_Query query;
 19    PB_SendSceneMessage sendSceneMessage;
 120    Vector3 startPos = new Vector3(5, 2, 15);
 21    bool alreadyInitialized = false;
 22
 23    [UnitySetUp]
 24    protected override IEnumerator SetUp()
 25    {
 026        yield return base.SetUp();
 027        Environment.i.world.sceneBoundsChecker.Stop();
 028    }
 29
 30    private void ConfigureRaycastQuery(string queryType)
 31    {
 032        DCLCharacterController.i.SetPosition(startPos);
 33
 034        raycastQuery = new PB_RayQuery();
 035        raycastQuery.QueryId = "123456" + queryType;
 036        raycastQuery.QueryType = queryType;
 037        raycastQuery.Ray = new PB_Ray();
 038        raycastQuery.Ray.Direction = new PB_Vector3();
 039        raycastQuery.Ray.Direction.X = Vector3.back.x;
 040        raycastQuery.Ray.Direction.Y = Vector3.back.y;
 041        raycastQuery.Ray.Direction.Z = Vector3.back.z;
 042        raycastQuery.Ray.Distance = 1000;
 043        raycastQuery.Ray.Origin = new PB_Vector3();
 044        raycastQuery.Ray.Origin.X = startPos.x;
 045        raycastQuery.Ray.Origin.Y = startPos.y;
 046        raycastQuery.Ray.Origin.Z = startPos.z;
 47
 048        query = new PB_Query();
 049        query.QueryId = "raycast";
 050        query.Payload = System.Convert.ToBase64String(raycastQuery.ToByteArray());
 51
 052        sendSceneMessage = new PB_SendSceneMessage();
 053        sendSceneMessage.Query = query;
 054        sendSceneMessage.SceneId = this.scene.sceneData.id;
 055    }
 56
 57    [UnityTest]
 58    [Explicit]
 59    [Category("Explicit")]
 60    public IEnumerator HitFirst()
 61    {
 062        ConfigureRaycastQuery("HitFirst");
 63
 064        List<IDCLEntity> entities = new List<IDCLEntity>();
 065        Vector3 pos = new Vector3(5, 0, 10);
 66
 067        for (int i = 0; i < ENTITIES_COUNT; i++)
 68        {
 069            BoxShape shape = TestHelpers.CreateEntityWithBoxShape(scene, pos);
 070            yield return shape.routine;
 71
 072            IDCLEntity entity = shape.attachedEntities.First();
 73
 074            TestHelpers.SetEntityTransform(scene, entity, pos, Quaternion.identity, new Vector3(5, 10, 1));
 075            yield return null;
 76
 077            DCL.CollidersManager.i.ConfigureColliders(entity.meshRootGameObject, true, false, entity);
 78
 079            entities.Add(entity);
 80
 081            pos.z -= 2;
 082        }
 83
 084        WebInterface.RaycastHitFirstResponse response = new WebInterface.RaycastHitFirstResponse();
 085        response.queryType = raycastQuery.QueryType;
 086        response.queryId = raycastQuery.QueryId;
 087        response.payload = new WebInterface.RaycastHitEntity();
 088        response.payload.ray = new WebInterface.RayInfo();
 089        response.payload.ray.origin = new Vector3(raycastQuery.Ray.Origin.X, raycastQuery.Ray.Origin.Y, raycastQuery.Ray
 090        response.payload.ray.distance = raycastQuery.Ray.Distance;
 091        response.payload.ray.direction = new Vector3(raycastQuery.Ray.Direction.X, raycastQuery.Ray.Direction.Y, raycast
 092        response.payload.entity = new WebInterface.HitEntityInfo();
 093        response.payload.entity.entityId = entities[0].entityId;
 94
 095        var sceneEvent = new WebInterface.SceneEvent<WebInterface.RaycastHitFirstResponse>();
 96
 097        bool eventTriggered = false;
 098        int responseCount = 0;
 99
 0100        yield return SendRaycastQueryMessage<WebInterface.RaycastHitFirstResponse, WebInterface.RaycastHitEntity>(
 101            sceneEvent, response,
 102            (raycastResponse) =>
 103            {
 0104                responseCount++;
 0105                Assert.IsTrue(responseCount == 1, "This raycast query should be lossy and therefore excecuted once.");
 0106                Assert.IsTrue(raycastResponse != null);
 0107                Assert.IsTrue(raycastResponse.payload.payload.entity.entityId == sceneEvent.payload.payload.entity.entit
 108
 0109                if (raycastResponse != null &&
 110                    AreSceneEventsEqual<WebInterface.RaycastHitFirstResponse, WebInterface.RaycastHitEntity>(raycastResp
 111                    raycastResponse.payload.payload.entity.entityId == sceneEvent.payload.payload.entity.entityId)
 112                {
 0113                    eventTriggered = true;
 0114                    return true;
 115                }
 116
 0117                return false;
 118            });
 119
 0120        Assert.IsTrue(eventTriggered);
 0121    }
 122
 123    [UnityTest]
 124    [Explicit]
 125    [Category("Explicit")]
 126    public IEnumerator HitAll()
 127    {
 0128        ConfigureRaycastQuery("HitAll");
 129
 0130        List<IDCLEntity> entities = new List<IDCLEntity>();
 0131        Vector3 pos = new Vector3(5, 0, 10);
 132
 0133        for (int i = 0; i < ENTITIES_COUNT; i++)
 134        {
 0135            BoxShape shape = TestHelpers.CreateEntityWithBoxShape(scene, pos);
 0136            yield return shape.routine;
 137
 0138            IDCLEntity entity = shape.attachedEntities.First();
 139
 0140            TestHelpers.SetEntityTransform(scene, entity, pos, Quaternion.identity, new Vector3(5, 10, 1));
 0141            yield return null;
 142
 0143            DCL.CollidersManager.i.ConfigureColliders(entity.meshRootGameObject, true, false, entity);
 144
 0145            entities.Add(entity);
 146
 0147            pos.z -= 2;
 0148        }
 149
 0150        WebInterface.RaycastHitAllResponse response = new WebInterface.RaycastHitAllResponse();
 151
 0152        response.queryType = raycastQuery.QueryType;
 0153        response.queryId = raycastQuery.QueryId;
 0154        response.payload = new WebInterface.RaycastHitEntities();
 0155        response.payload.ray = new WebInterface.RayInfo();
 0156        response.payload.ray.origin = new Vector3(raycastQuery.Ray.Origin.X, raycastQuery.Ray.Origin.Y, raycastQuery.Ray
 0157        response.payload.ray.distance = raycastQuery.Ray.Distance;
 0158        response.payload.ray.direction = new Vector3(raycastQuery.Ray.Direction.X, raycastQuery.Ray.Direction.Y, raycast
 0159        response.payload.entities = new WebInterface.RaycastHitEntity[ENTITIES_COUNT];
 160
 0161        for (int i = 0; i < ENTITIES_COUNT; i++)
 162        {
 0163            response.payload.entities[i] = new WebInterface.RaycastHitEntity();
 0164            response.payload.entities[i].didHit = true;
 0165            response.payload.entities[i].entity = new WebInterface.HitEntityInfo();
 0166            response.payload.entities[i].entity.entityId = entities[i].entityId;
 167        }
 168
 0169        var sceneEvent = new WebInterface.SceneEvent<WebInterface.RaycastHitAllResponse>();
 170
 0171        bool eventTriggered = false;
 0172        int responseCount = 0;
 173
 0174        yield return SendRaycastQueryMessage<WebInterface.RaycastHitAllResponse, WebInterface.RaycastHitEntities>(
 175            sceneEvent, response,
 176            (raycastResponse) =>
 177            {
 0178                responseCount++;
 179
 0180                Assert.IsTrue(responseCount == 1, "This raycast query should be lossy and therefore excecuted once.");
 181
 0182                Assert.IsTrue(raycastResponse != null);
 183
 0184                Assert.IsTrue(raycastResponse.payload.payload.entities.Length == ENTITIES_COUNT);
 185
 0186                if (raycastResponse != null &&
 187                    AreSceneEventsEqual<WebInterface.RaycastHitAllResponse, WebInterface.RaycastHitEntities>(raycastResp
 188                    raycastResponse.payload.payload.entities.Length == ENTITIES_COUNT)
 189                {
 0190                    for (int i = 0; i < raycastResponse.payload.payload.entities.Length; i++)
 191                    {
 0192                        bool found = false;
 193
 0194                        for (int j = 0; j < sceneEvent.payload.payload.entities.Length; j++)
 195                        {
 0196                            if (raycastResponse.payload.payload.entities[i].entity.entityId == sceneEvent.payload.payloa
 197                            {
 0198                                found = raycastResponse.payload.payload.entities[i].didHit;
 0199                                break;
 200                            }
 201                        }
 202
 0203                        if (!found)
 0204                            return false;
 205                    }
 206
 0207                    eventTriggered = true;
 208
 0209                    return true;
 210                }
 211
 0212                return false;
 213            });
 214
 0215        yield return null;
 216
 0217        Assert.IsTrue(eventTriggered);
 0218    }
 219
 220    private IEnumerator SendRaycastQueryMessage<T, T2>
 221    (
 222        WebInterface.SceneEvent<T> sceneEvent,
 223        T response,
 224        System.Func<WebInterface.SceneEvent<T>, bool> OnMessageReceived
 225    )
 226        where T2 : WebInterface.RaycastHitInfo
 227        where T : WebInterface.RaycastResponse<T2>
 228    {
 229        string targetEventType = "SceneEvent";
 230
 231        sceneEvent.sceneId = scene.sceneData.id;
 232        sceneEvent.payload = response;
 233        sceneEvent.eventType = "raycastResponse";
 234
 235        yield return TestHelpers.ExpectMessageToKernel(
 236            targetEventType,
 237            sceneEvent,
 238            () =>
 239            {
 240                // Note (Zak): we send several times the same message to ensure it's
 241                // only processed once (lossy messages)
 0242                sceneController.SendSceneMessage(System.Convert.ToBase64String(sendSceneMessage.ToByteArray()));
 0243                sceneController.SendSceneMessage(System.Convert.ToBase64String(sendSceneMessage.ToByteArray()));
 0244                sceneController.SendSceneMessage(System.Convert.ToBase64String(sendSceneMessage.ToByteArray()));
 0245            },
 246            OnMessageReceived);
 247    }
 248
 249    private bool AreSceneEventsEqual<T, T2>(WebInterface.SceneEvent<T> s1, WebInterface.SceneEvent<T> s2) where T2 : Web
 250    {
 0251        Assert.IsTrue(s1.eventType == s2.eventType);
 0252        Assert.IsTrue(s1.sceneId == s2.sceneId);
 253
 0254        if (s1.eventType != s2.eventType ||
 255            s1.sceneId != s2.sceneId)
 0256            return false;
 257
 0258        return AreRaycastResponsesEqual(s1.payload, s2.payload);
 259    }
 260
 261    private bool AreRaycastResponsesEqual<T>(WebInterface.RaycastResponse<T> r1, WebInterface.RaycastResponse<T> r2) whe
 262    {
 0263        Assert.IsTrue(r1.queryId == r2.queryId);
 0264        Assert.IsTrue(r1.queryType == r2.queryType);
 0265        Assert.IsTrue(r1.payload.ray.distance == r2.payload.ray.distance);
 0266        Assert.IsTrue(r1.payload.ray.direction == r2.payload.ray.direction);
 0267        Assert.IsTrue(r1.payload.ray.origin == r2.payload.ray.origin);
 268
 0269        return r1.queryId == r2.queryId &&
 270               r1.queryType == r2.queryType &&
 271               r1.payload.ray.distance == r2.payload.ray.distance &&
 272               r1.payload.ray.direction == r2.payload.ray.direction &&
 273               r1.payload.ray.origin == r2.payload.ray.origin;
 274    }
 275}