Fantom

 

//
// Copyright (c) 2010, Brian Frank and Andy Frank
// Licensed under the Academic Free License version 3.0
//
// History:
//   12 Feb 10  Brian Frank  Creation
//

**
** AtomicTest
**
@Js
class AtomicTest : Test
{

  Void testBool()
  {
    // constructors
    verifyEq(AtomicBool().val, false)
    verifyEq(AtomicBool(true).val, true)

    // val
    a := AtomicBool()
    verifyEq(a.val, false)
    a.val = true
    verifyEq(a.val, true)

    // getAndSet
    verifyEq(a.getAndSet(false), true)
    verifyEq(a.val, false)

    // compareAndSet
    verifyEq(a.compareAndSet(true, true), false)
    verifyEq(a.val, false)
    verifyEq(a.compareAndSet(false, true), true)
    verifyEq(a.val, true)

    // toStr
    verifyEq(AtomicBool(true).toStr, "true")
  }

  Void testInt()
  {
    // constructors
    verifyEq(AtomicInt().val, 0)
    verifyEq(AtomicInt(-55).val, -55)

    // val field
    a := AtomicInt()
    verifyEq(a.val, 0)
    a.val = 0xabcd_01234_ddee
    verifyEq(a.val, 0xabcd_01234_ddee)

    // getAndSet
    verifyEq(a.getAndSet(1972), 0xabcd_01234_ddee)
    verifyEq(a.val, 1972)

    // compareAndSet
    verifyEq(a.compareAndSet(1973, 3), false)
    verifyEq(a.val, 1972)
    verifyEq(a.compareAndSet(1972, 3), true)
    verifyEq(a.val, 3)

    // increment/decrement
    verifyEq(a.getAndIncrement, 3); verifyEq(a.val, 4)
    verifyEq(a.incrementAndGet, 5); verifyEq(a.val, 5)
    verifyEq(a.addAndGet(3),    8); verifyEq(a.val, 8)
    verifyEq(a.getAndAdd(-3),   8); verifyEq(a.val, 5)
    verifyEq(a.decrementAndGet, 4); verifyEq(a.val, 4)
    verifyEq(a.getAndDecrement, 4); verifyEq(a.val, 3)

    a.increment; verifyEq(a.val, 4)
    a.increment; verifyEq(a.val, 5)
    a.add(4);    verifyEq(a.val, 9)
    a.decrement; verifyEq(a.val, 8)

    // toStr
    verifyEq(AtomicInt(-1234).toStr, "-1234")
  }

  Void testRef()
  {
    // constructors
    verifyEq(AtomicRef().val, null)
    verifySame(AtomicRef("foo").val, "foo")
    verifyErr(NotImmutableErr#) { x := AtomicRef(this) }

    // val field
    a := AtomicRef("foo")
    verifySame(a.val, "foo")
    dt := DateTime.now
    a.val = dt
    verifySame(a.val, dt)
    a.val = null
    verifyEq(a.val, null)
    verifyErr(NotImmutableErr#) { a.val = Env.cur.out }
    verifyEq(a.val, null)

    // getAndSet
    verifyEq(a.getAndSet(dt), null)
    ver := Version("2.0")
    verifySame(a.getAndSet(ver), dt)
    verifySame(a.val, ver)
    verifyErr(NotImmutableErr#) { a.getAndSet(this) }
    verifySame(a.val, ver)

    // compareAndSet
    num := 99
    verifyEq(a.compareAndSet(num, num), false)
    verifySame(a.val, ver)
    verifyEq(a.compareAndSet(ver, num), true)
    verifySame(a.val, num)
    verifyEq(a.compareAndSet(null, null), false)
    verifyErr(NotImmutableErr#) { a.compareAndSet(num, this) }
    verifySame(a.val, num)
    verifyEq(a.compareAndSet(num, null), true)
    verifyEq(a.val, null)
    verifyEq(a.compareAndSet("x", "x"), false)
    verifyEq(a.val, null)
    verifyEq(a.compareAndSet(null, "x"), true)
    verifySame(a.val, "x")

    // toStr
    verifyEq(AtomicRef("foo").toStr, "foo")
  }

}