/* * Copyright 2015 Rayco AraƱa * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.raycoarana.baindo.observables; import com.raycoarana.baindo.test.UnitTestSuite; import org.junit.Test; import org.mockito.Mock; import java.util.Observer; import static org.hamcrest.core.Is.is; import static org.junit.Assert.assertThat; import static org.mockito.Matchers.any; import static org.mockito.Matchers.eq; import static org.mockito.Mockito.never; import static org.mockito.Mockito.verify; public class ObservableTest extends UnitTestSuite { private static final int ZERO = 0; private static final int ONE = 1; @Mock private Observer mOtherObserver; @Mock private Observer mObserver; private Observable mObservable; private int mCountObservers; @Test public void shouldCountObservers() { givenAnObservable(); givenThatAnObserverIsAddedToTheObservable(); whenCountObservers(); thenOneObserverIsReturned(); } @Test public void shouldDeleteObservers() { givenAnObservable(); givenThatAnObserverIsAddedToTheObservable(); whenDeleteObservers(); thenZeroObserverIsReturned(); } @Test public void shouldDeleteAnObserver() { givenAnObservable(); givenThatAnObserverIsAddedToTheObservable(); givenThatOtherObserverIsAddedToTheProperty(); whenDeleteObserverOneObserverAndGetObserversCount(); thenOneObserverIsReturned(); } @Test public void shouldNotifyAllObserversIfChanged() { givenAnObservableThatHasChanged(); givenThatAnObserverIsAddedToTheObservable(); whenNotifyObservers(); thenObserverIsNotified(); } @Test public void shouldNoNotifyAnyObservers() { givenAnObservable(); givenThatAnObserverIsAddedToTheObservable(); whenNotifyObservers(); thenNoObserverIsNotified(); } @Test public void shouldNotifyAllObserversWithData() { givenAnObservableThatHasChanged(); givenThatAnObserverIsAddedToTheObservable(); whenNotifyObserversWithData(); thenObserverIsNotified(); } @Test(expected = NullPointerException.class) public void shouldNotLetAddANullObserver() { givenAnObservable(); givenThatANullObserverIsAddedToTheObservable(); } @Test public void shouldNotAddTwoTimesTheSameObserver() { givenAnObservable(); givenThatAnObserverIsAddedToTheObservable(); givenThatAnObserverIsAddedToTheObservable(); whenCountObservers(); thenOneObserverIsReturned(); } private void givenThatANullObserverIsAddedToTheObservable() { mObservable.addObserver(null); } private void givenAnObservableThatHasChanged() { mObservable = new Observable(){{ setChanged(); }}; } private void givenThatAnObserverIsAddedToTheObservable() { mObservable.addObserver(mObserver); } private void givenAnObservable() { mObservable = new Property<>(); } private void givenThatOtherObserverIsAddedToTheProperty() { mObservable.addObserver(mOtherObserver); } private void whenCountObservers() { mCountObservers = mObservable.countObservers(); } private void whenDeleteObservers() { mObservable.deleteObservers(); } private void whenDeleteObserverOneObserverAndGetObserversCount() { mObservable.deleteObserver(mObserver); mCountObservers = mObservable.countObservers(); } private void whenNotifyObservers() { mObservable.notifyObservers(); } private void whenNotifyObserversWithData() { mObservable.notifyObservers((Object) null); } private void thenZeroObserverIsReturned() { assertThat(mObservable.countObservers(), is(ZERO)); } private void thenOneObserverIsReturned() { assertThat(mCountObservers, is(ONE)); } private void thenObserverIsNotified() { verify(mObserver).update(eq(mObservable), any()); } private void thenNoObserverIsNotified() { verify(mObserver, never()).update(eq(mObservable), any()); } }