package com.dhemery.publishing;
import org.junit.Test;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;
import static org.hamcrest.MatcherAssert.assertThat;
import static org.hamcrest.Matchers.*;
public class ASubscriptionRegistry {
private class Publication1{}
private class Publication2{}
@Test
public void hasNoSubscriptionsForNonSubscriber() {
Object nonSubscriber = new Object();
assertThat(forSubscriber(nonSubscriber), is(empty()));
}
@Test
public void holdsSubscriptionsBySubscriber() {
Object subscriber = new Object();
Class<?> publication = Publication1.class;
subscribe(subscriber, publication);
assertThat(forSubscriber(subscriber), hasItem(publication));
}
@Test
public void distinguishesSubscriptionsBySubscriber() {
Object subscriber1 = new Object();
Object subscriber2 = new Object();
subscribe(subscriber1, Publication1.class);
subscribe(subscriber2, Publication2.class);
assertThat(forSubscriber(subscriber1), hasItem(Publication1.class));
assertThat(forSubscriber(subscriber2), hasItem(Publication2.class));
assertThat(forSubscriber(subscriber1), not(hasItem(Publication2.class)));
assertThat(forSubscriber(subscriber2), not(hasItem(Publication1.class)));
}
private Map<Object,Set<Class<?>>> subscriptions = new HashMap<Object, Set<Class<?>>>();
public void subscribe(Object subscriber, Class<?> publication) {
ensureSubscriber(subscriber);
subscriptions.get(subscriber).add(publication);
}
private void ensureSubscriber(Object subscriber) {
if(subscriptions.containsKey(subscriber)) return;
subscriptions.put(subscriber, new HashSet<Class<?>>());
}
public Set<Class<?>> forSubscriber(Object subscriber) {
ensureSubscriber(subscriber);
return subscriptions.get(subscriber);
}
}