ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/jsr166/jsr166/src/test/tck/LongAdderTest.java
Revision: 1.3
Committed: Thu May 30 03:28:55 2013 UTC (10 years, 11 months ago) by jsr166
Branch: MAIN
Changes since 1.2: +2 -1 lines
Log Message:
prefer assertNotSame, assertNotNull to assertTrue

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 */
6
7 import junit.framework.*;
8 import java.util.concurrent.*;
9 import java.util.concurrent.atomic.LongAdder;
10
11 public class LongAdderTest extends JSR166TestCase {
12 public static void main(String[] args) {
13 junit.textui.TestRunner.run(suite());
14 }
15 public static Test suite() {
16 return new TestSuite(LongAdderTest.class);
17 }
18
19 /**
20 * default constructed initializes to zero
21 */
22 public void testConstructor() {
23 LongAdder ai = new LongAdder();
24 assertEquals(0, ai.sum());
25 }
26
27 /**
28 * add adds given value to current, and sum returns current value
29 */
30 public void testAddAndSum() {
31 LongAdder ai = new LongAdder();
32 ai.add(2);
33 assertEquals(2, ai.sum());
34 ai.add(-4);
35 assertEquals(-2, ai.sum());
36 }
37
38 /**
39 * decrement decrements and sum returns current value
40 */
41 public void testDecrementAndsum() {
42 LongAdder ai = new LongAdder();
43 ai.decrement();
44 assertEquals(-1, ai.sum());
45 ai.decrement();
46 assertEquals(-2, ai.sum());
47 }
48
49 /**
50 * incrementAndGet increments and returns current value
51 */
52 public void testIncrementAndsum() {
53 LongAdder ai = new LongAdder();
54 ai.increment();
55 assertEquals(1, ai.sum());
56 ai.increment();
57 assertEquals(2, ai.sum());
58 }
59
60 /**
61 * reset zeroes sum
62 */
63 public void testReset() {
64 LongAdder ai = new LongAdder();
65 ai.add(2);
66 assertEquals(2, ai.sum());
67 ai.reset();
68 assertEquals(0, ai.sum());
69 }
70
71 /**
72 * sumThenReset returns sum then zeros
73 */
74 public void testSumThenReset() {
75 LongAdder ai = new LongAdder();
76 ai.add(2);
77 assertEquals(2, ai.sum());
78 assertEquals(2, ai.sumThenReset());
79 assertEquals(0, ai.sum());
80 }
81
82 /**
83 * a deserialized serialized adder holds same value
84 */
85 public void testSerialization() throws Exception {
86 LongAdder x = new LongAdder();
87 LongAdder y = serialClone(x);
88 assertNotSame(x, y);
89 x.add(-22);
90 LongAdder z = serialClone(x);
91 assertNotSame(y, z);
92 assertEquals(-22, x.sum());
93 assertEquals(0, y.sum());
94 assertEquals(-22, z.sum());
95 }
96
97 /**
98 * toString returns current value.
99 */
100 public void testToString() {
101 LongAdder ai = new LongAdder();
102 assertEquals("0", ai.toString());
103 ai.increment();
104 assertEquals(Long.toString(1), ai.toString());
105 }
106
107 /**
108 * intValue returns current value.
109 */
110 public void testIntValue() {
111 LongAdder ai = new LongAdder();
112 assertEquals(0, ai.intValue());
113 ai.increment();
114 assertEquals(1, ai.intValue());
115 }
116
117 /**
118 * longValue returns current value.
119 */
120 public void testLongValue() {
121 LongAdder ai = new LongAdder();
122 assertEquals(0, ai.longValue());
123 ai.increment();
124 assertEquals(1, ai.longValue());
125 }
126
127 /**
128 * floatValue returns current value.
129 */
130 public void testFloatValue() {
131 LongAdder ai = new LongAdder();
132 assertEquals(0.0f, ai.floatValue());
133 ai.increment();
134 assertEquals(1.0f, ai.floatValue());
135 }
136
137 /**
138 * doubleValue returns current value.
139 */
140 public void testDoubleValue() {
141 LongAdder ai = new LongAdder();
142 assertEquals(0.0, ai.doubleValue());
143 ai.increment();
144 assertEquals(1.0, ai.doubleValue());
145 }
146
147 /**
148 * adds by multiple threads produce correct sum
149 */
150 public void testAddAndSumMT() {
151 final int incs = 1000000;
152 final int nthreads = 4;
153 final ExecutorService pool = Executors.newCachedThreadPool();
154 LongAdder a = new LongAdder();
155 Phaser phaser = new Phaser(nthreads + 1);
156 for (int i = 0; i < nthreads; ++i)
157 pool.execute(new AdderTask(a, phaser, incs));
158 phaser.arriveAndAwaitAdvance();
159 phaser.arriveAndAwaitAdvance();
160 long total = (long)nthreads * incs;
161 long sum = a.sum();
162 assertEquals(sum, total);
163 pool.shutdown();
164 }
165
166 static final class AdderTask implements Runnable {
167 final LongAdder adder;
168 final Phaser phaser;
169 final int incs;
170 volatile long result;
171 AdderTask(LongAdder adder, Phaser phaser, int incs) {
172 this.adder = adder;
173 this.phaser = phaser;
174 this.incs = incs;
175 }
176
177 public void run() {
178 phaser.arriveAndAwaitAdvance();
179 LongAdder a = adder;
180 for (int i = 0; i < incs; ++i)
181 a.add(1L);
182 result = a.sum();
183 phaser.arrive();
184 }
185 }
186
187 }