Skip to content

Commit b1ba6f3

Browse files
Added tests for let properties to Mirror
1 parent 5f0f3e4 commit b1ba6f3

File tree

1 file changed

+241
-2
lines changed

1 file changed

+241
-2
lines changed

test/stdlib/WeakMirror.swift

+241-2
Original file line numberDiff line numberDiff line change
@@ -14,9 +14,9 @@
1414
// RUN: if [ %target-runtime == "objc" ]; \
1515
// RUN: then \
1616
// RUN: %target-clang %S/Inputs/Mirror/Mirror.mm -c -o %t/Mirror.mm.o -g && \
17-
// RUN: %target-build-swift -Xfrontend -disable-access-control %s -I %S/Inputs/Mirror/ -Xlinker %t/Mirror.mm.o -o %t/Mirror; \
17+
// RUN: %target-build-swift -Xfrontend -disable-access-control -Xfrontend -enable-experimental-feature -Xfrontend WeakLet %s -I %S/Inputs/Mirror/ -Xlinker %t/Mirror.mm.o -o %t/Mirror; \
1818
// RUN: else \
19-
// RUN: %target-build-swift %s -Xfrontend -disable-access-control -o %t/Mirror; \
19+
// RUN: %target-build-swift %s -Xfrontend -disable-access-control -Xfrontend -enable-experimental-feature -Xfrontend WeakLet -o %t/Mirror; \
2020
// RUN: fi
2121
// RUN: %target-codesign %t/Mirror
2222
// RUN: %target-run %t/Mirror
@@ -123,6 +123,91 @@ mirrors.test("class/NativeSwiftClassHasNativeWeakReferenceNoLeak") {
123123
expectNil(verifier)
124124
}
125125

126+
#if hasFeature(WeakLet)
127+
class NativeSwiftClassHasWeakLet {
128+
weak let weakProperty: AnyObject?
129+
let x: Int
130+
init(x: Int, weakProperty: AnyObject?) {
131+
self.x = x
132+
self.weakProperty = weakProperty
133+
}
134+
}
135+
136+
class NativeSwiftClassHasNativeClassBoundExistentialLet {
137+
weak let weakProperty: NativeClassBoundExistential?
138+
let x: Int
139+
init(x: Int, weakProperty: NativeClassBoundExistential?) {
140+
self.x = x
141+
self.weakProperty = weakProperty
142+
}
143+
}
144+
145+
struct StructHasNativeWeakLetReference {
146+
weak let weakProperty: AnyObject?
147+
let x: Int
148+
init(x: Int, weakProperty: AnyObject?) {
149+
self.x = x
150+
self.weakProperty = weakProperty
151+
}
152+
}
153+
154+
mirrors.test("class/NativeSwiftClassHasNativeWeakLetReference") {
155+
let child = NativeSwiftClass(x: 2020)
156+
let parent = NativeSwiftClassHasWeakLet(x: 1010, weakProperty: child)
157+
let mirror = Mirror(reflecting: parent)
158+
let children = Array(mirror.children)
159+
let extractedChild = children[0].1 as! NativeSwiftClass
160+
expectNotEqual(parent.x, extractedChild.x)
161+
expectEqual(ObjectIdentifier(child), ObjectIdentifier(extractedChild))
162+
expectEqual(child.x, extractedChild.x)
163+
print(extractedChild)
164+
}
165+
166+
mirrors.test("class/NativeSwiftClassHasNativeClassBoundExistentialLet") {
167+
let child = NativeSwiftClass(x: 2020) as NativeClassBoundExistential
168+
let parent = NativeSwiftClassHasNativeClassBoundExistentialLet(x: 1010, weakProperty: child)
169+
let mirror = Mirror(reflecting: parent)
170+
let children = Array(mirror.children)
171+
let extractedChild = children[0].1 as! NativeSwiftClass
172+
expectNotEqual(parent.x, extractedChild.x)
173+
expectEqual(ObjectIdentifier(child), ObjectIdentifier(extractedChild))
174+
expectEqual(child.x, extractedChild.x)
175+
print(extractedChild)
176+
}
177+
178+
mirrors.test("struct/StructHasNativeWeakLetReference") {
179+
let child = NativeSwiftClass(x: 2020)
180+
var parent = StructHasNativeWeakLetReference(x: 1010, weakProperty: child)
181+
let mirror = Mirror(reflecting: parent)
182+
let children = Array(mirror.children)
183+
let extractedChild = children[0].1 as! NativeSwiftClass
184+
expectNotEqual(parent.x, extractedChild.x)
185+
expectEqual(ObjectIdentifier(child), ObjectIdentifier(extractedChild))
186+
expectEqual(child.x, extractedChild.x)
187+
print(extractedChild)
188+
}
189+
190+
// https://github.com/apple/swift/issues/51384
191+
// Using 'Mirror' to access a weak reference results in object being
192+
// retained indefinitely
193+
mirrors.test("class/NativeSwiftClassHasNativeWeakLetReferenceNoLeak") {
194+
weak var verifier: AnyObject?
195+
do {
196+
let child = NativeSwiftClass(x: 2020)
197+
verifier = child
198+
let parent = NativeSwiftClassHasWeakLet(x: 1010, weakProperty: child)
199+
let mirror = Mirror(reflecting: parent)
200+
let children = Array(mirror.children)
201+
let extractedChild = children[0].1 as! NativeSwiftClass
202+
expectNotNil(extractedChild)
203+
expectNotNil(verifier)
204+
// If child is destroyed, the above cast and checks will fail.
205+
_fixLifetime(child)
206+
}
207+
expectNil(verifier)
208+
}
209+
#endif
210+
126211
#if _runtime(_ObjC)
127212

