blob: cbfd9bc21572b814834ab62306450a94d63e7ed5 [file] [log] [blame]
// RUN: %empty-directory(%t)
// RUN: %target-build-swift %s -module-name=_Test -import-objc-header %S/Inputs/check_class_for_archiving.h -o %t/a.out
// RUN: %target-codesign %t/a.out
// RUN: %target-run %t/a.out
// REQUIRES: executable_test
// REQUIRES: objc_interop
import Foundation
import StdlibUnittest
class SwiftClass {}
class ObjcClass : NSObject {}
private class PrivateClass : NSObject {}
@objc(named_class)
private class NamedClass1 : NSObject {}
@objc(_T3nix11NamedClass2C)
private class NamedClass2 : NSObject {}
class GenericClass<T> : NSObject {}
class DerivedClass : GenericClass<Int> {}
@objc(_T3nix20DerivedClassWithNameC)
private class DerivedClassWithName : GenericClass<Int> {}
struct ABC {
class InnerClass : NSObject {}
}
struct DEF<T> {
class InnerClass : NSObject {}
}
let suite = TestSuite("check_class_for_archiving")
defer { runAllTests() }
let op: Int32 = 0 // archiving
suite.test("SwiftClass") {
expectEqual(0, NSKeyedUnarchiver._swift_checkClassAndWarnForKeyedArchiving(SwiftClass.self, operation: op))
}
suite.test("ObjcClass") {
expectEqual(0, NSKeyedUnarchiver._swift_checkClassAndWarnForKeyedArchiving(ObjcClass.self, operation: op))
}
suite.test("NamedClass1") {
expectEqual(0, NSKeyedUnarchiver._swift_checkClassAndWarnForKeyedArchiving(NamedClass1.self, operation: op))
}
suite.test("NamedClass2") {
expectEqual(0, NSKeyedUnarchiver._swift_checkClassAndWarnForKeyedArchiving(NamedClass2.self, operation: op))
}
suite.test("DerivedClass") {
expectEqual(0, NSKeyedUnarchiver._swift_checkClassAndWarnForKeyedArchiving(DerivedClass.self, operation: op))
}
suite.test("DerivedClassWithName") {
expectEqual(0, NSKeyedUnarchiver._swift_checkClassAndWarnForKeyedArchiving(DerivedClassWithName.self, operation: op))
}
suite.test("NSKeyedUnarchiver") {
expectEqual(0, NSKeyedUnarchiver._swift_checkClassAndWarnForKeyedArchiving(NSKeyedUnarchiver.self, operation: op))
}
// Disable negative tests on older OSes because of rdar://problem/50504765
if #available(iOS 13, macOS 10.15, tvOS 13, watchOS 6, *) {
suite.test("PrivateClass") {
expectNotEqual(0, NSKeyedUnarchiver._swift_checkClassAndWarnForKeyedArchiving(PrivateClass.self, operation: op))
}
}
if #available(macOS 9999, iOS 9999, tvOS 9999, watchOS 9999, *) {
// Generic classes and nested classes were considered to have unstable names
// in earlier releases.
suite.test("GenericClass") {
expectEqual(0, NSKeyedUnarchiver._swift_checkClassAndWarnForKeyedArchiving(GenericClass<Int>.self, operation: op))
}
suite.test("InnerClass") {
print(NSStringFromClass(ABC.InnerClass.self))
expectEqual(0, NSKeyedUnarchiver._swift_checkClassAndWarnForKeyedArchiving(ABC.InnerClass.self, operation: op))
}
suite.test("InnerClass2") {
print(NSStringFromClass(DEF<Int>.InnerClass.self))
expectEqual(0, NSKeyedUnarchiver._swift_checkClassAndWarnForKeyedArchiving(DEF<Int>.InnerClass.self, operation: op))
}
suite.test("LocalClass") {
class LocalClass: NSObject {}
expectNotEqual(0, NSKeyedUnarchiver._swift_checkClassAndWarnForKeyedArchiving(LocalClass.self, operation: op))
}
}