From bcc4a891be5d0641f00cacf4937d4a14f9dca220 Mon Sep 17 00:00:00 2001 From: Svyatoslav Scherbina Date: Wed, 19 Jul 2023 15:41:32 +0200 Subject: [PATCH] Native: add tests for ExperimentalForeignApi on cinterop declarations Add tests checking that all (top-level) declarations generated by cinterop now have ExperimentalForeignApi annotation. ^KT-58362 --- .../experimental/cases/enum/contents.gold.txt | 29 +++++++ .../experimental/cases/enum/dependency.def | 1 + .../cases/function/contents.gold.txt | 6 ++ .../cases/function/dependency.def | 1 + .../cases/global/contents.gold.txt | 11 +++ .../experimental/cases/global/dependency.def | 1 + .../cases/objccategory/contents.gold.txt | 31 +++++++ .../cases/objccategory/dependency.def | 2 + .../cases/objcclass/contents.gold.txt | 27 +++++++ .../cases/objcclass/dependency.def | 2 + .../cases/objcprotocol/contents.gold.txt | 23 ++++++ .../cases/objcprotocol/dependency.def | 2 + .../cases/objctypedef/contents.gold.txt | 21 +++++ .../cases/objctypedef/dependency.def | 2 + .../cases/struct/contents.gold.txt | 12 +++ .../experimental/cases/struct/dependency.def | 1 + .../cases/typedef/contents.gold.txt | 18 +++++ .../experimental/cases/typedef/dependency.def | 1 + .../CInterop/experimental/include/enum.h | 8 ++ .../CInterop/experimental/include/function.h | 2 + .../CInterop/experimental/include/global.h | 6 ++ .../experimental/include/objccategory.h | 10 +++ .../CInterop/experimental/include/objcclass.h | 7 ++ .../experimental/include/objcprotocol.h | 6 ++ .../experimental/include/objctypedef.h | 6 ++ .../CInterop/experimental/include/struct.h | 3 + .../CInterop/experimental/include/typedef.h | 8 ++ .../CInteropExperimentalTestGenerated.java | 80 +++++++++++++++++++ .../generators/tests/GenerateNativeTests.kt | 6 ++ .../AbstractNativeCInteropTest.kt | 12 +++ 30 files changed, 345 insertions(+) create mode 100644 native/native.tests/testData/CInterop/experimental/cases/enum/contents.gold.txt create mode 100644 native/native.tests/testData/CInterop/experimental/cases/enum/dependency.def create mode 100644 native/native.tests/testData/CInterop/experimental/cases/function/contents.gold.txt create mode 100644 native/native.tests/testData/CInterop/experimental/cases/function/dependency.def create mode 100644 native/native.tests/testData/CInterop/experimental/cases/global/contents.gold.txt create mode 100644 native/native.tests/testData/CInterop/experimental/cases/global/dependency.def create mode 100644 native/native.tests/testData/CInterop/experimental/cases/objccategory/contents.gold.txt create mode 100644 native/native.tests/testData/CInterop/experimental/cases/objccategory/dependency.def create mode 100644 native/native.tests/testData/CInterop/experimental/cases/objcclass/contents.gold.txt create mode 100644 native/native.tests/testData/CInterop/experimental/cases/objcclass/dependency.def create mode 100644 native/native.tests/testData/CInterop/experimental/cases/objcprotocol/contents.gold.txt create mode 100644 native/native.tests/testData/CInterop/experimental/cases/objcprotocol/dependency.def create mode 100644 native/native.tests/testData/CInterop/experimental/cases/objctypedef/contents.gold.txt create mode 100644 native/native.tests/testData/CInterop/experimental/cases/objctypedef/dependency.def create mode 100644 native/native.tests/testData/CInterop/experimental/cases/struct/contents.gold.txt create mode 100644 native/native.tests/testData/CInterop/experimental/cases/struct/dependency.def create mode 100644 native/native.tests/testData/CInterop/experimental/cases/typedef/contents.gold.txt create mode 100644 native/native.tests/testData/CInterop/experimental/cases/typedef/dependency.def create mode 100644 native/native.tests/testData/CInterop/experimental/include/enum.h create mode 100644 native/native.tests/testData/CInterop/experimental/include/function.h create mode 100644 native/native.tests/testData/CInterop/experimental/include/global.h create mode 100644 native/native.tests/testData/CInterop/experimental/include/objccategory.h create mode 100644 native/native.tests/testData/CInterop/experimental/include/objcclass.h create mode 100644 native/native.tests/testData/CInterop/experimental/include/objcprotocol.h create mode 100644 native/native.tests/testData/CInterop/experimental/include/objctypedef.h create mode 100644 native/native.tests/testData/CInterop/experimental/include/struct.h create mode 100644 native/native.tests/testData/CInterop/experimental/include/typedef.h create mode 100644 native/native.tests/tests-gen/org/jetbrains/kotlin/konan/blackboxtest/CInteropExperimentalTestGenerated.java diff --git a/native/native.tests/testData/CInterop/experimental/cases/enum/contents.gold.txt b/native/native.tests/testData/CInterop/experimental/cases/enum/contents.gold.txt new file mode 100644 index 00000000000..9778896de23 --- /dev/null +++ b/native/native.tests/testData/CInterop/experimental/cases/enum/contents.gold.txt @@ -0,0 +1,29 @@ + +package dependency { + + @ExperimentalForeignApi enum class E1 private constructor(value: UInt) : Enum, CEnum { + @ConstantValue.UInt(value = 0.toUInt()) enum entry ONE + @ConstantValue.UInt(value = 1.toUInt()) enum entry TWO + @ConstantValue.UInt(value = 2.toUInt()) enum entry THREE + override val value: UInt + + class Var constructor(rawPtr: NativePtr /* = NativePtr */) : CEnumVar { + var value: E1 + @CEnumVarTypeSize(size = 4) @Deprecated(level = DeprecationLevel.WARNING, message = "Use sizeOf() or alignOf() instead.", replaceWith = ReplaceWith(expression = "", imports = {})) companion object : CPrimitiveVar.Type + } + + companion object { + @Deprecated(level = DeprecationLevel.WARNING, message = "Will be removed.", replaceWith = ReplaceWith(expression = "", imports = {})) fun byValue(value: UInt): E1 + } + + } + +} + +package dependency { + @ExperimentalForeignApi typealias E2 = UInt + @ExperimentalForeignApi typealias E2Var = UIntVarOf + @ExperimentalForeignApi const val EIGHT: E2 /* = UInt */ = 8.toUInt() + @ExperimentalForeignApi const val FOUR: E2 /* = UInt */ = 4.toUInt() +} + diff --git a/native/native.tests/testData/CInterop/experimental/cases/enum/dependency.def b/native/native.tests/testData/CInterop/experimental/cases/enum/dependency.def new file mode 100644 index 00000000000..d152a9c0089 --- /dev/null +++ b/native/native.tests/testData/CInterop/experimental/cases/enum/dependency.def @@ -0,0 +1 @@ +headers = enum.h diff --git a/native/native.tests/testData/CInterop/experimental/cases/function/contents.gold.txt b/native/native.tests/testData/CInterop/experimental/cases/function/contents.gold.txt new file mode 100644 index 00000000000..adf9ec30f3f --- /dev/null +++ b/native/native.tests/testData/CInterop/experimental/cases/function/contents.gold.txt @@ -0,0 +1,6 @@ + +package dependency { + @CCall(id = "knifunptr_dependency1_bar") @ExperimentalForeignApi external fun bar() + @CCall(id = "knifunptr_dependency0_foo") @ExperimentalForeignApi external fun foo() +} + diff --git a/native/native.tests/testData/CInterop/experimental/cases/function/dependency.def b/native/native.tests/testData/CInterop/experimental/cases/function/dependency.def new file mode 100644 index 00000000000..f247c436ccb --- /dev/null +++ b/native/native.tests/testData/CInterop/experimental/cases/function/dependency.def @@ -0,0 +1 @@ +headers = function.h diff --git a/native/native.tests/testData/CInterop/experimental/cases/global/contents.gold.txt b/native/native.tests/testData/CInterop/experimental/cases/global/contents.gold.txt new file mode 100644 index 00000000000..3324d328f59 --- /dev/null +++ b/native/native.tests/testData/CInterop/experimental/cases/global/contents.gold.txt @@ -0,0 +1,11 @@ + +package dependency { + @ExperimentalForeignApi const val MACRO_CONST_GLOBAL: Int = 1 + @ExperimentalForeignApi val MACRO_GLOBAL: Int + @CCall(id = "knifunptr_dependency3_MACRO_GLOBAL_getter") get + @CCall(id = "knifunptr_dependency0_getValue") @ExperimentalForeignApi external fun getValue(): Int + @ExperimentalForeignApi var global: Int + @CCall(id = "knifunptr_dependency1_global_getter") get + @CCall(id = "knifunptr_dependency2_global_setter") set +} + diff --git a/native/native.tests/testData/CInterop/experimental/cases/global/dependency.def b/native/native.tests/testData/CInterop/experimental/cases/global/dependency.def new file mode 100644 index 00000000000..2b1a7f483f1 --- /dev/null +++ b/native/native.tests/testData/CInterop/experimental/cases/global/dependency.def @@ -0,0 +1 @@ +headers = global.h diff --git a/native/native.tests/testData/CInterop/experimental/cases/objccategory/contents.gold.txt b/native/native.tests/testData/CInterop/experimental/cases/objccategory/contents.gold.txt new file mode 100644 index 00000000000..ae668065bde --- /dev/null +++ b/native/native.tests/testData/CInterop/experimental/cases/objccategory/contents.gold.txt @@ -0,0 +1,31 @@ + +package dependency { + + @ExternalObjCClass @ExperimentalForeignApi open class MyClass : ObjCObjectBase { + protected constructor() + companion object : MyClassMeta, ObjCClassOf + } + + @ExternalObjCClass @ExperimentalForeignApi open class MyClassMeta : ObjCObjectBaseMeta { + protected constructor() + } + +} + +package dependency { + @ObjCMethod(encoding = "v16@0:8", isStret = false, selector = "classMethod") @ExperimentalForeignApi external fun MyClassMeta.classMethod() + @ExperimentalForeignApi var MyClassMeta.classProperty: Any? + @ObjCMethod(encoding = "@16@0:8", isStret = false, selector = "classProperty") get + @ObjCMethod(encoding = "v24@0:8@16", isStret = false, selector = "setClassProperty:") set + @ObjCMethod(encoding = "@16@0:8", isStret = false, selector = "classProperty") @ExperimentalForeignApi external fun MyClassMeta.classProperty(): Any? + @ObjCFactory(encoding = "@16@0:8", isStret = false, selector = "init") @CCall.ConsumesReceiver @CCall.ReturnsRetained @ExperimentalForeignApi external fun ObjCClassOf.create(): T? + @Deprecated(level = DeprecationLevel.ERROR, message = "Use factory method instead", replaceWith = ReplaceWith(expression = "MyClass.create()", imports = {})) @ObjCMethod(encoding = "@16@0:8", isStret = false, selector = "init") @CCall.ConsumesReceiver @CCall.ReturnsRetained @ExperimentalForeignApi external fun MyClass.init(): MyClass? + @ObjCMethod(encoding = "v16@0:8", isStret = false, selector = "instanceMethod") @ExperimentalForeignApi external fun MyClass.instanceMethod() + @ExperimentalForeignApi var MyClass.instanceProperty: Int + @ObjCMethod(encoding = "i16@0:8", isStret = false, selector = "instanceProperty") get + @ObjCMethod(encoding = "v20@0:8i16", isStret = false, selector = "setInstanceProperty:") set + @ObjCMethod(encoding = "i16@0:8", isStret = false, selector = "instanceProperty") @ExperimentalForeignApi external fun MyClass.instanceProperty(): Int + @ObjCMethod(encoding = "v24@0:8@16", isStret = false, selector = "setClassProperty:") @ExperimentalForeignApi external fun MyClassMeta.setClassProperty(classProperty: Any?) + @ObjCMethod(encoding = "v20@0:8i16", isStret = false, selector = "setInstanceProperty:") @ExperimentalForeignApi external fun MyClass.setInstanceProperty(instanceProperty: Int) +} + diff --git a/native/native.tests/testData/CInterop/experimental/cases/objccategory/dependency.def b/native/native.tests/testData/CInterop/experimental/cases/objccategory/dependency.def new file mode 100644 index 00000000000..f03d0aab388 --- /dev/null +++ b/native/native.tests/testData/CInterop/experimental/cases/objccategory/dependency.def @@ -0,0 +1,2 @@ +language = Objective-C +headers = objccategory.h diff --git a/native/native.tests/testData/CInterop/experimental/cases/objcclass/contents.gold.txt b/native/native.tests/testData/CInterop/experimental/cases/objcclass/contents.gold.txt new file mode 100644 index 00000000000..90f17a91a54 --- /dev/null +++ b/native/native.tests/testData/CInterop/experimental/cases/objcclass/contents.gold.txt @@ -0,0 +1,27 @@ + +package dependency { + + @ExternalObjCClass @ExperimentalForeignApi open class MyClass : ObjCObjectBase { + @ObjCConstructor(designated = true, initSelector = "init") constructor() + var instanceProperty: Int + @ObjCMethod(encoding = "i16@0:8", isStret = false, selector = "instanceProperty") get + @ObjCMethod(encoding = "v20@0:8i16", isStret = false, selector = "setInstanceProperty:") set + @Deprecated(level = DeprecationLevel.ERROR, message = "Use constructor instead", replaceWith = ReplaceWith(expression = "MyClass()", imports = {})) @ObjCMethod(encoding = "@16@0:8", isStret = false, selector = "init") @CCall.ConsumesReceiver @CCall.ReturnsRetained open external fun init(): MyClass? + @ObjCMethod(encoding = "v16@0:8", isStret = false, selector = "instanceMethod") open external fun instanceMethod() + @ObjCMethod(encoding = "i16@0:8", isStret = false, selector = "instanceProperty") open external fun instanceProperty(): Int + @ObjCMethod(encoding = "v20@0:8i16", isStret = false, selector = "setInstanceProperty:") open external fun setInstanceProperty(instanceProperty: Int) + companion object : MyClassMeta, ObjCClassOf + } + + @ExternalObjCClass @ExperimentalForeignApi open class MyClassMeta : ObjCObjectBaseMeta { + protected constructor() + var classProperty: Any? + @ObjCMethod(encoding = "@16@0:8", isStret = false, selector = "classProperty") get + @ObjCMethod(encoding = "v24@0:8@16", isStret = false, selector = "setClassProperty:") set + @ObjCMethod(encoding = "v16@0:8", isStret = false, selector = "classMethod") open external fun classMethod() + @ObjCMethod(encoding = "@16@0:8", isStret = false, selector = "classProperty") open external fun classProperty(): Any? + @ObjCMethod(encoding = "v24@0:8@16", isStret = false, selector = "setClassProperty:") open external fun setClassProperty(classProperty: Any?) + } + +} + diff --git a/native/native.tests/testData/CInterop/experimental/cases/objcclass/dependency.def b/native/native.tests/testData/CInterop/experimental/cases/objcclass/dependency.def new file mode 100644 index 00000000000..6e14a1439ea --- /dev/null +++ b/native/native.tests/testData/CInterop/experimental/cases/objcclass/dependency.def @@ -0,0 +1,2 @@ +language = Objective-C +headers = objcclass.h diff --git a/native/native.tests/testData/CInterop/experimental/cases/objcprotocol/contents.gold.txt b/native/native.tests/testData/CInterop/experimental/cases/objcprotocol/contents.gold.txt new file mode 100644 index 00000000000..1af53c58353 --- /dev/null +++ b/native/native.tests/testData/CInterop/experimental/cases/objcprotocol/contents.gold.txt @@ -0,0 +1,23 @@ + +package dependency { + + @ExternalObjCClass(protocolGetter = "kniprot_dependency0_MyProtocol") @ExperimentalForeignApi interface MyProtocolProtocol : ObjCObject { + var instanceProperty: Any? + @ObjCMethod(encoding = "@16@0:8", isStret = false, selector = "instanceProperty") get + @ObjCMethod(encoding = "v24@0:8@16", isStret = false, selector = "setInstanceProperty:") set + @ObjCMethod(encoding = "@16@0:8", isStret = false, selector = "instanceMethod") fun instanceMethod(): Any? + @ObjCMethod(encoding = "@16@0:8", isStret = false, selector = "instanceProperty") fun instanceProperty(): Any? + @ObjCMethod(encoding = "v24@0:8@16", isStret = false, selector = "setInstanceProperty:") fun setInstanceProperty(instanceProperty: Any?) + } + + @ExternalObjCClass(protocolGetter = "kniprot_dependency0_MyProtocol") @ExperimentalForeignApi interface MyProtocolProtocolMeta : ObjCObjectMeta /* = ObjCClass */ { + var classProperty: Int + @ObjCMethod(encoding = "i16@0:8", isStret = false, selector = "classProperty") get + @ObjCMethod(encoding = "v20@0:8i16", isStret = false, selector = "setClassProperty:") set + @ObjCMethod(encoding = "i16@0:8", isStret = false, selector = "classMethod") fun classMethod(): Int + @ObjCMethod(encoding = "i16@0:8", isStret = false, selector = "classProperty") fun classProperty(): Int + @ObjCMethod(encoding = "v20@0:8i16", isStret = false, selector = "setClassProperty:") fun setClassProperty(classProperty: Int) + } + +} + diff --git a/native/native.tests/testData/CInterop/experimental/cases/objcprotocol/dependency.def b/native/native.tests/testData/CInterop/experimental/cases/objcprotocol/dependency.def new file mode 100644 index 00000000000..4ccb4a073ad --- /dev/null +++ b/native/native.tests/testData/CInterop/experimental/cases/objcprotocol/dependency.def @@ -0,0 +1,2 @@ +language = Objective-C +headers = objcprotocol.h diff --git a/native/native.tests/testData/CInterop/experimental/cases/objctypedef/contents.gold.txt b/native/native.tests/testData/CInterop/experimental/cases/objctypedef/contents.gold.txt new file mode 100644 index 00000000000..f3a6bc14fac --- /dev/null +++ b/native/native.tests/testData/CInterop/experimental/cases/objctypedef/contents.gold.txt @@ -0,0 +1,21 @@ + +package dependency { + + @ExternalObjCClass @ExperimentalForeignApi open class MyClass : ObjCObjectBase { + protected constructor() + companion object : MyClassMeta, ObjCClassOf + } + + @ExternalObjCClass @ExperimentalForeignApi open class MyClassMeta : ObjCObjectBaseMeta { + protected constructor() + } + +} + +package dependency { + @ExperimentalForeignApi typealias MyClassRef = MyClass? + @ExperimentalForeignApi typealias MyClassRefVar = ObjCObjectVar + @ExperimentalForeignApi typealias MyId = Any? + @ExperimentalForeignApi typealias MyIdVar = ObjCObjectVar +} + diff --git a/native/native.tests/testData/CInterop/experimental/cases/objctypedef/dependency.def b/native/native.tests/testData/CInterop/experimental/cases/objctypedef/dependency.def new file mode 100644 index 00000000000..bc1ba80a968 --- /dev/null +++ b/native/native.tests/testData/CInterop/experimental/cases/objctypedef/dependency.def @@ -0,0 +1,2 @@ +language = Objective-C +headers = objctypedef.h diff --git a/native/native.tests/testData/CInterop/experimental/cases/struct/contents.gold.txt b/native/native.tests/testData/CInterop/experimental/cases/struct/contents.gold.txt new file mode 100644 index 00000000000..d3a2f13de94 --- /dev/null +++ b/native/native.tests/testData/CInterop/experimental/cases/struct/contents.gold.txt @@ -0,0 +1,12 @@ + +package dependency { + + @CStruct(spelling = "struct { int x; }") @ExperimentalForeignApi class Foo constructor(rawPtr: NativePtr /* = NativePtr */) : CStructVar { + var x: Int + @CStruct.MemberAt(offset = 0.toLong()) get + @CStruct.MemberAt(offset = 0.toLong()) set + @CStruct.VarType(align = 4, size = 4.toLong()) @Deprecated(level = DeprecationLevel.WARNING, message = "Use sizeOf() or alignOf() instead.", replaceWith = ReplaceWith(expression = "", imports = {})) companion object : CStructVar.Type + } + +} + diff --git a/native/native.tests/testData/CInterop/experimental/cases/struct/dependency.def b/native/native.tests/testData/CInterop/experimental/cases/struct/dependency.def new file mode 100644 index 00000000000..f6bd9905709 --- /dev/null +++ b/native/native.tests/testData/CInterop/experimental/cases/struct/dependency.def @@ -0,0 +1 @@ +headers = struct.h diff --git a/native/native.tests/testData/CInterop/experimental/cases/typedef/contents.gold.txt b/native/native.tests/testData/CInterop/experimental/cases/typedef/contents.gold.txt new file mode 100644 index 00000000000..f86effd36da --- /dev/null +++ b/native/native.tests/testData/CInterop/experimental/cases/typedef/contents.gold.txt @@ -0,0 +1,18 @@ + +package dependency { + + @CStruct(spelling = "struct { }") @ExperimentalForeignApi class T constructor(rawPtr: NativePtr /* = NativePtr */) : CStructVar { + @CStruct.VarType(align = 1, size = 0.toLong()) @Deprecated(level = DeprecationLevel.WARNING, message = "Use sizeOf() or alignOf() instead.", replaceWith = ReplaceWith(expression = "", imports = {})) companion object : CStructVar.Type + } + +} + +package dependency { + @ExperimentalForeignApi typealias MyInt = Int + @ExperimentalForeignApi typealias MyIntVar = IntVarOf + @ExperimentalForeignApi typealias MyPointer = COpaquePointer + @ExperimentalForeignApi typealias MyPointerVar = CPointerVarOf */> + @ExperimentalForeignApi typealias MyS = S + @ExperimentalForeignApi typealias MyT = T +} + diff --git a/native/native.tests/testData/CInterop/experimental/cases/typedef/dependency.def b/native/native.tests/testData/CInterop/experimental/cases/typedef/dependency.def new file mode 100644 index 00000000000..7e2e0078d56 --- /dev/null +++ b/native/native.tests/testData/CInterop/experimental/cases/typedef/dependency.def @@ -0,0 +1 @@ +headers = typedef.h diff --git a/native/native.tests/testData/CInterop/experimental/include/enum.h b/native/native.tests/testData/CInterop/experimental/include/enum.h new file mode 100644 index 00000000000..30c03a14dcf --- /dev/null +++ b/native/native.tests/testData/CInterop/experimental/include/enum.h @@ -0,0 +1,8 @@ +enum E1 { + ONE, TWO, THREE +}; + +enum E2 { + FOUR = 4, + EIGHT = 8 +}; \ No newline at end of file diff --git a/native/native.tests/testData/CInterop/experimental/include/function.h b/native/native.tests/testData/CInterop/experimental/include/function.h new file mode 100644 index 00000000000..2b060c20ea4 --- /dev/null +++ b/native/native.tests/testData/CInterop/experimental/include/function.h @@ -0,0 +1,2 @@ +void foo(void); +void bar() {} \ No newline at end of file diff --git a/native/native.tests/testData/CInterop/experimental/include/global.h b/native/native.tests/testData/CInterop/experimental/include/global.h new file mode 100644 index 00000000000..50e4973cb17 --- /dev/null +++ b/native/native.tests/testData/CInterop/experimental/include/global.h @@ -0,0 +1,6 @@ +#define MACRO_CONST_GLOBAL 1 + +int getValue(void); +#define MACRO_GLOBAL getValue() + +extern int global; \ No newline at end of file diff --git a/native/native.tests/testData/CInterop/experimental/include/objccategory.h b/native/native.tests/testData/CInterop/experimental/include/objccategory.h new file mode 100644 index 00000000000..e441b96c30a --- /dev/null +++ b/native/native.tests/testData/CInterop/experimental/include/objccategory.h @@ -0,0 +1,10 @@ +@interface MyClass +@end + +@interface MyClass (MyClassCategory) +-(instancetype) init; +-(void) instanceMethod; ++(void) classMethod; +@property int instanceProperty; +@property (class) id classProperty; +@end \ No newline at end of file diff --git a/native/native.tests/testData/CInterop/experimental/include/objcclass.h b/native/native.tests/testData/CInterop/experimental/include/objcclass.h new file mode 100644 index 00000000000..4f693bbea31 --- /dev/null +++ b/native/native.tests/testData/CInterop/experimental/include/objcclass.h @@ -0,0 +1,7 @@ +@interface MyClass +-(instancetype) init; +-(void) instanceMethod; ++(void) classMethod; +@property int instanceProperty; +@property (class) id classProperty; +@end \ No newline at end of file diff --git a/native/native.tests/testData/CInterop/experimental/include/objcprotocol.h b/native/native.tests/testData/CInterop/experimental/include/objcprotocol.h new file mode 100644 index 00000000000..197106af14e --- /dev/null +++ b/native/native.tests/testData/CInterop/experimental/include/objcprotocol.h @@ -0,0 +1,6 @@ +@protocol MyProtocol +-(id) instanceMethod; ++(int) classMethod; +@property id instanceProperty; +@property (class) int classProperty; +@end \ No newline at end of file diff --git a/native/native.tests/testData/CInterop/experimental/include/objctypedef.h b/native/native.tests/testData/CInterop/experimental/include/objctypedef.h new file mode 100644 index 00000000000..c8256e84b29 --- /dev/null +++ b/native/native.tests/testData/CInterop/experimental/include/objctypedef.h @@ -0,0 +1,6 @@ +@interface MyClass +@end + +typedef MyClass MyClass2; +typedef MyClass* MyClassRef; +typedef id MyId; \ No newline at end of file diff --git a/native/native.tests/testData/CInterop/experimental/include/struct.h b/native/native.tests/testData/CInterop/experimental/include/struct.h new file mode 100644 index 00000000000..533cad3b310 --- /dev/null +++ b/native/native.tests/testData/CInterop/experimental/include/struct.h @@ -0,0 +1,3 @@ +struct Foo { + int x; +}; \ No newline at end of file diff --git a/native/native.tests/testData/CInterop/experimental/include/typedef.h b/native/native.tests/testData/CInterop/experimental/include/typedef.h new file mode 100644 index 00000000000..c184bae77ca --- /dev/null +++ b/native/native.tests/testData/CInterop/experimental/include/typedef.h @@ -0,0 +1,8 @@ +typedef int MyInt; +typedef void* MyPointer; + +struct S; +struct T {}; + +typedef struct S MyS; +typedef struct T MyT; \ No newline at end of file diff --git a/native/native.tests/tests-gen/org/jetbrains/kotlin/konan/blackboxtest/CInteropExperimentalTestGenerated.java b/native/native.tests/tests-gen/org/jetbrains/kotlin/konan/blackboxtest/CInteropExperimentalTestGenerated.java new file mode 100644 index 00000000000..b005f361a67 --- /dev/null +++ b/native/native.tests/tests-gen/org/jetbrains/kotlin/konan/blackboxtest/CInteropExperimentalTestGenerated.java @@ -0,0 +1,80 @@ +/* + * Copyright 2010-2023 JetBrains s.r.o. and Kotlin Programming Language contributors. + * Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file. + */ + +package org.jetbrains.kotlin.konan.blackboxtest; + +import com.intellij.testFramework.TestDataPath; +import org.jetbrains.kotlin.test.util.KtTestUtil; +import org.jetbrains.kotlin.test.TestMetadata; +import org.junit.jupiter.api.Nested; +import org.junit.jupiter.api.Test; + +import java.io.File; +import java.util.regex.Pattern; + +/** This class is generated by {@link org.jetbrains.kotlin.generators.tests.GenerateNativeTestsKt}. DO NOT MODIFY MANUALLY */ +@SuppressWarnings("all") +@TestMetadata("native/native.tests/testData/CInterop/experimental/cases") +@TestDataPath("$PROJECT_ROOT") +public class CInteropExperimentalTestGenerated extends AbstractNativeCInteropExperimentalTest { + @Test + public void testAllFilesPresentInCases() throws Exception { + KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("native/native.tests/testData/CInterop/experimental/cases"), Pattern.compile("^([^_](.+))$"), null, false); + } + + @Test + @TestMetadata("enum") + public void testEnum() throws Exception { + runTest("native/native.tests/testData/CInterop/experimental/cases/enum/"); + } + + @Test + @TestMetadata("function") + public void testFunction() throws Exception { + runTest("native/native.tests/testData/CInterop/experimental/cases/function/"); + } + + @Test + @TestMetadata("global") + public void testGlobal() throws Exception { + runTest("native/native.tests/testData/CInterop/experimental/cases/global/"); + } + + @Test + @TestMetadata("objccategory") + public void testObjccategory() throws Exception { + runTest("native/native.tests/testData/CInterop/experimental/cases/objccategory/"); + } + + @Test + @TestMetadata("objcclass") + public void testObjcclass() throws Exception { + runTest("native/native.tests/testData/CInterop/experimental/cases/objcclass/"); + } + + @Test + @TestMetadata("objcprotocol") + public void testObjcprotocol() throws Exception { + runTest("native/native.tests/testData/CInterop/experimental/cases/objcprotocol/"); + } + + @Test + @TestMetadata("objctypedef") + public void testObjctypedef() throws Exception { + runTest("native/native.tests/testData/CInterop/experimental/cases/objctypedef/"); + } + + @Test + @TestMetadata("struct") + public void testStruct() throws Exception { + runTest("native/native.tests/testData/CInterop/experimental/cases/struct/"); + } + + @Test + @TestMetadata("typedef") + public void testTypedef() throws Exception { + runTest("native/native.tests/testData/CInterop/experimental/cases/typedef/"); + } +} diff --git a/native/native.tests/tests/org/jetbrains/kotlin/generators/tests/GenerateNativeTests.kt b/native/native.tests/tests/org/jetbrains/kotlin/generators/tests/GenerateNativeTests.kt index cefd90c3cf4..111de7cb729 100644 --- a/native/native.tests/tests/org/jetbrains/kotlin/generators/tests/GenerateNativeTests.kt +++ b/native/native.tests/tests/org/jetbrains/kotlin/generators/tests/GenerateNativeTests.kt @@ -168,6 +168,12 @@ fun main() { ) { model("CInterop/frameworkIncludeCategories/cases", pattern = "^([^_](.+))$", recursive = false) } + + testClass( + suiteTestClassName = "CInteropExperimentalTestGenerated" + ) { + model("CInterop/experimental/cases", pattern = "^([^_](.+))$", recursive = false) + } } // ObjCExport tests. diff --git a/native/native.tests/tests/org/jetbrains/kotlin/konan/blackboxtest/AbstractNativeCInteropTest.kt b/native/native.tests/tests/org/jetbrains/kotlin/konan/blackboxtest/AbstractNativeCInteropTest.kt index cec192dd4a2..7acd067d747 100644 --- a/native/native.tests/tests/org/jetbrains/kotlin/konan/blackboxtest/AbstractNativeCInteropTest.kt +++ b/native/native.tests/tests/org/jetbrains/kotlin/konan/blackboxtest/AbstractNativeCInteropTest.kt @@ -43,6 +43,18 @@ abstract class AbstractNativeCInteropIncludeCategoriesTest : AbstractNativeCInte get() = "dependency.def" } +// This test checks that cinterop-generated declarations have an experimental annotation. +abstract class AbstractNativeCInteropExperimentalTest : AbstractNativeCInteropTest() { + override val fmodules: Boolean + get() = false + + override val defFileName: String + get() = "dependency.def" + + override val ignoreExperimentalForeignApi: Boolean + get() = false +} + @Tag("cinterop") abstract class AbstractNativeCInteropTest : AbstractNativeCInteropBaseTest() { abstract val fmodules: Boolean