ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/jsr166/jsr166/src/test/tck/LongAccumulatorTest.java
Revision: 1.5
Committed: Sat Apr 25 04:55:31 2015 UTC (9 years ago) by jsr166
Branch: MAIN
Changes since 1.4: +1 -1 lines
Log Message:
improve main methods; respect system properties; actually fail if a test fails

File Contents

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