diff --git a/backend.native/tests/interop/objc/tests/structWithNSObject.h b/backend.native/tests/interop/objc/tests/structWithNSObject.h new file mode 100644 index 00000000000..86d6acb763e --- /dev/null +++ b/backend.native/tests/interop/objc/tests/structWithNSObject.h @@ -0,0 +1,17 @@ +#import + +struct CStructWithNSObjects { + id any; + + NSString* nsString; + NSString* _Nonnull nonNullString; + NSObject* object; + + NSArray* array; + NSMutableArray* mutableArray; + + NSSet* set; + + NSDictionary* dictionary; +}; + diff --git a/backend.native/tests/interop/objc/tests/structWithNSObject.kt b/backend.native/tests/interop/objc/tests/structWithNSObject.kt new file mode 100644 index 00000000000..67459f8b17f --- /dev/null +++ b/backend.native/tests/interop/objc/tests/structWithNSObject.kt @@ -0,0 +1,65 @@ +import kotlinx.cinterop.* +import kotlin.test.* +import objcTests.* + +private class NSObjectSubClass : NSObject() { + val x = 111 +} + +@Test +fun testStructWithNSObject() { + memScoped { + val struct = alloc() + + struct.any = 5 + assertEquals(5, struct.any) + struct.any = null + assertEquals(null, struct.any) + + struct.nsString = "hello" + assertEquals("hello", struct.nsString) + struct.nsString = null + assertEquals(null, struct.nsString) + + struct.nonNullString = "world" + assertEquals("world", struct.nonNullString) + + struct.`object` = NSObjectSubClass() + assertEquals(111, (struct.`object` as NSObjectSubClass).x) + struct.`object` = null + assertEquals(null, struct.`object`) + + struct.array = null + assertEquals(null, struct.array) + struct.array = listOf(1, 2, 3) + assertEquals(listOf(1, 2, 3), struct.array) + + struct.set = null + assertEquals(null, struct.set) + struct.set = setOf("hello", "world") + assertEquals(setOf("hello", "world"), struct.set) + + struct.dictionary = null + assertEquals(null, struct.dictionary) + struct.dictionary = mapOf("k1" to "v1", "k2" to "v2") + assertEquals(mapOf("k1" to "v1", "k2" to "v2"), struct.dictionary) + + struct.mutableArray = null + assertEquals(null, struct.mutableArray) + struct.mutableArray = mutableListOf(1, 2) + struct.mutableArray!! += 3 + assertEquals(mutableListOf(1, 2, 3), struct.mutableArray) + + // Check that subtyping via Nothing-returning functions does not break compiler. + assertFailsWith { + struct.any = TODO() + struct.nsString = TODO() + struct.nonNullString = TODO() + struct.`object` = TODO() + struct.array = TODO() + struct.set = TODO() + struct.dictionary = TODO() + struct.mutableArray = TODO() + } + } +} \ No newline at end of file