mirror of
https://github.com/BentoBoxWorld/BentoBox.git
synced 2025-02-20 06:11:37 +01:00
Added Clipboard test class and improved Clipboard robustness
Flight # 2533 RDU to PHX Above Memphis, TN Altitude 38,006 ft Ground speed 464 mph
This commit is contained in:
parent
8364da6e65
commit
9b1c7f10ab
@ -186,7 +186,11 @@ public class Clipboard {
|
|||||||
// Calculate location for pasting
|
// Calculate location for pasting
|
||||||
Location loc = island.getCenter().toVector().subtract(off).toLocation(world);
|
Location loc = island.getCenter().toVector().subtract(off).toLocation(world);
|
||||||
// Paste
|
// Paste
|
||||||
blockConfig.getConfigurationSection(BLOCK).getKeys(false).forEach(b -> pasteBlock(world, island, loc, blockConfig.getConfigurationSection(BLOCK + "." + b)));
|
if (blockConfig.contains(BLOCK)) {
|
||||||
|
blockConfig.getConfigurationSection(BLOCK).getKeys(false).forEach(b -> pasteBlock(world, island, loc, blockConfig.getConfigurationSection(BLOCK + "." + b)));
|
||||||
|
} else {
|
||||||
|
plugin.logError("Clipboard has no block data in it to paste!");
|
||||||
|
}
|
||||||
// Run follow on task if it exists
|
// Run follow on task if it exists
|
||||||
if (task != null) {
|
if (task != null) {
|
||||||
Bukkit.getScheduler().runTaskLater(plugin, task, 2L);
|
Bukkit.getScheduler().runTaskLater(plugin, task, 2L);
|
||||||
@ -198,8 +202,11 @@ public class Clipboard {
|
|||||||
* @param location - location
|
* @param location - location
|
||||||
*/
|
*/
|
||||||
public void pasteClipboard(Location location) {
|
public void pasteClipboard(Location location) {
|
||||||
blockConfig.getConfigurationSection(BLOCK).getKeys(false).forEach(b -> pasteBlock(location.getWorld(), null, location, blockConfig.getConfigurationSection(BLOCK + "." + b)));
|
if (blockConfig.contains(BLOCK)) {
|
||||||
|
blockConfig.getConfigurationSection(BLOCK).getKeys(false).forEach(b -> pasteBlock(location.getWorld(), null, location, blockConfig.getConfigurationSection(BLOCK + "." + b)));
|
||||||
|
} else {
|
||||||
|
plugin.logError("Clipboard has no block data in it to paste!");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void writeSign(Island island, Block block, List<String> lines) {
|
private void writeSign(Island island, Block block, List<String> lines) {
|
||||||
|
349
src/test/java/world/bentobox/bentobox/schems/ClipboardTest.java
Normal file
349
src/test/java/world/bentobox/bentobox/schems/ClipboardTest.java
Normal file
@ -0,0 +1,349 @@
|
|||||||
|
package world.bentobox.bentobox.schems;
|
||||||
|
|
||||||
|
import static org.junit.Assert.*;
|
||||||
|
import static org.mockito.Mockito.mock;
|
||||||
|
import static org.mockito.Mockito.when;
|
||||||
|
|
||||||
|
import java.io.File;
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.UUID;
|
||||||
|
|
||||||
|
import org.bukkit.Bukkit;
|
||||||
|
import org.bukkit.DyeColor;
|
||||||
|
import org.bukkit.Location;
|
||||||
|
import org.bukkit.Material;
|
||||||
|
import org.bukkit.World;
|
||||||
|
import org.bukkit.block.Block;
|
||||||
|
import org.bukkit.block.BlockState;
|
||||||
|
import org.bukkit.block.Chest;
|
||||||
|
import org.bukkit.block.CreatureSpawner;
|
||||||
|
import org.bukkit.block.Sign;
|
||||||
|
import org.bukkit.block.data.BlockData;
|
||||||
|
import org.bukkit.entity.Cow;
|
||||||
|
import org.bukkit.entity.Creeper;
|
||||||
|
import org.bukkit.entity.EntityType;
|
||||||
|
import org.bukkit.entity.Horse;
|
||||||
|
import org.bukkit.entity.Horse.Color;
|
||||||
|
import org.bukkit.entity.Horse.Style;
|
||||||
|
import org.bukkit.entity.LivingEntity;
|
||||||
|
import org.bukkit.entity.Pig;
|
||||||
|
import org.bukkit.entity.Player;
|
||||||
|
import org.bukkit.entity.Sheep;
|
||||||
|
import org.bukkit.inventory.HorseInventory;
|
||||||
|
import org.bukkit.inventory.Inventory;
|
||||||
|
import org.bukkit.inventory.ItemStack;
|
||||||
|
import org.bukkit.scheduler.BukkitScheduler;
|
||||||
|
import org.bukkit.util.Vector;
|
||||||
|
import org.junit.Before;
|
||||||
|
import org.junit.Test;
|
||||||
|
import org.junit.runner.RunWith;
|
||||||
|
import org.mockito.Mockito;
|
||||||
|
import org.powermock.api.mockito.PowerMockito;
|
||||||
|
import org.powermock.core.classloader.annotations.PrepareForTest;
|
||||||
|
import org.powermock.modules.junit4.PowerMockRunner;
|
||||||
|
|
||||||
|
import world.bentobox.bentobox.BentoBox;
|
||||||
|
import world.bentobox.bentobox.api.localization.TextVariables;
|
||||||
|
import world.bentobox.bentobox.api.user.User;
|
||||||
|
import world.bentobox.bentobox.database.objects.Island;
|
||||||
|
|
||||||
|
@RunWith(PowerMockRunner.class)
|
||||||
|
@PrepareForTest({Bukkit.class})
|
||||||
|
public class ClipboardTest {
|
||||||
|
|
||||||
|
private BentoBox plugin;
|
||||||
|
private File schemFolder;
|
||||||
|
private Location loc;
|
||||||
|
private User user;
|
||||||
|
private Location loc2;
|
||||||
|
private Sheep sheep;
|
||||||
|
private Horse horse;
|
||||||
|
private Block block;
|
||||||
|
private World world;
|
||||||
|
private BukkitScheduler sched;
|
||||||
|
|
||||||
|
@Before
|
||||||
|
public void setUp() throws Exception {
|
||||||
|
plugin = mock(BentoBox.class);
|
||||||
|
schemFolder = mock(File.class);
|
||||||
|
when(schemFolder.exists()).thenReturn(true);
|
||||||
|
loc = mock(Location.class);
|
||||||
|
world = mock(World.class);
|
||||||
|
block = mock(Block.class);
|
||||||
|
when(block.getType()).thenReturn(Material.GRASS);
|
||||||
|
when(block.getLocation()).thenReturn(loc);
|
||||||
|
|
||||||
|
BlockData bd = mock(BlockData.class);
|
||||||
|
when(bd.getAsString()).thenReturn("Block_data");
|
||||||
|
when(block.getBlockData()).thenReturn(bd);
|
||||||
|
when(world.getBlockAt(Mockito.anyInt(), Mockito.anyInt(), Mockito.anyInt())).thenReturn(block);
|
||||||
|
when(loc.getWorld()).thenReturn(world);
|
||||||
|
when(loc.getBlockX()).thenReturn(1);
|
||||||
|
when(loc.getBlockY()).thenReturn(2);
|
||||||
|
when(loc.getBlockZ()).thenReturn(3);
|
||||||
|
when(loc.getBlock()).thenReturn(block);
|
||||||
|
when(loc.toVector()).thenReturn(new Vector(1,2,3));
|
||||||
|
|
||||||
|
loc2 = mock(Location.class);
|
||||||
|
when(loc2.getWorld()).thenReturn(world);
|
||||||
|
when(loc2.getBlockX()).thenReturn(2);
|
||||||
|
when(loc2.getBlockY()).thenReturn(3);
|
||||||
|
when(loc2.getBlockZ()).thenReturn(4);
|
||||||
|
when(loc2.getBlock()).thenReturn(block);
|
||||||
|
// Living entities
|
||||||
|
|
||||||
|
List<LivingEntity> ents = new ArrayList<>();
|
||||||
|
Pig pig = mock(Pig.class);
|
||||||
|
Player player = mock(Player.class);
|
||||||
|
Cow cow = mock(Cow.class);
|
||||||
|
Creeper creeper = mock(Creeper.class);
|
||||||
|
sheep = mock(Sheep.class);
|
||||||
|
horse = mock(Horse.class);
|
||||||
|
when(pig.getLocation()).thenReturn(loc);
|
||||||
|
when(cow.getLocation()).thenReturn(loc);
|
||||||
|
when(creeper.getLocation()).thenReturn(loc);
|
||||||
|
when(player.getLocation()).thenReturn(loc);
|
||||||
|
when(sheep.getLocation()).thenReturn(loc);
|
||||||
|
when(horse.getLocation()).thenReturn(loc);
|
||||||
|
|
||||||
|
when(pig.getType()).thenReturn(EntityType.PIG);
|
||||||
|
when(player.getType()).thenReturn(EntityType.PLAYER);
|
||||||
|
when(cow.getType()).thenReturn(EntityType.COW);
|
||||||
|
when(creeper.getType()).thenReturn(EntityType.CREEPER);
|
||||||
|
when(sheep.getType()).thenReturn(EntityType.SHEEP);
|
||||||
|
when(sheep.getColor()).thenReturn(DyeColor.LIGHT_BLUE);
|
||||||
|
when(horse.getType()).thenReturn(EntityType.HORSE);
|
||||||
|
when(horse.getColor()).thenReturn(Color.CREAMY);
|
||||||
|
when(horse.getStyle()).thenReturn(Style.BLACK_DOTS);
|
||||||
|
|
||||||
|
HorseInventory inv = mock(HorseInventory.class);
|
||||||
|
when(horse.getInventory()).thenReturn(inv);
|
||||||
|
|
||||||
|
// UUIDs (I'm going to assume these will all be unique (prays to god of randomness)
|
||||||
|
when(creeper.getUniqueId()).thenReturn(UUID.randomUUID());
|
||||||
|
when(player.getUniqueId()).thenReturn(UUID.randomUUID());
|
||||||
|
when(cow.getUniqueId()).thenReturn(UUID.randomUUID());
|
||||||
|
when(pig.getUniqueId()).thenReturn(UUID.randomUUID());
|
||||||
|
when(sheep.getUniqueId()).thenReturn(UUID.randomUUID());
|
||||||
|
when(horse.getUniqueId()).thenReturn(UUID.randomUUID());
|
||||||
|
|
||||||
|
ents.add(creeper);
|
||||||
|
ents.add(player);
|
||||||
|
ents.add(cow);
|
||||||
|
ents.add(pig);
|
||||||
|
ents.add(sheep);
|
||||||
|
ents.add(horse);
|
||||||
|
when(world.getLivingEntities()).thenReturn(ents);
|
||||||
|
|
||||||
|
user = mock(User.class);
|
||||||
|
User.setPlugin(plugin);
|
||||||
|
when(user.getLocation()).thenReturn(loc);
|
||||||
|
|
||||||
|
// Scheduler
|
||||||
|
PowerMockito.mockStatic(Bukkit.class);
|
||||||
|
sched = mock(BukkitScheduler.class);
|
||||||
|
when(Bukkit.getScheduler()).thenReturn(sched);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testClipboard() {
|
||||||
|
when(schemFolder.exists()).thenReturn(false);
|
||||||
|
new Clipboard(plugin, schemFolder);
|
||||||
|
Mockito.verify(schemFolder).mkdirs();
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testSetGetPos1() {
|
||||||
|
Clipboard cb = new Clipboard(plugin, schemFolder);
|
||||||
|
assertNull(cb.getPos1());
|
||||||
|
cb.setPos1(loc);
|
||||||
|
assertEquals(loc, cb.getPos1());
|
||||||
|
assertNull(cb.getOrigin());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testSetGetPos2() {
|
||||||
|
Clipboard cb = new Clipboard(plugin, schemFolder);
|
||||||
|
assertNull(cb.getPos2());
|
||||||
|
cb.setPos2(loc);
|
||||||
|
assertEquals(loc, cb.getPos2());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testSetGetOrigin() {
|
||||||
|
Clipboard cb = new Clipboard(plugin, schemFolder);
|
||||||
|
assertNull(cb.getOrigin());
|
||||||
|
cb.setOrigin(loc);
|
||||||
|
assertEquals(loc, cb.getOrigin());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testCopyNoPos1Pos2() {
|
||||||
|
Clipboard cb = new Clipboard(plugin, schemFolder);
|
||||||
|
cb.copy(user, false);
|
||||||
|
Mockito.verify(user).sendMessage(Mockito.eq("commands.admin.schem.need-pos1-pos2"));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testCopyNoPos2() {
|
||||||
|
Clipboard cb = new Clipboard(plugin, schemFolder);
|
||||||
|
cb.setPos1(loc);
|
||||||
|
cb.copy(user, false);
|
||||||
|
Mockito.verify(user).sendMessage(Mockito.eq("commands.admin.schem.need-pos1-pos2"));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testCopy() {
|
||||||
|
Clipboard cb = new Clipboard(plugin, schemFolder);
|
||||||
|
cb.setPos1(loc);
|
||||||
|
cb.setPos2(loc2);
|
||||||
|
cb.copy(user, false);
|
||||||
|
Mockito.verify(user).sendMessage("commands.admin.schem.copied-blocks", TextVariables.NUMBER, "8");
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testCopySigns() {
|
||||||
|
when(block.getType()).thenReturn(Material.SIGN);
|
||||||
|
Sign bs = mock(Sign.class);
|
||||||
|
String[] lines = {"line1", "line2", "line3", "line4"};
|
||||||
|
when(bs.getLines()).thenReturn(lines);
|
||||||
|
when(block.getState()).thenReturn(bs);
|
||||||
|
Clipboard cb = new Clipboard(plugin, schemFolder);
|
||||||
|
cb.setPos1(loc);
|
||||||
|
cb.setPos2(loc2);
|
||||||
|
cb.copy(user, false);
|
||||||
|
Mockito.verify(user).sendMessage("commands.admin.schem.copied-blocks", TextVariables.NUMBER, "8");
|
||||||
|
// Every block is a sign, so this should be called 8 times
|
||||||
|
Mockito.verify(bs, Mockito.times(8)).getLines();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testCopyChests() {
|
||||||
|
when(block.getType()).thenReturn(Material.CHEST);
|
||||||
|
Chest bs = mock(Chest.class);
|
||||||
|
Inventory inv = mock(Inventory.class);
|
||||||
|
ItemStack[] contents = { new ItemStack(Material.ACACIA_BOAT, 1), new ItemStack(Material.GLASS, 23)};
|
||||||
|
when(inv.getContents()).thenReturn(contents);
|
||||||
|
when(bs.getInventory()).thenReturn(inv);
|
||||||
|
when(block.getState()).thenReturn(bs);
|
||||||
|
Clipboard cb = new Clipboard(plugin, schemFolder);
|
||||||
|
cb.setPos1(loc);
|
||||||
|
cb.setPos2(loc2);
|
||||||
|
cb.copy(user, false);
|
||||||
|
Mockito.verify(user).sendMessage("commands.admin.schem.copied-blocks", TextVariables.NUMBER, "8");
|
||||||
|
// Every block is a sign, so this should be called 8 times
|
||||||
|
Mockito.verify(bs, Mockito.times(8)).getInventory();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testCopyCreatureSpawners() {
|
||||||
|
when(block.getType()).thenReturn(Material.SPAWNER);
|
||||||
|
CreatureSpawner bs = mock(CreatureSpawner.class);
|
||||||
|
when(bs.getSpawnedType()).thenReturn(EntityType.CAVE_SPIDER);
|
||||||
|
when(block.getState()).thenReturn(bs);
|
||||||
|
Clipboard cb = new Clipboard(plugin, schemFolder);
|
||||||
|
cb.setPos1(loc);
|
||||||
|
cb.setPos2(loc2);
|
||||||
|
cb.copy(user, false);
|
||||||
|
Mockito.verify(user).sendMessage("commands.admin.schem.copied-blocks", TextVariables.NUMBER, "8");
|
||||||
|
// Every block is a sign, so this should be called 8 times
|
||||||
|
Mockito.verify(bs, Mockito.times(8)).getMaxNearbyEntities();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testCopyAir() {
|
||||||
|
// No entities
|
||||||
|
when(world.getLivingEntities()).thenReturn(new ArrayList<>());
|
||||||
|
when(block.getType()).thenReturn(Material.AIR);
|
||||||
|
BlockState bs = mock(BlockState.class);
|
||||||
|
when(block.getState()).thenReturn(bs);
|
||||||
|
Clipboard cb = new Clipboard(plugin, schemFolder);
|
||||||
|
cb.setPos1(loc);
|
||||||
|
cb.setPos2(loc2);
|
||||||
|
// Do not copy air
|
||||||
|
cb.copy(user, false);
|
||||||
|
Mockito.verify(user).sendMessage("commands.admin.schem.copied-blocks", TextVariables.NUMBER, "0");
|
||||||
|
cb.copy(user, true);
|
||||||
|
Mockito.verify(user).sendMessage("commands.admin.schem.copied-blocks", TextVariables.NUMBER, "8");
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testPasteIslandNoData() {
|
||||||
|
Clipboard cb = new Clipboard(plugin, schemFolder);
|
||||||
|
Island island = mock(Island.class);
|
||||||
|
when(island.getCenter()).thenReturn(loc);
|
||||||
|
cb.pasteIsland(world, island, () -> {});
|
||||||
|
Mockito.verify(plugin).logError(Mockito.eq("Clipboard has no block data in it to paste!"));
|
||||||
|
// Verify the task is run
|
||||||
|
Mockito.verify(sched).runTaskLater(Mockito.eq(plugin), Mockito.any(Runnable.class), Mockito.eq(2L));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testPasteIslandWithData() {
|
||||||
|
Clipboard cb = new Clipboard(plugin, schemFolder);
|
||||||
|
Island island = mock(Island.class);
|
||||||
|
when(island.getCenter()).thenReturn(loc);
|
||||||
|
cb.setPos1(loc);
|
||||||
|
cb.setPos2(loc2);
|
||||||
|
cb.copy(user, false);
|
||||||
|
cb.pasteIsland(world, island, () -> {});
|
||||||
|
// This is set just once because the coords of the block are always the same
|
||||||
|
Mockito.verify(block).setBlockData(Mockito.any());
|
||||||
|
// Verify the entities are spawned
|
||||||
|
Mockito.verify(world).spawnEntity(Mockito.eq(null), Mockito.eq(EntityType.PIG));
|
||||||
|
Mockito.verify(world).spawnEntity(Mockito.eq(null), Mockito.eq(EntityType.CREEPER));
|
||||||
|
Mockito.verify(world).spawnEntity(Mockito.eq(null), Mockito.eq(EntityType.HORSE));
|
||||||
|
Mockito.verify(world).spawnEntity(Mockito.eq(null), Mockito.eq(EntityType.SHEEP));
|
||||||
|
Mockito.verify(world).spawnEntity(Mockito.eq(null), Mockito.eq(EntityType.COW));
|
||||||
|
// Player should NOT spawn!!
|
||||||
|
Mockito.verify(world, Mockito.never()).spawnEntity(Mockito.eq(null), Mockito.eq(EntityType.PLAYER));
|
||||||
|
|
||||||
|
// Verify the task is run
|
||||||
|
Mockito.verify(sched).runTaskLater(Mockito.eq(plugin), Mockito.any(Runnable.class), Mockito.eq(2L));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testPasteClipboardNoData() {
|
||||||
|
Clipboard cb = new Clipboard(plugin, schemFolder);
|
||||||
|
cb.pasteClipboard(loc);
|
||||||
|
Mockito.verify(plugin).logError(Mockito.eq("Clipboard has no block data in it to paste!"));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testPasteClipboard() {
|
||||||
|
Clipboard cb = new Clipboard(plugin, schemFolder);
|
||||||
|
cb.setPos1(loc);
|
||||||
|
cb.setPos2(loc2);
|
||||||
|
cb.copy(user, false);
|
||||||
|
cb.pasteClipboard(loc);
|
||||||
|
// This is set just once because the coords of the block are always the same
|
||||||
|
Mockito.verify(block).setBlockData(Mockito.any());
|
||||||
|
// Verify the entities are spawned
|
||||||
|
Mockito.verify(world).spawnEntity(Mockito.eq(null), Mockito.eq(EntityType.PIG));
|
||||||
|
Mockito.verify(world).spawnEntity(Mockito.eq(null), Mockito.eq(EntityType.CREEPER));
|
||||||
|
Mockito.verify(world).spawnEntity(Mockito.eq(null), Mockito.eq(EntityType.HORSE));
|
||||||
|
Mockito.verify(world).spawnEntity(Mockito.eq(null), Mockito.eq(EntityType.SHEEP));
|
||||||
|
Mockito.verify(world).spawnEntity(Mockito.eq(null), Mockito.eq(EntityType.COW));
|
||||||
|
// Player should NOT spawn!!
|
||||||
|
Mockito.verify(world, Mockito.never()).spawnEntity(Mockito.eq(null), Mockito.eq(EntityType.PLAYER));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testIsFull() {
|
||||||
|
Clipboard cb = new Clipboard(plugin, schemFolder);
|
||||||
|
assertFalse(cb.isFull());
|
||||||
|
cb.setPos1(loc);
|
||||||
|
cb.setPos2(loc2);
|
||||||
|
cb.copy(user, false);
|
||||||
|
assertTrue(cb.isFull());
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Will not test the file system methods
|
||||||
|
*/
|
||||||
|
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user