Skip to content

Commit

Permalink
Add more tests for spec info
Browse files Browse the repository at this point in the history
  • Loading branch information
araszka committed Oct 6, 2024
1 parent d20ca8c commit fdad06b
Show file tree
Hide file tree
Showing 9 changed files with 142 additions and 27 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@ public class SpectatorTargetInfoEventController(ISpectatorTargetInfoService spec
{
[Subscribe(GbxRemoteEvent.PlayerDisconnect)]
public Task OnPlayerDisconnectAsync(object sender, PlayerGbxEventArgs eventArgs) =>
spectatorTargetInfoService.RemovePlayerFromSpectatorsListAsync(eventArgs.Login);
spectatorTargetInfoService.RemovePlayerAsync(eventArgs.Login);

[Subscribe(GbxRemoteEvent.BeginMap)]
public async Task OnBeginMapAsync(object sender, MapGbxEventArgs eventArgs)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@ public async Task ReportSpectatorTargetAsync(string targetLogin)
}
else
{
await spectatorTargetInfoService.RemovePlayerFromSpectatorsListAsync(spectatorLogin);
await spectatorTargetInfoService.RemovePlayerAsync(spectatorLogin);
await spectatorTargetInfoService.HideSpectatorInfoWidgetAsync(spectatorLogin);
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -67,7 +67,7 @@ public interface ISpectatorTargetInfoService
/// </summary>
/// <param name="playerLogin"></param>
/// <returns></returns>
public Task RemovePlayerFromSpectatorsListAsync(string playerLogin);
public Task RemovePlayerAsync(string playerLogin);

/// <summary>
/// Gets the logins of a players spectating the given target.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -25,8 +25,9 @@ public int GetRank(string playerLogin)
return rank;
}

public int ForgetPlayer(string playerLogin)
{
return this.RemoveAll(cpData => cpData.player.GetLogin() == playerLogin);
}
public bool ForgetPlayer(string playerLogin) =>
(from checkpointData in this
where checkpointData.player.GetLogin() == playerLogin
select this.Remove(checkpointData)
).FirstOrDefault();
}
Original file line number Diff line number Diff line change
Expand Up @@ -44,6 +44,7 @@ ILogger<SpectatorTargetInfoService> logger
public async Task InitializeAsync()
{
await DetectIsTeamsModeAsync();
await DetectIsTimeAttackModeAsync();
await FetchAndCacheTeamInfoAsync();
await SendReportSpectatorTargetManialinkAsync();
await HideGameModeUiAsync();
Expand Down Expand Up @@ -158,7 +159,7 @@ public async Task SetSpectatorTargetAndSendAsync(string spectatorLogin, string t
}
}

public Task RemovePlayerFromSpectatorsListAsync(string playerLogin)
public Task RemovePlayerAsync(string playerLogin)
{
lock (_spectatorTargetsMutex)
{
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -26,11 +26,11 @@ public async Task Removes_Player_From_Spectators_On_Disconnect()

await Controller.OnPlayerDisconnectAsync(null, new PlayerGbxEventArgs { Login = login });

Check warning on line 27 in tests/Modules/SpectatorTargetInfoModule.Tests/Controllers/SpectatorTargetEventControllerTests.cs

View workflow job for this annotation

GitHub Actions / Qodana for .NET

Cannot convert null literal to non-nullable reference type.

Cannot convert null literal to non-nullable reference type

_spectatorTargetService.Verify(sts => sts.RemovePlayerFromSpectatorsListAsync(login));
_spectatorTargetService.Verify(sts => sts.RemovePlayerAsync(login));
}

[Fact]
public async Task Updates_Team_Mode_On_New_Map()
public async Task Detects_Team_And_TimeAttack_Mode_On_New_Map()
{
await Controller.OnBeginMapAsync(null, new MapGbxEventArgs());

Expand All @@ -39,7 +39,7 @@ public async Task Updates_Team_Mode_On_New_Map()
}

[Fact]
public async Task Registers_Ceckpoint_Times()
public async Task Registers_Checkpoint_Times()
{
var login = "*fakeplayer_unittest*";
var checkpointId = 3;
Expand Down Expand Up @@ -73,6 +73,7 @@ public async Task Resets_Collected_Data_On_New_Round()

_spectatorTargetService.Verify(sts => sts.ClearCheckpointsAsync());
_spectatorTargetService.Verify(sts => sts.FetchAndCacheTeamInfoAsync());
_spectatorTargetService.Verify(sts => sts.ResetWidgetForSpectatorsAsync());
}

[Fact]
Expand All @@ -82,5 +83,33 @@ public async Task Resets_Collected_Data_On_New_Warm_Up_Round()

_spectatorTargetService.Verify(sts => sts.ClearCheckpointsAsync());
_spectatorTargetService.Verify(sts => sts.FetchAndCacheTeamInfoAsync());
_spectatorTargetService.Verify(sts => sts.ResetWidgetForSpectatorsAsync());
}

