ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/jsr166/jsr166/src/test/tck/DoubleAdderTest.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: +1 -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.DoubleAdder;
10
11 public class DoubleAdderTest 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(DoubleAdderTest.class);
17 }
18
19 /**
20 * default constructed initializes to zero
21 */
22 public void testConstructor() {
23 DoubleAdder ai = new DoubleAdder();
24 assertEquals(0.0, ai.sum());
25 }
26
27 /**
28 * add adds given value to current, and sum returns current value
29 */
30 public void testAddAndSum() {
31 DoubleAdder ai = new DoubleAdder();
32 ai.add(2.0);
33 assertEquals(2.0, ai.sum());
34 ai.add(-4.0);
35 assertEquals(-2.0, ai.sum());
36 }
37
38 /**
39 * reset zeroes sum
40 */
41 public void testReset() {
42 DoubleAdder ai = new DoubleAdder();
43 ai.add(2.0);
44 assertEquals(2.0, ai.sum());
45 ai.reset();
46 assertEquals(0.0, ai.sum());
47 }
48
49 /**
50 * sumThenReset returns sum then zeros
51 */
52 public void testSumThenReset() {
53 DoubleAdder ai = new DoubleAdder();
54 ai.add(2.0);
55 assertEquals(2.0, ai.sum());
56 assertEquals(2.0, ai.sumThenReset());
57 assertEquals(0.0, ai.sum());
58 }
59
60 /**
61 * a deserialized serialized adder holds same value
62 */
63 public void testSerialization() throws Exception {
64 DoubleAdder x = new DoubleAdder();
65 DoubleAdder y = serialClone(x);
66 assertNotSame(x, y);
67 x.add(-22.0);
68 DoubleAdder z = serialClone(x);
69 assertEquals(-22.0, x.sum());
70 assertEquals(0.0, y.sum());
71 assertEquals(-22.0, z.sum());
72 }
73
74 /**
75 * toString returns current value.
76 */
77 public void testToString() {
78 DoubleAdder ai = new DoubleAdder();
79 assertEquals(Double.toString(0.0), ai.toString());
80 ai.add(1.0);
81 assertEquals(Double.toString(1.0), ai.toString());
82 }
83
84 /**
85 * intValue returns current value.
86 */
87 public void testIntValue() {
88 DoubleAdder ai = new DoubleAdder();
89 assertEquals(0, ai.intValue());
90 ai.add(1.0);
91 assertEquals(1, ai.intValue());
92 }
93
94 /**
95 * longValue returns current value.
96 */
97 public void testLongValue() {
98 DoubleAdder ai = new DoubleAdder();
99 assertEquals(0, ai.longValue());
100 ai.add(1.0);
101 assertEquals(1, ai.longValue());
102 }
103
104 /**
105 * floatValue returns current value.
106 */
107 public void testFloatValue() {
108 DoubleAdder ai = new DoubleAdder();
109 assertEquals(0.0f, ai.floatValue());
110 ai.add(1.0);
111 assertEquals(1.0f, ai.floatValue());
112 }
113
114 /**
115 * doubleValue returns current value.
116 */
117 public void testDoubleValue() {
118 DoubleAdder ai = new DoubleAdder();
119 assertEquals(0.0, ai.doubleValue());
120 ai.add(1.0);
121 assertEquals(1.0, ai.doubleValue());
122 }
123
124 /**
125 * adds by multiple threads produce correct sum
126 */
127 public void testAddAndSumMT() {
128 final int incs = 1000000;
129 final int nthreads = 4;
130 final ExecutorService pool = Executors.newCachedThreadPool();
131 DoubleAdder a = new DoubleAdder();
132 Phaser phaser = new Phaser(nthreads + 1);
133 for (int i = 0; i < nthreads; ++i)
134 pool.execute(new AdderTask(a, phaser, incs));
135 phaser.arriveAndAwaitAdvance();
136 phaser.arriveAndAwaitAdvance();
137 double total = (long)nthreads * incs;
138 double sum = a.sum();
139 assertEquals(sum, total);
140 pool.shutdown();
141 }
142
143 static final class AdderTask implements Runnable {
144 final DoubleAdder adder;
145 final Phaser phaser;
146 final int incs;
147 volatile double result;
148 AdderTask(DoubleAdder adder, Phaser phaser, int incs) {
149 this.adder = adder;
150 this.phaser = phaser;
151 this.incs = incs;
152 }
153
154 public void run() {
155 phaser.arriveAndAwaitAdvance();
156 DoubleAdder a = adder;
157 for (int i = 0; i < incs; ++i)
158 a.add(1.0);
159 result = a.sum();
160 phaser.arrive();
161 }
162 }
163
164 }