Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ namespace TaloGameServices
{
public class LeaderboardEntriesManager
{
private Dictionary<string, List<LeaderboardEntry>> _currentEntries = new Dictionary<string, List<LeaderboardEntry>>();
private readonly Dictionary<string, List<LeaderboardEntry>> _currentEntries = new();

public List<LeaderboardEntry> GetEntries(string internalName)
{
Expand All @@ -16,7 +16,7 @@ public List<LeaderboardEntry> GetEntries(string internalName)
return _currentEntries[internalName];
}

public void UpsertEntry(string internalName, LeaderboardEntry entry, bool bumpPositions = false)
public void UpsertEntry(string internalName, LeaderboardEntry upsertEntry, bool bumpPositions = false)
{
if (!_currentEntries.ContainsKey(internalName))
{
Expand All @@ -26,18 +26,23 @@ public void UpsertEntry(string internalName, LeaderboardEntry entry, bool bumpPo
var entries = _currentEntries[internalName];

// ensure there isn't an existing entry
entries.RemoveAll((e) => e.id == entry.id);
entries.RemoveAll((e) => e.id == upsertEntry.id);

int insertPosition = FindInsertPosition(entries, entry);
entries.Insert(insertPosition, entry);
int insertPosition = FindInsertPosition(entries, upsertEntry);
entries.Insert(insertPosition, upsertEntry);

if (bumpPositions)
{
foreach (var e in entries)
// find any collisions and bump any subsequent entries down by 1
int collisionIndex = entries.FindIndex((e) => e.id != upsertEntry.id && e.position == upsertEntry.position);
if (collisionIndex != -1)
{
if (e.id != entry.id && e.position >= entry.position)
for (int i = collisionIndex; i < entries.Count; i++)
{
e.position += 1;
if (entries[i].id != upsertEntry.id)
{
entries[i].position += 1;
}
}
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -191,6 +191,35 @@ public void UpsertEntry_BumpPositions_OnlyBumpsAffectedEntries()
Assert.AreEqual(3, entries[3].position); // bumped from 2 to 3
}

[Test]
public void UpsertEntry_BumpPositions_DoesNotBumpWhenPlayerImprovesButKeepsSamePosition()
{
var entry1 = new LeaderboardEntry { id = 1, score = 100f, position = 0, leaderboardSortMode = "desc" };
var entry2 = new LeaderboardEntry { id = 2, score = 80f, position = 1, leaderboardSortMode = "desc" };
var entry3 = new LeaderboardEntry { id = 3, score = 60f, position = 2, leaderboardSortMode = "desc" };

manager.UpsertEntry("test", entry1);
manager.UpsertEntry("test", entry2);
manager.UpsertEntry("test", entry3);

// entry1 improves their score but stays at position 0 - no one should be bumped
var updatedEntry1 = new LeaderboardEntry { id = 1, score = 110f, position = 0, leaderboardSortMode = "desc" };
manager.UpsertEntry("test", updatedEntry1, bumpPositions: true);

var entries = manager.GetEntries("test");

Assert.AreEqual(3, entries.Count);

Assert.AreEqual(1, entries[0].id);
Assert.AreEqual(0, entries[0].position); // still first

Assert.AreEqual(2, entries[1].id);
Assert.AreEqual(1, entries[1].position); // unchanged

Assert.AreEqual(3, entries[2].id);
Assert.AreEqual(2, entries[2].position); // unchanged
}

[Test]
public void UpsertEntry_NoBumpPositions_PreservesExistingPositions()
{
Expand Down