/* * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses this file to You 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.apache.harmony.tests.java.util; import java.util.Observable; import java.util.Observer; import java.util.Vector; public class ObservableTest extends junit.framework.TestCase { static class TestObserver implements Observer { public Vector objv = new Vector(); int updateCount = 0; public void update(Observable observed, Object arg) { ++updateCount; objv.add(arg); } public int updateCount() { return updateCount; } } static class DeleteTestObserver implements Observer { int updateCount = 0; boolean deleteAll = false; public DeleteTestObserver(boolean all) { deleteAll = all; } public void update(Observable observed, Object arg) { ++updateCount; if (deleteAll) observed.deleteObservers(); else observed.deleteObserver(this); } public int updateCount() { return updateCount; } } static class TestObservable extends Observable { public void doChange() { setChanged(); } public void clearChange() { clearChanged(); } } Observer observer; TestObservable observable; /** * java.util.Observable#Observable() */ public void test_Constructor() { // Test for method java.util.Observable() try { Observable ov = new Observable(); assertTrue("Wrong initial values.", !ov.hasChanged()); assertEquals("Wrong initial values.", 0, ov.countObservers()); } catch (Exception e) { fail("Exception during test : " + e.getMessage()); } } /** * java.util.Observable#addObserver(java.util.Observer) */ public void test_addObserverLjava_util_Observer() { // Test for method void // java.util.Observable.addObserver(java.util.Observer) TestObserver test = new TestObserver(); observable.addObserver(test); assertEquals("Failed to add observer", 1, observable.countObservers()); observable.addObserver(test); assertEquals("Duplicate observer", 1, observable.countObservers()); Observable o = new Observable(); try { o.addObserver(null); fail("Expected adding a null observer to throw a NPE."); } catch (NullPointerException ex) { // expected; } catch (Throwable ex) { fail("Did not expect adding a new observer to throw a " + ex.getClass().getName()); } } /** * java.util.Observable#countObservers() */ public void test_countObservers() { // Test for method int java.util.Observable.countObservers() assertEquals("New observable had > 0 observers", 0, observable .countObservers()); observable.addObserver(new TestObserver()); assertEquals("Observable with observer returned other than 1", 1, observable .countObservers()); } /** * java.util.Observable#deleteObserver(java.util.Observer) */ public void test_deleteObserverLjava_util_Observer() { // Test for method void // java.util.Observable.deleteObserver(java.util.Observer) observable.addObserver(observer = new TestObserver()); observable.deleteObserver(observer); assertEquals("Failed to delete observer", 0, observable.countObservers()); observable.deleteObserver(observer); observable.deleteObserver(null); } /** * java.util.Observable#deleteObservers() */ public void test_deleteObservers() { // Test for method void java.util.Observable.deleteObservers() observable.addObserver(new TestObserver()); observable.addObserver(new TestObserver()); observable.addObserver(new TestObserver()); observable.addObserver(new TestObserver()); observable.addObserver(new TestObserver()); observable.addObserver(new TestObserver()); observable.addObserver(new TestObserver()); observable.addObserver(new TestObserver()); observable.deleteObservers(); assertEquals("Failed to delete observers", 0, observable.countObservers()); } /** * java.util.Observable#hasChanged() */ public void test_hasChanged() { assertFalse(observable.hasChanged()); observable.addObserver(observer = new TestObserver()); observable.doChange(); assertTrue(observable.hasChanged()); } public void test_clearChanged() { assertFalse(observable.hasChanged()); observable.addObserver(observer = new TestObserver()); observable.doChange(); assertTrue(observable.hasChanged()); observable.clearChange(); assertFalse(observable.hasChanged()); } /** * java.util.Observable#notifyObservers() */ public void test_notifyObservers() { // Test for method void java.util.Observable.notifyObservers() observable.addObserver(observer = new TestObserver()); observable.notifyObservers(); assertEquals("Notified when unchnaged", 0, ((TestObserver) observer) .updateCount()); ((TestObservable) observable).doChange(); observable.notifyObservers(); assertEquals("Failed to notify", 1, ((TestObserver) observer).updateCount()); DeleteTestObserver observer1, observer2; observable.deleteObservers(); observable.addObserver(observer1 = new DeleteTestObserver(false)); observable.addObserver(observer2 = new DeleteTestObserver(false)); observable.doChange(); observable.notifyObservers(); assertTrue("Failed to notify all", observer1.updateCount() == 1 && observer2.updateCount() == 1); assertEquals("Failed to delete all", 0, observable.countObservers()); observable.addObserver(observer1 = new DeleteTestObserver(false)); observable.addObserver(observer2 = new DeleteTestObserver(false)); observable.doChange(); observable.notifyObservers(); assertTrue("Failed to notify all 2", observer1.updateCount() == 1 && observer2.updateCount() == 1); assertEquals("Failed to delete all 2", 0, observable.countObservers()); } /** * java.util.Observable#notifyObservers(java.lang.Object) */ public void test_notifyObserversLjava_lang_Object() { // Test for method void // java.util.Observable.notifyObservers(java.lang.Object) Object obj; observable.addObserver(observer = new TestObserver()); observable.notifyObservers(); assertEquals("Notified when unchanged", 0, ((TestObserver) observer) .updateCount()); ((TestObservable) observable).doChange(); observable.notifyObservers(obj = new Object()); assertEquals("Failed to notify", 1, ((TestObserver) observer).updateCount()); assertTrue("Failed to pass Object arg", ((TestObserver) observer).objv .elementAt(0).equals(obj)); } /** * Sets up the fixture, for example, open a network connection. This method * is called before a test is executed. */ protected void setUp() { observable = new TestObservable(); } /** * Tears down the fixture, for example, close a network connection. This * method is called after a test is executed. */ protected void tearDown() { } }