package com.dhemery.publishing;
import org.junit.Test;
import java.lang.reflect.Method;
import java.util.Set;
import static org.hamcrest.MatcherAssert.assertThat;
import static org.hamcrest.Matchers.*;
public class ASubscriberInspector {
private final Object subscriberWithNoSubscriptions = new Object(){};
private final Object subscriberWithOneSubscription = new Object(){
@Subscribe
public void subscription(Object o) {}
};
private final Object subscriberWithMultipleSubscriptions = new Object(){
@Subscribe
public void subscription1(Object o) {}
@Subscribe
public void subscription2(Object o) {}
@Subscribe
public void subscription3(Object o) {}
@Subscribe
public void subscription4(Object o) {}
@Subscribe
public void subscription5(Object o) {}
@Subscribe
public void subscription6(Object o) {}
};
private final Object subscriberWithSubscriptionAndAnotherMethod = new Object(){
@Subscribe
public void subscription(Object o) {}
@SuppressWarnings("unused")
public void notASubscription(Object o) {}
};
private final SubscriberInspector subscriberInspector = new SubscriberInspector();
@Test
public void findsNoSubscriptionsMethodsIfSubscriberHasNoSubscription() {
Set<Method> subscriptions = subscriberInspector.subscriptionsOn(subscriberWithNoSubscriptions);
assertThat(subscriptions, is(empty()));
}
@Test
public void findsOneSubscriptionIfSubscriberHasOneSubscription() {
Set<Method> subscriptions = subscriberInspector.subscriptionsOn(subscriberWithOneSubscription);
Method method = subscriberWithOneSubscription.getClass().getDeclaredMethods()[0];
assertThat(subscriptions, hasItem(method));
}
@Test
public void findsAllSubscriptions() {
Set<Method> subscriptions = subscriberInspector.subscriptionsOn(subscriberWithMultipleSubscriptions);
Method[] allMethods = subscriberWithMultipleSubscriptions.getClass().getDeclaredMethods();
assertThat(subscriptions, containsInAnyOrder(allMethods));
}
@Test
public void findsOnlySubscriptions() throws NoSuchMethodException {
Set<Method> subscriptions = subscriberInspector.subscriptionsOn(subscriberWithSubscriptionAndAnotherMethod);
Method subscription = subscriberWithSubscriptionAndAnotherMethod.getClass().getDeclaredMethod("subscription", Object.class);
Method notASubscription = subscriberWithSubscriptionAndAnotherMethod.getClass().getDeclaredMethod("notASubscription", Object.class);
assertThat(subscriptions, hasItem(subscription));
assertThat(subscriptions, not(hasItem(notASubscription)));
}
}