bentobox/src/test/java/world/bentobox/bentobox/managers/island/NewIslandTest.java

357 lines
14 KiB
Java

package world.bentobox.bentobox.managers.island;
import static org.junit.Assert.assertEquals;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.ArgumentMatchers.anyBoolean;
import static org.mockito.ArgumentMatchers.anyInt;
import static org.mockito.ArgumentMatchers.eq;
import static org.mockito.Mockito.never;
import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
import java.util.Collections;
import java.util.Optional;
import java.util.UUID;
import org.bukkit.Bukkit;
import org.bukkit.Location;
import org.bukkit.Material;
import org.bukkit.World;
import org.bukkit.block.Block;
import org.bukkit.scheduler.BukkitScheduler;
import org.eclipse.jdt.annotation.NonNull;
import org.junit.After;
import org.junit.Before;
import org.junit.Ignore;
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 org.powermock.reflect.Whitebox;
import world.bentobox.bentobox.BentoBox;
import world.bentobox.bentobox.api.addons.GameModeAddon;
import world.bentobox.bentobox.api.events.island.IslandCreateEvent;
import world.bentobox.bentobox.api.events.island.IslandEvent;
import world.bentobox.bentobox.api.events.island.IslandEvent.IslandEventBuilder;
import world.bentobox.bentobox.api.events.island.IslandEvent.Reason;
import world.bentobox.bentobox.api.events.island.IslandResetEvent;
import world.bentobox.bentobox.api.user.User;
import world.bentobox.bentobox.blueprints.dataobjects.BlueprintBundle;
import world.bentobox.bentobox.database.objects.Island;
import world.bentobox.bentobox.managers.BlueprintsManager;
import world.bentobox.bentobox.managers.IslandDeletionManager;
import world.bentobox.bentobox.managers.IslandWorldManager;
import world.bentobox.bentobox.managers.IslandsManager;
import world.bentobox.bentobox.managers.PlayersManager;
import world.bentobox.bentobox.util.Util;
/**
* @author tastybento
*
*/
@RunWith(PowerMockRunner.class)
@PrepareForTest({ Util.class, IslandEvent.class, Bukkit.class })
public class NewIslandTest {
private static final String NAME = "name";
@Mock
private BentoBox plugin;
@Mock
private World world;
@Mock
private GameModeAddon addon;
@Mock
private User user;
@Mock
private Island oldIsland;
@Mock
private IslandsManager im;
@Mock
private Island island;
@Mock
private PlayersManager pm;
@Mock
private IslandWorldManager iwm;
@Mock
private IslandCreateEvent ice;
@Mock
private IslandResetEvent ire;
@Mock
private IslandDeletionManager idm;
@Mock
private Location location;
@Mock
private Block block;
@Mock
private BukkitScheduler scheduler;
@Mock
private IslandEventBuilder builder;
@Mock
private BlueprintBundle bpb;
private final UUID uuid = UUID.randomUUID();
@Mock
private BlueprintsManager bpm;
@Mock
private @NonNull Location location2;
/**
*/
@Before
public void setUp() throws Exception {
Whitebox.setInternalState(BentoBox.class, "instance", plugin);
// Islands manager
when(plugin.getIslands()).thenReturn(im);
when(im.createIsland(any(), any())).thenReturn(island);
when(im.getLast(any())).thenReturn(location);
when(im.getIsland(any(), any(User.class))).thenReturn(island);
when(im.getPrimaryIsland(any(), any())).thenReturn(island);
when(island.isReserved()).thenReturn(true);
// Player's manager
when(plugin.getPlayers()).thenReturn(pm);
// IWM
when(plugin.getIWM()).thenReturn(iwm);
Optional<GameModeAddon> optionalAddon = Optional.of(addon);
when(iwm.getAddon(any())).thenReturn(optionalAddon);
when(iwm.isDeathsResetOnNewIsland(any())).thenReturn(true);
// Island deletion manager
when(plugin.getIslandDeletionManager()).thenReturn(idm);
when(idm.inDeletion(any())).thenReturn(false);
// blueprints Manager
when(bpb.getUniqueId()).thenReturn(NAME);
when(bpm.getBlueprintBundles(any())).thenReturn(Collections.singletonMap(NAME, bpb));
when(plugin.getBlueprintsManager()).thenReturn(bpm);
// User
when(user.getPermissionValue(Mockito.anyString(), Mockito.anyInt())).thenReturn(20);
when(user.getUniqueId()).thenReturn(uuid);
when(user.getName()).thenReturn("tastybento");
when(user.getWorld()).thenReturn(world);
when(user.getLocation()).thenReturn(location);
// Events
PowerMockito.mockStatic(IslandEvent.class);
when(IslandEvent.builder()).thenReturn(builder);
when(builder.admin(anyBoolean())).thenReturn(builder);
when(builder.blueprintBundle(any())).thenReturn(builder);
when(builder.deletedIslandInfo(any())).thenReturn(builder);
when(builder.involvedPlayer(any())).thenReturn(builder);
when(builder.island(any())).thenReturn(builder);
when(builder.location(any())).thenReturn(builder);
when(builder.reason(any())).thenReturn(builder);
when(builder.oldIsland(any())).thenReturn(builder);
when(builder.build()).thenReturn(ice);
when(ice.getBlueprintBundle()).thenReturn(bpb);
when(ire.getBlueprintBundle()).thenReturn(bpb);
// Location and blocks
when(island.getWorld()).thenReturn(world);
when(island.getCenter()).thenReturn(location2);
when(location.getWorld()).thenReturn(world);
when(world.getMaxHeight()).thenReturn(5);
when(location.getBlock()).thenReturn(block);
when(location.distance(any())).thenReturn(320D);
when(block.getType()).thenReturn(Material.AIR);
when(block.isEmpty()).thenReturn(true);
when(world.getBlockAt(anyInt(), anyInt(), anyInt())).thenReturn(block);
when(oldIsland.getWorld()).thenReturn(world);
// Util - return the same location
PowerMockito.mockStatic(Util.class);
when(Util.getClosestIsland(any()))
.thenAnswer((Answer<Location>) invocation -> invocation.getArgument(0, Location.class));
// Bukkit Scheduler
PowerMockito.mockStatic(Bukkit.class);
when(Bukkit.getScheduler()).thenReturn(scheduler);
when(Bukkit.getViewDistance()).thenReturn(10);
// Addon
when(addon.getOverWorld()).thenReturn(world);
}
/**
*/
@After
public void tearDown() {
Mockito.framework().clearInlineMocks();
}
/**
* Test method for
* {@link world.bentobox.bentobox.managers.island.NewIsland#builder()}.
*/
@Test
public void testBuilderNoUser() {
try {
NewIsland.builder().build();
} catch (Exception e) {
assertEquals("Insufficient parameters. Must have a user!", e.getMessage());
}
}
/**
* Test method for
* {@link world.bentobox.bentobox.managers.island.NewIsland#builder()}.
*/
@Test
public void testBuilder() throws Exception {
NewIsland.builder().addon(addon).name(NAME).player(user).noPaste().reason(Reason.CREATE).oldIsland(oldIsland)
.build();
// Verifications
verify(im).save(eq(island));
verify(island).setFlagsDefaults();
verify(scheduler).runTask(any(BentoBox.class), any(Runnable.class));
verify(builder, times(2)).build();
verify(bpb).getUniqueId();
verify(ice).getBlueprintBundle();
verify(pm).setDeaths(eq(world), eq(uuid), eq(0));
verify(im, never()).setHomeLocation(eq(user), any());
verify(island).setProtectionRange(eq(20));
}
/**
* Test method for {@link world.bentobox.bentobox.managers.island.NewIsland#builder()}.
*/
@Test
public void testBuilderReset() throws Exception {
when(builder.build()).thenReturn(ire);
NewIsland.builder().addon(addon).name(NAME).player(user).noPaste().reason(Reason.RESET).oldIsland(oldIsland).build();
// Verifications
verify(im).save(eq(island));
verify(island).setFlagsDefaults();
verify(scheduler).runTask(any(BentoBox.class), any(Runnable.class));
verify(builder, times(2)).build();
verify(bpb).getUniqueId();
verify(ice, never()).getBlueprintBundle();
verify(ire).getBlueprintBundle();
verify(pm).setDeaths(eq(world), eq(uuid), eq(0));
verify(im, never()).setHomeLocation(eq(user), any());
}
/**
* Test method for
* {@link world.bentobox.bentobox.managers.island.NewIsland#builder()}.
*/
@Test
public void testBuilderNoOldIsland() throws Exception {
NewIsland.builder().addon(addon).name(NAME).player(user).noPaste().reason(Reason.CREATE).build();
// Verifications
verify(im).save(eq(island));
verify(island).setFlagsDefaults();
verify(scheduler).runTask(any(BentoBox.class), any(Runnable.class));
verify(builder, times(2)).build();
verify(bpb).getUniqueId();
verify(ice).getBlueprintBundle();
verify(pm).setDeaths(eq(world), eq(uuid), eq(0));
verify(im, never()).setHomeLocation(eq(user), any());
}
/**
* Test method for
* {@link world.bentobox.bentobox.managers.island.NewIsland#builder()}.
*/
@Test
public void testBuilderNoOldIslandPasteNoNMS() throws Exception {
when(location.distance(any())).thenReturn(30D);
NewIsland.builder().addon(addon).name(NAME).player(user).reason(Reason.CREATE).build();
// Verifications
verify(im).save(eq(island));
verify(island).setFlagsDefaults();
verify(bpm).paste(eq(addon), eq(island), eq(NAME), any(Runnable.class), eq(false));
verify(builder, times(2)).build();
verify(bpb).getUniqueId();
verify(ice).getBlueprintBundle();
verify(pm).setDeaths(world, uuid, 0);
verify(im, never()).setHomeLocation(eq(user), any());
}
/**
* Test method for
* {@link world.bentobox.bentobox.managers.island.NewIsland#builder()}.
*/
@Test
public void testBuilderNoOldIslandPasteWithNMS() throws Exception {
NewIsland.builder().addon(addon).name(NAME).player(user).reason(Reason.CREATE).build();
PowerMockito.mockStatic(Bukkit.class);
// Verifications
verify(im).save(island);
verify(island).setFlagsDefaults();
verify(bpm).paste(eq(addon), eq(island), eq(NAME), any(Runnable.class), eq(true));
verify(builder, times(2)).build();
verify(bpb).getUniqueId();
verify(ice).getBlueprintBundle();
verify(pm).setDeaths(world, uuid, 0);
verify(im, never()).setHomeLocation(eq(user), any());
}
/**
* Test method for {@link world.bentobox.bentobox.managers.island.NewIsland#builder()}.
*/
@Test
public void testBuilderHasIsland() throws Exception {
when(im.hasIsland(any(), any(User.class))).thenReturn(true);
NewIsland.builder().addon(addon).name(NAME).player(user).noPaste().reason(Reason.CREATE).oldIsland(oldIsland).build();
// Verifications
verify(im).save(eq(island));
verify(island).setFlagsDefaults();
verify(scheduler).runTask(any(BentoBox.class), any(Runnable.class));
verify(builder, times(2)).build();
verify(bpb).getUniqueId();
verify(ice).getBlueprintBundle();
verify(pm).setDeaths(world, uuid, 0);
verify(im, never()).setHomeLocation(eq(user), any());
verify(island).setProtectionRange(eq(20));
verify(island).setReserved(eq(false));
}
/**
* Test method for {@link world.bentobox.bentobox.managers.island.NewIsland#builder()}.
*/
@Test
public void testBuilderHasIslandFail() throws Exception {
when(im.getIsland(any(), any(User.class))).thenReturn(null);
when(im.hasIsland(any(), any(User.class))).thenReturn(true);
NewIsland.builder().addon(addon).name(NAME).player(user).noPaste().reason(Reason.CREATE).oldIsland(oldIsland).build();
// Verifications
verify(im).save(eq(island));
verify(island).setFlagsDefaults();
verify(scheduler).runTask(any(BentoBox.class), any(Runnable.class));
verify(builder, times(2)).build();
verify(bpb).getUniqueId();
verify(ice).getBlueprintBundle();
verify(pm).setDeaths(world, uuid, 0);
verify(im, never()).setHomeLocation(eq(user), any());
verify(island).setProtectionRange(eq(20));
//verify(plugin).logError("New island for user tastybento was not reserved!");
}
/**
* Test method for {@link world.bentobox.bentobox.managers.island.NewIsland#builder()}.
*/
@Test
@Ignore("Not done")
public void testBuilderHasIslandFailnoReserve() throws Exception {
when(island.isReserved()).thenReturn(false);
when(im.hasIsland(any(), any(User.class))).thenReturn(true);
NewIsland.builder().addon(addon).name(NAME).player(user).noPaste().reason(Reason.CREATE).oldIsland(oldIsland).build();
// Verifications
verify(im).save(eq(island));
verify(island).setFlagsDefaults();
verify(scheduler).runTask(any(BentoBox.class), any(Runnable.class));
verify(builder, times(2)).build();
verify(bpb).getUniqueId();
verify(ice).getBlueprintBundle();
verify(pm).setDeaths(world, uuid, 0);
verify(im, never()).setHomeLocation(eq(user), any());
verify(island).setProtectionRange(eq(20));
verify(plugin).logError("New island for user tastybento was not reserved!");
}
}