Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(165)

Side by Side Diff: base/android/javatests/src/org/chromium/base/ObserverListTest.java

Issue 12378004: Android: Add a java version of ObserverList. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Addressed Tommy's comments. Created 7 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
(Empty)
1 // Copyright 2013 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 package org.chromium.base;
6
7 import android.test.InstrumentationTestCase;
8 import android.test.suitebuilder.annotation.SmallTest;
9
10 import org.chromium.base.test.util.Feature;
11
12 import java.lang.Iterable;
13 import java.util.Iterator;
14 import java.util.NoSuchElementException;
15
16 /**
17 * Tests for (@link ObserverList}.
18 */
19 public class ObserverListTest extends InstrumentationTestCase {
20 interface Observer {
21 void observe(int x);
22 }
23
24 private static class Foo implements Observer {
25 private final int mScalar;
26 private int mTotal = 0;
27
28 Foo(int scalar) {
29 mScalar = scalar;
30 }
31
32 @Override
33 public void observe(int x) {
34 mTotal += x * mScalar;
35 }
36 }
37
38 /**
39 * An observer which removes a given Observer object from the list when obse rve is called.
40 */
41 private static class FooRemover implements Observer {
42 private final ObserverList<Observer> mList;
43 private final Observer mDoomed;
44
45 FooRemover(ObserverList<Observer> list, Observer innocent) {
46 mList = list;
47 mDoomed = innocent;
48 }
49
50 @Override
51 public void observe(int x) {
52 mList.removeObserver(mDoomed);
53 }
54 }
55
56 private static <T> int getSizeOfIterable(Iterable<T> iterable) {
57 int num = 0;
58 for (T el : iterable)
59 num++;
60 return num;
61 }
62
63 @SmallTest
64 @Feature({"Android-AppBase"})
65 public void testRemoveWhileIteration() {
bulach 2013/02/28 12:39:12 it'd be nice to add a "testAddWhileIterating" and
nilesh 2013/02/28 19:35:36 Makes sense, add a test for addWhileIterating.
66 ObserverList<Observer> observerList = new ObserverList<Observer>();
67 Foo a, b, c, d, e;
bulach 2013/02/28 12:39:12 nit: I don't think this is strictly forbidden, but
nilesh 2013/02/28 19:35:36 Done.
68 a = new Foo(1);
69 b = new Foo(-1);
70 c = new Foo(1);
71 d = new Foo(-1);
72 e = new Foo(-1);
73 FooRemover evil = new FooRemover(observerList, c);
74
75 observerList.addObserver(a);
76 observerList.addObserver(b);
77
78 for (Observer obs : observerList)
79 obs.observe(10);
80
81 // Removing an observer not in the list should do nothing.
82 observerList.removeObserver(e);
83
84 observerList.addObserver(evil);
85 observerList.addObserver(c);
86 observerList.addObserver(d);
87
88 for (Observer obs : observerList)
89 obs.observe(10);
90
91 // observe should be called twice on a.
92 assertEquals(20, a.mTotal);
93 // observe should be called twice on b.
94 assertEquals(-20, b.mTotal);
95 // evil removed c from the observerList before it got any callbacks.
96 assertEquals(0, c.mTotal);
97 // observe should be called once on d.
98 assertEquals(-10, d.mTotal);
99 // e was never added to the list, observe should not be called.
100 assertEquals(0, e.mTotal);
101 }
102
103 @SmallTest
104 @Feature({"Android-AppBase"})
105 public void testIterator() {
106 ObserverList<Integer> observerList = new ObserverList<Integer>();
107 observerList.addObserver(5);
108 observerList.addObserver(10);
109 observerList.addObserver(15);
110 assertEquals(3, getSizeOfIterable(observerList));
111
112 observerList.removeObserver(10);
113 assertEquals(2, getSizeOfIterable(observerList));
114
115 Iterator<Integer> it = observerList.iterator();
116 assertTrue(it.hasNext());
117 assertTrue(5 == it.next());
118 assertTrue(it.hasNext());
119 assertTrue(15 == it.next());
120 assertFalse(it.hasNext());
121
122 boolean removeExceptionThrown = false;
123 try {
124 it.remove();
125 fail("Expecting UnsupportedOperationException to be thrown here.");
126 } catch (UnsupportedOperationException e) {
127 removeExceptionThrown = true;
128 }
129 assertTrue(removeExceptionThrown);
130 assertEquals(2, getSizeOfIterable(observerList));
131
132 boolean noElementExceptionThrown = false;
133 try {
134 it.next();
135 fail("Expecting NoSuchElementException to be thrown here.");
136 } catch (NoSuchElementException e) {
137 noElementExceptionThrown = true;
138 }
139 assertTrue(noElementExceptionThrown);
140 }
141 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698