public async Task GhostsShouldLeaveGhostHouseWhenPillCountHasBeenReached() { // X // - // H G var ghostStart1 = new CellLocation(1, 2); _gameSettings.PacMan = new PacMan(ghostStart1.FarAway(), Direction.Left); _gameSettings.GhostHouse.AddRange(new[] { ghostStart1, ghostStart1.Left }); _gameSettings.Doors.Add(ghostStart1.Left.Above); var ghost1 = GhostBuilder.New() .WithLocation(ghostStart1) .WithNumberOfCoinsRequiredToExitHouse(1) .Create(); var ghost2 = GhostBuilder.New() .WithLocation(ghostStart1) .WithNumberOfCoinsRequiredToExitHouse(10) .Create(); _gameSettings.Ghosts.Add(ghost1); _gameSettings.Ghosts.Add(ghost2); _gameSettings.Coins.Add(_gameSettings.PacMan.Location.FarAway()); _gameSettings.Coins.Add(_gameSettings.PacMan.Location.Left); var game = new Game(_gameClock, _gameSettings); game.StartGame(); await game.ChangeDirection(Direction.Left); // PacMan Eats Coin await _gameClock.Tick(); // Still in House, under door await _gameClock.Tick(); // On ghost door await _gameClock.Tick(); // Out of house await _gameClock.Tick(); using var _ = new AssertionScope(); game.Ghosts[ghost1.Name].Should().BeEquivalentTo(new { Location = ghostStart1.Left.Above.Above }); game.Ghosts[ghost2.Name].Should().BeEquivalentTo(new { Location = ghostStart1 }); }