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 org.apache.harmony.luni.tests.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 71 Observer observer; 72 73 TestObservable observable; 74 75 /** 76 * @tests java.util.Observable#Observable() 77 */ 78 public void test_Constructor() { 79 // Test for method java.util.Observable() 80 Observable ov = new Observable(); 81 assertTrue("Wrong initial values.", !ov.hasChanged()); 82 assertEquals("Wrong initial values.", 0, ov.countObservers()); 83 } 84 85 /** 86 * @tests java.util.Observable#addObserver(java.util.Observer) 87 */ 88 public void test_addObserverLjava_util_Observer() { 89 // Test for method void 90 // java.util.Observable.addObserver(java.util.Observer) 91 TestObserver test = new TestObserver(); 92 observable.addObserver(test); 93 assertEquals("Failed to add observer", 1, observable.countObservers()); 94 observable.addObserver(test); 95 assertEquals("Duplicate observer", 1, observable.countObservers()); 96 97 Observable o = new Observable(); 98 try { 99 o.addObserver(null); 100 fail("Expected adding a null observer to throw a NPE."); 101 } catch (NullPointerException ex) { 102 // expected; 103 } 104 } 105 106 /** 107 * @tests java.util.Observable#countObservers() 108 */ 109 public void test_countObservers() { 110 // Test for method int java.util.Observable.countObservers() 111 assertEquals("New observable had > 0 observers", 0, observable 112 .countObservers()); 113 observable.addObserver(new TestObserver()); 114 assertEquals("Observable with observer returned other than 1", 1, observable 115 .countObservers()); 116 } 117 118 /** 119 * @tests java.util.Observable#deleteObserver(java.util.Observer) 120 */ 121 public void test_deleteObserverLjava_util_Observer() { 122 // Test for method void 123 // java.util.Observable.deleteObserver(java.util.Observer) 124 observable.addObserver(observer = new TestObserver()); 125 observable.deleteObserver(observer); 126 assertEquals("Failed to delete observer", 127 0, observable.countObservers()); 128 129 } 130 131 /** 132 * @tests java.util.Observable#deleteObservers() 133 */ 134 public void test_deleteObservers() { 135 // Test for method void java.util.Observable.deleteObservers() 136 observable.addObserver(new TestObserver()); 137 observable.addObserver(new TestObserver()); 138 observable.addObserver(new TestObserver()); 139 observable.addObserver(new TestObserver()); 140 observable.addObserver(new TestObserver()); 141 observable.addObserver(new TestObserver()); 142 observable.addObserver(new TestObserver()); 143 observable.addObserver(new TestObserver()); 144 observable.deleteObservers(); 145 assertEquals("Failed to delete observers", 146 0, observable.countObservers()); 147 } 148 149 /** 150 * @tests java.util.Observable#hasChanged() 151 */ 152 public void test_hasChanged() { 153 // TODO : Implement test 154 } 155 156 /** 157 * @tests java.util.Observable#notifyObservers() 158 */ 159 public void test_notifyObservers() { 160 // Test for method void java.util.Observable.notifyObservers() 161 observable.addObserver(observer = new TestObserver()); 162 observable.notifyObservers(); 163 assertEquals("Notified when unchnaged", 0, ((TestObserver) observer) 164 .updateCount()); 165 ((TestObservable) observable).doChange(); 166 observable.notifyObservers(); 167 assertEquals("Failed to notify", 168 1, ((TestObserver) observer).updateCount()); 169 170 DeleteTestObserver observer1, observer2; 171 observable.deleteObservers(); 172 observable.addObserver(observer1 = new DeleteTestObserver(false)); 173 observable.addObserver(observer2 = new DeleteTestObserver(false)); 174 observable.doChange(); 175 observable.notifyObservers(); 176 assertTrue("Failed to notify all", observer1.updateCount() == 1 177 && observer2.updateCount() == 1); 178 assertEquals("Failed to delete all", 0, observable.countObservers()); 179 180 observable.addObserver(observer1 = new DeleteTestObserver(false)); 181 observable.addObserver(observer2 = new DeleteTestObserver(false)); 182 observable.doChange(); 183 observable.notifyObservers(); 184 assertTrue("Failed to notify all 2", observer1.updateCount() == 1 185 && observer2.updateCount() == 1); 186 assertEquals("Failed to delete all 2", 0, observable.countObservers()); 187 } 188 189 /** 190 * @tests java.util.Observable#notifyObservers(java.lang.Object) 191 */ 192 public void test_notifyObserversLjava_lang_Object() { 193 // Test for method void 194 // java.util.Observable.notifyObservers(java.lang.Object) 195 Object obj; 196 observable.addObserver(observer = new TestObserver()); 197 observable.notifyObservers(); 198 assertEquals("Notified when unchanged", 0, ((TestObserver) observer) 199 .updateCount()); 200 ((TestObservable) observable).doChange(); 201 observable.notifyObservers(obj = new Object()); 202 assertEquals("Failed to notify", 203 1, ((TestObserver) observer).updateCount()); 204 assertTrue("Failed to pass Object arg", ((TestObserver) observer).objv 205 .elementAt(0).equals(obj)); 206 } 207 208 /** 209 * Sets up the fixture, for example, open a network connection. This method 210 * is called before a test is executed. 211 */ 212 protected void setUp() { 213 observable = new TestObservable(); 214 } 215 216 /** 217 * Tears down the fixture, for example, close a network connection. This 218 * method is called after a test is executed. 219 */ 220 protected void tearDown() { 221 } 222 } 223