From 8d95d499246741b075ffa2e3fb6cfdd0119d91ef Mon Sep 17 00:00:00 2001 From: Stephen Date: Sat, 17 Feb 2024 13:15:56 +0000 Subject: [PATCH 1/2] Check for undefined layer and throw on collision actor insertion --- .../CollisionComponent.cs | 8 +++++++- .../Layers/UndefinedLayerException.cs | 18 ++++++++++++++++++ 2 files changed, 25 insertions(+), 1 deletion(-) create mode 100644 src/cs/MonoGame.Extended.Collisions/Layers/UndefinedLayerException.cs diff --git a/src/cs/MonoGame.Extended.Collisions/CollisionComponent.cs b/src/cs/MonoGame.Extended.Collisions/CollisionComponent.cs index 9677c14f..d615220e 100644 --- a/src/cs/MonoGame.Extended.Collisions/CollisionComponent.cs +++ b/src/cs/MonoGame.Extended.Collisions/CollisionComponent.cs @@ -104,7 +104,13 @@ namespace MonoGame.Extended.Collisions /// Target to insert. public void Insert(ICollisionActor target) { - _layers[target.LayerName ?? DEFAULT_LAYER_NAME].Space.Insert(target); + var layerName = target.LayerName ?? DEFAULT_LAYER_NAME; + if (!_layers.TryGetValue(layerName, out var layer)) + { + throw new UndefinedLayerException(layerName); + } + + layer.Space.Insert(target); } /// diff --git a/src/cs/MonoGame.Extended.Collisions/Layers/UndefinedLayerException.cs b/src/cs/MonoGame.Extended.Collisions/Layers/UndefinedLayerException.cs new file mode 100644 index 00000000..a27b5b6b --- /dev/null +++ b/src/cs/MonoGame.Extended.Collisions/Layers/UndefinedLayerException.cs @@ -0,0 +1,18 @@ +namespace MonoGame.Extended.Collisions.Layers; + +using System; + +/// +/// Thrown when the collision system has no layer defined with the specified name +/// +public class UndefinedLayerException : Exception +{ + /// + /// Thrown when the collision system has no layer defined with the specified name + /// + /// The undefined layer name + public UndefinedLayerException(string layerName) + : base($"Layer with name '{layerName}' is undefined") + { + } +} From 6cc4b6cb967bf9a849d03cc0815bd173bdb83268 Mon Sep 17 00:00:00 2001 From: Stephen Date: Sat, 17 Feb 2024 13:25:11 +0000 Subject: [PATCH 2/2] Add test coverage --- .../CollisionComponentTests.cs | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/src/cs/Tests/MonoGame.Extended.Collisions.Tests/CollisionComponentTests.cs b/src/cs/Tests/MonoGame.Extended.Collisions.Tests/CollisionComponentTests.cs index dbba215e..39ac707f 100644 --- a/src/cs/Tests/MonoGame.Extended.Collisions.Tests/CollisionComponentTests.cs +++ b/src/cs/Tests/MonoGame.Extended.Collisions.Tests/CollisionComponentTests.cs @@ -4,6 +4,8 @@ using Xunit; namespace MonoGame.Extended.Collisions.Tests { + using MonoGame.Extended.Collisions.Layers; + /// /// Test collision of actors with various shapes. /// @@ -376,6 +378,16 @@ namespace MonoGame.Extended.Collisions.Tests Assert.True(dynamicActor.IsColliding); } + [Fact] + public void InsertActor_ThrowsUndefinedLayerException_IfThereIsNoLayerDefined() + { + var sut = new CollisionComponent(); + + var act = () => sut.Insert(new CollisionIndicatingActor(RectangleF.Empty)); + + Assert.Throws(act); + } + private class CollisionIndicatingActor : ICollisionActor { private RectangleF _bounds;