package com.jcwhatever.nucleus.events.manager;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertTrue;
import com.jcwhatever.v1_8_R3.MockPlugin;
import com.jcwhatever.nucleus.NucleusTest;
import com.jcwhatever.nucleus.mixins.ICancellable;
import com.jcwhatever.nucleus.utils.observer.event.EventSubscriber;
import com.jcwhatever.nucleus.utils.observer.event.EventSubscriberPriority;
import org.bukkit.plugin.Plugin;
import org.junit.Test;
import java.util.ArrayList;
import java.util.List;
import javax.annotation.Nullable;
public class EventManagerTest {
Plugin plugin = new MockPlugin("dummy");
List<String> callTracker = new ArrayList<>(3);
@Test
public void test() {
NucleusTest.init();
EventManager manager = new EventManager(plugin, null);
manager.register(plugin, TestEvent.class, new TestEventSubscriber<TestEvent>(false, false));
manager.call(this, new TestEvent());
assertEquals(1, callTracker.size());
callTracker.clear();
TestEventSubscriber<TestCancellableEvent> sub1 = new TestEventSubscriber<>(true, false);
sub1.setPriority(EventSubscriberPriority.FIRST);
TestEventSubscriber<TestCancellableEvent> sub2 = new TestEventSubscriber<>(true, false);
sub2.setPriority(EventSubscriberPriority.HIGH);
TestEventSubscriber<TestCancellableEvent> sub3 = new TestEventSubscriber<>(true, false);
sub3.setPriority(EventSubscriberPriority.NORMAL);
TestEventSubscriber<TestCancellableEvent> sub4 = new TestEventSubscriber<>(true, false);
sub4.setPriority(EventSubscriberPriority.LOW);
TestEventSubscriber<TestCancellableEvent> sub5 = new TestEventSubscriber<>(true, false);
sub5.setPriority(EventSubscriberPriority.LAST);
TestEventSubscriber<TestCancellableEvent> sub6 = new TestEventSubscriber<>(true, false);
sub6.setPriority(EventSubscriberPriority.WATCHER);
manager.register(plugin, TestCancellableEvent.class, sub1);
manager.register(plugin, TestCancellableEvent.class, sub2);
manager.register(plugin, TestCancellableEvent.class, sub3);
manager.register(plugin, TestCancellableEvent.class, sub4);
manager.register(plugin, TestCancellableEvent.class, sub5);
manager.register(plugin, TestCancellableEvent.class, sub6);
manager.call(this, new TestCancellableEvent());
assertEquals(6, callTracker.size());
assertEquals("FIRST", callTracker.get(0));
assertEquals("HIGH", callTracker.get(1));
assertEquals("NORMAL", callTracker.get(2));
assertEquals("LOW", callTracker.get(3));
assertEquals("LAST", callTracker.get(4));
assertEquals("WATCHER", callTracker.get(5));
}
public class TestEventSubscriber<E> extends EventSubscriber<E>{
boolean isCancellable;
boolean cancel;
TestEventSubscriber(boolean isCancellable, boolean cancel) {
this.isCancellable = isCancellable;
this.cancel = cancel;
}
@Override
public void onEvent(@Nullable Object caller, E event) {
assertEquals(EventManagerTest.this, caller);
assertNotNull(event);
if (isCancellable) {
assertTrue(event instanceof TestCancellableEvent);
if (cancel)
((ICancellable)event).setCancelled(true);
}
callTracker.add(getPriority().name());
}
}
public static class TestEvent {
}
public static class TestCancellableEvent implements ICancellable {
private boolean isCancelled;
@Override
public boolean isCancelled() {
return isCancelled;
}
@Override
public void setCancelled(boolean isCancelled) {
this.isCancelled = isCancelled;
}
}
}