[Fact]
public async Task Sets_TimeAttack_Mode_To_Active_At_Warm_Up_Start()
{
await Controller.OnWarmUpStartAsync(null, EventArgs.Empty);

_spectatorTargetService.Verify(sts => sts.UpdateIsTimeAttackModeAsync(true));
}

[Fact]
public async Task Detects_TimeAttack_Mode_At_Warm_Up_End()
{
await Controller.OnWarmUpEndAsync(null, EventArgs.Empty);

_spectatorTargetService.Verify(sts => sts.DetectIsTimeAttackModeAsync());
}

[Fact]
public async Task Clears_Checkpoints_Of_Player_On_Give_Up()
{
var eventArgs = new PlayerUpdateEventArgs { Login = "*fakeplayer1*", AccountId = "*fakeplayer1*", Time = 0 };

await _spectatorTargetService.Object.UpdateIsTimeAttackModeAsync(true);
await Controller.OnPlayerGiveUpAsync(null, eventArgs);

Check warning on line 111 in tests/Modules/SpectatorTargetInfoModule.Tests/Controllers/SpectatorTargetEventControllerTests.cs

View workflow job for this annotation

GitHub Actions / Qodana for .NET

Cannot convert null literal to non-nullable reference type.

Cannot convert null literal to non-nullable reference type

_spectatorTargetService.Verify(sts => sts.ClearCheckpointsAsync(eventArgs.Login));
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@ public SpectatorTargetInfoManialinkControllerTests()
}

[Fact]
public async Task SetsSpectatorTargetIfGivenLoginIsValid()
public async Task Sets_Spectator_Target_If_Given_Login_Is_Valid()
{
_actor.Setup(actor => actor.AccountId)
.Returns("*fakeplayer_spectator*");
Expand All @@ -33,12 +33,12 @@ public async Task SetsSpectatorTargetIfGivenLoginIsValid()
await Controller.ReportSpectatorTargetAsync(targetLogin);

_spectatorTargetService.Verify(st => st.SetSpectatorTargetAndSendAsync(spectatorLogin, targetLogin), Times.Once);
_spectatorTargetService.Verify(st => st.RemovePlayerFromSpectatorsListAsync(spectatorLogin), Times.Never);
_spectatorTargetService.Verify(st => st.RemovePlayerAsync(spectatorLogin), Times.Never);
_spectatorTargetService.Verify(st => st.HideSpectatorInfoWidgetAsync(spectatorLogin), Times.Never);
}

[Fact]
public async Task RemoveSpectatorIfTargetIsEmpty()
public async Task Remove_Spectator_If_Target_Is_Empty()
{
_actor.Setup(actor => actor.AccountId)
.Returns("*fakeplayer_spectator*");
Expand All @@ -49,12 +49,12 @@ public async Task RemoveSpectatorIfTargetIsEmpty()
await Controller.ReportSpectatorTargetAsync(targetLogin);

_spectatorTargetService.Verify(st => st.SetSpectatorTargetAndSendAsync(spectatorLogin, targetLogin), Times.Never);
_spectatorTargetService.Verify(st => st.RemovePlayerFromSpectatorsListAsync(spectatorLogin), Times.Once);
_spectatorTargetService.Verify(st => st.RemovePlayerAsync(spectatorLogin), Times.Once);
_spectatorTargetService.Verify(st => st.HideSpectatorInfoWidgetAsync(spectatorLogin), Times.Once);
}

[Fact]
public async Task RemoveSpectatorIfTargetIsSpectatorThemselvesEmpty()
public async Task Remove_Spectator_If_Target_Is_Spectator_Themselves()
{
_actor.Setup(actor => actor.AccountId)
.Returns("*fakeplayer_spectator*");
Expand All @@ -65,7 +65,7 @@ public async Task RemoveSpectatorIfTargetIsSpectatorThemselvesEmpty()
await Controller.ReportSpectatorTargetAsync(targetLogin);

_spectatorTargetService.Verify(st => st.SetSpectatorTargetAndSendAsync(spectatorLogin, targetLogin), Times.Never);
_spectatorTargetService.Verify(st => st.RemovePlayerFromSpectatorsListAsync(spectatorLogin), Times.Once);
_spectatorTargetService.Verify(st => st.RemovePlayerAsync(spectatorLogin), Times.Once);
_spectatorTargetService.Verify(st => st.HideSpectatorInfoWidgetAsync(spectatorLogin), Times.Once);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@ public Task Gets_Player_Data_From_Group()
new CheckpointData(new OnlinePlayer { State = PlayerState.Playing, AccountId = "*fakeplayer12*" }, 2));

