public void PlaceNullBuildingTest()
        {
            // given: SmallBuildingSlot
            SmallBuildingSlot slot = new SmallBuildingSlot();

            // when: placing a null Building
            // then: ArgumentNullException
            Assert.That(() => slot.PlaceBuilding(null), Throws.ArgumentNullException);
        }
        public void ConstructionTest()
        {
            // given: SmallBuildingSlot
            // when: constructing
            SmallBuildingSlot slot = new SmallBuildingSlot();

            // then: default values
            Assert.That(slot.Building, Is.Null);
        }
        public void RemoveNullBuildingTest()
        {
            // given: SmallBuildingSlot
            SmallBuildingSlot slot = new SmallBuildingSlot();

            // when: removing the Building
            // then: InvalidOperationException
            Assert.That(() => slot.RemoveBuilding(), Throws.InvalidOperationException);
        }
        public void PlaceBuildingTest()
        {
            // given: SmallBuildingSlot and Building
            Mock <IBuilding> buildingMock = new Mock <IBuilding>(MockBehavior.Strict);

            SmallBuildingSlot slot = new SmallBuildingSlot();

            // when: placing the slot
            slot.PlaceBuilding(buildingMock.Object);

            // then: Building is places
            Assert.That(slot.Building, Is.SameAs(buildingMock.Object));
        }
        public void PlaceBuildingOccupiedTest()
        {
            // given: SmallBuildingSlot and Buildings
            Mock <IBuilding> buildingMock  = new Mock <IBuilding>(MockBehavior.Strict);
            Mock <IBuilding> buildingMock2 = new Mock <IBuilding>(MockBehavior.Strict);

            SmallBuildingSlot slot = new SmallBuildingSlot();

            slot.PlaceBuilding(buildingMock.Object);

            // when: placing the second slot
            // then: InvalidOperationException thrown
            Assert.That(() => slot.PlaceBuilding(buildingMock2.Object), Throws.InvalidOperationException);
        }
        public void RemoveBuildingTest()
        {
            // given: SmallBuildingSlot with a Building
            Mock <IBuilding> buildingMock = new Mock <IBuilding>(MockBehavior.Strict);

            SmallBuildingSlot slot = new SmallBuildingSlot();

            slot.PlaceBuilding(buildingMock.Object);

            // when: removing the Building
            var removedBuilding = slot.RemoveBuilding();

            // then: slot Building is null and correct Building was returned
            Assert.That(slot.Building, Is.Null);
            Assert.That(removedBuilding, Is.SameAs(buildingMock.Object));
        }
        public void SimulateTest()
        {
            // given: SmallBuildingSlot with building mock
            Mock <IBuilding> buildingMock = new Mock <IBuilding>(MockBehavior.Strict);

            buildingMock.Setup(b => b.Simulate());

            SmallBuildingSlot slot = new SmallBuildingSlot();

            slot.PlaceBuilding(buildingMock.Object);

            // when: simulating the slot
            slot.Simulate();

            // then: building was simulated
            Assert.That(() => buildingMock.Verify(b => b.Simulate(), Times.Once), Throws.Nothing);
        }