Home | History | Annotate | Download | only in util
      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