var time = checkpointsGroup.GetPlayerCheckpointData(targetPlayer.GetLogin())?.time;

Assert.Equal(1, time);

return Task.CompletedTask;
Expand Down Expand Up @@ -51,7 +51,7 @@ public Task Gets_Rank_Of_Player()
new CheckpointData(new OnlinePlayer { State = PlayerState.Playing, AccountId = "*fakeplayer12*" }, 2));

var rank = checkpointsGroup.GetRank(targetPlayer.AccountId);

Assert.Equal(2, rank);

return Task.CompletedTask;
Expand All @@ -72,7 +72,7 @@ public Task Gets_Rank_Of_Player_Correctly_If_Another_Player_Has_The_Same_Time_Be
new CheckpointData(new OnlinePlayer { State = PlayerState.Playing, AccountId = "*fakeplayer12*" }, 2));

var rank = checkpointsGroup.GetRank(targetPlayer.AccountId);

Assert.Equal(3, rank);

return Task.CompletedTask;
Expand All @@ -93,9 +93,38 @@ public Task Gets_Rank_Of_Player_Correctly_If_Another_Player_Has_The_Same_Time_Af
new CheckpointData(new OnlinePlayer { State = PlayerState.Playing, AccountId = "*fakeplayer12*" }, 2));

var rank = checkpointsGroup.GetRank(targetPlayer.AccountId);

Assert.Equal(2, rank);

return Task.CompletedTask;
}

[Fact]
public Task Forgets_Given_Player()
{
var checkpointsGroup = new CheckpointsGroup();
var targetPlayer = new OnlinePlayer { State = PlayerState.Playing, AccountId = "*fakeplayer1*" };

checkpointsGroup.Add(new CheckpointData(new OnlinePlayer { State = PlayerState.Playing, AccountId = "*fakeplayer10*" }, 0));
checkpointsGroup.Add(new CheckpointData(targetPlayer, 1));
checkpointsGroup.Add(new CheckpointData(new OnlinePlayer { State = PlayerState.Playing, AccountId = "*fakeplayer11*" }, 1));
checkpointsGroup.Add(new CheckpointData(new OnlinePlayer { State = PlayerState.Playing, AccountId = "*fakeplayer12*" }, 2));

var entryRemoved = checkpointsGroup.ForgetPlayer(targetPlayer.GetLogin());

Assert.True(entryRemoved);

return Task.CompletedTask;
}

[Fact]
public Task Does_Not_Forget_Non_Existent_Player()
{
var checkpointsGroup = new CheckpointsGroup();
var entryRemoved = checkpointsGroup.ForgetPlayer("*fakeplayer1*");

Assert.False(entryRemoved);

return Task.CompletedTask;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -72,7 +72,7 @@ public async Task Adds_And_Clears_Checkpoint_Data()

await spectatorTargetService.ClearCheckpointsAsync();
var checkpointTime = spectatorTargetService.GetCheckpointTimes();

Assert.Empty(checkpointTime);
}

Expand Down Expand Up @@ -143,6 +143,58 @@ public async Task Removes_Spectator_If_Target_Login_Is_Null()
Assert.DoesNotContain("*fakeplayer1*", spectatorOfPlayer);
}

[Fact]
public async Task Removes_Spectator_From_Spectator_Target_Repository()
{
var spectatorTargetService = ServiceMock();
var spectatorLogin = "*fakeplayer_spec*";

await spectatorTargetService.AddCheckpointAsync("*fakeplayer1*", 1, 1);
await spectatorTargetService.SetSpectatorTargetAsync(spectatorLogin, "*fakeplayer1*");
await spectatorTargetService.RemovePlayerAsync(spectatorLogin);

var spectatorInRepo = spectatorTargetService
.GetSpectatorTargets()
.ContainsKey(spectatorLogin);

Assert.False(spectatorInRepo);
}

