bentobox/src/test/java/world/bentobox/bentobox/managers/BlueprintsManagerTest.java

690 lines
27 KiB
Java

package world.bentobox.bentobox.managers;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertTrue;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.ArgumentMatchers.eq;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.util.Arrays;
import java.util.Collections;
import java.util.Comparator;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.jar.JarEntry;
import java.util.jar.JarOutputStream;
import java.util.jar.Manifest;
import org.bukkit.Bukkit;
import org.bukkit.ChatColor;
import org.bukkit.Material;
import org.bukkit.Server;
import org.bukkit.World;
import org.bukkit.configuration.file.YamlConfiguration;
import org.bukkit.scheduler.BukkitScheduler;
import org.bukkit.scheduler.BukkitTask;
import org.bukkit.util.Vector;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mock;
import org.mockito.Mockito;
import org.mockito.stubbing.Answer;
import org.powermock.api.mockito.PowerMockito;
import org.powermock.core.classloader.annotations.PrepareForTest;
import org.powermock.modules.junit4.PowerMockRunner;
import com.github.puregero.multilib.MultiLib;
import world.bentobox.bentobox.BentoBox;
import world.bentobox.bentobox.api.addons.Addon;
import world.bentobox.bentobox.api.addons.AddonDescription;
import world.bentobox.bentobox.api.addons.GameModeAddon;
import world.bentobox.bentobox.api.localization.TextVariables;
import world.bentobox.bentobox.api.user.User;
import world.bentobox.bentobox.blueprints.Blueprint;
import world.bentobox.bentobox.blueprints.BlueprintPaster;
import world.bentobox.bentobox.blueprints.dataobjects.BlueprintBlock;
import world.bentobox.bentobox.blueprints.dataobjects.BlueprintBundle;
import world.bentobox.bentobox.database.objects.Island;
/**
* @author tastybento
*
*/
@RunWith(PowerMockRunner.class)
@PrepareForTest({ Bukkit.class, BentoBox.class, BlueprintPaster.class, MultiLib.class })
public class BlueprintsManagerTest {
public static int BUFFER_SIZE = 10240;
@Mock
private BentoBox plugin;
@Mock
private GameModeAddon addon;
@Mock
private Island island;
@Mock
private BukkitScheduler scheduler;
private File dataFolder;
private File jarFile;
private TestClass test;
private Blueprint defaultBp;
@Mock
private World world;
@Mock
private User user;
@Mock
private BukkitTask task;
private int times;
@Mock
private Server server;
@Before
public void setUp() throws Exception {
// Multilib
PowerMockito.mockStatic(MultiLib.class, Mockito.RETURNS_MOCKS);
// Make the addon
dataFolder = new File("dataFolder");
jarFile = new File("addon.jar");
makeAddon();
test = new TestClass();
test.setDataFolder(dataFolder);
test.setFile(jarFile);
// Default blueprint
defaultBp = new Blueprint();
defaultBp.setName("bedrock");
defaultBp.setDescription(Collections.singletonList(ChatColor.AQUA + "A bedrock block"));
defaultBp.setBedrock(new Vector(0,0,0));
Map<Vector, BlueprintBlock> map = new HashMap<>();
map.put(new Vector(0,0,0), new BlueprintBlock("minecraft:bedrock"));
defaultBp.setBlocks(map);
// Scheduler
PowerMockito.mockStatic(Bukkit.class);
when(Bukkit.getScheduler()).thenReturn(scheduler);
when(server.getBukkitVersion()).thenReturn("version");
when(Bukkit.getServer()).thenReturn(server);
}
/**
* Fake Addon class
*
*/
private class TestClass extends Addon {
@Override
public void onEnable() { }
@Override
public void onDisable() { }
}
public void makeAddon() throws Exception {
// Make a blueprint folder
File blueprintFolder = new File(dataFolder, BlueprintsManager.FOLDER_NAME);
blueprintFolder.mkdirs();
// Make a blueprint file
YamlConfiguration config = new YamlConfiguration();
config.set("hello", "this is a test");
File configFile = new File(blueprintFolder, "blueprint.blu");
config.save(configFile);
// Make a blueprint bundle
YamlConfiguration yml = new YamlConfiguration();
yml.set("name", "TestAddon");
File ymlFile = new File(blueprintFolder, "bundle.json");
yml.save(ymlFile);
// Make an archive file
// Put them into a jar file
createJarArchive(jarFile, blueprintFolder, Arrays.asList(configFile, ymlFile));
// Clean up
Files.deleteIfExists(configFile.toPath());
Files.deleteIfExists(ymlFile.toPath());
// Remove folder
deleteDir(blueprintFolder.toPath());
// Mocks
when(addon.getDataFolder()).thenReturn(dataFolder);
when(addon.getFile()).thenReturn(jarFile);
when(addon.getOverWorld()).thenReturn(world);
when(addon.getPermissionPrefix()).thenReturn("bskyblock.");
// Desc
AddonDescription desc = new AddonDescription.Builder("main", "name", "1.0").build();
when(addon.getDescription()).thenReturn(desc);
}
/**
*/
@After
public void tearDown() throws Exception {
// Clean up file system
deleteDir(dataFolder.toPath());
// Delete addon.jar
Files.deleteIfExists(jarFile.toPath());
Mockito.framework().clearInlineMocks();
}
private void deleteDir(Path path) throws Exception {
if (path.toFile().isDirectory()) {
// Clean up file system
Files.walk(path)
.sorted(Comparator.reverseOrder())
.map(Path::toFile)
.forEach(File::delete);
}
Files.deleteIfExists(path);
}
/**
* Test method for {@link world.bentobox.bentobox.managers.BlueprintsManager#extractDefaultBlueprints(world.bentobox.bentobox.api.addons.GameModeAddon)}.
*/
@Test
public void testExtractDefaultBlueprintsFolderExists() throws IOException {
// Make the default folder
File bpFile = new File("datafolder", "blueprints");
bpFile.mkdirs();
BlueprintsManager bpm = new BlueprintsManager(plugin);
bpm.extractDefaultBlueprints(addon);
// Nothing should happen
assertEquals(0, bpFile.listFiles().length);
// Clean up
Files.deleteIfExists(bpFile.toPath());
}
/**
* Test method for {@link world.bentobox.bentobox.managers.BlueprintsManager#extractDefaultBlueprints(world.bentobox.bentobox.api.addons.GameModeAddon)}.
*/
@Test
public void testExtractDefaultBlueprints() {
BlueprintsManager bpm = new BlueprintsManager(plugin);
bpm.extractDefaultBlueprints(addon);
verify(addon).saveResource(eq("blueprints/bundle.json"), eq(false));
verify(addon).saveResource(eq("blueprints/blueprint.blu"), eq(false));
}
/**
* Test method for {@link world.bentobox.bentobox.managers.BlueprintsManager#extractDefaultBlueprints(world.bentobox.bentobox.api.addons.GameModeAddon)}.
*/
@Test
public void testExtractDefaultBlueprintsThrowError() throws NullPointerException {
// Give it a folder instead of a jar file
when(addon.getFile()).thenReturn(dataFolder);
BlueprintsManager bpm = new BlueprintsManager(plugin);
bpm.extractDefaultBlueprints(addon);
verify(plugin).logError(Mockito.startsWith("Could not load blueprint files from addon jar dataFolder"));
}
/**
* Test method for {@link world.bentobox.bentobox.managers.BlueprintsManager#getBlueprintBundles(world.bentobox.bentobox.api.addons.GameModeAddon)}.
*/
@Test
public void testGetBlueprintBundles() {
BlueprintsManager bpm = new BlueprintsManager(plugin);
assertTrue(bpm.getBlueprintBundles(addon).isEmpty());
}
/**
* Test method for {@link world.bentobox.bentobox.managers.BlueprintsManager#loadBlueprintBundles(world.bentobox.bentobox.api.addons.GameModeAddon)}.
*/
@Test
public void testLoadBlueprintBundlesNoBlueprintFolder() {
// Set up running and verification
when(scheduler.runTaskAsynchronously(eq(plugin), any(Runnable.class))).thenAnswer((Answer<BukkitTask>) invocation -> {
invocation.getArgument(1,Runnable.class).run();
verify(plugin).logError(eq("There is no blueprint folder for addon name"));
verify(plugin).logError(eq("No blueprint bundles found! Creating a default one."));
File blueprints = new File(dataFolder, BlueprintsManager.FOLDER_NAME);
File d = new File(blueprints, "default.json");
assertTrue(d.exists());
return task;
});
BlueprintsManager bpm = new BlueprintsManager(plugin);
bpm.loadBlueprintBundles(addon);
}
/**
* Test method for {@link world.bentobox.bentobox.managers.BlueprintsManager#loadBlueprintBundles(world.bentobox.bentobox.api.addons.GameModeAddon)}.
*/
@Test
public void testLoadBlueprintBundles() {
// Set up running and verification
when(scheduler.runTaskAsynchronously(eq(plugin), any(Runnable.class))).thenAnswer((Answer<BukkitTask>) invocation -> {
invocation.getArgument(1,Runnable.class).run();
verify(plugin).logError(eq("No blueprint bundles found! Creating a default one."));
return task;
});
BlueprintsManager bpm = new BlueprintsManager(plugin);
bpm.extractDefaultBlueprints(addon);
bpm.loadBlueprintBundles(addon);
}
/**
* Test method for {@link world.bentobox.bentobox.managers.BlueprintsManager#loadBlueprints(world.bentobox.bentobox.api.addons.GameModeAddon)}.
*/
@Test
public void testLoadBlueprintsFail() {
BlueprintsManager bpm = new BlueprintsManager(plugin);
bpm.loadBlueprints(addon);
verify(plugin).logError("No blueprints found for name");
}
/**
* Test method for {@link world.bentobox.bentobox.managers.BlueprintsManager#loadBlueprints(world.bentobox.bentobox.api.addons.GameModeAddon)}.
*/
@Test
public void testLoadBlueprintsFailZero() {
BlueprintsManager bpm = new BlueprintsManager(plugin);
bpm.extractDefaultBlueprints(addon);
bpm.loadBlueprints(addon);
verify(plugin).logError("No blueprints found for name");
}
/**
* Test method for {@link world.bentobox.bentobox.managers.BlueprintsManager#loadBlueprints(world.bentobox.bentobox.api.addons.GameModeAddon)}.
*/
@Test
public void testLoadBlueprints() {
// Set up running and verification
when(scheduler.runTaskAsynchronously(eq(plugin), any(Runnable.class))).thenAnswer((Answer<BukkitTask>) invocation -> {
invocation.getArgument(1,Runnable.class).run();
return task;
});
BlueprintsManager bpm = new BlueprintsManager(plugin);
// Load once (makes default files too)
bpm.loadBlueprintBundles(addon);
// Load them again
bpm.loadBlueprints(addon);
verify(plugin, Mockito.times(2)).log("Loaded blueprint 'bedrock' for name");
}
/**
* Test method for {@link world.bentobox.bentobox.managers.BlueprintsManager#addBlueprint(world.bentobox.bentobox.api.addons.GameModeAddon, world.bentobox.bentobox.blueprints.Blueprint)}.
*/
@Test
public void testAddBlueprint() {
// add blueprint
BlueprintsManager bpm = new BlueprintsManager(plugin);
bpm.addBlueprint(addon, defaultBp);
verify(plugin).log(eq("Added blueprint 'bedrock' for name"));
// Add it again, it should replace the previous one
bpm.addBlueprint(addon, defaultBp);
assertEquals(1, bpm.getBlueprints(addon).size());
}
/**
* Test method for {@link world.bentobox.bentobox.managers.BlueprintsManager#saveBlueprint(world.bentobox.bentobox.api.addons.GameModeAddon, world.bentobox.bentobox.blueprints.Blueprint)}.
*/
@Test
public void testSaveBlueprint() {
// Save it
BlueprintsManager bpm = new BlueprintsManager(plugin);
bpm.saveBlueprint(addon, defaultBp);
File blueprints = new File(dataFolder, BlueprintsManager.FOLDER_NAME);
File d = new File(blueprints, "bedrock.blu");
assertTrue(d.exists());
}
/**
* Test method for {@link world.bentobox.bentobox.managers.BlueprintsManager#saveBlueprintBundle(world.bentobox.bentobox.api.addons.GameModeAddon, world.bentobox.bentobox.blueprints.dataobjects.BlueprintBundle)}.
*/
@Test
public void testSaveBlueprintBundle() {
// Make bundle
BlueprintBundle bb = new BlueprintBundle();
bb.setIcon(Material.PAPER);
bb.setUniqueId("bundle");
bb.setDisplayName("A bundle");
bb.setDescription(Collections.singletonList(ChatColor.AQUA + "A bundle of blueprints"));
// Save it
File blueprints = new File(dataFolder, BlueprintsManager.FOLDER_NAME);
// Set up running and verification
when(scheduler.runTaskAsynchronously(eq(plugin), any(Runnable.class))).thenAnswer((Answer<BukkitTask>) invocation -> {
invocation.getArgument(1,Runnable.class).run();
File d = new File(blueprints, "bundle.json");
assertTrue(d.exists());
return task;
});
BlueprintsManager bpm = new BlueprintsManager(plugin);
bpm.saveBlueprintBundle(addon, bb);
}
/**
* Test method for {@link world.bentobox.bentobox.managers.BlueprintsManager#saveBlueprintBundles()}.
*/
@Test
public void testSaveBlueprintBundles() {
// Make bundle
BlueprintBundle bb = new BlueprintBundle();
bb.setIcon(Material.PAPER);
bb.setUniqueId("bundle");
bb.setDisplayName("A bundle");
bb.setDescription(Collections.singletonList(ChatColor.AQUA + "A bundle of blueprints"));
// Add it
BlueprintsManager bpm = new BlueprintsManager(plugin);
bpm.addBlueprintBundle(addon, bb);
// Add another
BlueprintBundle bb2 = new BlueprintBundle();
bb2.setIcon(Material.PAPER);
bb2.setUniqueId("bundle2");
bb2.setDisplayName("A bundle2");
bb2.setDescription(Collections.singletonList(ChatColor.AQUA + "A bundle of blueprints2"));
// Add
bpm.addBlueprintBundle(addon, bb2);
// check that there are 2 in there
assertEquals(2, bpm.getBlueprintBundles(addon).size());
File blueprints = new File(dataFolder, BlueprintsManager.FOLDER_NAME);
File d = new File(blueprints, "bundle.json");
File d2 = new File(blueprints, "bundle2.json");
times = 0;
// Set up running and verification
when(scheduler.runTaskAsynchronously(eq(plugin), any(Runnable.class))).thenAnswer((Answer<BukkitTask>) invocation -> {
invocation.getArgument(1,Runnable.class).run();
// Verify
times++;
if (times > 2) {
assertTrue(d.exists());
assertTrue(d2.exists());
}
return task;
});
// Save
bpm.saveBlueprintBundles();
}
/**
* Test method for {@link world.bentobox.bentobox.managers.BlueprintsManager#getBlueprints(world.bentobox.bentobox.api.addons.GameModeAddon)}.
*/
@Test
public void testGetBlueprints() {
BlueprintsManager bpm = new BlueprintsManager(plugin);
assertTrue(bpm.getBlueprints(addon).isEmpty());
}
/**
* Test method for {@link world.bentobox.bentobox.managers.BlueprintsManager#paste(world.bentobox.bentobox.api.addons.GameModeAddon, world.bentobox.bentobox.database.objects.Island, java.lang.String)}.
*/
@Test
public void testPasteGameModeAddonIslandStringFail() {
BlueprintsManager bpm = new BlueprintsManager(plugin);
bpm.paste(addon, island, "random");
verify(plugin).logError("Tried to paste 'random' but the bundle is not loaded!");
}
/**
* Test method for {@link world.bentobox.bentobox.managers.BlueprintsManager#paste(world.bentobox.bentobox.api.addons.GameModeAddon, world.bentobox.bentobox.database.objects.Island, java.lang.String)}.
*/
@Test
public void testPasteGameModeAddonIslandStringNoBlueprintsLoaded() {
// Make bundle
BlueprintBundle bb = new BlueprintBundle();
bb.setIcon(Material.PAPER);
bb.setUniqueId("bundle");
bb.setDisplayName("A bundle");
bb.setDescription(Collections.singletonList(ChatColor.AQUA + "A bundle of blueprints"));
// Add it
BlueprintsManager bpm = new BlueprintsManager(plugin);
bpm.addBlueprintBundle(addon, bb);
// paste it
bpm.paste(addon, island, "bundle");
verify(plugin).logError("No blueprints loaded for bundle 'bundle'!");
}
/**
* Test method for {@link world.bentobox.bentobox.managers.BlueprintsManager#paste(world.bentobox.bentobox.api.addons.GameModeAddon, world.bentobox.bentobox.database.objects.Island, java.lang.String)}.
*/
@Test
public void testPasteGameModeAddonIslandStringNoNormalBlueprint() {
// Make bundle
BlueprintBundle bb = new BlueprintBundle();
bb.setIcon(Material.PAPER);
bb.setUniqueId("bundle");
bb.setDisplayName("A bundle");
bb.setDescription(Collections.singletonList(ChatColor.AQUA + "A bundle of blueprints"));
// Set no environments
// Add it
BlueprintsManager bpm = new BlueprintsManager(plugin);
bpm.addBlueprintBundle(addon, bb);
bpm.addBlueprint(addon, defaultBp);
// paste it
bpm.paste(addon, island, "bundle");
verify(plugin).logError("Blueprint bundle has no normal world blueprint, using default");
}
/**
* Test method for {@link world.bentobox.bentobox.managers.BlueprintsManager#validate(world.bentobox.bentobox.api.addons.GameModeAddon, java.lang.String)}.
*/
@Test
public void testValidateNull() {
BlueprintsManager bpm = new BlueprintsManager(plugin);
assertNull(bpm.validate(addon, null));
}
/**
* Test method for {@link world.bentobox.bentobox.managers.BlueprintsManager#validate(world.bentobox.bentobox.api.addons.GameModeAddon, java.lang.String)}.
*/
@Test
public void testValidateInvalid() {
BlueprintsManager bpm = new BlueprintsManager(plugin);
assertNull(bpm.validate(addon, "invalid"));
}
/**
* Test method for {@link world.bentobox.bentobox.managers.BlueprintsManager#validate(world.bentobox.bentobox.api.addons.GameModeAddon, java.lang.String)}.
*/
@Test
public void testValidate() {
// Make bundle
BlueprintBundle bb = new BlueprintBundle();
bb.setIcon(Material.PAPER);
bb.setUniqueId("bundle");
bb.setDisplayName("A bundle");
bb.setDescription(Collections.singletonList(ChatColor.AQUA + "A bundle of blueprints"));
// This blueprint is used for all environments
bb.setBlueprint(World.Environment.NORMAL, defaultBp);
bb.setBlueprint(World.Environment.NETHER, defaultBp);
bb.setBlueprint(World.Environment.THE_END, defaultBp);
// Add it
BlueprintsManager bpm = new BlueprintsManager(plugin);
bpm.addBlueprintBundle(addon, bb);
assertEquals("bundle", bpm.validate(addon, "bundle"));
// Not there
assertNull(bpm.validate(addon, "buNdle2"));
}
/**
* Test method for {@link world.bentobox.bentobox.managers.BlueprintsManager#checkPerm(world.bentobox.bentobox.api.addons.Addon, world.bentobox.bentobox.api.user.User, java.lang.String)}.
*/
@Test
public void testCheckPermNoBundles() {
BlueprintsManager bpm = new BlueprintsManager(plugin);
assertFalse(bpm.checkPerm(addon, user, "name"));
verify(user).sendMessage(eq("general.errors.no-permission"), eq(TextVariables.PERMISSION), eq("bskyblock.island.create.name"));
}
/**
* Test method for {@link world.bentobox.bentobox.managers.BlueprintsManager#checkPerm(world.bentobox.bentobox.api.addons.Addon, world.bentobox.bentobox.api.user.User, java.lang.String)}.
*/
@Test
public void testCheckPermBundlesNoPremissionRequired() {
// Make bundle
BlueprintBundle bb = new BlueprintBundle();
bb.setIcon(Material.PAPER);
bb.setUniqueId("bundle");
bb.setDisplayName("A bundle");
bb.setDescription(Collections.singletonList(ChatColor.AQUA + "A bundle of blueprints"));
// This blueprint is used for all environments
bb.setBlueprint(World.Environment.NORMAL, defaultBp);
bb.setBlueprint(World.Environment.NETHER, defaultBp);
bb.setBlueprint(World.Environment.THE_END, defaultBp);
// No permissions required
bb.setRequirePermission(false);
// Add it
BlueprintsManager bpm = new BlueprintsManager(plugin);
bpm.addBlueprintBundle(addon, bb);
// Check perm
assertTrue(bpm.checkPerm(addon, user, "bundle"));
verify(user, Mockito.never()).sendMessage(eq("general.errors.no-permission"), eq(TextVariables.PERMISSION), eq("bskyblock.island.create.bundle"));
}
/**
* Test method for {@link world.bentobox.bentobox.managers.BlueprintsManager#checkPerm(world.bentobox.bentobox.api.addons.Addon, world.bentobox.bentobox.api.user.User, java.lang.String)}.
*/
@Test
public void testCheckPermBundlesPremissionRequired() {
// Make bundle
BlueprintBundle bb = new BlueprintBundle();
bb.setIcon(Material.PAPER);
bb.setUniqueId("bundle");
bb.setDisplayName("A bundle");
bb.setDescription(Collections.singletonList(ChatColor.AQUA + "A bundle of blueprints"));
// This blueprint is used for all environments
bb.setBlueprint(World.Environment.NORMAL, defaultBp);
bb.setBlueprint(World.Environment.NETHER, defaultBp);
bb.setBlueprint(World.Environment.THE_END, defaultBp);
// Permission required
bb.setRequirePermission(true);
// Add it
BlueprintsManager bpm = new BlueprintsManager(plugin);
bpm.addBlueprintBundle(addon, bb);
assertFalse(bpm.checkPerm(addon, user, "bundle"));
verify(user).sendMessage(eq("general.errors.no-permission"), eq(TextVariables.PERMISSION), eq("bskyblock.island.create.bundle"));
}
/**
* Test method for {@link world.bentobox.bentobox.managers.BlueprintsManager#checkPerm(world.bentobox.bentobox.api.addons.Addon, world.bentobox.bentobox.api.user.User, java.lang.String)}.
*/
@Test
public void testCheckPermBundlesDefault() {
// Make bundle
BlueprintBundle bb = new BlueprintBundle();
bb.setIcon(Material.PAPER);
bb.setUniqueId("default");
bb.setDisplayName("A bundle");
bb.setDescription(Collections.singletonList(ChatColor.AQUA + "A bundle of blueprints"));
// This blueprint is used for all environments
bb.setBlueprint(World.Environment.NORMAL, defaultBp);
bb.setBlueprint(World.Environment.NETHER, defaultBp);
bb.setBlueprint(World.Environment.THE_END, defaultBp);
// Permission required
bb.setRequirePermission(true);
// Add it
BlueprintsManager bpm = new BlueprintsManager(plugin);
bpm.addBlueprintBundle(addon, bb);
assertTrue(bpm.checkPerm(addon, user, "default"));
}
/**
* Test method for {@link world.bentobox.bentobox.managers.BlueprintsManager#deleteBlueprintBundle(world.bentobox.bentobox.api.addons.GameModeAddon, world.bentobox.bentobox.blueprints.dataobjects.BlueprintBundle)}.
*/
@Test
public void testDeleteBlueprintBundle() throws IOException {
// Make bundle
BlueprintBundle bb = new BlueprintBundle();
bb.setIcon(Material.PAPER);
bb.setUniqueId("bundle");
bb.setDisplayName("A bundle");
bb.setDescription(Collections.singletonList(ChatColor.AQUA + "A bundle of blueprints"));
// Create a dummy file
File blueprints = new File(dataFolder, BlueprintsManager.FOLDER_NAME);
blueprints.mkdirs();
File d = new File(blueprints, "bundle.json");
Files.createFile(d.toPath());
BlueprintsManager bpm = new BlueprintsManager(plugin);
// Set up running and verification
when(scheduler.runTaskAsynchronously(eq(plugin), any(Runnable.class))).thenAnswer((Answer<BukkitTask>) invocation -> {
invocation.getArgument(1,Runnable.class).run();
// Verify
assertFalse(d.exists());
return task;
});
// Delete it
bpm.deleteBlueprintBundle(addon, bb);
}
/**
* Test method for {@link world.bentobox.bentobox.managers.BlueprintsManager#renameBlueprint(world.bentobox.bentobox.api.addons.GameModeAddon, world.bentobox.bentobox.blueprints.Blueprint, java.lang.String, java.lang.String)}.
*/
@Test
public void testRenameBlueprint() {
// Save it
BlueprintsManager bpm = new BlueprintsManager(plugin);
bpm.saveBlueprint(addon, defaultBp);
bpm.addBlueprint(addon, defaultBp);
File blueprints = new File(dataFolder, BlueprintsManager.FOLDER_NAME);
File d = new File(blueprints, "bedrock.blu");
assertTrue(d.exists());
// Rename it
bpm.renameBlueprint(addon, defaultBp, "bedrock2", "");
assertFalse(d.exists());
d = new File(blueprints, "bedrock2.blu");
assertTrue(d.exists());
}
/*
* Utility methods
*/
private void createJarArchive(File archiveFile, File folder, List<File> tobeJaredList) {
byte[] buffer = new byte[BUFFER_SIZE];
// Open archive file
try (FileOutputStream stream = new FileOutputStream(archiveFile)) {
try (JarOutputStream out = new JarOutputStream(stream, new Manifest())) {
for (File j: tobeJaredList) addFile(folder, buffer, stream, out, j);
}
} catch (Exception ex) {
ex.printStackTrace();
System.out.println("Error: " + ex.getMessage());
}
}
private void addFile(File folder, byte[] buffer, FileOutputStream stream, JarOutputStream out, File tobeJared) throws IOException {
if (tobeJared == null || !tobeJared.exists() || tobeJared.isDirectory())
return;
// Add archive entry
JarEntry jarAdd = new JarEntry(folder.getName() + "/" + tobeJared.getName());
jarAdd.setTime(tobeJared.lastModified());
out.putNextEntry(jarAdd);
// Write file to archive
try (FileInputStream in = new FileInputStream(tobeJared)) {
while (true) {
int nRead = in.read(buffer, 0, buffer.length);
if (nRead <= 0)
break;
out.write(buffer, 0, nRead);
}
} catch (Exception e) {
System.out.println("Error: " + e.getMessage());
e.printStackTrace();
}
}
}