xref: /aosp_15_r20/external/kotlinx.atomicfu/atomicfu/src/commonTest/kotlin/kotlinx/atomicfu/test/TopLevelTest.kt (revision 68017707106cb9da9fed635c150bc497c09c160f)
1 /*
<lambda>null2  * Copyright 2017-2018 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
3  */
4 
5 package kotlinx.atomicfu.test
6 
7 import kotlinx.atomicfu.*
8 import kotlin.test.Test
9 import kotlin.test.assertEquals
10 
11 private val a = atomic(0)
12 private val b = atomic(2424920024888888848)
13 private val c = atomic(true)
14 private val abcNode = atomic(ANode(BNode(CNode(8))))
15 private val any = atomic<Any?>(null)
16 
17 private val intArr = AtomicIntArray(3)
18 private val longArr = AtomicLongArray(5)
19 private val booleanArr = AtomicBooleanArray(4)
20 private val refArr = AtomicArray<ANode<BNode<CNode>>>(5)
21 private val anyRefArr = AtomicArray<Any>(10)
22 
23 private val stringAtomicNullArr = atomicArrayOfNulls<String>(10)
24 
25 internal val internalTopLevelField = atomic(0)
26 public val publicTopLevelField = atomic(0)
27 
28 class TopLevelPrimitiveTest {
29     @Test
30     fun testTopLevelInt() {
31         check(a.value == 0)
32         check(a.getAndSet(3) == 0)
33         check(a.compareAndSet(3, 8))
34         a.lazySet(5)
35         check(a.value == 5)
36         a.value = 1
37         check(a.value == 1)
38         check(a.getAndSet(2) == 1)
39         check(a.value == 2)
40         check(a.getAndIncrement() == 2)
41         check(a.value == 3)
42         check(a.getAndDecrement() == 3)
43         check(a.value == 2)
44         check(a.getAndAdd(2) == 2)
45         check(a.value == 4)
46         check(a.addAndGet(3) == 7)
47         check(a.value == 7)
48         check(a.incrementAndGet() == 8)
49         check(a.value == 8)
50         check(a.decrementAndGet() == 7)
51         check(a.value == 7)
52         a.compareAndSet(7, 10)
53     }
54 
55     @Test
56     fun testTopLevelLong() {
57         check(b.value == 2424920024888888848)
58         b.lazySet(8424920024888888848)
59         check(b.value == 8424920024888888848)
60         b.value = 8424920024888888833
61         check(b.value == 8424920024888888833)
62         check(b.getAndSet(8924920024888888848) == 8424920024888888833)
63         check(b.value == 8924920024888888848)
64         check(b.incrementAndGet() == 8924920024888888849)
65         check(b.value == 8924920024888888849)
66         check(b.getAndDecrement() == 8924920024888888849)
67         check(b.value == 8924920024888888848)
68         check(b.getAndAdd(100000000000000000) == 8924920024888888848)
69         check(b.value == 9024920024888888848)
70         check(b.addAndGet(-9223372036854775807) == -198452011965886959)
71         check(b.value == -198452011965886959)
72         check(b.incrementAndGet() == -198452011965886958)
73         check(b.value == -198452011965886958)
74         check(b.decrementAndGet() == -198452011965886959)
75         check(b.value == -198452011965886959)
76     }
77 
78     @Test
79     fun testTopLevelBoolean() {
80         check(c.value)
81         c.lazySet(false)
82         check(!c.value)
83         c.value = false
84         check(!c.value)
85         check(!c.getAndSet(true))
86         check(c.compareAndSet(true, false))
87         check(!c.value)
88     }
89 
90     @Test
91     fun testTopLevelRef() {
92         check(abcNode.value.b.c.d == 8)
93         val newNode = ANode(BNode(CNode(76)))
94         check(abcNode.getAndSet(newNode).b.c.d == 8)
95         check(abcNode.value.b.c.d == 76)
96         val l = IntArray(4){i -> i}
97         any.lazySet(l)
98         check((any.value as IntArray)[2] == 2)
99         abcNode.value = ANode(BNode(CNode(88)))
100         check(abcNode.value.b.c.d == 88)
101     }
102 }
103 
104 class TopLevelArrayTest {
105     @Test
testIntArraynull106     fun testIntArray() {
107         check(intArr[0].compareAndSet(0, 3))
108         check(intArr[1].value == 0)
109         intArr[0].lazySet(5)
110         check(intArr[0].value + intArr[1].value + intArr[2].value == 5)
111         check(intArr[0].compareAndSet(5, 10))
112         check(intArr[0].getAndDecrement() == 10)
113         check(intArr[0].value == 9)
114         intArr[2].value = 2
115         check(intArr[2].value == 2)
116         check(intArr[2].compareAndSet(2, 34))
117         check(intArr[2].value == 34)
118         assertEquals(8, intArr.size + longArr.size)
119     }
120 
121     @Test
testLongArraynull122     fun testLongArray() {
123         longArr[0].value = 2424920024888888848
124         check(longArr[0].value == 2424920024888888848)
125         longArr[0].lazySet(8424920024888888848)
126         check(longArr[0].value == 8424920024888888848)
127         val ac = longArr[0].value
128         longArr[3].value = ac
129         check(longArr[3].getAndSet(8924920024888888848) == 8424920024888888848)
130         check(longArr[3].value == 8924920024888888848)
131         val ac1 = longArr[3].value
132         longArr[4].value = ac1
133         check(longArr[4].incrementAndGet() == 8924920024888888849)
134         check(longArr[4].value == 8924920024888888849)
135         check(longArr[4].getAndDecrement() == 8924920024888888849)
136         check(longArr[4].value == 8924920024888888848)
137         longArr[4].value = 8924920024888888848
138         check(longArr[4].getAndAdd(100000000000000000) == 8924920024888888848)
139         val ac2 = longArr[4].value
140         longArr[1].value = ac2
141         check(longArr[1].value == 9024920024888888848)
142         check(longArr[1].addAndGet(-9223372036854775807) == -198452011965886959)
143         check(longArr[1].value == -198452011965886959)
144         check(longArr[1].incrementAndGet() == -198452011965886958)
145         check(longArr[1].value == -198452011965886958)
146         check(longArr[1].decrementAndGet() == -198452011965886959)
147         check(longArr[1].value == -198452011965886959)
148     }
149 
150     @Test
testBooleanArraynull151     fun testBooleanArray() {
152         check(!booleanArr[1].value)
153         booleanArr[1].compareAndSet(false, true)
154         booleanArr[0].lazySet(true)
155         check(!booleanArr[2].getAndSet(true))
156         check(booleanArr[0].value && booleanArr[1].value && booleanArr[2].value)
157     }
158     @Test
testTopLevelArrayOfNullsnull159     fun testTopLevelArrayOfNulls() {
160         check(stringAtomicNullArr[0].value == null)
161         check(stringAtomicNullArr[0].compareAndSet(null, "aa"))
162         stringAtomicNullArr[1].lazySet("aa")
163         check(stringAtomicNullArr[0].value == stringAtomicNullArr[1].value)
164     }
165 
166     @Suppress("UNCHECKED_CAST")
167     @Test
testRefArraynull168     fun testRefArray() {
169         val a2 = ANode(BNode(CNode(2)))
170         val a3 = ANode(BNode(CNode(3)))
171         refArr[0].value = a2
172         check(refArr[0].value!!.b.c.d == 2)
173         check(refArr[0].compareAndSet(a2, a3))
174         check(refArr[0].value!!.b.c.d == 3)
175         val r0 = refArr[0].value
176         refArr[3].value = r0
177         check(refArr[3].value!!.b.c.d == 3)
178         val a = abcNode.value
179         check(refArr[3].compareAndSet(a3, a))
180 
181         val l = listOf(1, 2, 3)
182         anyRefArr[5].lazySet(l)
183         check((anyRefArr[5].value as List<Int>)[1] == 2)
184         check(anyRefArr[5].compareAndSet(l, a2))
185         check((anyRefArr[5].value as ANode<BNode<CNode>>).b.c.d == 2)
186     }
187 }
188 
189 data class ANode<T>(val b: T)
190 data class BNode<T>(val c: T)
191 data class CNode(val d: Int)
192