X-Git-Url: http://wamblee.org/gitweb/?a=blobdiff_plain;f=support%2Fgeneral%2Fsrc%2Ftest%2Fjava%2Forg%2Fwamblee%2Fobserver%2FObservableTest.java;fp=support%2Fgeneral%2Fsrc%2Ftest%2Fjava%2Forg%2Fwamblee%2Fobserver%2FObservableTest.java;h=ff37ccb9bfeb1e72aea95826c5fcf473f86b5a4a;hb=32a62ca2c752e33a7873ac868a7a1f289caedcd4;hp=0000000000000000000000000000000000000000;hpb=d2bdf4e813c6a3964958c87b2ce56eaadf8a1f0a;p=utils diff --git a/support/general/src/test/java/org/wamblee/observer/ObservableTest.java b/support/general/src/test/java/org/wamblee/observer/ObservableTest.java new file mode 100644 index 00000000..ff37ccb9 --- /dev/null +++ b/support/general/src/test/java/org/wamblee/observer/ObservableTest.java @@ -0,0 +1,150 @@ +/* + * Copyright 2005 the original author or authors. + * + * 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 org.wamblee.observer; + +import static org.easymock.EasyMock.createControl; +import static org.easymock.EasyMock.createMock; +import static org.easymock.EasyMock.createStrictMock; +import static org.easymock.EasyMock.replay; +import static org.easymock.EasyMock.verify; + +import java.util.ArrayList; +import java.util.List; + +import junit.framework.TestCase; + +import org.easymock.IMocksControl; + +/** + * Test of the observer pattern implementation. + * + * @author Erik Brakkee + */ +public class ObservableTest extends TestCase { + + private static final int SUBSCRIBER_COUNT = 100; + + private static final String UPDATE = "send"; + + private Integer _observed; + private Observable _observable; + + /* + * (non-Javadoc) + * + * @see junit.framework.TestCase#setUp() + */ + @Override + protected void setUp() throws Exception { + super.setUp(); + _observed = new Integer(1); + _observable = new Observable(_observed, + new DefaultObserverNotifier()); + } + + /** + * Tests subscription and notification of one subscriber. + */ + public void testOneObserver() { + final Observer mockObserver = createStrictMock(Observer.class); + long subscription = _observable.subscribe(mockObserver); + + assertEquals(1, _observable.getObserverCount()); + + final String message = "hallo"; + mockObserver.send(_observed, message); + replay(mockObserver); + + _observable.send(message); + verify(mockObserver); + + _observable.unsubscribe(subscription); + assertEquals(0, _observable.getObserverCount()); + + _observable.send(message); + + } + + /** + * Subscribes many susbcribers and sends notifications to subscribers. + * Verifies that unique subscription number are returned. Also verifies that + * the correct subscribers are notfied. + */ + public void testManySubscribers() { + final int nsubscribers = SUBSCRIBER_COUNT; + final Observer[] mocks = new Observer[nsubscribers]; + + IMocksControl control = createControl(); + + List subscriptions = new ArrayList(); + for (int i = 0; i < nsubscribers; i++) { + mocks[i] = control.createMock("mock" + i, Observer.class); + long subscription = _observable.subscribe(mocks[i]); + assertTrue(subscriptions.add(subscription)); + } + + assertEquals(nsubscribers, _observable.getObserverCount()); + + final String message = "hallo"; + + for (int i = 0; i < nsubscribers; i++) { + mocks[i].send(_observed, message); + } + control.replay(); + + _observable.send(message); + control.verify(); + + for (int i = nsubscribers / 2; i < nsubscribers; i++) { + _observable.unsubscribe(subscriptions.get(i)); + } + assertEquals(nsubscribers - (nsubscribers - nsubscribers / 2), + _observable.getObserverCount()); + + control.reset(); + final String message2 = "blabla"; + + for (int i = 0; i < nsubscribers / 2; i++) { + mocks[i].send(_observed, message2); + } + control.replay(); + + _observable.send(message2); + control.verify(); + } + + /** + * Subscribes and then unsubscribes with a wrong id. Verifies that + * IllegalArgumentException is thrown. + * + */ + public void testUnsubscribeWithWrongSubscription() { + Observer observer = createMock(Observer.class); + replay(observer); + + long subscription = _observable.subscribe(observer); + + assertEquals(1, _observable.getObserverCount()); + + try { + _observable.unsubscribe(subscription + 1); + } catch (IllegalArgumentException e) { + return; // ok + } + fail(); + } +}