package com.puremvc.core; import com.puremvc.patterns.mediator.Mediator; import com.puremvc.patterns.observer.BaseNotification; import com.puremvc.patterns.observer.BaseObserver; import com.puremvc.patterns.observer.Notification; import com.puremvc.patterns.observer.Observer; import org.junit.Before; import org.junit.Test; import org.mockito.Mock; import org.mockito.internal.util.reflection.Whitebox; import java.util.HashMap; import java.util.List; import static org.hamcrest.CoreMatchers.is; import static org.junit.Assert.assertThat; import static org.mockito.BDDMockito.given; import static org.mockito.Matchers.anyObject; import static org.mockito.Mockito.*; import static org.mockito.MockitoAnnotations.initMocks; public class CoreViewTest { private CoreView coreView; @Mock private BaseObserver observer; @Mock private Notification notification; @Mock private Mediator mediator; @Before public void setUp() throws Exception { initMocks(this); coreView = new CoreView(); given(mediator.getMediatorName()).willReturn("defaultMediatorName"); given(mediator.listNotificationInterests()).willReturn(new String[]{}); } @Test public void shouldRegisterObserverUnderGivenName() throws Exception { coreView.registerObserver("testCommand", observer); HashMap<String, List<Observer>> observerMap = getObserverMap(); assertThat(observerMap.size(), is(1)); assertThat(observerMap.get("testCommand").size(), is(1)); } @Test public void shouldAbleToRemoveObserver() throws Exception { given(observer.compareNotifyContext(anyObject())).willReturn(true); coreView.registerObserver("commandNeedRemove", observer); coreView.removeObserver("commandNeedRemove", notification); HashMap<String, List<Observer>> observerMap = getObserverMap(); assertThat(observerMap.size(), is(0)); } @Test public void shouldNotifyAllObservers() throws Exception { BaseObserver observer1 = mock(BaseObserver.class); BaseObserver observer2 = mock(BaseObserver.class); BaseObserver observer3 = mock(BaseObserver.class); coreView.registerObserver("givenNotify", observer1); coreView.registerObserver("givenNotify", observer2); coreView.registerObserver("differentNotify", observer3); BaseNotification notification = new BaseNotification("givenNotify"); coreView.notifyObservers(notification); verify(observer1).notifyObserver(notification); verify(observer2).notifyObserver(notification); verify(observer3, never()).notifyObserver(notification); } @Test public void shouldAbleToRegisterMediator() throws Exception { coreView.registerMediator(mediator); verify(mediator).onRegister(); } @Test public void shouldNotRegisterForSameNameMediator() throws Exception { coreView.registerMediator(mediator); coreView.registerMediator(mediator); verify(mediator, times(1)).onRegister(); } @Test public void shouldAbleToRemoveMediator() throws Exception { coreView.registerMediator(mediator); assertThat(getMediatorMap().size(), is(1)); coreView.removeMediator("defaultMediatorName"); assertThat(getMediatorMap().size(), is(0)); } private HashMap<String, List<Observer>> getObserverMap() { return (HashMap<String, List<Observer>>) Whitebox.getInternalState(coreView, "observerMap"); } private HashMap<String, Mediator> getMediatorMap() { return (HashMap<String, Mediator>) Whitebox.getInternalState(coreView, "mediatorMap"); } }