11d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert/* 21d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * Written by Doug Lea and Martin Buchholz with assistance from 31d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * members of JCP JSR-166 Expert Group and released to the public 41d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * domain, as explained at 51d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * http://creativecommons.org/publicdomain/zero/1.0/ 61d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert */ 71d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 81d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert/* 91d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * Source: 101d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * http://gee.cs.oswego.edu/cgi-bin/viewcvs.cgi/jsr166/src/test/tck-jsr166e/AtomicDoubleTest.java?revision=1.8 111d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * (Modified to adapt to guava coding conventions) 121d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert */ 131d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 141d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertpackage com.google.common.util.concurrent; 151d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 161d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport junit.framework.*; 171d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 181d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert/** 191d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * Unit test for {@link AtomicDouble}. 201d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert */ 211d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertpublic class AtomicDoubleTest extends JSR166TestCase { 221d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 231d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert private static final double[] VALUES = { 241d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert Double.NEGATIVE_INFINITY, 251d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert -Double.MAX_VALUE, 261d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert (double) Long.MIN_VALUE, 271d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert (double) Integer.MIN_VALUE, 281d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert -Math.PI, 291d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert -1.0, 301d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert -Double.MIN_VALUE, 311d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert -0.0, 321d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert +0.0, 331d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert Double.MIN_VALUE, 341d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 1.0, 351d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert Math.PI, 361d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert (double) Integer.MAX_VALUE, 371d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert (double) Long.MAX_VALUE, 381d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert Double.MAX_VALUE, 391d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert Double.POSITIVE_INFINITY, 401d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert Double.NaN, 411d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert Float.MAX_VALUE, 421d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert }; 431d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 441d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert /** The notion of equality used by AtomicDouble */ 451d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert static boolean bitEquals(double x, double y) { 461d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return Double.doubleToRawLongBits(x) == Double.doubleToRawLongBits(y); 471d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 481d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 491d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert static void assertBitEquals(double x, double y) { 501d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertEquals(Double.doubleToRawLongBits(x), 511d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert Double.doubleToRawLongBits(y)); 521d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 531d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 541d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert /** 551d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * constructor initializes to given value 561d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert */ 571d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert public void testConstructor() { 581d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert for (double x : VALUES) { 591d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert AtomicDouble a = new AtomicDouble(x); 601d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertBitEquals(x, a.get()); 611d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 621d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 631d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 641d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert /** 651d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * default constructed initializes to zero 661d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert */ 671d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert public void testConstructor2() { 681d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert AtomicDouble a = new AtomicDouble(); 691d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertBitEquals(0.0, a.get()); 701d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 711d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 721d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert /** 731d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * get returns the last value set 741d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert */ 751d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert public void testGetSet() { 761d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert AtomicDouble at = new AtomicDouble(1.0); 771d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertBitEquals(1.0, at.get()); 781d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert for (double x : VALUES) { 791d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert at.set(x); 801d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertBitEquals(x, at.get()); 811d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 821d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 831d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 841d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert /** 851d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * get returns the last value lazySet in same thread 861d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert */ 871d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert public void testGetLazySet() { 881d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert AtomicDouble at = new AtomicDouble(1.0); 891d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertBitEquals(1.0, at.get()); 901d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert for (double x : VALUES) { 911d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert at.lazySet(x); 921d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertBitEquals(x, at.get()); 931d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 941d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 951d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 961d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert /** 971d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * compareAndSet succeeds in changing value if equal to expected else fails 981d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert */ 991d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert public void testCompareAndSet() { 1001d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert double prev = Math.E; 1011d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert double unused = Math.E + Math.PI; 1021d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert AtomicDouble at = new AtomicDouble(prev); 1031d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert for (double x : VALUES) { 1041d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertBitEquals(prev, at.get()); 1051d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertFalse(at.compareAndSet(unused, x)); 1061d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertBitEquals(prev, at.get()); 1071d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertTrue(at.compareAndSet(prev, x)); 1081d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertBitEquals(x, at.get()); 1091d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert prev = x; 1101d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 1111d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 1121d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 1131d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert /** 1141d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * compareAndSet in one thread enables another waiting for value 1151d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * to succeed 1161d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert */ 1171d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 1181d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert public void testCompareAndSetInMultipleThreads() throws Exception { 1191d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert final AtomicDouble at = new AtomicDouble(1.0); 1201d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert Thread t = newStartedThread(new CheckedRunnable() { 1211d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert public void realRun() { 1221d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert while (!at.compareAndSet(2.0, 3.0)) { 1231d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert Thread.yield(); 1241d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 1251d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert }}); 1261d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 1271d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertTrue(at.compareAndSet(1.0, 2.0)); 1281d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert awaitTermination(t); 1291d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertBitEquals(3.0, at.get()); 1301d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 1311d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 1321d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert /** 1331d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * repeated weakCompareAndSet succeeds in changing value when equal 1341d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * to expected 1351d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert */ 1361d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert public void testWeakCompareAndSet() { 1371d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert double prev = Math.E; 1381d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert double unused = Math.E + Math.PI; 1391d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert AtomicDouble at = new AtomicDouble(prev); 1401d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert for (double x : VALUES) { 1411d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertBitEquals(prev, at.get()); 1421d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertFalse(at.weakCompareAndSet(unused, x)); 1431d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertBitEquals(prev, at.get()); 1441d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert while (!at.weakCompareAndSet(prev, x)) { 1451d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert ; 1461d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 1471d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertBitEquals(x, at.get()); 1481d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert prev = x; 1491d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 1501d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 1511d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 1521d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert /** 1531d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * getAndSet returns previous value and sets to given value 1541d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert */ 1551d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert public void testGetAndSet() { 1561d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert double prev = Math.E; 1571d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert AtomicDouble at = new AtomicDouble(prev); 1581d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert for (double x : VALUES) { 1591d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertBitEquals(prev, at.getAndSet(x)); 1601d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert prev = x; 1611d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 1621d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 1631d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 1641d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert /** 1651d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * getAndAdd returns previous value and adds given value 1661d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert */ 1671d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert public void testGetAndAdd() { 1681d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert for (double x : VALUES) { 1691d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert for (double y : VALUES) { 1701d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert AtomicDouble a = new AtomicDouble(x); 1711d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert double z = a.getAndAdd(y); 1721d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertBitEquals(x, z); 1731d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertBitEquals(x + y, a.get()); 1741d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 1751d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 1761d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 1771d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 1781d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert /** 1791d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * addAndGet adds given value to current, and returns current value 1801d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert */ 1811d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert public void testAddAndGet() { 1821d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert for (double x : VALUES) { 1831d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert for (double y : VALUES) { 1841d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert AtomicDouble a = new AtomicDouble(x); 1851d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert double z = a.addAndGet(y); 1861d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertBitEquals(x + y, z); 1871d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertBitEquals(x + y, a.get()); 1881d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 1891d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 1901d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 1911d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 1921d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert /** 1931d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * a deserialized serialized atomic holds same value 1941d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert */ 1951d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert public void testSerialization() throws Exception { 1961d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert AtomicDouble a = new AtomicDouble(); 1971d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert AtomicDouble b = serialClone(a); 1981d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertTrue(a != b); 1991d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert a.set(-22.0); 2001d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert AtomicDouble c = serialClone(a); 2011d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertBitEquals(-22.0, a.get()); 2021d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertBitEquals(0.0, b.get()); 2031d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertBitEquals(-22.0, c.get()); 2041d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert for (double x : VALUES) { 2051d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert AtomicDouble d = new AtomicDouble(x); 2061d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertBitEquals(serialClone(d).get(), d.get()); 2071d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 2081d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 2091d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 2101d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert /** 2111d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * toString returns current value 2121d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert */ 2131d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert public void testToString() { 2141d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert AtomicDouble at = new AtomicDouble(); 2151d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertEquals("0.0", at.toString()); 2161d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert for (double x : VALUES) { 2171d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert at.set(x); 2181d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertEquals(Double.toString(x), at.toString()); 2191d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 2201d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 2211d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 2221d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert /** 2231d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * intValue returns current value. 2241d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert */ 2251d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert public void testIntValue() { 2261d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert AtomicDouble at = new AtomicDouble(); 2271d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertEquals(0, at.intValue()); 2281d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert for (double x : VALUES) { 2291d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert at.set(x); 2301d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertEquals((int) x, at.intValue()); 2311d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 2321d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 2331d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 2341d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert /** 2351d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * longValue returns current value. 2361d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert */ 2371d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert public void testLongValue() { 2381d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert AtomicDouble at = new AtomicDouble(); 2391d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertEquals(0L, at.longValue()); 2401d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert for (double x : VALUES) { 2411d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert at.set(x); 2421d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertEquals((long) x, at.longValue()); 2431d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 2441d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 2451d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 2461d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert /** 2471d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * floatValue returns current value. 2481d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert */ 2491d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert public void testFloatValue() { 2501d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert AtomicDouble at = new AtomicDouble(); 2511d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertEquals(0.0f, at.floatValue()); 2521d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert for (double x : VALUES) { 2531d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert at.set(x); 2541d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertEquals((float) x, at.floatValue()); 2551d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 2561d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 2571d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 2581d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert /** 2591d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * doubleValue returns current value. 2601d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert */ 2611d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert public void testDoubleValue() { 2621d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert AtomicDouble at = new AtomicDouble(); 2631d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertEquals(0.0d, at.doubleValue()); 2641d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert for (double x : VALUES) { 2651d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert at.set(x); 2661d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertBitEquals(x, at.doubleValue()); 2671d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 2681d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 2691d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 2701d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert /** 2711d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * compareAndSet treats +0.0 and -0.0 as distinct values 2721d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert */ 2731d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert public void testDistinctZeros() { 2741d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert AtomicDouble at = new AtomicDouble(+0.0); 2751d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertFalse(at.compareAndSet(-0.0, 7.0)); 2761d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertFalse(at.weakCompareAndSet(-0.0, 7.0)); 2771d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertBitEquals(+0.0, at.get()); 2781d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertTrue(at.compareAndSet(+0.0, -0.0)); 2791d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertBitEquals(-0.0, at.get()); 2801d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertFalse(at.compareAndSet(+0.0, 7.0)); 2811d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertFalse(at.weakCompareAndSet(+0.0, 7.0)); 2821d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertBitEquals(-0.0, at.get()); 2831d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 2841d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert} 285