Move logic for config format into ConfigStringUtils

This commit is contained in:
nossr50
2024-11-02 19:39:06 -07:00
parent ce18f3df97
commit 39b0e87b9a
14 changed files with 470 additions and 88 deletions

View File

@@ -0,0 +1,323 @@
package com.gmail.nossr50.util.text;
import org.bukkit.Material;
import org.bukkit.entity.EntityType;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import com.gmail.nossr50.datatypes.party.PartyFeature;
import com.gmail.nossr50.datatypes.skills.SuperAbilityType;
import static org.junit.jupiter.api.Assertions.*;
class StringUtilsTest {
@BeforeEach
void setUp() {
// Clear caches before each test to ensure test isolation
clearCaches();
}
/**
* Utility method to clear all caches in StringUtils.
* Reflection is used since the caches are private.
*/
private void clearCaches() {
try {
java.lang.reflect.Field entityCache = StringUtils.class.getDeclaredField("formattedEntityStrings");
entityCache.setAccessible(true);
((java.util.Map<?, ?>) entityCache.get(null)).clear();
java.lang.reflect.Field superAbilityCache = StringUtils.class.getDeclaredField("formattedSuperAbilityStrings");
superAbilityCache.setAccessible(true);
((java.util.Map<?, ?>) superAbilityCache.get(null)).clear();
java.lang.reflect.Field materialCache = StringUtils.class.getDeclaredField("formattedMaterialStrings");
materialCache.setAccessible(true);
((java.util.Map<?, ?>) materialCache.get(null)).clear();
java.lang.reflect.Field partyFeatureCache = StringUtils.class.getDeclaredField("prettyPartyFeatureStringCache");
partyFeatureCache.setAccessible(true);
((java.util.Map<?, ?>) partyFeatureCache.get(null)).clear();
} catch (NoSuchFieldException | IllegalAccessException e) {
fail("Failed to clear caches: " + e.getMessage());
}
}
// Tests for getCapitalized(String target)
@Test
void testGetCapitalized_NullInput() {
assertNull(StringUtils.getCapitalized(null));
}
@Test
void testGetCapitalized_EmptyString() {
assertEquals("", StringUtils.getCapitalized(""));
}
@Test
void testGetCapitalized_SingleCharacter() {
assertEquals("A", StringUtils.getCapitalized("a"));
assertEquals("Z", StringUtils.getCapitalized("Z"));
}
@Test
void testGetCapitalized_AllUppercase() {
assertEquals("Test", StringUtils.getCapitalized("TEST"));
}
@Test
void testGetCapitalized_AllLowercase() {
assertEquals("Test", StringUtils.getCapitalized("test"));
}
@Test
void testGetCapitalized_MixedCase() {
assertEquals("Test", StringUtils.getCapitalized("tEsT"));
}
@Test
void testGetCapitalized_NonASCII() {
assertEquals("Ñandú", StringUtils.getCapitalized("ñandú"));
}
// Tests for ticksToSeconds(double ticks)
@Test
void testTicksToSeconds_PositiveTicks() {
assertEquals("1.5", StringUtils.ticksToSeconds(30));
}
@Test
void testTicksToSeconds_ZeroTicks() {
assertEquals("0.0", StringUtils.ticksToSeconds(0));
}
@Test
void testTicksToSeconds_FractionalTicks() {
assertEquals("1.5", StringUtils.ticksToSeconds(30.0));
assertEquals("1.5", StringUtils.ticksToSeconds(30.0));
assertEquals("1.0", StringUtils.ticksToSeconds(20.0));
assertEquals("0.1", StringUtils.ticksToSeconds(2.0));
}
@Test
void testTicksToSeconds_NegativeTicks() {
assertEquals("-1.0", StringUtils.ticksToSeconds(-20));
}
// Tests for getPrettySuperAbilityString(SuperAbilityType superAbilityType)
@Test
void testGetPrettySuperAbilityString_NullInput() {
assertThrows(NullPointerException.class, () -> {
StringUtils.getPrettySuperAbilityString(null);
});
}
@Test
void testGetPrettySuperAbilityString_ValidInput() {
SuperAbilityType superAbilityType = SuperAbilityType.SUPER_BREAKER;
String expected = "Super Breaker";
String actual = StringUtils.getPrettySuperAbilityString(superAbilityType);
assertEquals(expected, actual);
}
@Test
void testGetPrettySuperAbilityString_Caching() {
SuperAbilityType superAbilityType = SuperAbilityType.SUPER_BREAKER;
// First call should compute and cache
String firstCall = StringUtils.getPrettySuperAbilityString(superAbilityType);
// Second call should retrieve from cache
String secondCall = StringUtils.getPrettySuperAbilityString(superAbilityType);
assertSame(firstCall, secondCall, "Cached value should be the same instance");
}
// Tests for getPrettyEntityTypeString(EntityType entityType)
@Test
void testGetPrettyEntityTypeString_ValidInput() {
EntityType zombie = EntityType.ZOMBIE;
String expected = "Zombie";
String actual = StringUtils.getPrettyEntityTypeString(zombie);
assertEquals(expected, actual);
}
@Test
void testGetPrettyEntityTypeString_WithUnderscores() {
EntityType entity = EntityType.SKELETON_HORSE;
String expected = "Skeleton Horse";
String actual = StringUtils.getPrettyEntityTypeString(entity);
assertEquals(expected, actual);
}
@Test
void testGetPrettyEntityTypeString_Caching() {
EntityType skeleton = EntityType.SKELETON;
// First call should compute and cache
String firstCall = StringUtils.getPrettyEntityTypeString(skeleton);
// Second call should retrieve from cache
String secondCall = StringUtils.getPrettyEntityTypeString(skeleton);
assertSame(firstCall, secondCall, "Cached value should be the same instance");
}
// Tests for getFormattedMaterialString(Material material)
@Test
void testGetPrettyMaterialString_ValidInput() {
Material diamondSword = Material.DIAMOND_SWORD;
String expected = "Diamond Sword";
String actual = StringUtils.getPrettyMaterialString(diamondSword);
assertEquals(expected, actual);
}
@Test
void testGetPrettyMaterialString_WithUnderscores() {
Material goldenApple = Material.GOLDEN_APPLE;
String expected = "Golden Apple";
String actual = StringUtils.getPrettyMaterialString(goldenApple);
assertEquals(expected, actual);
}
@Test
void testGetPrettyMaterialString_Caching() {
Material ironPickaxe = Material.IRON_PICKAXE;
// First call should compute and cache
String firstCall = StringUtils.getPrettyMaterialString(ironPickaxe);
// Second call should retrieve from cache
String secondCall = StringUtils.getPrettyMaterialString(ironPickaxe);
assertSame(firstCall, secondCall, "Cached value should be the same instance");
}
// Tests for buildStringAfterNthElement(String[] args, int index)
@Test
void testBuildStringAfterNthElement_IndexZero() {
String[] args = {"Hello", "World", "Test"};
String expected = "Hello World Test";
String actual = StringUtils.buildStringAfterNthElement(args, 0);
assertEquals(expected, actual);
}
@Test
void testBuildStringAfterNthElement_IndexMiddle() {
String[] args = {"This", "is", "a", "test"};
String expected = "a test";
String actual = StringUtils.buildStringAfterNthElement(args, 2);
assertEquals(expected, actual);
}
@Test
void testBuildStringAfterNthElement_IndexLast() {
String[] args = {"Only", "One"};
String expected = "One";
String actual = StringUtils.buildStringAfterNthElement(args, 1);
assertEquals(expected, actual);
}
@Test
void testBuildStringAfterNthElement_IndexOutOfBounds() {
String[] args = {"Too", "Short"};
String expected = "";
String actual = StringUtils.buildStringAfterNthElement(args, 5);
assertEquals(expected, actual);
}
@Test
void testBuildStringAfterNthElement_EmptyArray() {
String[] args = {};
String expected = "";
String actual = StringUtils.buildStringAfterNthElement(args, 0);
assertEquals(expected, actual);
}
@Test
void testBuildStringAfterNthElement_ArgsWithSpaces() {
String[] args = {"Multiple", " ", "Spaces"};
String expected = " Spaces";
String actual = StringUtils.buildStringAfterNthElement(args, 1);
assertEquals(expected, actual);
}
// Tests for isInt(String string)
@Test
void testIsInt_ValidIntegers() {
assertTrue(StringUtils.isInt("123"));
assertTrue(StringUtils.isInt("-456"));
assertTrue(StringUtils.isInt("0"));
}
@Test
void testIsInt_InvalidIntegers() {
assertFalse(StringUtils.isInt("123.45"));
assertFalse(StringUtils.isInt("abc"));
assertFalse(StringUtils.isInt(""));
assertFalse(StringUtils.isInt(" "));
assertFalse(StringUtils.isInt(null)); // This will throw NullPointerException
}
// Tests for isDouble(String string)
@Test
void testIsDouble_ValidDoubles() {
assertTrue(StringUtils.isDouble("123.45"));
assertTrue(StringUtils.isDouble("-456.78"));
assertTrue(StringUtils.isDouble("0.0"));
assertTrue(StringUtils.isDouble("1e10"));
}
@Test
void testIsDouble_InvalidDoubles() {
assertFalse(StringUtils.isDouble("abc"));
assertFalse(StringUtils.isDouble(""));
assertFalse(StringUtils.isDouble(" "));
assertFalse(StringUtils.isDouble("123.45.67"));
}
@Test
void testIsDouble_NullInput() {
assertThrows(NullPointerException.class, () -> {
StringUtils.isDouble(null);
});
}
@Test
void testCachingMechanism_EntityType() {
EntityType zombie = EntityType.ZOMBIE;
String firstCall = StringUtils.getPrettyEntityTypeString(zombie);
String secondCall = StringUtils.getPrettyEntityTypeString(zombie);
assertSame(firstCall, secondCall, "EntityType caching failed");
}
@Test
void testCachingMechanism_Material() {
Material diamondSword = Material.DIAMOND_SWORD;
String firstCall = StringUtils.getPrettyMaterialString(diamondSword);
String secondCall = StringUtils.getPrettyMaterialString(diamondSword);
assertSame(firstCall, secondCall, "Material caching failed");
}
// Tests for createPrettyString via public methods
@Test
void testCreatePrettyString_Spaces() {
String[] args = {"hello", "world"};
String expected = "hello world";
String actual = StringUtils.buildStringAfterNthElement(args, 0);
assertEquals(expected, actual);
}
@Test
void testPrettify_Substrings() {
Material goldenApple = Material.GOLDEN_APPLE;
String expected = "Golden Apple";
String actual = StringUtils.getPrettyMaterialString(goldenApple);
assertEquals(expected, actual);
}
}