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