Death Counter
This commit is contained in:
@@ -0,0 +1,257 @@
|
||||
package dev.tatsi.reloadmc.smp.manager;
|
||||
|
||||
import com.google.gson.Gson;
|
||||
import com.google.gson.GsonBuilder;
|
||||
import dev.tatsi.reloadmc.smp.model.DeathRecord;
|
||||
import dev.tatsi.reloadmc.smp.model.PlayerDeathData;
|
||||
import org.bukkit.plugin.java.JavaPlugin;
|
||||
import org.junit.jupiter.api.BeforeEach;
|
||||
import org.junit.jupiter.api.Test;
|
||||
import org.junit.jupiter.api.extension.ExtendWith;
|
||||
import org.junit.jupiter.api.io.TempDir;
|
||||
import org.mockito.Mock;
|
||||
import org.mockito.junit.jupiter.MockitoExtension;
|
||||
|
||||
import java.io.File;
|
||||
import java.io.FileWriter;
|
||||
import java.io.IOException;
|
||||
import java.nio.file.Path;
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
import java.util.UUID;
|
||||
import java.util.logging.Logger;
|
||||
|
||||
import static org.junit.jupiter.api.Assertions.*;
|
||||
import static org.mockito.Mockito.*;
|
||||
|
||||
@ExtendWith(MockitoExtension.class)
|
||||
class DeathCounterManagerTest {
|
||||
|
||||
@Mock
|
||||
private JavaPlugin mockPlugin;
|
||||
|
||||
@Mock
|
||||
private Logger mockLogger;
|
||||
|
||||
@TempDir
|
||||
Path tempDir;
|
||||
|
||||
private DeathCounterManager deathCounterManager;
|
||||
private File dataFolder;
|
||||
private UUID testPlayerUuid;
|
||||
private String testPlayerName;
|
||||
|
||||
@BeforeEach
|
||||
void setUp() {
|
||||
// Setup mock plugin
|
||||
dataFolder = tempDir.toFile();
|
||||
when(mockPlugin.getDataFolder()).thenReturn(dataFolder);
|
||||
when(mockPlugin.getLogger()).thenReturn(mockLogger);
|
||||
|
||||
// Test data
|
||||
testPlayerUuid = UUID.randomUUID();
|
||||
testPlayerName = "TestPlayer";
|
||||
|
||||
// Create DeathCounterManager instance
|
||||
deathCounterManager = new DeathCounterManager(mockPlugin);
|
||||
}
|
||||
|
||||
@Test
|
||||
void testConstructor_CreatesDataFolderIfNotExists() {
|
||||
// Given: A new temp directory that doesn't exist
|
||||
File newDataFolder = new File(tempDir.toFile(), "newFolder");
|
||||
when(mockPlugin.getDataFolder()).thenReturn(newDataFolder);
|
||||
|
||||
// When: Creating a new DeathCounterManager
|
||||
new DeathCounterManager(mockPlugin);
|
||||
|
||||
// Then: The data folder should be created
|
||||
assertTrue(newDataFolder.exists());
|
||||
}
|
||||
|
||||
@Test
|
||||
void testAddDeath_NewPlayer() {
|
||||
// Given: A new death record
|
||||
DeathRecord deathRecord = new DeathRecord(100.0, 64.0, 200.0, "world", "Fell from a high place");
|
||||
|
||||
// When: Adding a death for a new player
|
||||
deathCounterManager.addDeath(testPlayerUuid, testPlayerName, deathRecord);
|
||||
|
||||
// Then: Player data should be created and death should be recorded
|
||||
PlayerDeathData playerData = deathCounterManager.getPlayerDeathData(testPlayerUuid);
|
||||
assertNotNull(playerData);
|
||||
assertEquals(testPlayerUuid, playerData.getPlayerUuid());
|
||||
assertEquals(testPlayerName, playerData.getPlayerName());
|
||||
assertEquals(1, playerData.getDeathCount());
|
||||
assertEquals(1, playerData.getDeaths().size());
|
||||
assertEquals(deathRecord.getDeathReason(), playerData.getDeaths().get(0).getDeathReason());
|
||||
}
|
||||
|
||||
@Test
|
||||
void testAddDeath_ExistingPlayer() {
|
||||
// Given: A player with existing death data
|
||||
DeathRecord firstDeath = new DeathRecord(100.0, 64.0, 200.0, "world", "Fell from a high place");
|
||||
DeathRecord secondDeath = new DeathRecord(150.0, 70.0, 250.0, "nether", "Burned to death");
|
||||
|
||||
// When: Adding multiple deaths for the same player
|
||||
deathCounterManager.addDeath(testPlayerUuid, testPlayerName, firstDeath);
|
||||
deathCounterManager.addDeath(testPlayerUuid, testPlayerName, secondDeath);
|
||||
|
||||
// Then: Both deaths should be recorded
|
||||
PlayerDeathData playerData = deathCounterManager.getPlayerDeathData(testPlayerUuid);
|
||||
assertNotNull(playerData);
|
||||
assertEquals(2, playerData.getDeathCount());
|
||||
assertEquals(2, playerData.getDeaths().size());
|
||||
}
|
||||
|
||||
@Test
|
||||
void testGetPlayerDeathData_NonExistentPlayer() {
|
||||
// Given: A UUID that doesn't exist in the data
|
||||
UUID nonExistentUuid = UUID.randomUUID();
|
||||
|
||||
// When: Getting player data for non-existent player
|
||||
PlayerDeathData result = deathCounterManager.getPlayerDeathData(nonExistentUuid);
|
||||
|
||||
// Then: Should return null
|
||||
assertNull(result);
|
||||
}
|
||||
|
||||
@Test
|
||||
void testGetDeathCount_ExistingPlayer() {
|
||||
// Given: A player with death data
|
||||
DeathRecord deathRecord = new DeathRecord(100.0, 64.0, 200.0, "world", "Fell from a high place");
|
||||
deathCounterManager.addDeath(testPlayerUuid, testPlayerName, deathRecord);
|
||||
|
||||
// When: Getting death count
|
||||
int deathCount = deathCounterManager.getDeathCount(testPlayerUuid);
|
||||
|
||||
// Then: Should return correct count
|
||||
assertEquals(1, deathCount);
|
||||
}
|
||||
|
||||
@Test
|
||||
void testGetDeathCount_NonExistentPlayer() {
|
||||
// Given: A UUID that doesn't exist in the data
|
||||
UUID nonExistentUuid = UUID.randomUUID();
|
||||
|
||||
// When: Getting death count for non-existent player
|
||||
int deathCount = deathCounterManager.getDeathCount(nonExistentUuid);
|
||||
|
||||
// Then: Should return 0
|
||||
assertEquals(0, deathCount);
|
||||
}
|
||||
|
||||
@Test
|
||||
void testGetAllPlayerData() {
|
||||
// Given: Multiple players with death data
|
||||
UUID player1Uuid = UUID.randomUUID();
|
||||
UUID player2Uuid = UUID.randomUUID();
|
||||
DeathRecord death1 = new DeathRecord(100.0, 64.0, 200.0, "world", "Fell from a high place");
|
||||
DeathRecord death2 = new DeathRecord(150.0, 70.0, 250.0, "nether", "Burned to death");
|
||||
|
||||
deathCounterManager.addDeath(player1Uuid, "Player1", death1);
|
||||
deathCounterManager.addDeath(player2Uuid, "Player2", death2);
|
||||
|
||||
// When: Getting all player data
|
||||
Map<UUID, PlayerDeathData> allData = deathCounterManager.getAllPlayerData();
|
||||
|
||||
// Then: Should return copy of all data
|
||||
assertEquals(2, allData.size());
|
||||
assertTrue(allData.containsKey(player1Uuid));
|
||||
assertTrue(allData.containsKey(player2Uuid));
|
||||
|
||||
// Verify it's a copy (modifying returned map shouldn't affect internal data)
|
||||
allData.clear();
|
||||
assertEquals(2, deathCounterManager.getAllPlayerData().size());
|
||||
}
|
||||
|
||||
@Test
|
||||
void testDataPersistence_SaveAndLoad() throws IOException {
|
||||
// Given: Some death data
|
||||
DeathRecord deathRecord = new DeathRecord(100.0, 64.0, 200.0, "world", "Fell from a high place");
|
||||
deathCounterManager.addDeath(testPlayerUuid, testPlayerName, deathRecord);
|
||||
|
||||
// When: Creating a new DeathCounterManager (which should load existing data)
|
||||
DeathCounterManager newManager = new DeathCounterManager(mockPlugin);
|
||||
|
||||
// Then: Data should be loaded correctly
|
||||
PlayerDeathData loadedData = newManager.getPlayerDeathData(testPlayerUuid);
|
||||
assertNotNull(loadedData);
|
||||
assertEquals(testPlayerUuid, loadedData.getPlayerUuid());
|
||||
assertEquals(testPlayerName, loadedData.getPlayerName());
|
||||
assertEquals(1, loadedData.getDeathCount());
|
||||
}
|
||||
|
||||
@Test
|
||||
void testLoadData_EmptyFile() throws IOException {
|
||||
// Given: An empty data file
|
||||
File dataFile = new File(dataFolder, "death_counter.json");
|
||||
// Create an empty file
|
||||
dataFile.createNewFile();
|
||||
assertTrue(dataFile.exists());
|
||||
|
||||
// When: Creating a new DeathCounterManager
|
||||
DeathCounterManager newManager = new DeathCounterManager(mockPlugin);
|
||||
|
||||
// Then: Should handle empty data gracefully
|
||||
assertEquals(0, newManager.getAllPlayerData().size());
|
||||
}
|
||||
|
||||
@Test
|
||||
void testShutdown_SavesData() {
|
||||
// Given: Some death data
|
||||
DeathRecord deathRecord = new DeathRecord(100.0, 64.0, 200.0, "world", "Fell from a high place");
|
||||
deathCounterManager.addDeath(testPlayerUuid, testPlayerName, deathRecord);
|
||||
|
||||
// When: Calling shutdown
|
||||
deathCounterManager.shutdown();
|
||||
|
||||
// Then: Should log shutdown message
|
||||
verify(mockLogger).info("Death counter data saved on shutdown.");
|
||||
}
|
||||
|
||||
@Test
|
||||
void testDeathRecordDetails() {
|
||||
// Given: A death record with specific details
|
||||
double x = 123.45;
|
||||
double y = 67.89;
|
||||
double z = 234.56;
|
||||
String world = "test_world";
|
||||
String reason = "Killed by Zombie";
|
||||
|
||||
DeathRecord deathRecord = new DeathRecord(x, y, z, world, reason);
|
||||
deathCounterManager.addDeath(testPlayerUuid, testPlayerName, deathRecord);
|
||||
|
||||
// When: Retrieving the death record
|
||||
PlayerDeathData playerData = deathCounterManager.getPlayerDeathData(testPlayerUuid);
|
||||
DeathRecord retrievedRecord = playerData.getDeaths().get(0);
|
||||
|
||||
// Then: All details should be preserved
|
||||
assertEquals(x, retrievedRecord.getX(), 0.001);
|
||||
assertEquals(y, retrievedRecord.getY(), 0.001);
|
||||
assertEquals(z, retrievedRecord.getZ(), 0.001);
|
||||
assertEquals(world, retrievedRecord.getWorld());
|
||||
assertEquals(reason, retrievedRecord.getDeathReason());
|
||||
assertNotNull(retrievedRecord.getTimestamp());
|
||||
}
|
||||
|
||||
@Test
|
||||
void testMultipleDeathsPreserveOrder() {
|
||||
// Given: Multiple deaths added in sequence
|
||||
DeathRecord death1 = new DeathRecord(100.0, 64.0, 200.0, "world", "First death");
|
||||
DeathRecord death2 = new DeathRecord(150.0, 70.0, 250.0, "nether", "Second death");
|
||||
DeathRecord death3 = new DeathRecord(200.0, 80.0, 300.0, "end", "Third death");
|
||||
|
||||
// When: Adding deaths in sequence
|
||||
deathCounterManager.addDeath(testPlayerUuid, testPlayerName, death1);
|
||||
deathCounterManager.addDeath(testPlayerUuid, testPlayerName, death2);
|
||||
deathCounterManager.addDeath(testPlayerUuid, testPlayerName, death3);
|
||||
|
||||
// Then: Deaths should be preserved in order
|
||||
PlayerDeathData playerData = deathCounterManager.getPlayerDeathData(testPlayerUuid);
|
||||
assertEquals(3, playerData.getDeathCount());
|
||||
assertEquals("First death", playerData.getDeaths().get(0).getDeathReason());
|
||||
assertEquals("Second death", playerData.getDeaths().get(1).getDeathReason());
|
||||
assertEquals("Third death", playerData.getDeaths().get(2).getDeathReason());
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user