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 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