[atomicfu-K/N] Tests for K/N atomicfu-compiler-plugin

* `nativeTest` task now allows to provide compiler plugins that may be enabled during test compilation
* test sets for JVM and K/N backends are equal

KT-60800 describes all the issues with native tests that were solved in this commit.

Co-authored-by: Dmitriy Dolovov <Dmitriy.Dolovov@jetbrains.com>

Merge-request: KT-MR-11401
Merged-by: Maria Sokolova <maria.sokolova@jetbrains.com>
This commit is contained in:
mvicsokolova
2023-08-16 09:41:29 +00:00
committed by Space Team
parent 8f03eb9314
commit 9ff0e0b046
38 changed files with 2644 additions and 33 deletions
@@ -0,0 +1,67 @@
import kotlinx.atomicfu.*
import kotlin.test.*
import kotlin.random.*
private object Provider {
private val port = atomic(Random.nextInt(20, 90) * 100)
fun next(): Int = port.incrementAndGet()
private val _l = atomic(2424920024888888848)
fun getL() = _l.incrementAndGet()
val _ref = atomic<String?>(null)
val _x = atomic(false)
val intArr = AtomicIntArray(10)
val longArr = AtomicLongArray(10)
val refArr = atomicArrayOfNulls<Any?>(5)
}
private object DelegatedProvider {
internal val _a = atomic(42)
var a: Int by _a
var vInt by atomic(77)
}
private fun testFieldInObject() {
val port = Provider.next()
assertEquals(port + 1, Provider.next())
assertEquals(2424920024888888849, Provider.getL())
Provider._ref.compareAndSet(null, "abc")
assertEquals("abc", Provider._ref.value)
assertFalse(Provider._x.value)
Provider.intArr[8].value = 454
assertEquals(455, Provider.intArr[8].incrementAndGet())
Provider.longArr[8].value = 4544096409680468
assertEquals(4544096409680470, Provider.longArr[8].addAndGet(2))
Provider.refArr[1].value = Provider._ref.value
assertEquals("abc", Provider.refArr[1].value)
}
private fun testDelegatedPropertiesInObject() {
assertEquals(42, DelegatedProvider.a)
DelegatedProvider._a.compareAndSet(42, 56)
assertEquals(56, DelegatedProvider.a)
DelegatedProvider.a = 77
DelegatedProvider._a.compareAndSet(77, 66)
assertEquals(66, DelegatedProvider._a.value)
assertEquals(66, DelegatedProvider.a)
assertEquals(77, DelegatedProvider.vInt)
DelegatedProvider.vInt = 55
assertEquals(110, DelegatedProvider.vInt * 2)
}
@Test
fun box() {
testFieldInObject()
testDelegatedPropertiesInObject()
}
@@ -0,0 +1,182 @@
import kotlinx.atomicfu.*
import kotlin.test.*
private val a = atomic(0)
private val b = atomic(2424920024888888848)
private val c = atomic(true)
private val abcNode = atomic(ANode(BNode(CNode(8))))
private val any = atomic<Any?>(null)
internal val a_internal = atomic(0)
internal val b_internal = atomic(2424920024888888848)
internal val c_internal = atomic(true)
internal val abcNode_internal = atomic(ANode(BNode(CNode(8))))
internal val any_internal = atomic<Any?>(null)
private val intArr = AtomicIntArray(3)
private val longArr = AtomicLongArray(5)
private val booleanArr = AtomicBooleanArray(4)
private val refArr = atomicArrayOfNulls<ANode<BNode<CNode>>>(5)
private val anyRefArr = atomicArrayOfNulls<Any>(10)
private val stringAtomicNullArr = atomicArrayOfNulls<String>(10)
class TopLevelPrimitiveTest {
fun testTopLevelInt() {
assertEquals(0, a.value)
assertEquals(0, a.getAndSet(3))
assertTrue(a.compareAndSet(3, 8))
a.lazySet(1)
assertEquals(1, a.value)
assertEquals(1, a.getAndSet(2))
assertEquals(2, a.value)
assertEquals(2, a.getAndIncrement())
assertEquals(3, a.value)
assertEquals(3, a.getAndDecrement())
assertEquals(2, a.value)
assertEquals(2, a.getAndAdd(2))
assertEquals(4, a.value)
assertEquals(7, a.addAndGet(3))
assertEquals(7, a.value)
assertEquals(8, a.incrementAndGet())
assertEquals(8, a.value)
assertEquals(7, a.decrementAndGet())
assertEquals(7, a.value)
assertTrue(a.compareAndSet(7, 10))
}
fun testTopLevelLong() {
assertEquals(2424920024888888848, b.value)
b.lazySet(8424920024888888848)
assertEquals(8424920024888888848, b.value)
assertEquals(8424920024888888848, b.getAndSet(8924920024888888848))
assertEquals(8924920024888888848, b.value)
assertEquals(8924920024888888849, b.incrementAndGet())
assertEquals(8924920024888888849, b.value)
assertEquals(8924920024888888849, b.getAndDecrement())
assertEquals(8924920024888888848, b.value)
assertEquals(8924920024888888848, b.getAndAdd(100000000000000000))
assertEquals(9024920024888888848, b.value)
assertEquals(-198452011965886959, b.addAndGet(-9223372036854775807))
assertEquals(-198452011965886959, b.value)
assertEquals(-198452011965886958, b.incrementAndGet())
assertEquals(-198452011965886958, b.value)
assertEquals(-198452011965886959, b.decrementAndGet())
assertEquals(-198452011965886959, b.value)
}
fun testTopLevelBoolean() {
assertTrue(c.value)
c.lazySet(false)
assertFalse(c.value)
assertTrue(!c.getAndSet(true))
assertTrue(c.compareAndSet(true, false))
assertFalse(c.value)
}
fun testTopLevelRef() {
assertEquals(8, abcNode.value.b.c.d)
val newNode = ANode(BNode(CNode(76)))
assertEquals(8, abcNode.getAndSet(newNode).b.c.d)
assertEquals(76, abcNode.value.b.c.d)
val l = IntArray(4){i -> i}
any.lazySet(l)
assertEquals(2, (any.value as IntArray)[2])
}
fun testTopLevelArrayOfNulls() {
assertEquals(null, stringAtomicNullArr[0].value)
assertTrue(stringAtomicNullArr[0].compareAndSet(null, "aa"))
stringAtomicNullArr[1].lazySet("aa")
assertTrue(stringAtomicNullArr[0].value == stringAtomicNullArr[1].value)
}
}
class TopLevelArrayTest {
fun testIntArray() {
assertTrue(intArr[0].compareAndSet(0, 3))
assertEquals(0, intArr[1].value)
intArr[0].lazySet(5)
assertEquals(5, intArr[0].value + intArr[1].value + intArr[2].value)
assertTrue(intArr[0].compareAndSet(5, 10))
assertEquals(10, intArr[0].getAndDecrement())
assertEquals(9, intArr[0].value)
intArr[2].value = 2
assertEquals(2, intArr[2].value)
assertTrue(intArr[2].compareAndSet(2, 34))
assertEquals(34, intArr[2].value)
}
fun testLongArray() {
longArr[0].value = 2424920024888888848
assertEquals(2424920024888888848, longArr[0].value)
longArr[0].lazySet(8424920024888888848)
assertEquals(8424920024888888848, longArr[0].value)
val ac = longArr[0].value
longArr[3].value = ac
assertEquals(8424920024888888848, longArr[3].getAndSet(8924920024888888848))
assertEquals(8924920024888888848, longArr[3].value)
val ac1 = longArr[3].value
longArr[4].value = ac1
assertEquals(8924920024888888849, longArr[4].incrementAndGet())
assertEquals(8924920024888888849, longArr[4].value)
assertEquals(8924920024888888849, longArr[4].getAndDecrement())
assertEquals(8924920024888888848, longArr[4].value)
longArr[4].value = 8924920024888888848
assertEquals(8924920024888888848, longArr[4].getAndAdd(100000000000000000))
val ac2 = longArr[4].value
longArr[1].value = ac2
assertEquals(9024920024888888848, longArr[1].value)
assertEquals(-198452011965886959, longArr[1].addAndGet(-9223372036854775807))
assertEquals(-198452011965886959, longArr[1].value)
assertEquals(-198452011965886958, longArr[1].incrementAndGet())
assertEquals(-198452011965886958, longArr[1].value)
assertEquals(-198452011965886959, longArr[1].decrementAndGet())
assertEquals(-198452011965886959, longArr[1].value)
}
fun testBooleanArray() {
assertFalse(booleanArr[1].value)
booleanArr[1].compareAndSet(false, true)
booleanArr[0].lazySet(true)
assertFalse(booleanArr[2].getAndSet(true))
assertTrue(booleanArr[0].value && booleanArr[1].value && booleanArr[2].value)
}
@Suppress("UNCHECKED_CAST")
fun testRefArray() {
val a2 = ANode(BNode(CNode(2)))
val a3 = ANode(BNode(CNode(3)))
refArr[0].value = a2
assertEquals(2, refArr[0].value!!.b.c.d)
assertTrue(refArr[0].compareAndSet(a2, a3))
assertEquals(3, refArr[0].value!!.b.c.d)
val r0 = refArr[0].value
refArr[3].value = r0
assertEquals(3, refArr[3].value!!.b.c.d)
val a = abcNode.value
assertTrue(refArr[3].compareAndSet(a3, a))
}
}
data class ANode<T>(val b: T)
data class BNode<T>(val c: T)
data class CNode(val d: Int)
@Test
fun box() {
val primitiveTest = TopLevelPrimitiveTest()
primitiveTest.testTopLevelInt()
primitiveTest.testTopLevelLong()
primitiveTest.testTopLevelBoolean()
primitiveTest.testTopLevelRef()
primitiveTest.testTopLevelArrayOfNulls()
val arrayTest = TopLevelArrayTest()
arrayTest.testIntArray()
arrayTest.testLongArray()
arrayTest.testBooleanArray()
arrayTest.testRefArray()
}