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