package com.jcwhatever.nucleus.utils.signs; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertTrue; import com.jcwhatever.v1_8_R3.BukkitTester; import com.jcwhatever.v1_8_R3.MockWorld; import com.jcwhatever.v1_8_R3.blocks.MockBlock; import com.jcwhatever.v1_8_R3.blocks.MockSign; import com.jcwhatever.nucleus.Nucleus; import com.jcwhatever.nucleus.NucleusTest; import com.jcwhatever.nucleus.managed.signs.ISignContainer; import com.jcwhatever.nucleus.managed.signs.ISignManager; import com.jcwhatever.nucleus.managed.signs.SignHandler; import org.bukkit.GameMode; import org.bukkit.Location; import org.bukkit.Material; import org.bukkit.block.BlockFace; import org.bukkit.block.Sign; import org.bukkit.entity.Player; import org.bukkit.event.block.Action; import org.bukkit.plugin.Plugin; import org.junit.After; import org.junit.Before; import org.junit.BeforeClass; import org.junit.Test; import java.util.Collection; /** * Tests Nucleus {@link ISignManager} implementation. */ public class SignManagerTest { Plugin _plugin = BukkitTester.mockPlugin("Plugin"); MockWorld _world = BukkitTester.world("signManagerWorld"); Player _player = BukkitTester.login("signManagerPlayer"); MockSignHandler _signHandler = new MockSignHandler(_plugin); ISignManager _signManager; /** * Make sure Nucleus and Bukkit are initialized. */ @BeforeClass public static void init() { NucleusTest.init(); } @Before public void before() { _signManager = Nucleus.getSignManager(); _signManager.registerHandler(_signHandler); _signHandler.reset(); } @After public void after() { _signManager.unregisterHandler(_signHandler.getName()); } /** * Make sure registering and unregistering a sign type works * correctly. */ @Test public void testRegisterSignType() throws Exception { Collection<SignHandler> signHandlers = _signManager.getSignHandlers(); assertEquals(1, signHandlers.size()); } /** * Make sure {@link ISignManager#getSignHandler} returns the correct value. */ @Test public void testGetSignHandler() throws Exception { SignHandler signHandler = _signManager.getSignHandler(_signHandler.getName()); assertEquals(_signHandler, signHandler); } /** * Make sure {@link ISignManager#getSigns} returns the correct value. */ @Test public void testGetSigns() throws Exception { // baseline test: should be no signs Collection<ISignContainer> signs = _signManager.getSigns(_signHandler.getName()); assertEquals(0, signs.size()); // place a new sign _world.placeSignPost(_player, 0, 0, 0, _signHandler.getName(), "line2", "line3", "line4"); // should be 1 sign signs = _signManager.getSigns(_signHandler.getName()); assertEquals(1, signs.size()); } /** * Make sure {@link ISignManager#getSavedLines} returns the correct value. */ @Test public void testGetSavedLines() throws Exception { // place a new sign _world.placeSignPost(_player, 10, 10, 10, _signHandler.getName(), "line2", "line3", "line4"); MockBlock signBlock = _world.getBlockAt(10, 10, 10); String[] lines = _signManager.getSavedLines((Sign)signBlock.getState()); // validate result assertTrue(lines != null); assertEquals(_signHandler.getDisplayName(), lines[0]); assertEquals("line2", lines[1]); assertEquals("line3", lines[2]); assertEquals("line4", lines[3]); } /** * Make sure {@link ISignManager#restoreSign} works correctly. */ @Test public void testRestoreSign() throws Exception { // place a new sign _world.placeSignPost(_player, 0, 0, 0, _signHandler.getName(), "line2", "line3", "line4"); MockBlock signBlock = _world.getBlockAt(0, 0, 0); // delete new sign signBlock.setType(Material.AIR); assertEquals(Material.AIR, signBlock.getType()); // restore sign _signManager.restoreSign(_signHandler.getName(), new Location(_world, 0, 0, 0)); BukkitTester.pause(2); // validate sign restored assertEquals(Material.SIGN_POST, signBlock.getType()); MockSign state1 = (MockSign)signBlock.getState(); assertEquals(_signHandler.getDisplayName(), state1.getLines()[0]); assertEquals("line2", state1.getLines()[1]); assertEquals("line3", state1.getLines()[2]); assertEquals("line4", state1.getLines()[3]); } /** * Make sure {@link ISignManager#restoreSigns} works correctly. */ @Test public void testRestoreSigns() throws Exception { // place new signs _world.placeSignPost(_player, 0, 0, 0, _signHandler.getName(), "line2", "line3", "line4"); _world.placeSignPost(_player, 1, 1, 1, _signHandler.getName(), "2line2", "2line3", "2line4"); MockBlock signBlock1 = _world.getBlockAt(0, 0, 0); MockBlock signBlock2 = _world.getBlockAt(1, 1, 1); // delete new signs signBlock1.setType(Material.AIR); signBlock2.setType(Material.AIR); assertEquals(Material.AIR, signBlock1.getType()); assertEquals(Material.AIR, signBlock2.getType()); // restore all signs _signManager.restoreSigns(_signHandler.getName()); BukkitTester.pause(2); // check sign1 assertEquals(Material.SIGN_POST, signBlock1.getType()); MockSign state1 = (MockSign)signBlock1.getState(); assertEquals(_signHandler.getDisplayName(), state1.getLines()[0]); assertEquals("line2", state1.getLines()[1]); assertEquals("line3", state1.getLines()[2]); assertEquals("line4", state1.getLines()[3]); // check sign2 assertEquals(Material.SIGN_POST, signBlock2.getType()); MockSign state2 = (MockSign)signBlock2.getState(); assertEquals(_signHandler.getDisplayName(), state2.getLines()[0]); assertEquals("2line2", state2.getLines()[1]); assertEquals("2line3", state2.getLines()[2]); assertEquals("2line4", state2.getLines()[3]); } /** * Make sure change sign event is handled properly when * player is in {@link GameMode#SURVIVAL}. */ @Test public void testSignChangeSurvival() throws Exception { _player.setGameMode(GameMode.SURVIVAL); testSignBreak(); } /** * Make sure change sign event is handled properly when * player is in {@link GameMode#CREATIVE}. */ @Test public void testSignChangeCreative() throws Exception { _player.setGameMode(GameMode.CREATIVE); testSignChange(); } private void testSignChange() { // place a new NON-handled sign _world.placeSignPost(_player, 4, 4, 4, "line1", "line2", "line3", "line4"); // make sure the sign was not handled assertEquals(0, _signHandler.signChangeCount); // place a new handled sign _world.placeSignPost(_player, 0, 0, 0, _signHandler.getName(), "line2", "line3", "line4"); // make sure the sign change was detected and handled. assertEquals(1, _signHandler.signChangeCount); } /** * Make sure sign click event is handled properly when player * is in {@link GameMode#SURVIVAL}. */ @Test public void testSignClickSurvival() throws Exception { _player.setGameMode(GameMode.SURVIVAL); testSignClick(); } /** * Make sure sign click event is handled properly when player * is in {@link GameMode#CREATIVE}. */ @Test public void testSignClickCreative() throws Exception { _player.setGameMode(GameMode.CREATIVE); testSignClick(); } private void testSignClick() throws Exception { // place a new handled sign _world.placeSignPost(_player, 0, 0, 0, _signHandler.getName(), "line2", "line3", "line4"); // place a new NON-handled sign _world.placeSignPost(_player, 4, 4, 4, "line1", "line2", "line3", "line4"); // click a non-sign block BukkitTester.blockClick(_player, Action.RIGHT_CLICK_BLOCK, _world.getBlockAt(2, 2, 2), BlockFace.SOUTH); // make sure the block break on a non sign was NOT handled. assertEquals(0, _signHandler.signClickCount); // click a non-handled sign BukkitTester.blockClick(_player, Action.RIGHT_CLICK_BLOCK, _world.getBlockAt(4, 4, 4), BlockFace.SOUTH); // make sure the sign click was NOT handled. assertEquals(0, _signHandler.signClickCount); // click sign BukkitTester.blockClick(_player, Action.RIGHT_CLICK_BLOCK, _world.getBlockAt(0, 0, 0), BlockFace.SOUTH); // make sure the sign click was detected and handled. assertEquals(1, _signHandler.signClickCount); } /** * Make sure sign break event is handled properly when * player is in {@link GameMode#SURVIVAL}. */ @Test public void testSignBreakSurvival() throws Exception { _player.setGameMode(GameMode.SURVIVAL); testSignBreak(); // make sure the sign break was not handled (cancelled). assertEquals(0, _signHandler.signBreakCount); } /** * Make sure sign break event is handled properly when * player is in {@link GameMode#CREATIVE}. */ @Test public void testSignBreakCreative() throws Exception { _player.setGameMode(GameMode.CREATIVE); testSignBreak(); // make sure the sign break was detected and handled. assertEquals(1, _signHandler.signBreakCount); } private void testSignBreak() { // place a new handled sign _world.placeSignPost(_player, 0, 0, 0, _signHandler.getName(), "line2", "line3", "line4"); // place a new NON-handled sign _world.placeSignPost(_player, 4, 4, 4, "line1", "line2", "line3", "line4"); // break a non-sign block _world.breakBlock(_player, 2, 2, 2); // make sure the block break was NOT handled. assertEquals(0, _signHandler.signBreakCount); // break a non-handled sign _world.breakBlock(_player, 4, 4, 4); // make sure the block break was NOT handled. assertEquals(0, _signHandler.signBreakCount); // break the handled sign _world.breakBlock(_player, 0, 0, 0); } }