Skip to content

Commit 94061bf

Browse files
Add unit tests for extensions and inventory builder
Introduces test classes for TranslationExtension, UXExtension, and InventoryBuilder, covering translation formatting, particle spawning, and inventory item management. These tests improve code reliability and ensure correct behavior of extension functions and inventory operations.
1 parent bba10b8 commit 94061bf

3 files changed

Lines changed: 178 additions & 0 deletions

File tree

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
package cc.modlabs.kpaper.extensions
2+
3+
import org.junit.jupiter.api.Assertions.assertEquals
4+
import org.junit.jupiter.api.Test
5+
6+
class TranslationExtensionTest {
7+
8+
@Test
9+
fun `minecraftTranslated wraps key with lang tag`() {
10+
assertEquals("<lang:test.key>", "test.key".minecraftTranslated)
11+
}
12+
13+
@Test
14+
fun `getUnknownTranslation formats clickable hoverable key`() {
15+
val key = "missing.key"
16+
val expected = "<hover:show_text:'Click to copy'><click:suggest_command:'$key'>$key</click></hover>"
17+
assertEquals(expected, getUnknownTranslation(key))
18+
}
19+
20+
@Test
21+
fun `toMinecraftTranslated formats args with colons`() {
22+
val out = "item.count".toMinecraftTranslated(1, 2, 3)
23+
assertEquals("<lang:item.count:1:2:3>", out)
24+
}
25+
}
Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,65 @@
1+
package cc.modlabs.kpaper.extensions
2+
3+
import io.mockk.every
4+
import io.mockk.mockk
5+
import io.mockk.verify
6+
import org.bukkit.Color
7+
import org.bukkit.Location
8+
import org.bukkit.Particle
9+
import org.bukkit.World
10+
import org.junit.jupiter.api.Test
11+
12+
class UXExtensionTest {
13+
14+
private fun locWith(world: World = mockk(relaxed = true)): Location = Location(world, 10.0, 64.0, -5.0)
15+
16+
@Test
17+
fun `spawnParticle delegates to world with same args`() {
18+
val world: World = mockk(relaxed = true)
19+
val loc = locWith(world)
20+
21+
loc.spawnParticle(
22+
particle = Particle.CRIT,
23+
count = 3,
24+
offsetX = 0.1,
25+
offsetY = 0.2,
26+
offsetZ = 0.3,
27+
speed = 0.0,
28+
dustOptions = Particle.DustOptions(Color.WHITE, 1.0f)
29+
)
30+
31+
verify(exactly = 1) {
32+
world.spawnParticle(
33+
Particle.CRIT,
34+
loc,
35+
3,
36+
0.1,
37+
0.2,
38+
0.3,
39+
0.0,
40+
any<Particle.DustOptions>()
41+
)
42+
}
43+
}
44+
45+
@Test
46+
fun `spawnColoredParticle uses DUST and DustOptions`() {
47+
val world: World = mockk(relaxed = true)
48+
val loc = locWith(world)
49+
50+
loc.spawnColoredParticle(Color.RED)
51+
52+
verify(exactly = 1) {
53+
world.spawnParticle(
54+
Particle.DUST,
55+
loc,
56+
1,
57+
0.0,
58+
0.0,
59+
0.0,
60+
0.0,
61+
any<Particle.DustOptions>()
62+
)
63+
}
64+
}
65+
}
Lines changed: 88 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,88 @@
1+
package cc.modlabs.kpaper.inventory
2+
3+
import io.mockk.*
4+
import net.kyori.adventure.text.Component
5+
import org.bukkit.Bukkit
6+
import org.bukkit.entity.Player
7+
import org.bukkit.inventory.Inventory
8+
import org.bukkit.inventory.ItemStack
9+
import org.junit.jupiter.api.AfterEach
10+
import org.junit.jupiter.api.BeforeEach
11+
import org.junit.jupiter.api.Test
12+
13+
class InventoryBuilderTest {
14+
15+
private lateinit var inventory: Inventory
16+
private lateinit var player: Player
17+
18+
@BeforeEach
19+
fun setUp() {
20+
mockkStatic(Bukkit::class)
21+
inventory = mockk(relaxed = true)
22+
player = mockk(relaxed = true)
23+
every { Bukkit.createInventory(any(), any<Int>(), any<Component>()) } returns inventory
24+
}
25+
26+
@AfterEach
27+
fun tearDown() {
28+
unmockkAll()
29+
}
30+
31+
@Test
32+
fun `build sets provided items into inventory`() {
33+
val title = Component.text("Inv")
34+
val size = 9
35+
36+
val stack1: ItemStack = mockk(relaxed = true)
37+
val stack2: ItemStack = mockk(relaxed = true)
38+
39+
val ib = InventoryBuilder(size, title)
40+
.setItem(0, InventoryItem(stack1))
41+
.setItem(5, stack2)
42+
43+
val inv = ib.build()
44+
45+
// Correct inventory returned from Bukkit
46+
assert(inv === inventory)
47+
48+
verify(exactly = 1) { inventory.setItem(0, stack1) }
49+
verify(exactly = 1) { inventory.setItem(5, stack2) }
50+
confirmVerified(inventory)
51+
}
52+
53+
@Test
54+
@org.junit.jupiter.api.Disabled("Disabled: calling open() initializes ItemClickListener and the plugin event system; documented behavior only")
55+
fun `open builds inventory opens for player and registers click mapping`() {
56+
val title = Component.text("Openable")
57+
val size = 9
58+
59+
val stack: ItemStack = mockk(relaxed = true)
60+
val invItem = InventoryItem(stack)
61+
62+
val ib = InventoryBuilder(size, title)
63+
.setItem(3, invItem)
64+
65+
ib.open(player)
66+
67+
verify(exactly = 1) { player.openInventory(inventory) }
68+
// Registration with ItemClickListener would occur here in a real server environment
69+
}
70+
71+
@Test
72+
fun `fill sets every empty slot to provided item`() {
73+
val title = Component.text("Fill")
74+
val size = 9
75+
76+
// Inventory initially empty
77+
every { inventory.getItem(any()) } returns null
78+
79+
val filler: ItemStack = mockk(relaxed = true)
80+
val ib = InventoryBuilder(size, title)
81+
82+
val built = ib.fill(InventoryItem(filler)).build()
83+
assert(built === inventory)
84+
85+
// setItem called for all slots
86+
verify(exactly = size) { inventory.setItem(any(), filler) }
87+
}
88+
}

0 commit comments

Comments
 (0)