1 /* 2 * Licensed to the Apache Software Foundation (ASF) under one or more 3 * contributor license agreements. See the NOTICE file distributed with 4 * this work for additional information regarding copyright ownership. 5 * The ASF licenses this file to You under the Apache License, Version 2.0 6 * (the "License"); you may not use this file except in compliance with 7 * the License. You may obtain a copy of the License at 8 * 9 * http://www.apache.org/licenses/LICENSE-2.0 10 * 11 * Unless required by applicable law or agreed to in writing, software 12 * distributed under the License is distributed on an "AS IS" BASIS, 13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14 * See the License for the specific language governing permissions and 15 * limitations under the License. 16 */ 17 18 package tests.api.java.util; 19 20 import java.util.Observable; 21 import java.util.Observer; 22 import java.util.Vector; 23 24 public class ObservableTest extends junit.framework.TestCase { 25 26 static class TestObserver implements Observer { 27 public Vector objv = new Vector(); 28 29 int updateCount = 0; 30 31 public void update(Observable observed, Object arg) { 32 ++updateCount; 33 objv.add(arg); 34 } 35 36 public int updateCount() { 37 return updateCount; 38 } 39 40 } 41 42 static class DeleteTestObserver implements Observer { 43 int updateCount = 0; 44 45 boolean deleteAll = false; 46 47 public DeleteTestObserver(boolean all) { 48 deleteAll = all; 49 } 50 51 public void update(Observable observed, Object arg) { 52 ++updateCount; 53 if (deleteAll) 54 observed.deleteObservers(); 55 else 56 observed.deleteObserver(this); 57 } 58 59 public int updateCount() { 60 return updateCount; 61 } 62 63 } 64 65 static class TestObservable extends Observable { 66 public void doChange() { 67 setChanged(); 68 } 69 70 public void clearChange() { 71 clearChanged(); 72 } 73 } 74 75 Observer observer; 76 77 TestObservable observable; 78 79 /** 80 * java.util.Observable#Observable() 81 */ 82 public void test_Constructor() { 83 // Test for method java.util.Observable() 84 try { 85 Observable ov = new Observable(); 86 assertTrue("Wrong initial values.", !ov.hasChanged()); 87 assertEquals("Wrong initial values.", 0, ov.countObservers()); 88 } catch (Exception e) { 89 fail("Exception during test : " + e.getMessage()); 90 } 91 } 92 93 /** 94 * java.util.Observable#addObserver(java.util.Observer) 95 */ 96 public void test_addObserverLjava_util_Observer() { 97 // Test for method void 98 // java.util.Observable.addObserver(java.util.Observer) 99 TestObserver test = new TestObserver(); 100 observable.addObserver(test); 101 assertEquals("Failed to add observer", 1, observable.countObservers()); 102 observable.addObserver(test); 103 assertEquals("Duplicate observer", 1, observable.countObservers()); 104 105 Observable o = new Observable(); 106 try { 107 o.addObserver(null); 108 fail("Expected adding a null observer to throw a NPE."); 109 } catch (NullPointerException ex) { 110 // expected; 111 } catch (Throwable ex) { 112 fail("Did not expect adding a new observer to throw a " 113 + ex.getClass().getName()); 114 } 115 } 116 117 /** 118 * java.util.Observable#countObservers() 119 */ 120 public void test_countObservers() { 121 // Test for method int java.util.Observable.countObservers() 122 assertEquals("New observable had > 0 observers", 0, observable 123 .countObservers()); 124 observable.addObserver(new TestObserver()); 125 assertEquals("Observable with observer returned other than 1", 1, observable 126 .countObservers()); 127 } 128 129 /** 130 * java.util.Observable#deleteObserver(java.util.Observer) 131 */ 132 public void test_deleteObserverLjava_util_Observer() { 133 // Test for method void 134 // java.util.Observable.deleteObserver(java.util.Observer) 135 observable.addObserver(observer = new TestObserver()); 136 observable.deleteObserver(observer); 137 assertEquals("Failed to delete observer", 138 0, observable.countObservers()); 139 observable.deleteObserver(observer); 140 observable.deleteObserver(null); 141 } 142 143 /** 144 * java.util.Observable#deleteObservers() 145 */ 146 public void test_deleteObservers() { 147 // Test for method void java.util.Observable.deleteObservers() 148 observable.addObserver(new TestObserver()); 149 observable.addObserver(new TestObserver()); 150 observable.addObserver(new TestObserver()); 151 observable.addObserver(new TestObserver()); 152 observable.addObserver(new TestObserver()); 153 observable.addObserver(new TestObserver()); 154 observable.addObserver(new TestObserver()); 155 observable.addObserver(new TestObserver()); 156 observable.deleteObservers(); 157 assertEquals("Failed to delete observers", 158 0, observable.countObservers()); 159 } 160 161 /** 162 * java.util.Observable#hasChanged() 163 */ 164 public void test_hasChanged() { 165 assertFalse(observable.hasChanged()); 166 observable.addObserver(observer = new TestObserver()); 167 observable.doChange(); 168 assertTrue(observable.hasChanged()); 169 } 170 171 public void test_clearChanged() { 172 assertFalse(observable.hasChanged()); 173 observable.addObserver(observer = new TestObserver()); 174 observable.doChange(); 175 assertTrue(observable.hasChanged()); 176 observable.clearChange(); 177 assertFalse(observable.hasChanged()); 178 } 179 180 /** 181 * java.util.Observable#notifyObservers() 182 */ 183 public void test_notifyObservers() { 184 // Test for method void java.util.Observable.notifyObservers() 185 observable.addObserver(observer = new TestObserver()); 186 observable.notifyObservers(); 187 assertEquals("Notified when unchnaged", 0, ((TestObserver) observer) 188 .updateCount()); 189 ((TestObservable) observable).doChange(); 190 observable.notifyObservers(); 191 assertEquals("Failed to notify", 192 1, ((TestObserver) observer).updateCount()); 193 194 DeleteTestObserver observer1, observer2; 195 observable.deleteObservers(); 196 observable.addObserver(observer1 = new DeleteTestObserver(false)); 197 observable.addObserver(observer2 = new DeleteTestObserver(false)); 198 observable.doChange(); 199 observable.notifyObservers(); 200 assertTrue("Failed to notify all", observer1.updateCount() == 1 201 && observer2.updateCount() == 1); 202 assertEquals("Failed to delete all", 0, observable.countObservers()); 203 204 observable.addObserver(observer1 = new DeleteTestObserver(false)); 205 observable.addObserver(observer2 = new DeleteTestObserver(false)); 206 observable.doChange(); 207 observable.notifyObservers(); 208 assertTrue("Failed to notify all 2", observer1.updateCount() == 1 209 && observer2.updateCount() == 1); 210 assertEquals("Failed to delete all 2", 0, observable.countObservers()); 211 } 212 213 /** 214 * java.util.Observable#notifyObservers(java.lang.Object) 215 */ 216 public void test_notifyObserversLjava_lang_Object() { 217 // Test for method void 218 // java.util.Observable.notifyObservers(java.lang.Object) 219 Object obj; 220 observable.addObserver(observer = new TestObserver()); 221 observable.notifyObservers(); 222 assertEquals("Notified when unchanged", 0, ((TestObserver) observer) 223 .updateCount()); 224 ((TestObservable) observable).doChange(); 225 observable.notifyObservers(obj = new Object()); 226 assertEquals("Failed to notify", 227 1, ((TestObserver) observer).updateCount()); 228 assertTrue("Failed to pass Object arg", ((TestObserver) observer).objv 229 .elementAt(0).equals(obj)); 230 } 231 232 /** 233 * Sets up the fixture, for example, open a network connection. This method 234 * is called before a test is executed. 235 */ 236 protected void setUp() { 237 observable = new TestObservable(); 238 } 239 240 /** 241 * Tears down the fixture, for example, close a network connection. This 242 * method is called after a test is executed. 243 */ 244 protected void tearDown() { 245 } 246 } 247