@SmallTest @Feature({"Android-AppBase"}) public void testRemoveWhileIteration() { ObserverList<Observer> observerList = new ObserverList<Observer>(); Foo a = new Foo(1); Foo b = new Foo(-1); Foo c = new Foo(1); Foo d = new Foo(-1); Foo e = new Foo(-1); FooRemover evil = new FooRemover(observerList, c); observerList.addObserver(a); observerList.addObserver(b); for (Observer obs : observerList) obs.observe(10); // Removing an observer not in the list should do nothing. observerList.removeObserver(e); observerList.addObserver(evil); observerList.addObserver(c); observerList.addObserver(d); for (Observer obs : observerList) obs.observe(10); // observe should be called twice on a. assertEquals(20, a.mTotal); // observe should be called twice on b. assertEquals(-20, b.mTotal); // evil removed c from the observerList before it got any callbacks. assertEquals(0, c.mTotal); // observe should be called once on d. assertEquals(-10, d.mTotal); // e was never added to the list, observe should not be called. assertEquals(0, e.mTotal); }
@SmallTest @Feature({"Android-AppBase"}) public void testAddWhileIteration() { ObserverList<Observer> observerList = new ObserverList<Observer>(); Foo a = new Foo(1); Foo b = new Foo(-1); Foo c = new Foo(1); FooAdder evil = new FooAdder(observerList, c); observerList.addObserver(evil); observerList.addObserver(a); observerList.addObserver(b); for (Observer obs : observerList) obs.observe(10); assertTrue(observerList.hasObserver(c)); assertEquals(10, a.mTotal); assertEquals(-10, b.mTotal); assertEquals(0, c.mTotal); }