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