package pl.baczkowicz.spy.eventbus;
import java.util.function.Consumer;
import junit.framework.TestCase;
import org.junit.Test;
import pl.baczkowicz.spy.eventbus.sample.SampleCountChangeEvent;
import pl.baczkowicz.spy.eventbus.sample.SampleInfoChangeEvent;
import pl.baczkowicz.spy.eventbus.sample.SampleSubscriber;
public class KBusTest extends TestCase
{
@Test
public void testSpyBus()
{
final IKBus eventBus = new KBus();
// Subscription and removal of subscriptions or consumers could be also done in the subscriber class - see commented out code
final SampleSubscriber subscriber = new SampleSubscriber();
eventBus.subscribe(subscriber, (Consumer<SampleCountChangeEvent>) subscriber::onCountChange, SampleCountChangeEvent.class);
eventBus.subscribe(subscriber, (Consumer<Object>) subscriber::onAnyEvent, Object.class);
// Expecting that to be handled twice
eventBus.publish(new SampleCountChangeEvent("hello", 1));
// Expecting that to be handled twice
eventBus.publish(new SampleCountChangeEvent("hello", 5));
// Only one subscriber configured
eventBus.publish(new SampleInfoChangeEvent("hello", 8));
assertEquals(5, subscriber.getMessageCount());
eventBus.unsubscribeConsumer(subscriber, SampleCountChangeEvent.class);
// Only one subscriber remaining
eventBus.publish(new SampleCountChangeEvent("hello", 21));
assertEquals(6, subscriber.getMessageCount());
// Only one subscriber configured
eventBus.publish(new SampleInfoChangeEvent("hello", 25));
assertEquals(7, subscriber.getMessageCount());
// After this, no events should be handled
eventBus.unsubscribe(subscriber);
eventBus.publish(new SampleCountChangeEvent("hello", 31));
eventBus.publish(new SampleInfoChangeEvent("hello", 32));
assertEquals(7, subscriber.getMessageCount());
}
@Test
public void testFilter()
{
final IKBus eventBus = new KBus();
// Subscription and removal of subscriptions or consumers could be also done in the subscriber class - see commented out code
final SampleSubscriber subscriber = new SampleSubscriber();
// Subscription with filter value - no need for cast because onAnyEvents excepts Object type
eventBus.subscribeWithFilterOnly(subscriber, subscriber::onAnyEvent, FilterableEvent.class, "keepMe");
// Only one subscriber configured - has the right filter content
final SampleInfoChangeEvent filteredEvent = new SampleInfoChangeEvent("hello", 41);
filteredEvent.setFilter("keepMe");
eventBus.publish(filteredEvent);
assertEquals(1, subscriber.getMessageCount());
// Only one subscriber configured - but should be filtered out, no "keepMe" in there...
eventBus.publish(new SampleInfoChangeEvent("hello", 42));
eventBus.publish(new Integer(42));
eventBus.publish("hello");
assertEquals(1, subscriber.getMessageCount());
}
// @Test
// public void testInvalidType()
// {
// final IKBus eventBus = new KBus();
//
// // Subscription and removal of subscriptions or consumers could be also done in the subscriber class - see commented out code
// final SampleSubscriber subscriber = new SampleSubscriber();
//
// eventBus.subscribe(subscriber, (Consumer<SampleCountChangeEvent>) subscriber::onCountChange, Object.class);
//
// // Valid
// eventBus.publish(new SampleCountChangeEvent("hello", 42));
//
// // Invalid
// eventBus.publish(new Integer(42));
// eventBus.publish("hello");
//
// assertEquals(1, subscriber.getMessageCount());
// }
}