From 0798708f2ee86e0b8f2d917370e37f18d6e99c29 Mon Sep 17 00:00:00 2001 From: Mikhail Gusev Date: Mon, 12 Sep 2016 10:13:09 +0900 Subject: [PATCH] Fixed issue #7 regarding TileChange callback invokation using null object Added code to TileChangeEvent tests with null objects as parameters --- Tests/Management/TileChangeManagerTests.cs | 49 ++++++++++++++----- .../Management/TileChangeManager.cs | 16 +++--- 2 files changed, 43 insertions(+), 22 deletions(-) diff --git a/Tests/Management/TileChangeManagerTests.cs b/Tests/Management/TileChangeManagerTests.cs index 043fec9..463bc49 100644 --- a/Tests/Management/TileChangeManagerTests.cs +++ b/Tests/Management/TileChangeManagerTests.cs @@ -93,8 +93,13 @@ public void TileChangeEvents() // Mock IChangeTile on entity var mockMovable = mockEntity.As(); - // Tile from - var mockTileOne = new Mock(); + // Entity that will trigger NULL check + var mockNullEntity = new Mock(); + // Mock IChangeTile on entity that triggers NULL + var mockNullMovable = mockNullEntity.As(); + + // Tile from + var mockTileOne = new Mock(); // Tile to var mockTileTwo = new Mock(); @@ -109,32 +114,50 @@ public void TileChangeEvents() var tileChangeArgs = new TileChangedArgs(mockTileOne.Object, mockTileTwo.Object, TileChangeType.Change); var tileFinishArgs = new TileChangedArgs(mockTileOne.Object, mockTileTwo.Object, TileChangeType.Finish); + // Setup events for Start, Change, and Finish functions so they emit the events mockMovable.Setup(movable => movable.StartChangeTile(mockTileOne.Object, mockTileTwo.Object)) .Raises(m => m.ChangeStarted += null, mockMovable.Object, tileStartArgs); - - mockMovable.Setup(movable => movable.ChangeTile(mockTileOne.Object, mockTileTwo.Object)) + + mockMovable.Setup(movable => movable.ChangeTile(mockTileOne.Object, mockTileTwo.Object)) .Raises(m => m.Changing += null, mockMovable.Object, tileChangeArgs); - + mockMovable.Setup(movable => movable.FinishChangeTile(mockTileOne.Object, mockTileTwo.Object)) .Raises(m => m.ChangeFinished += null, mockMovable.Object, tileFinishArgs); - // Register Creator - manager.RegisterEntityCreator(mockCreator.Object); + + // Setup events for Start, Change, and Finish functions so they emit NULL trigger on the events + mockNullMovable.Setup(movable => movable.StartChangeTile(mockTileOne.Object, mockTileTwo.Object)) + .Raises(m => m.ChangeStarted += null, null, tileStartArgs); + + mockNullMovable.Setup(movable => movable.ChangeTile(mockTileOne.Object, mockTileTwo.Object)) + .Raises(m => m.Changing += null, null, tileChangeArgs); + + mockNullMovable.Setup(movable => movable.FinishChangeTile(mockTileOne.Object, mockTileTwo.Object)) + .Raises(m => m.ChangeFinished += null, null, tileFinishArgs); + + // Register Creator + manager.RegisterEntityCreator(mockCreator.Object); // Add solver that will handlt the entities Tile Change manager.Add(mockSolver.Object); // Raise entity created event mockCreator.Raise(creator => creator.EntityCreated += null, mockCreator.Object, new EntityCreatedArgs(mockTileOne.Object, mockEntity.Object)); + mockCreator.Raise(creator => creator.EntityCreated += null, mockCreator.Object, new EntityCreatedArgs(mockTileOne.Object, mockNullEntity.Object)); - // Move the entity - mockMovable.Object.StartChangeTile(mockTileOne.Object, mockTileTwo.Object); - mockMovable.Object.ChangeTile(mockTileOne.Object, mockTileTwo.Object); - mockMovable.Object.FinishChangeTile(mockTileOne.Object, mockTileTwo.Object); + // Move the entity + mockMovable.Object.StartChangeTile(mockTileOne.Object, mockTileTwo.Object); + mockMovable.Object.ChangeTile(mockTileOne.Object, mockTileTwo.Object); + mockMovable.Object.FinishChangeTile(mockTileOne.Object, mockTileTwo.Object); + + // Asset if event was called with NULL object + Assert.That(() => mockNullMovable.Object.StartChangeTile(mockTileOne.Object, mockTileTwo.Object), Throws.ArgumentNullException); + Assert.That(() => mockNullMovable.Object.ChangeTile(mockTileOne.Object, mockTileTwo.Object), Throws.ArgumentNullException); + Assert.That(() => mockNullMovable.Object.FinishChangeTile(mockTileOne.Object, mockTileTwo.Object), Throws.ArgumentNullException); - // Verify the solver was executed with correct args - mockSolver.Verify(solver => solver.Solve(mockEntity.Object, tileStartArgs), Times.Exactly(1)); + // Verify the solver was executed with correct args + mockSolver.Verify(solver => solver.Solve(mockEntity.Object, tileStartArgs), Times.Exactly(1)); mockSolver.Verify(solver => solver.Solve(mockEntity.Object, tileChangeArgs), Times.Exactly(1)); mockSolver.Verify(solver => solver.Solve(mockEntity.Object, tileFinishArgs), Times.Exactly(1)); diff --git a/TileSystem/Implementation/Management/TileChangeManager.cs b/TileSystem/Implementation/Management/TileChangeManager.cs index 94eccbf..f06a8d6 100644 --- a/TileSystem/Implementation/Management/TileChangeManager.cs +++ b/TileSystem/Implementation/Management/TileChangeManager.cs @@ -138,6 +138,7 @@ private void RegisterTileChangeEvents(object sender, EntityCreatedArgs e) if (movable == null) { + return; } @@ -159,7 +160,7 @@ private void DeregisterTileChangeEvents(object sender, EntityDestroyedArgs e) if (movableEntity == null) { - return; + throw new ArgumentNullException("ChangeTile", "TileChange event was invoked with null object"); } movableEntity.ChangeStarted -= EntityTileChangeStarted; @@ -177,8 +178,7 @@ private void EntityTileChangeStarted(object sender, TileChangedArgs e) IEntity entity = sender as IEntity; if (entity == null) { - // TODO: Issue 7 (https://github.com/Wizcorp/TileSystem/issues/7) - return; + throw new ArgumentNullException("ChangeTile", "TileChange event was invoked with null object"); } ExecuteSolvers(entity, e); @@ -194,9 +194,8 @@ private void EntityTileChanged(object sender, TileChangedArgs e) IEntity entity = sender as IEntity; if (entity == null) { - // TODO: Issue 7 (https://github.com/Wizcorp/TileSystem/issues/7) - return; - } + throw new ArgumentNullException("ChangeTile", "TileChange event was invoked with null object"); + } ExecuteSolvers(entity, e); } @@ -211,9 +210,8 @@ private void EntityTileChangeFinished(object sender, TileChangedArgs e) IEntity entity = sender as IEntity; if (entity == null) { - // TODO: Issue 7 (https://github.com/Wizcorp/TileSystem/issues/7) - return; - } + throw new ArgumentNullException("ChangeTile", "TileChange event was invoked with null object"); + } ExecuteSolvers(entity, e); }