Files
kotlin-fork/plugins/atomicfu/atomicfu-compiler/testData/box/atomics_basic/ArithmeticTest.kt
T
mvicsokolova 5c5367d377 [atomicfu-JVM] Preparation for commonization of JVM and K/N transformers
The following updates in the JVM/IR plugin were made:
* Lots of refactoring with preparation for K/N support: commonization of transformations.
* Improved error handling (checks for visibility constraints, appending message about usage constraints in case of an error).
* Explicit requirements for the visibility of atomic properties: to prevent leaking they should be private/internal or be members of private/internal classes.
* Fixed visibility of generated properties: volatile properties are always private and atomic updaters have the same visibility as the original atomic property.
* Volatile fields are generated from scratch and original atomic properties are removed.
* Delegated properties support is fixed (only declaration in the same scope is allowed).
* Non-inline atomic extensions are forbidden.
* For top-level atomics: only one wrapper class per file (with corresponding visibility) is generated.
* Bug fixes.

The corresponding tickets: 
https://github.com/Kotlin/kotlinx-atomicfu/issues/322
KT-60528



Merge-request: KT-MR-10579
Merged-by: Maria Sokolova <maria.sokolova@jetbrains.com>
2023-07-20 13:59:23 +00:00

131 lines
3.7 KiB
Kotlin
Vendored

import kotlinx.atomicfu.*
import kotlin.test.*
class IntArithmetic {
private val _x = atomic(0)
val x get() = _x.value
private val local = atomic(0)
private fun testGetValue() {
_x.value = 5
assertEquals(5, _x.value)
var aValue = _x.value
assertEquals(5, aValue)
assertEquals(5, x)
local.value = 555
aValue = local.value
assertEquals(aValue, local.value)
}
private fun testAtomicCallPlaces() {
_x.value = 5
_x.compareAndSet(5, 42)
val res = _x.compareAndSet(42, 45)
assertTrue(res)
assertTrue(_x.compareAndSet(45, 77))
assertFalse(_x.compareAndSet(95, 77))
assertTrue(_x.compareAndSet(77, 88))
}
private fun testInt() {
_x.value = 0
assertEquals(0, x)
val update = 3
assertEquals(0, _x.getAndSet(update))
assertTrue(_x.compareAndSet(update, 8))
_x.lazySet(1)
assertEquals(1, x)
assertEquals(1, _x.getAndSet(2))
assertEquals(2, x)
assertEquals(2, _x.getAndIncrement())
assertEquals(3, x)
assertEquals(3, _x.getAndDecrement())
assertEquals(2, x)
assertEquals(2, _x.getAndAdd(2))
assertEquals(4, x)
assertEquals(7, _x.addAndGet(3))
assertEquals(7, x)
assertEquals(8, _x.incrementAndGet())
assertEquals(8, x)
assertEquals(7, _x.decrementAndGet())
assertEquals(7, x)
assertTrue(_x.compareAndSet(7, 10))
}
fun test() {
testGetValue()
testAtomicCallPlaces()
testInt()
}
}
class LongArithmetic {
private val _x = atomic(4294967296)
val x get() = _x.value
private val y = atomic(5000000000)
private val z = atomic(2424920024888888848)
private val max = atomic(9223372036854775807)
fun testLong() {
assertEquals(2424920024888888848, z.value)
z.lazySet(8424920024888888848)
assertEquals(8424920024888888848, z.value)
assertEquals(8424920024888888848, z.getAndSet(8924920024888888848))
assertEquals(8924920024888888848, z.value)
assertEquals(8924920024888888849, z.incrementAndGet())
assertEquals(8924920024888888849, z.value)
assertEquals(8924920024888888849, z.getAndDecrement())
assertEquals(8924920024888888848, z.value)
assertEquals(8924920024888888848, z.getAndAdd(100000000000000000))
assertEquals(9024920024888888848, z.value)
assertEquals(-198452011965886959, z.addAndGet(-9223372036854775807))
assertEquals(-198452011965886959, z.value)
assertEquals(-198452011965886958, z.incrementAndGet())
assertEquals(-198452011965886958, z.value)
assertEquals(-198452011965886959, z.decrementAndGet())
assertEquals(-198452011965886959, z.value)
}
}
class BooleanArithmetic {
private val _x = atomic(false)
val x get() = _x.value
fun testBoolean() {
assertEquals(false, _x.value)
assertFalse(x)
_x.lazySet(true)
assertTrue(x)
assertTrue(_x.getAndSet(true))
assertTrue(_x.compareAndSet(true, false))
assertFalse(x)
}
}
class ReferenceArithmetic {
private val _x = atomic<String?>(null)
fun testReference() {
_x.value = "aaa"
assertEquals("aaa", _x.value)
_x.lazySet("bb")
assertEquals("bb", _x.value)
assertEquals("bb", _x.getAndSet("ccc"))
assertEquals("ccc", _x.value)
}
}
fun box(): String {
val intClass = IntArithmetic()
intClass.test()
val longClass = LongArithmetic()
longClass.testLong()
val booleanClass = BooleanArithmetic()
booleanClass.testBoolean()
val refClass = ReferenceArithmetic()
refClass.testReference()
return "OK"
}