initial version of support project with build support.
[utils] / test / org / wamblee / observer / ObservableTest.java
diff --git a/test/org/wamblee/observer/ObservableTest.java b/test/org/wamblee/observer/ObservableTest.java
new file mode 100644 (file)
index 0000000..b2b7bdd
--- /dev/null
@@ -0,0 +1,107 @@
+/*
+ * 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 java.util.ArrayList;
+import java.util.List;
+
+import org.jmock.Mock;
+import org.jmock.cglib.MockObjectTestCase;
+
+/**
+ * Test of the observer pattern implementation. 
+ */
+public class ObservableTest extends MockObjectTestCase {
+    
+    private static final String UPDATE = "send";
+    
+
+    private Observable<ObservableTest, String> _observable; 
+  
+    /* (non-Javadoc)
+     * @see junit.framework.TestCase#setUp()
+     */
+    @Override
+    protected void setUp() throws Exception {
+        super.setUp();
+        
+        _observable = new Observable<ObservableTest, String>(this, new DefaultObserverNotifier());
+    }
+    
+    /**
+     * Tests subscription and notification of one subscriber.
+     */
+    public void testOneObserver() { 
+        Mock mockObserver = mock(Observer.class);
+        Observer<ObservableTest,String> observer = (Observer<ObservableTest,String>)mockObserver.proxy();        
+        long subscription = _observable.subscribe(observer);
+        
+        assertEquals(1, _observable.getObserverCount()); 
+        
+        String message = "hallo";
+        mockObserver.expects(once()).method(UPDATE).with(same(this), eq(message)); 
+       
+        _observable.send(message);
+        _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() { 
+        int nsubscribers = 100; 
+        Mock[] mocks = new Mock[nsubscribers];
+        List<Long> subscriptions = new ArrayList<Long>();
+        for (int i = 0; i < nsubscribers; i++) { 
+            Mock mockObserver = mock(Observer.class);
+            Observer<ObservableTest,String> observer = (Observer<ObservableTest,String>)mockObserver.proxy();        
+            long subscription = _observable.subscribe(observer);
+            
+            mocks[i] = mockObserver;
+            assertTrue( subscriptions.add(subscription));  
+        }
+        
+        assertEquals(nsubscribers, _observable.getObserverCount());
+       
+        String message = "hallo";
+        for (int i = 0; i < nsubscribers; i++) { 
+           mocks[i].expects(once()).method(UPDATE).with(same(this), eq(message));
+        }
+        
+        _observable.send(message);
+       
+        for (int i = nsubscribers/2; i < nsubscribers; i++) { 
+            _observable.unsubscribe(subscriptions.get(i));    
+        }
+        assertEquals(nsubscribers - ( nsubscribers - nsubscribers/2), _observable.getObserverCount());
+     
+        message = "blabla"; 
+        for (int i = 0; i < nsubscribers/2; i++) { 
+            mocks[i].expects(once()).method(UPDATE).with(same(this), eq(message));
+        }
+        _observable.send(message);
+    }
+
+}