Skip to content

Commit

Permalink
fix: Adding warning when adding handler with RegisterSpawnHandler if …
Browse files Browse the repository at this point in the history
…assetid already exists (#1819)

* adding test for warning for existing handler

* adding warning for existing handler

* adding error for prefab existing with assetId
  • Loading branch information
James-Frowen committed May 2, 2020
1 parent a0aa4f9 commit 7f26329
Show file tree
Hide file tree
Showing 2 changed files with 69 additions and 0 deletions.
11 changes: 11 additions & 0 deletions Assets/Mirror/Runtime/ClientScene.cs
Original file line number Diff line number Diff line change
Expand Up @@ -493,6 +493,17 @@ public static void RegisterSpawnHandler(Guid assetId, SpawnHandlerDelegate spawn

if (logger.LogEnabled()) logger.Log("RegisterSpawnHandler asset '" + assetId + "' " + spawnHandler.GetMethodName() + "/" + unspawnHandler.GetMethodName());

if (spawnHandlers.ContainsKey(assetId) || unspawnHandlers.ContainsKey(assetId))
{
logger.LogWarning($"Replacing existing spawnHandlers for {assetId}");
}

if (prefabs.ContainsKey(assetId))
{
// this is error because SpawnPrefab checks prefabs before handler
logger.LogError($"assetId '{assetId}' is already used by prefab '{prefabs[assetId].name}'");
}

spawnHandlers[assetId] = spawnHandler;
unspawnHandlers[assetId] = unspawnHandler;
}
Expand Down
58 changes: 58 additions & 0 deletions Assets/Mirror/Tests/Editor/ClientSceneTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -396,6 +396,35 @@ public void RegisterSpawnHandler_SpawnDelegate_ErrorWhenAssetIdIsEmpty()
ClientScene.RegisterSpawnHandler(guid, spawnHandler, unspawnHandler);
}

[Test]
public void RegisterSpawnHandler_SpawnDelegate_WarningWhenHandlerForGuidAlreadyExistsInHandlerDictionary()
{
Guid guid = Guid.NewGuid();
SpawnDelegate spawnHandler = new SpawnDelegate((x, y) => null);
UnSpawnDelegate unspawnHandler = new UnSpawnDelegate(x => { });

ClientScene.RegisterSpawnHandler(guid, spawnHandler, unspawnHandler);

SpawnDelegate spawnHandler2 = new SpawnDelegate((x, y) => new GameObject());
UnSpawnDelegate unspawnHandler2 = new UnSpawnDelegate(x => UnityEngine.Object.Destroy(x));

LogAssert.Expect(LogType.Warning, $"Replacing existing spawnHandlers for {guid}");
ClientScene.RegisterSpawnHandler(guid, spawnHandler2, unspawnHandler2);
}

[Test]
public void RegisterSpawnHandler_SpawnDelegate_ErrorWhenHandlerForGuidAlreadyExistsInPrefabDictionary()
{
Guid guid = Guid.NewGuid();
prefabs.Add(guid, validPrefab);

SpawnDelegate spawnHandler = new SpawnDelegate((x, y) => null);
UnSpawnDelegate unspawnHandler = new UnSpawnDelegate(x => { });

LogAssert.Expect(LogType.Error, $"assetId '{guid}' is already used by prefab '{validPrefab.name}'");
ClientScene.RegisterSpawnHandler(guid, spawnHandler, unspawnHandler);
}


[Test]
public void RegisterSpawnHandler_SpawnHandlerDelegate_AddsHandlerToSpawnHandlers()
Expand Down Expand Up @@ -456,6 +485,35 @@ public void RegisterSpawnHandler_SpawnHandlerDelegate_ErrorWhenAssetIdIsEmpty()
ClientScene.RegisterSpawnHandler(guid, spawnHandler, unspawnHandler);
}

[Test]
public void RegisterSpawnHandler_SpawnHandlerDelegate_WarningWhenHandlerForGuidAlreadyExistsInHandlerDictionary()
{
Guid guid = Guid.NewGuid();
SpawnHandlerDelegate spawnHandler = new SpawnHandlerDelegate(x => null);
UnSpawnDelegate unspawnHandler = new UnSpawnDelegate(x => { });

ClientScene.RegisterSpawnHandler(guid, spawnHandler, unspawnHandler);

SpawnHandlerDelegate spawnHandler2 = new SpawnHandlerDelegate(x => new GameObject());
UnSpawnDelegate unspawnHandler2 = new UnSpawnDelegate(x => UnityEngine.Object.Destroy(x));

LogAssert.Expect(LogType.Warning, $"Replacing existing spawnHandlers for {guid}");
ClientScene.RegisterSpawnHandler(guid, spawnHandler2, unspawnHandler2);
}

[Test]
public void RegisterSpawnHandler_SpawnHandlerDelegate_ErrorWhenHandlerForGuidAlreadyExistsInPrefabDictionary()
{
Guid guid = Guid.NewGuid();
prefabs.Add(guid, validPrefab);

SpawnHandlerDelegate spawnHandler = new SpawnHandlerDelegate(x => new GameObject());
UnSpawnDelegate unspawnHandler = new UnSpawnDelegate(x => UnityEngine.Object.Destroy(x));

LogAssert.Expect(LogType.Error, $"assetId '{guid}' is already used by prefab '{validPrefab.name}'");
ClientScene.RegisterSpawnHandler(guid, spawnHandler, unspawnHandler);
}


[Test]
public void UnregisterSpawnHandler_RemovesSpawnHandlersFromDictionary()
Expand Down

0 comments on commit 7f26329

Please sign in to comment.