ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/jsr166/jsr166/src/test/tck/AtomicIntegerTest.java
Revision: 1.33
Committed: Tue Jan 26 13:33:05 2021 UTC (3 years, 3 months ago) by dl
Branch: MAIN
CVS Tags: HEAD
Changes since 1.32: +1 -0 lines
Log Message:
Replace Integer with Item class

File Contents

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