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