mirror of
https://github.com/apple/swift.git
synced 2025-12-14 20:36:38 +01:00
That OS doesn't have objc_readClassPair(). This test uses -target to explicitly select a newer deployment target and then runs the binary on an old OS to test the behavior. However this means arclite won't get linked in unless we also pass in -link-objc-runtime. Fixes <rdar://problem/50610877>.
172 lines
3.9 KiB
Swift
172 lines
3.9 KiB
Swift
// RUN: %empty-directory(%t)
|
|
// RUN: %target-build-swift %s -module-name=test -DENCODE -o %t/encode
|
|
// RUN: %target-run %t/encode %t/test.arc
|
|
// RUN: plutil -p %t/test.arc | %FileCheck -check-prefix=CHECK-ARCHIVE %s
|
|
|
|
// RUN: %target-build-swift %s -module-name=test -o %t/decode
|
|
// RUN: %target-run %t/decode %t/test.arc --stdlib-unittest-in-process
|
|
|
|
// RUN: %target-build-swift %s -module-name=test -o %t/decode -target x86_64-apple-macosx10.14.4 -link-objc-runtime
|
|
// RUN: %target-run %t/decode %t/test.arc NEW --stdlib-unittest-in-process
|
|
|
|
// REQUIRES: executable_test
|
|
// REQUIRES: objc_interop
|
|
// REQUIRES: OS=macosx
|
|
|
|
import Foundation
|
|
import StdlibUnittest
|
|
|
|
struct ABC {
|
|
// CHECK-ARCHIVE-DAG: "$classname" => "nested_class_coding"
|
|
@objc(nested_class_coding)
|
|
class NestedClass : NSObject, NSCoding {
|
|
var i : Int
|
|
|
|
init(_ ii: Int) {
|
|
i = ii
|
|
}
|
|
|
|
required init(coder aDecoder: NSCoder) {
|
|
i = aDecoder.decodeInteger(forKey: "i")
|
|
}
|
|
|
|
func encode(with aCoder: NSCoder) {
|
|
aCoder.encode(i, forKey: "i")
|
|
}
|
|
}
|
|
}
|
|
|
|
// CHECK-ARCHIVE-DAG: "$classname" => "private_class_coding"
|
|
@objc(private_class_coding)
|
|
private class PrivateClass : NSObject, NSCoding {
|
|
var pi : Int
|
|
|
|
init(_ ii: Int) {
|
|
pi = ii
|
|
}
|
|
|
|
required init(coder aDecoder: NSCoder) {
|
|
pi = aDecoder.decodeInteger(forKey: "pi")
|
|
}
|
|
|
|
func encode(with aCoder: NSCoder) {
|
|
aCoder.encode(pi, forKey: "pi")
|
|
}
|
|
}
|
|
|
|
class GenericClass<T> : NSObject, NSCoding {
|
|
var gi : T? = nil
|
|
|
|
override init() {
|
|
}
|
|
|
|
required init(coder aDecoder: NSCoder) {
|
|
}
|
|
|
|
func encode(with aCoder: NSCoder) {
|
|
}
|
|
}
|
|
|
|
// CHECK-ARCHIVE-DAG: "$classname" => "test.IntClass"
|
|
class IntClass : GenericClass<Int> {
|
|
|
|
init(ii: Int) {
|
|
super.init()
|
|
gi = ii
|
|
}
|
|
|
|
required init(coder aDecoder: NSCoder) {
|
|
super.init(coder: aDecoder)
|
|
gi = aDecoder.decodeInteger(forKey: "gi")
|
|
}
|
|
|
|
override func encode(with aCoder: NSCoder) {
|
|
aCoder.encode(gi!, forKey: "gi")
|
|
}
|
|
}
|
|
|
|
// CHECK-ARCHIVE-DAG: "$classname" => "double_class_coding"
|
|
@objc(double_class_coding)
|
|
class DoubleClass : GenericClass<Double> {
|
|
|
|
init(dd: Double) {
|
|
super.init()
|
|
gi = dd
|
|
}
|
|
|
|
required init(coder aDecoder: NSCoder) {
|
|
super.init(coder: aDecoder)
|
|
gi = aDecoder.decodeDouble(forKey: "gi")
|
|
}
|
|
|
|
override func encode(with aCoder: NSCoder) {
|
|
aCoder.encode(gi!, forKey: "gi")
|
|
}
|
|
}
|
|
|
|
// CHECK-ARCHIVE-DAG: "$classname" => "top_level_coding"
|
|
@objc(top_level_coding)
|
|
class TopLevel : NSObject, NSCoding {
|
|
var tli : Int
|
|
|
|
var nested: ABC.NestedClass?
|
|
fileprivate var priv: PrivateClass?
|
|
var intc : IntClass?
|
|
var doublec : DoubleClass?
|
|
|
|
init(_ ii: Int) {
|
|
tli = ii
|
|
}
|
|
|
|
required init(coder aDecoder: NSCoder) {
|
|
tli = aDecoder.decodeInteger(forKey: "tli")
|
|
nested = aDecoder.decodeObject(forKey: "nested") as? ABC.NestedClass
|
|
priv = aDecoder.decodeObject(forKey: "priv") as? PrivateClass
|
|
intc = aDecoder.decodeObject(forKey: "int") as? IntClass
|
|
doublec = aDecoder.decodeObject(forKey: "double") as? DoubleClass
|
|
}
|
|
|
|
func encode(with aCoder: NSCoder) {
|
|
aCoder.encode(tli, forKey: "tli")
|
|
aCoder.encode(nested, forKey: "nested")
|
|
aCoder.encode(priv, forKey: "priv")
|
|
aCoder.encode(intc, forKey: "int")
|
|
aCoder.encode(doublec, forKey: "double")
|
|
}
|
|
}
|
|
|
|
#if ENCODE
|
|
let c = TopLevel(27)
|
|
c.nested = ABC.NestedClass(28)
|
|
c.priv = PrivateClass(29)
|
|
c.intc = IntClass(ii: 42)
|
|
c.doublec = DoubleClass(dd: 3.14)
|
|
|
|
NSKeyedArchiver.archiveRootObject(c, toFile: CommandLine.arguments[1])
|
|
#else
|
|
var DecodeTestSuite = TestSuite("Decode")
|
|
|
|
DecodeTestSuite.test("Decode") {
|
|
func doIt() {
|
|
let u = NSKeyedUnarchiver.unarchiveObject(withFile: CommandLine.arguments[1])!
|
|
let x = u as! TopLevel
|
|
expectEqual(27, x.tli)
|
|
expectEqual(28, x.nested!.i)
|
|
expectEqual(29, x.priv!.pi)
|
|
expectEqual(42, x.intc!.gi!)
|
|
expectEqual(3.14, x.doublec!.gi!)
|
|
}
|
|
|
|
if CommandLine.arguments[2] == "NEW" {
|
|
if #available(macOS 10.14.4, *) {
|
|
doIt()
|
|
}
|
|
return
|
|
}
|
|
|
|
doIt()
|
|
}
|
|
|
|
runAllTests()
|
|
#endif
|