[Fact]
public async Task Removes_Driver_From_Spectator_Target_Repository()
{
var spectatorTargetService = ServiceMock();
var spectatorLogin1 = "*fakeplayer99*";
var spectatorLogin2 = "*fakeplayer98*";
var targetLogin = "*fakeplayer2*";

_playerManager.Setup(pm => pm.GetOnlinePlayerAsync("*fakeplayer1*"))
.ReturnsAsync(new OnlinePlayer { State = PlayerState.Playing, AccountId = "*fakeplayer1*" });
_playerManager.Setup(pm => pm.GetOnlinePlayerAsync("*fakeplayer2*"))
.ReturnsAsync(new OnlinePlayer { State = PlayerState.Playing, AccountId = "*fakeplayer2*" });
_playerManager.Setup(pm => pm.GetOnlinePlayerAsync("*fakeplayer3*"))
.ReturnsAsync(new OnlinePlayer { State = PlayerState.Playing, AccountId = "*fakeplayer3*" });

await spectatorTargetService.AddCheckpointAsync("*fakeplayer1*", 1, 1);
await spectatorTargetService.AddCheckpointAsync(targetLogin, 2, 2);
await spectatorTargetService.AddCheckpointAsync("*fakeplayer3*", 3, 3);
await spectatorTargetService.SetSpectatorTargetAsync(spectatorLogin1, targetLogin);
await spectatorTargetService.SetSpectatorTargetAsync(spectatorLogin2, targetLogin);

await spectatorTargetService.RemovePlayerAsync(targetLogin);

var targetPlayerInRepo = spectatorTargetService
.GetSpectatorTargets()
.Any(kv => kv.Value.GetLogin() == targetLogin);

var spectatorsOfTargetInRepo = spectatorTargetService
.GetSpectatorTargets()
.Any(kv => kv.Key == spectatorLogin1 || kv.Key == spectatorLogin2);

Assert.False(targetPlayerInRepo);
Assert.False(spectatorsOfTargetInRepo);
}

[Fact]
public async Task Gets_Logins_Spectating_The_Given_Target()
{
Expand Down Expand Up @@ -201,7 +253,7 @@ public Task Gets_Rank_From_Sorted_Checkpoints_List()
var player2Rank = checkpointsList.GetRank("*fakeplayer2*");
var player3Rank = checkpointsList.GetRank("*fakeplayer3*");
var player4Rank = checkpointsList.GetRank("*fakeplayer4*");

Assert.Equal(1, player1Rank);
Assert.Equal(2, player2Rank);
Assert.Equal(4, player3Rank);
Expand Down Expand Up @@ -270,7 +322,7 @@ public async Task Gets_The_Team_Color()

var team1Color = spectatorTargetService.GetTeamColor(PlayerTeam.Team1);
var team2Color = spectatorTargetService.GetTeamColor(PlayerTeam.Team2);

Assert.Equal("FF0066", team1Color);
Assert.Equal("111111", team2Color);
}
Expand Down Expand Up @@ -309,7 +361,8 @@ public async Task Sends_The_Widget_To_The_Given_Player_With_Arguments()
var widgetData = spectatorTargetService.GetWidgetData(targetPlayer, 2, 150);
await spectatorTargetService.SendSpectatorInfoWidgetAsync(spectatorLogin, targetPlayer, widgetData);

_manialinkManager.Verify(mm => mm.SendManialinkAsync(spectatorLogin, "SpectatorTargetInfoModule.SpectatorTargetInfo",widgetData));
_manialinkManager.Verify(mm =>
mm.SendManialinkAsync(spectatorLogin, "SpectatorTargetInfoModule.SpectatorTargetInfo", widgetData));
}

[Fact]
Expand Down Expand Up @@ -379,9 +432,11 @@ public async Task Sends_The_Widget_To_The_Given_Player_Without_Time_And_Checkpoi
await spectatorTargetService.AddCheckpointAsync(otherPlayer.GetLogin(), 2, 1000);
await spectatorTargetService.AddCheckpointAsync(targetPlayer.GetLogin(), 2, 1234);
await spectatorTargetService.SendSpectatorInfoWidgetAsync(spectatorLogin, targetPlayer);

_manialinkManager.Verify(mm =>
mm.SendManialinkAsync(spectatorLogin, "SpectatorTargetInfoModule.SpectatorTargetInfo", It.IsAny<object>()), Times.Once);
mm.SendManialinkAsync(spectatorLogin, "SpectatorTargetInfoModule.SpectatorTargetInfo",
It.IsAny<object>()),
Times.Once);
}

[Fact]
Expand Down

0 comments on commit fdad06b

Please sign in to comment.