128213
import Foundation
@@ -292,6 +377,160 @@ mirrors.test("struct/StructHasObjCClassBoundExistential") {
292377
print(extractedChild)
293378
}
294379

380+
#if hasFeature(WeakLet)
381+
382+
class NativeSwiftClassHasObjCClassBoundExistentialLet {
383+
weak let weakProperty: ObjCClassExistential?
384+
let x: Int
385+
init(x: Int, weakProperty: ObjCClassExistential?) {
386+
self.x = x
387+
self.weakProperty = weakProperty
388+
}
389+
}
390+
391+
class ObjCClassHasWeakLet : NSObject {
392+
weak let weakProperty: AnyObject?
393+
let x: Int
394+
init(x: Int, weakProperty: AnyObject?) {
395+
self.x = x
396+
self.weakProperty = weakProperty
397+
}
398+
}
399+
400+
class ObjCClassHasNativeClassBoundExistentialLet : NSObject {
401+
weak let weakProperty: NativeClassBoundExistential?
402+
let x: Int
403+
init(x: Int, weakProperty: NativeClassBoundExistential?) {
404+
self.x = x
405+
self.weakProperty = weakProperty
406+
}
407+
}
408+
409+
class ObjCClassHasObjCClassBoundExistentialLet : NSObject {
410+
weak let weakProperty: ObjCClassExistential?
411+
let x: Int
412+
init(x: Int, weakProperty: ObjCClassExistential?) {
413+
self.x = x
414+
self.weakProperty = weakProperty
415+
}
416+
}
417+
418+
struct StructHasObjCWeakLetReference {
419+
weak let weakProperty: ObjCClass?
420+
let x: Int
421+
init(x: Int, weakProperty: ObjCClass?) {
422+
self.x = x
423+
self.weakProperty = weakProperty
424+
}
425+
}
426+
427+
struct StructHasObjCClassBoundExistentialLet {
428+
weak let weakProperty: ObjCClassExistential?
429+
let x: Int
430+
init(x: Int, weakProperty: ObjCClassExistential?) {
431+
self.x = x
432+
self.weakProperty = weakProperty
433+
}
434+
}
435+
436+
mirrors.test("class/NativeSwiftClassHasObjCWeakLetReference") {
437+
let child = ObjCClass(x: 2020)
438+
let parent = NativeSwiftClassHasWeakLet(x: 1010, weakProperty: child)
439+
let mirror = Mirror(reflecting: parent)
440+
let children = Array(mirror.children)
441+
let extractedChild = children[0].1 as! ObjCClass
442+
expectNotEqual(parent.x, extractedChild.x)
443+
expectEqual(ObjectIdentifier(child), ObjectIdentifier(extractedChild))
444+
expectEqual(child.x, extractedChild.x)
445+
print(extractedChild)
446+
}
447+
448+
mirrors.test("class/NativeSwiftClassHasObjCClassBoundExistentialLet") {
449+
let child = ObjCClass(x: 2020) as ObjCClassExistential
450+
let parent = NativeSwiftClassHasObjCClassBoundExistentialLet(x: 1010, weakProperty: child)
451+
let mirror = Mirror(reflecting: parent)
452+
let children = Array(mirror.children)
453+
let extractedChild = children[0].1 as! ObjCClass
454+
expectNotEqual(parent.x, extractedChild.x)
455+
expectEqual(ObjectIdentifier(child), ObjectIdentifier(extractedChild))
456+
expectEqual(child.x, extractedChild.x)
457+
print(extractedChild)
458+
}
459+
460+
mirrors.test("class/ObjCClassHasNativeWeakLet") {
461+
let child = NativeSwiftClass(x: 2020)
462+
let parent = ObjCClassHasWeakLet(x: 1010, weakProperty: child)
463+
let mirror = Mirror(reflecting: parent)
464+
let children = Array(mirror.children)
465+
let extractedChild = children[0].1 as! NativeSwiftClass
466+
expectNotEqual(parent.x, extractedChild.x)
467+
expectEqual(ObjectIdentifier(child), ObjectIdentifier(extractedChild))
468+
expectEqual(child.x, extractedChild.x)
469+
print(extractedChild)
470+
}
471+
472+
mirrors.test("class/ObjcCClassHasObjCWeakLetReference") {
473+
let child = ObjCClass(x: 2020)
474+
let parent = ObjCClassHasWeakLet(x: 1010, weakProperty: child)
475+
let mirror = Mirror(reflecting: parent)
476+
let children = Array(mirror.children)
477+
let extractedChild = children[0].1 as! ObjCClass
478+
expectNotEqual(parent.x, extractedChild.x)
479+
expectEqual(ObjectIdentifier(child), ObjectIdentifier(extractedChild))
480+
expectEqual(child.x, extractedChild.x)
481+
print(extractedChild)
482+
}
483+
484+
mirrors.test("class/ObjCClassHasNativeClassBoundExistentialLet") {
485+
let child = NativeSwiftClass(x: 2020) as NativeClassBoundExistential
486+
let parent = ObjCClassHasNativeClassBoundExistentialLet(x: 1010, weakProperty: child)
487+
let mirror = Mirror(reflecting: parent)
488+
let children = Array(mirror.children)
489+
let extractedChild = children[0].1 as! NativeSwiftClass
490+
expectNotEqual(parent.x, extractedChild.x)
491+
expectEqual(ObjectIdentifier(child), ObjectIdentifier(extractedChild))
492+
expectEqual(child.x, extractedChild.x)
493+
print(extractedChild)
494+
}
495+
496+
mirrors.test("class/ObjCClassHasObjCClassBoundExistentialLet") {
497+
let child = ObjCClass(x: 2020) as ObjCClassExistential
498+
let parent = ObjCClassHasObjCClassBoundExistentialLet(x: 1010, weakProperty: child)
499+
let mirror = Mirror(reflecting: parent)
500+
let children = Array(mirror.children)
501+
let extractedChild = children[0].1 as! ObjCClass
502+
expectNotEqual(parent.x, extractedChild.x)
503+
expectEqual(ObjectIdentifier(child), ObjectIdentifier(extractedChild))
504+
expectEqual(child.x, extractedChild.x)
505+
print(extractedChild)
506+
}
507+
508+
mirrors.test("struct/StructHasObjCWeakLetReference") {
509+
let child = ObjCClass(x: 2020)
510+
var parent = StructHasObjCWeakLetReference(x: 1010, weakProperty: child)
511+
let mirror = Mirror(reflecting: parent)
512+
let children = Array(mirror.children)
513+
let extractedChild = children[0].1 as! ObjCClass
514+
expectNotEqual(parent.x, extractedChild.x)
515+
expectEqual(ObjectIdentifier(child), ObjectIdentifier(extractedChild))
516+
expectEqual(child.x, extractedChild.x)
517+
print(extractedChild)
518+
}
519+
520+
mirrors.test("struct/StructHasObjCClassBoundExistentialLet") {
521+
let child = ObjCClass(x: 2020) as ObjCClassExistential
522+
var parent = StructHasObjCClassBoundExistentialLet(x: 1010, weakProperty: child)
523+
let mirror = Mirror(reflecting: parent)
524+
let children = Array(mirror.children)
525+
let extractedChild = children[0].1 as! ObjCClass
526+
expectNotEqual(parent.x, extractedChild.x)
527+
expectEqual(ObjectIdentifier(child), ObjectIdentifier(extractedChild))
528+
expectEqual(child.x, extractedChild.x)
529+
print(extractedChild)
530+
}
531+
532+
#endif
533+
295534
#endif
296535

297536
runAllTests()

0 commit comments

Comments
 (0)