ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/jsr166/jsr166/src/test/tck/DoubleAccumulatorTest.java
Revision: 1.7
Committed: Sun Apr 23 03:14:10 2017 UTC (7 years ago) by jsr166
Branch: MAIN
Changes since 1.6: +37 -37 lines
Log Message:
rename ai -> acc

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 java.util.concurrent.Executors;
8 import java.util.concurrent.ExecutorService;
9 import java.util.concurrent.Phaser;
10 import java.util.concurrent.atomic.DoubleAccumulator;
11
12 import junit.framework.Test;
13 import junit.framework.TestSuite;
14
15 public class DoubleAccumulatorTest extends JSR166TestCase {
16 public static void main(String[] args) {
17 main(suite(), args);
18 }
19 public static Test suite() {
20 return new TestSuite(DoubleAccumulatorTest.class);
21 }
22
23 /**
24 * new instance initialized to supplied identity
25 */
26 public void testConstructor() {
27 for (double identity : new double[] {
28 Double.NEGATIVE_INFINITY,
29 Double.POSITIVE_INFINITY,
30 Double.MIN_VALUE,
31 Double.MAX_VALUE,
32 0.0,
33 })
34 assertEquals(identity,
35 new DoubleAccumulator(Double::max, identity).get());
36 }
37
38 /**
39 * accumulate accumulates given value to current, and get returns current value
40 */
41 public void testAccumulateAndGet() {
42 DoubleAccumulator acc = new DoubleAccumulator(Double::max, 0.0);
43 acc.accumulate(2.0);
44 assertEquals(2.0, acc.get());
45 acc.accumulate(-4.0);
46 assertEquals(2.0, acc.get());
47 acc.accumulate(4.0);
48 assertEquals(4.0, acc.get());
49 }
50
51 /**
52 * reset() causes subsequent get() to return zero
53 */
54 public void testReset() {
55 DoubleAccumulator acc = new DoubleAccumulator(Double::max, 0.0);
56 acc.accumulate(2.0);
57 assertEquals(2.0, acc.get());
58 acc.reset();
59 assertEquals(0.0, acc.get());
60 }
61
62 /**
63 * getThenReset() returns current value; subsequent get() returns zero
64 */
65 public void testGetThenReset() {
66 DoubleAccumulator acc = new DoubleAccumulator(Double::max, 0.0);
67 acc.accumulate(2.0);
68 assertEquals(2.0, acc.get());
69 assertEquals(2.0, acc.getThenReset());
70 assertEquals(0.0, acc.get());
71 }
72
73 /**
74 * toString returns current value.
75 */
76 public void testToString() {
77 DoubleAccumulator acc = new DoubleAccumulator(Double::max, 0.0);
78 assertEquals("0.0", acc.toString());
79 acc.accumulate(1.0);
80 assertEquals(Double.toString(1.0), acc.toString());
81 }
82
83 /**
84 * intValue returns current value.
85 */
86 public void testIntValue() {
87 DoubleAccumulator acc = new DoubleAccumulator(Double::max, 0.0);
88 assertEquals(0, acc.intValue());
89 acc.accumulate(1.0);
90 assertEquals(1, acc.intValue());
91 }
92
93 /**
94 * longValue returns current value.
95 */
96 public void testLongValue() {
97 DoubleAccumulator acc = new DoubleAccumulator(Double::max, 0.0);
98 assertEquals(0, acc.longValue());
99 acc.accumulate(1.0);
100 assertEquals(1, acc.longValue());
101 }
102
103 /**
104 * floatValue returns current value.
105 */
106 public void testFloatValue() {
107 DoubleAccumulator acc = new DoubleAccumulator(Double::max, 0.0);
108 assertEquals(0.0f, acc.floatValue());
109 acc.accumulate(1.0);
110 assertEquals(1.0f, acc.floatValue());
111 }
112
113 /**
114 * doubleValue returns current value.
115 */
116 public void testDoubleValue() {
117 DoubleAccumulator acc = new DoubleAccumulator(Double::max, 0.0);
118 assertEquals(0.0, acc.doubleValue());
119 acc.accumulate(1.0);
120 assertEquals(1.0, acc.doubleValue());
121 }
122
123 /**
124 * accumulates by multiple threads produce correct result
125 */
126 public void testAccumulateAndGetMT() {
127 final int incs = 1000000;
128 final int nthreads = 4;
129 final ExecutorService pool = Executors.newCachedThreadPool();
130 DoubleAccumulator a = new DoubleAccumulator(Double::max, 0.0);
131 Phaser phaser = new Phaser(nthreads + 1);
132 for (int i = 0; i < nthreads; ++i)
133 pool.execute(new AccTask(a, phaser, incs));
134 phaser.arriveAndAwaitAdvance();
135 phaser.arriveAndAwaitAdvance();
136 double expected = incs - 1;
137 double result = a.get();
138 assertEquals(expected, result);
139 pool.shutdown();
140 }
141
142 static final class AccTask implements Runnable {
143 final DoubleAccumulator acc;
144 final Phaser phaser;
145 final int incs;
146 volatile double result;
147 AccTask(DoubleAccumulator acc, Phaser phaser, int incs) {
148 this.acc = acc;
149 this.phaser = phaser;
150 this.incs = incs;
151 }
152
153 public void run() {
154 phaser.arriveAndAwaitAdvance();
155 DoubleAccumulator a = acc;
156 for (int i = 0; i < incs; ++i)
157 a.accumulate(i);
158 result = a.get();
159 phaser.arrive();
160 }
161 }
162
163 }