1
mirror of https://github.com/StarWishsama/Slimefun4.git synced 2024-09-20 19:55:48 +00:00

Added Unit Tests

This commit is contained in:
TheBusyBiscuit 2020-09-15 19:42:52 +02:00
parent 2810019dbe
commit 1a7de82c45
2 changed files with 192 additions and 7 deletions

View File

@ -13,6 +13,7 @@ import org.bukkit.block.Block;
import org.bukkit.block.BlockFace;
import org.bukkit.event.block.BlockFromToEvent;
import io.github.thebusybiscuit.slimefun4.api.MinecraftVersion;
import io.github.thebusybiscuit.slimefun4.implementation.items.androids.MinerAndroid;
/**
@ -43,25 +44,47 @@ public enum InfiniteBlockGenerator implements Predicate<Block> {
public static final InfiniteBlockGenerator[] values = values();
private static final BlockFace[] sameLevelFaces = { BlockFace.NORTH, BlockFace.EAST, BlockFace.SOUTH, BlockFace.WEST };
@Nullable
private final Material material;
@ParametersAreNonnullByDefault
InfiniteBlockGenerator(String type) {
InfiniteBlockGenerator(@Nonnull String type) {
this.material = Material.matchMaterial(type);
}
/**
* This returns the generated {@link Material} of this {@link InfiniteBlockGenerator}.
* This method can return null if the associated {@link Material} is not available in the current
* {@link MinecraftVersion}.
*
* @return The generated {@link Material} or null
*/
@Nullable
public Material getGeneratedMaterial() {
return material;
}
@Override
public boolean test(@Nonnull Block b) {
return test(b, false);
return testAndTrigger(b, false);
}
public boolean test(@Nonnull Block b, boolean firesEvent) {
/**
* Similar to {@link #test(Block)} this tests whether this {@link InfiniteBlockGenerator}
* exists at the given {@link Block}.
* Optionally this will also trigger a {@link BlockFromToEvent}.
*
* @param b
* The {@link Block}
* @param firesEvent
* Whether or not to to trigger a {@link BlockFromToEvent}.
*
* @return Whether this {@link InfiniteBlockGenerator} exists at the given {@link Block}
*/
public boolean testAndTrigger(@Nonnull Block b, boolean firesEvent) {
Validate.notNull(b, "Block cannot be null!");
// This will eliminate non-matching base materials
// If we are on a version without Basalt, it will be null here and not match.
if (b.getType() == material) {
if (b.getType() == getGeneratedMaterial()) {
switch (this) {
case COBBLESTONE_GENERATOR:
return hasSurroundingMaterials(b, firesEvent, Material.WATER, Material.LAVA);
@ -161,7 +184,7 @@ public enum InfiniteBlockGenerator implements Predicate<Block> {
Validate.notNull(b, "Cannot find a generator without a Location!");
for (InfiniteBlockGenerator generator : values) {
if (generator.test(b, firesEvent)) {
if (generator.testAndTrigger(b, firesEvent)) {
return generator;
}
}

View File

@ -0,0 +1,162 @@
package io.github.thebusybiscuit.slimefun4.testing.tests.utils;
import java.util.Arrays;
import java.util.stream.Stream;
import org.bukkit.Material;
import org.bukkit.World;
import org.bukkit.block.Block;
import org.bukkit.block.BlockFace;
import org.bukkit.event.block.BlockFromToEvent;
import org.junit.jupiter.api.AfterAll;
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.BeforeAll;
import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.Arguments;
import org.junit.jupiter.params.provider.EnumSource;
import org.junit.jupiter.params.provider.MethodSource;
import be.seeseemelk.mockbukkit.MockBukkit;
import be.seeseemelk.mockbukkit.ServerMock;
import be.seeseemelk.mockbukkit.WorldMock;
import io.github.thebusybiscuit.slimefun4.implementation.SlimefunPlugin;
import io.github.thebusybiscuit.slimefun4.utils.InfiniteBlockGenerator;
class TestInfiniteBlockGenerators {
private static ServerMock server;
@BeforeAll
public static void load() {
server = MockBukkit.mock();
MockBukkit.load(SlimefunPlugin.class);
}
@AfterAll
public static void unload() {
MockBukkit.unmock();
}
@Test
@DisplayName("Test if invalid Cobblestone generators are ignored")
void testInvalidCobblestoneGenerator() {
World world = new WorldMock();
Block block = world.getBlockAt(0, 100, 0);
block.setType(Material.STONE);
Assertions.assertFalse(InfiniteBlockGenerator.COBBLESTONE_GENERATOR.test(block));
Assertions.assertNull(InfiniteBlockGenerator.findAt(block, false));
block.setType(Material.COBBLESTONE);
Assertions.assertFalse(InfiniteBlockGenerator.COBBLESTONE_GENERATOR.test(block));
Assertions.assertNull(InfiniteBlockGenerator.findAt(block, false));
}
@ParameterizedTest
@MethodSource(value = "provideFaces")
@DisplayName("Test if a Cobblestone Generator can be detected")
void testValidCobblestoneGenerator(BlockFace water, BlockFace lava) {
InfiniteBlockGenerator generator = InfiniteBlockGenerator.COBBLESTONE_GENERATOR;
World world = new WorldMock();
Block block = world.getBlockAt(0, 100, 0);
block.setType(Material.COBBLESTONE);
block.getRelative(water).setType(Material.WATER);
block.getRelative(lava).setType(Material.LAVA);
Assertions.assertTrue(generator.testAndTrigger(block, true));
server.getPluginManager().assertEventFired(BlockFromToEvent.class);
server.getPluginManager().clearEvents();
Assertions.assertEquals(generator, InfiniteBlockGenerator.findAt(block, false));
}
@Test
@DisplayName("Test if invalid Basalt generators are ignored")
void testInvalidBasaltGenerator() {
World world = new WorldMock();
Block block = world.getBlockAt(0, 100, 0);
block.setType(Material.COBBLESTONE);
Assertions.assertFalse(InfiniteBlockGenerator.BASALT_GENERATOR.test(block));
Assertions.assertNull(InfiniteBlockGenerator.findAt(block, false));
block.setType(Material.BASALT);
Assertions.assertFalse(InfiniteBlockGenerator.BASALT_GENERATOR.test(block));
Assertions.assertNull(InfiniteBlockGenerator.findAt(block, false));
block.getRelative(BlockFace.DOWN).setType(Material.SOUL_SOIL);
Assertions.assertFalse(InfiniteBlockGenerator.BASALT_GENERATOR.test(block));
Assertions.assertNull(InfiniteBlockGenerator.findAt(block, false));
}
@ParameterizedTest
@MethodSource(value = "provideFaces")
@DisplayName("Test if a Basalt Generator can be detected")
void testValidBasaltGenerator(BlockFace ice, BlockFace lava) {
InfiniteBlockGenerator generator = InfiniteBlockGenerator.BASALT_GENERATOR;
World world = new WorldMock();
Block block = world.getBlockAt(0, 100, 0);
block.setType(Material.BASALT);
block.getRelative(BlockFace.DOWN).setType(Material.SOUL_SOIL);
block.getRelative(ice).setType(Material.BLUE_ICE);
block.getRelative(lava).setType(Material.LAVA);
Assertions.assertTrue(generator.testAndTrigger(block, true));
server.getPluginManager().assertEventFired(BlockFromToEvent.class);
server.getPluginManager().clearEvents();
Assertions.assertEquals(generator, InfiniteBlockGenerator.findAt(block, false));
}
@Test
@DisplayName("Test if invalid Stone generators are ignored")
void testInvalidStoneGenerator() {
World world = new WorldMock();
Block block = world.getBlockAt(0, 100, 0);
block.setType(Material.COBBLESTONE);
Assertions.assertFalse(InfiniteBlockGenerator.STONE_GENERATOR.test(block));
Assertions.assertNull(InfiniteBlockGenerator.findAt(block, false));
block.setType(Material.STONE);
Assertions.assertFalse(InfiniteBlockGenerator.STONE_GENERATOR.test(block));
Assertions.assertNull(InfiniteBlockGenerator.findAt(block, false));
block.getRelative(BlockFace.UP).setType(Material.LAVA);
Assertions.assertFalse(InfiniteBlockGenerator.STONE_GENERATOR.test(block));
Assertions.assertNull(InfiniteBlockGenerator.findAt(block, false));
}
@ParameterizedTest
@EnumSource(value = BlockFace.class, names = { "NORTH", "EAST", "SOUTH", "WEST" })
@DisplayName("Test if a Stone Generator can be detected")
void testValidStoneGenerator(BlockFace water) {
InfiniteBlockGenerator generator = InfiniteBlockGenerator.STONE_GENERATOR;
World world = new WorldMock();
Block block = world.getBlockAt(0, 100, 0);
block.setType(Material.STONE);
block.getRelative(BlockFace.UP).setType(Material.LAVA);
block.getRelative(water).setType(Material.WATER);
Assertions.assertTrue(generator.testAndTrigger(block, true));
server.getPluginManager().assertEventFired(BlockFromToEvent.class);
server.getPluginManager().clearEvents();
Assertions.assertEquals(generator, InfiniteBlockGenerator.findAt(block, false));
}
private static Stream<Arguments> provideFaces() {
BlockFace[] faces = { BlockFace.NORTH, BlockFace.EAST, BlockFace.SOUTH, BlockFace.WEST };
Stream<BlockFace> stream = Arrays.stream(faces);
return stream.flatMap(a -> Arrays.stream(faces).filter(b -> a != b).map(b -> Arguments.of(a, b)));
}
}