2 * Written by Doug Lea with assistance from members of JCP JSR-166
3 * Expert Group and released to the public domain, as explained at
4 * http://creativecommons.org/licenses/publicdomain
5 * Other contributors include Andrew Wright, Jeffrey Hayes,
6 * Pat Fisher, Mike Judd.
9 package tests.api.java.util.concurrent; // android-added
11 import junit.framework.*;
12 import java.util.concurrent.atomic.*;
15 public class AtomicIntegerTest extends JSR166TestCase {
16 public static Test suite() {
17 return new TestSuite(AtomicIntegerTest.class);
20 final int[] VALUES = {
21 Integer.MIN_VALUE, -1, 0, 1, 42, Integer.MAX_VALUE,
25 * constructor initializes to given value
27 public void testConstructor() {
28 AtomicInteger ai = new AtomicInteger(1);
29 assertEquals(1,ai.get());
33 * default constructed initializes to zero
35 public void testConstructor2() {
36 AtomicInteger ai = new AtomicInteger();
37 assertEquals(0,ai.get());
41 * get returns the last value set
43 public void testGetSet() {
44 AtomicInteger ai = new AtomicInteger(1);
45 assertEquals(1,ai.get());
47 assertEquals(2,ai.get());
49 assertEquals(-3,ai.get());
53 * get returns the last value lazySet in same thread
55 public void testGetLazySet() {
56 AtomicInteger ai = new AtomicInteger(1);
57 assertEquals(1,ai.get());
59 assertEquals(2,ai.get());
61 assertEquals(-3,ai.get());
65 * compareAndSet succeeds in changing value if equal to expected else fails
67 public void testCompareAndSet() {
68 AtomicInteger ai = new AtomicInteger(1);
69 assertTrue(ai.compareAndSet(1,2));
70 assertTrue(ai.compareAndSet(2,-4));
71 assertEquals(-4,ai.get());
72 assertFalse(ai.compareAndSet(-5,7));
73 assertEquals(-4,ai.get());
74 assertTrue(ai.compareAndSet(-4,7));
75 assertEquals(7,ai.get());
79 * compareAndSet in one thread enables another waiting for value
82 public void testCompareAndSetInMultipleThreads() throws Exception {
83 final AtomicInteger ai = new AtomicInteger(1);
84 Thread t = new Thread(new CheckedRunnable() {
85 public void realRun() {
86 while (!ai.compareAndSet(2, 3))
91 assertTrue(ai.compareAndSet(1, 2));
92 t.join(LONG_DELAY_MS);
93 assertFalse(t.isAlive());
94 assertEquals(ai.get(), 3);
98 * repeated weakCompareAndSet succeeds in changing value when equal
101 public void testWeakCompareAndSet() {
102 AtomicInteger ai = new AtomicInteger(1);
103 while (!ai.weakCompareAndSet(1,2));
104 while (!ai.weakCompareAndSet(2,-4));
105 assertEquals(-4,ai.get());
106 while (!ai.weakCompareAndSet(-4,7));
107 assertEquals(7,ai.get());
111 * getAndSet returns previous value and sets to given value
113 public void testGetAndSet() {
114 AtomicInteger ai = new AtomicInteger(1);
115 assertEquals(1,ai.getAndSet(0));
116 assertEquals(0,ai.getAndSet(-10));
117 assertEquals(-10,ai.getAndSet(1));
121 * getAndAdd returns previous value and adds given value
123 public void testGetAndAdd() {
124 AtomicInteger ai = new AtomicInteger(1);
125 assertEquals(1,ai.getAndAdd(2));
126 assertEquals(3,ai.get());
127 assertEquals(3,ai.getAndAdd(-4));
128 assertEquals(-1,ai.get());
132 * getAndDecrement returns previous value and decrements
134 public void testGetAndDecrement() {
135 AtomicInteger ai = new AtomicInteger(1);
136 assertEquals(1,ai.getAndDecrement());
137 assertEquals(0,ai.getAndDecrement());
138 assertEquals(-1,ai.getAndDecrement());
142 * getAndIncrement returns previous value and increments
144 public void testGetAndIncrement() {
145 AtomicInteger ai = new AtomicInteger(1);
146 assertEquals(1,ai.getAndIncrement());
147 assertEquals(2,ai.get());
149 assertEquals(-2,ai.getAndIncrement());
150 assertEquals(-1,ai.getAndIncrement());
151 assertEquals(0,ai.getAndIncrement());
152 assertEquals(1,ai.get());
156 * addAndGet adds given value to current, and returns current value
158 public void testAddAndGet() {
159 AtomicInteger ai = new AtomicInteger(1);
160 assertEquals(3,ai.addAndGet(2));
161 assertEquals(3,ai.get());
162 assertEquals(-1,ai.addAndGet(-4));
163 assertEquals(-1,ai.get());
167 * decrementAndGet decrements and returns current value
169 public void testDecrementAndGet() {
170 AtomicInteger ai = new AtomicInteger(1);
171 assertEquals(0,ai.decrementAndGet());
172 assertEquals(-1,ai.decrementAndGet());
173 assertEquals(-2,ai.decrementAndGet());
174 assertEquals(-2,ai.get());
178 * incrementAndGet increments and returns current value
180 public void testIncrementAndGet() {
181 AtomicInteger ai = new AtomicInteger(1);
182 assertEquals(2,ai.incrementAndGet());
183 assertEquals(2,ai.get());
185 assertEquals(-1,ai.incrementAndGet());
186 assertEquals(0,ai.incrementAndGet());
187 assertEquals(1,ai.incrementAndGet());
188 assertEquals(1,ai.get());
192 * a deserialized serialized atomic holds same value
194 public void testSerialization() throws Exception {
195 AtomicInteger l = new AtomicInteger();
198 ByteArrayOutputStream bout = new ByteArrayOutputStream(10000);
199 ObjectOutputStream out = new ObjectOutputStream(new BufferedOutputStream(bout));
203 ByteArrayInputStream bin = new ByteArrayInputStream(bout.toByteArray());
204 ObjectInputStream in = new ObjectInputStream(new BufferedInputStream(bin));
205 AtomicInteger r = (AtomicInteger) in.readObject();
206 assertEquals(l.get(), r.get());
210 * toString returns current value.
212 public void testToString() {
213 AtomicInteger ai = new AtomicInteger();
214 assertEquals("0", ai.toString());
215 for (int x : VALUES) {
217 assertEquals(ai.toString(), Integer.toString(x));
222 * intValue returns current value.
224 public void testIntValue() {
225 AtomicInteger ai = new AtomicInteger();
226 assertEquals(0, ai.intValue());
227 for (int x : VALUES) {
229 assertEquals(x, ai.intValue());
234 * longValue returns current value.
236 public void testLongValue() {
237 AtomicInteger ai = new AtomicInteger();
238 assertEquals(0L, ai.longValue());
239 for (int x : VALUES) {
241 assertEquals((long)x, ai.longValue());
246 * floatValue returns current value.
248 public void testFloatValue() {
249 AtomicInteger ai = new AtomicInteger();
250 assertEquals(0.0f, ai.floatValue());
251 for (int x : VALUES) {
253 assertEquals((float)x, ai.floatValue());
258 * doubleValue returns current value.
260 public void testDoubleValue() {
261 AtomicInteger ai = new AtomicInteger();
262 assertEquals(0.0d, ai.doubleValue());
263 for (int x : VALUES) {
265 assertEquals((double)x, ai.doubleValue());