package com.jcwhatever.nucleus.views;
import static org.junit.Assert.assertEquals;
import com.jcwhatever.v1_8_R3.BukkitTester;
import com.jcwhatever.v1_8_R3.blocks.MockBlock;
import com.jcwhatever.nucleus.NucleusTest;
import com.jcwhatever.nucleus.views.workbench.WorkbenchView;
import org.bukkit.Material;
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;
/**
* Tests {@link ViewSession}.
*/
public class ViewSessionTest {
Plugin plugin = BukkitTester.mockPlugin("dummy");
Player player = BukkitTester.login("dummy");
ViewSession _session;
/**
* 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, null);
// test the test: we want to start with the players inventory closed.
assertEquals(null, player.getOpenInventory());
}
@Test
public void testPreviousWithNoView() {
assertEquals(null, _session.getCurrent());
try {
_session.previous();
throw new AssertionError("IllegalStateException expected.");
}
catch (IllegalStateException ignore) {}
}
/**
* Make sure the {@link ViewSession#next} method functions properly.
*/
@Test
public void testNext() {
WorkbenchView view1 = new WorkbenchView(plugin);
WorkbenchView view2 = new WorkbenchView(plugin);
// baseline test: No views have been opened
assertEquals(null, _session.getCurrent());
assertEquals(null, _session.getPrev());
assertEquals(null, _session.getNext());
// show view1 to player
_session.next(view1);
BukkitTester.pause(2);
// make sure player sees view1
assertEquals(view1.getInventoryView(), player.getOpenInventory());
assertEquals(view1, _session.getCurrent()); // make sure view1 is the current reported view
assertEquals(null, _session.getPrev());
assertEquals(null, _session.getNext());
assertEquals(view1, _session.getLast()); // make sure view1 is the reported last/final view
// show view 2 to player
_session.next(view2);
BukkitTester.pause(2);
assertEquals(view2, _session.getCurrent()); // make sure view2 is the current reported view
assertEquals(view1, _session.getPrev()); // make sure view1 is the reported previous view
assertEquals(null, _session.getNext());
assertEquals(view2, _session.getLast()); // make sure view2 is the reported last/final view
}
/**
* Make sure the {@link ViewSession#previous} method functions properly.
*/
@Test
public void testPrevious() {
WorkbenchView view1 = new WorkbenchView(plugin);
WorkbenchView view2 = new WorkbenchView(plugin);
// open to view2
_session.next(view1);
_session.next(view2);
BukkitTester.pause(4);
// baseline test: Reported views should be correct
assertEquals(view2, _session.getCurrent());
assertEquals(view1, _session.getPrev());
assertEquals(null, _session.getNext());
assertEquals(view2, _session.getLast());
// close view2 and show view1 to the player
_session.previous();
BukkitTester.pause(2);
assertEquals(view1, _session.getCurrent()); // make sure view1 is the current reported view
assertEquals(null, _session.getPrev());
assertEquals(view2, _session.getNext()); // make sure view2 is the reported next view
assertEquals(view2, _session.getLast()); // make sure view2 is the reported last/final view
// close view1 (ends/disposes session)
_session.previous();
BukkitTester.pause(2);
// session should be disposed from closing first view,
// all values cleared.
assertEquals(true, _session.isDisposed());
assertEquals(null, _session.getCurrent());
assertEquals(null, _session.getPrev());
assertEquals(null, _session.getNext());
}
/**
* Make sure the {@link ViewSession#refresh} method functions properly.
*/
@Test
public void refresh() {
WorkbenchView view1 = new WorkbenchView(plugin);
// open first view
_session.next(view1);
BukkitTester.pause(2);
// baseline test : Reported views should be correct
assertEquals(view1, _session.getCurrent());
assertEquals(null, _session.getPrev());
assertEquals(null, _session.getNext());
assertEquals(view1, _session.getLast());
// refresh the view (Close and re-open)
_session.refresh();
BukkitTester.pause(2);
// reported views should be the same as before
assertEquals(view1, _session.getCurrent());
assertEquals(null, _session.getPrev());
assertEquals(null, _session.getNext());
assertEquals(view1, _session.getLast());
}
/**
* Make sure the source block returned by the session is the source block
* provided when the session is first initialized.
*/
@Test
public void testSourceBlock() {
// dispose the session generated by #before
_session.dispose();
Block block = new MockBlock(player.getWorld(), Material.ANVIL, 0, 0, 0);
// start a new session using the anvil block.
_session = ViewSession.get(player, block);
assertEquals(block, _session.getSessionBlock());
}
}