blob: 2afaa73bcc0bbaa6bb1eae7da353ac114adcbff3 [file] [log] [blame]
Calin Juravle8f0d92b2013-08-01 17:26:00 +01001/*
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/publicdomain/zero/1.0/
5 * Other contributors include Andrew Wright, Jeffrey Hayes,
6 * Pat Fisher, Mike Judd.
7 */
8
9package jsr166;
10
11import junit.framework.*;
12import java.util.concurrent.atomic.AtomicInteger;
13
14public class AtomicIntegerTest extends JSR166TestCase {
15
16 final int[] VALUES = {
17 Integer.MIN_VALUE, -1, 0, 1, 42, Integer.MAX_VALUE,
18 };
19
20 /**
21 * constructor initializes to given value
22 */
23 public void testConstructor() {
24 AtomicInteger ai = new AtomicInteger(1);
25 assertEquals(1, ai.get());
26 }
27
28 /**
29 * default constructed initializes to zero
30 */
31 public void testConstructor2() {
32 AtomicInteger ai = new AtomicInteger();
33 assertEquals(0, ai.get());
34 }
35
36 /**
37 * get returns the last value set
38 */
39 public void testGetSet() {
40 AtomicInteger ai = new AtomicInteger(1);
41 assertEquals(1, ai.get());
42 ai.set(2);
43 assertEquals(2, ai.get());
44 ai.set(-3);
45 assertEquals(-3, ai.get());
46 }
47
48 /**
49 * get returns the last value lazySet in same thread
50 */
51 public void testGetLazySet() {
52 AtomicInteger ai = new AtomicInteger(1);
53 assertEquals(1, ai.get());
54 ai.lazySet(2);
55 assertEquals(2, ai.get());
56 ai.lazySet(-3);
57 assertEquals(-3, ai.get());
58 }
59
60 /**
61 * compareAndSet succeeds in changing value if equal to expected else fails
62 */
63 public void testCompareAndSet() {
64 AtomicInteger ai = new AtomicInteger(1);
65 assertTrue(ai.compareAndSet(1, 2));
66 assertTrue(ai.compareAndSet(2, -4));
67 assertEquals(-4, ai.get());
68 assertFalse(ai.compareAndSet(-5, 7));
69 assertEquals(-4, ai.get());
70 assertTrue(ai.compareAndSet(-4, 7));
71 assertEquals(7, ai.get());
72 }
73
74 /**
75 * compareAndSet in one thread enables another waiting for value
76 * to succeed
77 */
78 public void testCompareAndSetInMultipleThreads() throws Exception {
79 final AtomicInteger ai = new AtomicInteger(1);
80 Thread t = new Thread(new CheckedRunnable() {
81 public void realRun() {
82 while (!ai.compareAndSet(2, 3))
83 Thread.yield();
84 }});
85
86 t.start();
87 assertTrue(ai.compareAndSet(1, 2));
88 t.join(LONG_DELAY_MS);
89 assertFalse(t.isAlive());
90 assertEquals(3, ai.get());
91 }
92
93 /**
94 * repeated weakCompareAndSet succeeds in changing value when equal
95 * to expected
96 */
97 public void testWeakCompareAndSet() {
98 AtomicInteger ai = new AtomicInteger(1);
99 while (!ai.weakCompareAndSet(1, 2));
100 while (!ai.weakCompareAndSet(2, -4));
101 assertEquals(-4, ai.get());
102 while (!ai.weakCompareAndSet(-4, 7));
103 assertEquals(7, ai.get());
104 }
105
106 /**
107 * getAndSet returns previous value and sets to given value
108 */
109 public void testGetAndSet() {
110 AtomicInteger ai = new AtomicInteger(1);
111 assertEquals(1, ai.getAndSet(0));
112 assertEquals(0, ai.getAndSet(-10));
113 assertEquals(-10, ai.getAndSet(1));
114 }
115
116 /**
117 * getAndAdd returns previous value and adds given value
118 */
119 public void testGetAndAdd() {
120 AtomicInteger ai = new AtomicInteger(1);
121 assertEquals(1, ai.getAndAdd(2));
122 assertEquals(3, ai.get());
123 assertEquals(3, ai.getAndAdd(-4));
124 assertEquals(-1, ai.get());
125 }
126
127 /**
128 * getAndDecrement returns previous value and decrements
129 */
130 public void testGetAndDecrement() {
131 AtomicInteger ai = new AtomicInteger(1);
132 assertEquals(1, ai.getAndDecrement());
133 assertEquals(0, ai.getAndDecrement());
134 assertEquals(-1, ai.getAndDecrement());
135 }
136
137 /**
138 * getAndIncrement returns previous value and increments
139 */
140 public void testGetAndIncrement() {
141 AtomicInteger ai = new AtomicInteger(1);
142 assertEquals(1, ai.getAndIncrement());
143 assertEquals(2, ai.get());
144 ai.set(-2);
145 assertEquals(-2, ai.getAndIncrement());
146 assertEquals(-1, ai.getAndIncrement());
147 assertEquals(0, ai.getAndIncrement());
148 assertEquals(1, ai.get());
149 }
150
151 /**
152 * addAndGet adds given value to current, and returns current value
153 */
154 public void testAddAndGet() {
155 AtomicInteger ai = new AtomicInteger(1);
156 assertEquals(3, ai.addAndGet(2));
157 assertEquals(3, ai.get());
158 assertEquals(-1, ai.addAndGet(-4));
159 assertEquals(-1, ai.get());
160 }
161
162 /**
163 * decrementAndGet decrements and returns current value
164 */
165 public void testDecrementAndGet() {
166 AtomicInteger ai = new AtomicInteger(1);
167 assertEquals(0, ai.decrementAndGet());
168 assertEquals(-1, ai.decrementAndGet());
169 assertEquals(-2, ai.decrementAndGet());
170 assertEquals(-2, ai.get());
171 }
172
173 /**
174 * incrementAndGet increments and returns current value
175 */
176 public void testIncrementAndGet() {
177 AtomicInteger ai = new AtomicInteger(1);
178 assertEquals(2, ai.incrementAndGet());
179 assertEquals(2, ai.get());
180 ai.set(-2);
181 assertEquals(-1, ai.incrementAndGet());
182 assertEquals(0, ai.incrementAndGet());
183 assertEquals(1, ai.incrementAndGet());
184 assertEquals(1, ai.get());
185 }
186
187 /**
188 * a deserialized serialized atomic holds same value
189 */
190 public void testSerialization() throws Exception {
191 AtomicInteger x = new AtomicInteger();
192 AtomicInteger y = serialClone(x);
193 assertNotSame(x, y);
194 x.set(22);
195 AtomicInteger z = serialClone(x);
196 assertEquals(22, x.get());
197 assertEquals(0, y.get());
198 assertEquals(22, z.get());
199 }
200
201 /**
202 * toString returns current value.
203 */
204 public void testToString() {
205 AtomicInteger ai = new AtomicInteger();
206 assertEquals("0", ai.toString());
207 for (int x : VALUES) {
208 ai.set(x);
209 assertEquals(Integer.toString(x), ai.toString());
210 }
211 }
212
213 /**
214 * intValue returns current value.
215 */
216 public void testIntValue() {
217 AtomicInteger ai = new AtomicInteger();
218 assertEquals(0, ai.intValue());
219 for (int x : VALUES) {
220 ai.set(x);
221 assertEquals(x, ai.intValue());
222 }
223 }
224
225 /**
226 * longValue returns current value.
227 */
228 public void testLongValue() {
229 AtomicInteger ai = new AtomicInteger();
230 assertEquals(0L, ai.longValue());
231 for (int x : VALUES) {
232 ai.set(x);
233 assertEquals((long)x, ai.longValue());
234 }
235 }
236
237 /**
238 * floatValue returns current value.
239 */
240 public void testFloatValue() {
241 AtomicInteger ai = new AtomicInteger();
242 assertEquals(0.0f, ai.floatValue());
243 for (int x : VALUES) {
244 ai.set(x);
245 assertEquals((float)x, ai.floatValue());
246 }
247 }
248
249 /**
250 * doubleValue returns current value.
251 */
252 public void testDoubleValue() {
253 AtomicInteger ai = new AtomicInteger();
254 assertEquals(0.0d, ai.doubleValue());
255 for (int x : VALUES) {
256 ai.set(x);
257 assertEquals((double)x, ai.doubleValue());
258 }
259 }
260
261}