package com.jcwhatever.nucleus.views; import static org.junit.Assert.assertEquals; import com.jcwhatever.v1_8_R3.BukkitTester; import com.jcwhatever.nucleus.NucleusTest; import org.bukkit.block.Block; import org.bukkit.entity.Player; import org.bukkit.plugin.Plugin; import org.junit.Before; import org.junit.BeforeClass; import org.junit.Test; import javax.annotation.Nullable; /** * Basic abstract test for a {@link View} implementation. */ public abstract class AbstractViewTest { protected Plugin plugin = BukkitTester.mockPlugin("dummy"); protected Player player = BukkitTester.login("dummy"); protected ViewSession _session; protected final IViewGenerator _generator; public interface IViewGenerator { View generate(Plugin plugin); } /** * Constructor. * * @param generator An abject to generate new {@link View} instances for testing. */ public AbstractViewTest(IViewGenerator generator) { _generator = generator; } /** * Make sure Nucleus and Bukkit are initialized. */ @BeforeClass public static void init() { NucleusTest.init(); } /** * Setup each test. */ @Before public void before() { BukkitTester.pause(5); // ensure a view session from a previous test is disposed. ViewSession s = ViewSession.getCurrent(player); if (s != null) s.dispose(); // start a new view session _session = ViewSession.get(player, getSourceBlock()); // test the test: we want to start with the players inventory closed. assertEquals(null, player.getOpenInventory()); } /** * Make sure the plugin returned by the view is the plugin * specified during its construction. */ @Test public void testGetPlugin() { Plugin plugin = BukkitTester.mockPlugin("dummy"); View view = _generator.generate(plugin); assertEquals(plugin, view.getPlugin()); } /** * Make sure the player returned by the view is the player * in the session the view has been assigned to. */ @Test public void testGetPlayer() { View view = _generator.generate(plugin); _session.next(view); BukkitTester.pause(5); assertEquals(player, view.getPlayer()); } /** * Make sure the view session returned by the view is the * view session it was assigned to. */ @Test public void testGetViewSession() { View view = _generator.generate(plugin); _session.next(view); assertEquals(_session, view.getViewSession()); } /** * Make sure there are no problems when showing the view to a player. */ @Test public void testOpen() { View view = _generator.generate(plugin); _session.next(view); BukkitTester.pause(2); assertEquals(view.getInventoryView(), player.getOpenInventory()); } /** * Invoked to get a source block when creating a new view session. */ @Nullable protected abstract Block getSourceBlock(); }