|
2 | 2 | // RUN: mkdir -p %t
|
3 | 3 | //
|
4 | 4 | // RUN: %target-clang -fobjc-arc %S/Inputs/ObjCClasses/ObjCClasses.m -c -o %t/ObjCClasses.o
|
5 |
| -// RUN: %target-build-swift -Xfrontend -enable-import-objc-generics -I %S/Inputs/ObjCClasses/ -Xlinker %t/ObjCClasses.o %s -o %t/a.out |
6 |
| -// RUN: %target-run %t/a.out | FileCheck %s |
| 5 | +// RUN: %target-build-swift -Xfrontend -enable-import-objc-generics -I %S/Inputs/ObjCClasses/ %t/ObjCClasses.o %s -o %t/a.out |
| 6 | +// RUN: %target-run %t/a.out |
7 | 7 |
|
8 | 8 | // REQUIRES: executable_test
|
| 9 | +// XFAIL: interpret |
9 | 10 | // REQUIRES: objc_interop
|
10 | 11 |
|
11 | 12 | import Foundation
|
| 13 | +import StdlibUnittest |
12 | 14 | import ObjCClasses
|
13 | 15 |
|
14 |
| -let cs = Container<NSString>(object: "i-just-met-you") |
15 |
| -print(cs) |
16 |
| -// CHECK: <Container: {{.*}}> |
17 |
| -print(cs.object) |
18 |
| -// CHECK: i-just-met-you |
19 |
| - |
20 |
| -cs.processObjectWithBlock { s in print("in block: \(s)!!!") } |
21 |
| -// CHECK: in block: i-just-met-you!!! |
22 |
| -cs.getObjectWithBlock { () in NSString(string: "this-is-crazy") } |
23 |
| -print(cs.object) |
24 |
| -// CHECK: this-is-crazy |
25 |
| -cs.object = "so-heres-my-number" |
26 |
| -print(cs.object) |
27 |
| -// CHECK: so-heres-my-number |
28 |
| - |
29 |
| -let cs2 = Container<NSString>(object: "call-me-maybe") |
30 |
| -print(cs2.getCat1()) |
31 |
| -// CHECK: call-me-maybe |
32 |
| -cs2.setCat1(":)") |
33 |
| -print(cs2.cat1Property) |
34 |
| -// CHECK: :) |
35 |
| - |
36 |
| -let scs = SubContainer<NSString>(object: "hey neat") |
37 |
| -print(scs.object) |
38 |
| -// CHECK: hey neat |
39 |
| - |
40 |
| -let nestedContainer = NestedContainer<NSString>(object: Container<NSString>(object: "cat")) |
41 |
| -print(nestedContainer.object.object) |
42 |
| -// CHECK: cat |
43 |
| - |
44 |
| -let stringContainer = StringContainer(object: "stringy") |
45 |
| -print(stringContainer.object) |
46 |
| -// CHECK: stringy |
| 16 | +var ImportedObjCGenerics = TestSuite("ImportedObjCGenerics") |
| 17 | + |
| 18 | +ImportedObjCGenerics.test("Creation") { |
| 19 | + let cs = Container<NSString>(object: "i-just-met-you") |
| 20 | + expectEqual("i-just-met-you", cs.object) |
| 21 | + expectTrue(cs.dynamicType === Container<NSString>.self) |
| 22 | + expectTrue(cs.dynamicType === Container<AnyObject>.self) |
| 23 | +} |
| 24 | + |
| 25 | +ImportedObjCGenerics.test("Blocks") { |
| 26 | + let cs = Container<NSString>(object: "and-this-is-crazy") |
| 27 | + |
| 28 | + var fromBlock: NSString = "" |
| 29 | + cs.processObjectWithBlock { fromBlock = $0 } |
| 30 | + expectEqual("and-this-is-crazy", fromBlock) |
| 31 | + |
| 32 | + cs.updateObjectWithBlock { "but-heres-my-number" } |
| 33 | + expectEqual("but-heres-my-number", cs.object) |
| 34 | +} |
| 35 | + |
| 36 | +ImportedObjCGenerics.test("Categories") { |
| 37 | + let cs = Container<NSString>(cat1: "so-call-me-maybe") |
| 38 | + expectEqual("so-call-me-maybe", cs.getCat1()) |
| 39 | + |
| 40 | + cs.setCat1("its-hard-to-look-right") |
| 41 | + expectEqual("its-hard-to-look-right", cs.cat1Property) |
| 42 | +} |
| 43 | + |
| 44 | +ImportedObjCGenerics.test("Subclasses") { |
| 45 | + let subContainer = SubContainer<NSString>(object: "at-you-baby") |
| 46 | + expectEqual("at-you-baby", subContainer.object) |
| 47 | + |
| 48 | + let nestedContainer = NestedContainer<NSString>(object: Container(object: "but-heres-my-number")) |
| 49 | + expectEqual("but-heres-my-number", nestedContainer.object.object) |
| 50 | + |
| 51 | + let stringContainer = StringContainer(object: "so-call-me-maybe") |
| 52 | + expectEqual("so-call-me-maybe", stringContainer.object) |
| 53 | +} |
| 54 | + |
| 55 | +ImportedObjCGenerics.test("SwiftGenerics") { |
| 56 | + func openContainer<T: AnyObject>(x: Container<T>) -> T { |
| 57 | + return x.object |
| 58 | + } |
| 59 | + func openStringContainer<T: Container<NSString>>(x: T) -> NSString { |
| 60 | + return x.object |
| 61 | + } |
| 62 | + func openArbitraryContainer<S: AnyObject, T: Container<S>>(x: T) -> S { |
| 63 | + return x.object |
| 64 | + } |
| 65 | + |
| 66 | + let scs = SubContainer<NSString>(object: "before-you-came-into-my-life") |
| 67 | + expectEqual("before-you-came-into-my-life", openContainer(scs)) |
| 68 | + expectEqual("before-you-came-into-my-life", openStringContainer(scs)) |
| 69 | + expectEqual("before-you-came-into-my-life", openArbitraryContainer(scs)) |
| 70 | + |
| 71 | + let cs = Container<NSString>(object: "i-missed-you-so-bad") |
| 72 | + expectEqual("i-missed-you-so-bad", openContainer(cs)) |
| 73 | + expectEqual("i-missed-you-so-bad", openStringContainer(cs)) |
| 74 | + expectEqual("i-missed-you-so-bad", openArbitraryContainer(cs)) |
| 75 | + |
| 76 | + let strContainer = SubContainer<NSString>(object: "i-missed-you-so-so-bad") |
| 77 | + expectEqual("i-missed-you-so-so-bad", openContainer(strContainer)) |
| 78 | + expectEqual("i-missed-you-so-so-bad", openStringContainer(strContainer)) |
| 79 | + expectEqual("i-missed-you-so-so-bad", openArbitraryContainer(strContainer)) |
| 80 | + |
| 81 | + let numContainer = Container<NSNumber>(object: NSNumber(integer: 21)) |
| 82 | + expectEqual(NSNumber(integer: 21), openContainer(numContainer)) |
| 83 | + expectEqual(NSNumber(integer: 21), openArbitraryContainer(numContainer)) |
| 84 | + |
| 85 | + let subNumContainer = SubContainer<NSNumber>(object: NSNumber(integer: 22)) |
| 86 | + expectEqual(NSNumber(integer: 22), openContainer(subNumContainer)) |
| 87 | + expectEqual(NSNumber(integer: 22), openArbitraryContainer(subNumContainer)) |
| 88 | +} |
47 | 89 |
|
48 | 90 | // TODO: resolve crash in IRGen from test case below
|
49 | 91 | /*func makeContainer<T: AnyObject>(x: T) -> Container<T> {*/
|
50 | 92 | /*return Container(object: x)*/
|
51 | 93 | /*}*/
|
52 | 94 |
|
53 |
| -func openContainer<T: AnyObject>(x: Container<T>) -> T { |
54 |
| - return x.object |
| 95 | +ImportedObjCGenerics.test("SwiftGenerics/Creation") { |
| 96 | + // TODO: Test above. |
55 | 97 | }
|
56 |
| -print(openContainer(Container<NSString>(object: "some string"))) |
57 |
| -// CHECK: some string |
58 | 98 |
|
59 |
| -func openStringContainer<T: Container<NSString>>(x: T) -> NSString { |
60 |
| - return x.object |
61 |
| -} |
62 |
| -print(openStringContainer(Container<NSString>(object: "some string"))) |
63 |
| -// CHECK: some string |
64 |
| -print(openStringContainer(SubContainer<NSString>(object: "some string 2"))) |
65 |
| -// CHECK: some string 2 |
66 |
| -print(openStringContainer(StringContainer(object: "some string 3"))) |
67 |
| -// CHECK: some string 3 |
68 |
| - |
69 |
| -func openArbitraryContainer<S: AnyObject, T: Container<S>>(x: T) -> S { |
70 |
| - return x.object |
71 |
| -} |
72 |
| -print(openArbitraryContainer(Container<NSString>(object: "some string 4"))) |
73 |
| -// CHECK: some string 4 |
74 |
| -print(openArbitraryContainer(Container<NSNumber>(object: NSNumber(integer: 5))) as NSNumber) |
75 |
| -// CHECK: 5 |
76 |
| - |
77 |
| -let _ = CopyingContainer<NSString>() |
78 |
| -func copyContainerContents<T: NSCopying>(x: CopyingContainer<T>) -> T { |
79 |
| - return x.object.copyWithZone(nil) as! T |
| 99 | +ImportedObjCGenerics.test("ProtocolConstraints") { |
| 100 | + func copyContainerContents<T: NSCopying>(x: CopyingContainer<T>) -> T { |
| 101 | + return x.object.copyWithZone(nil) as! T |
| 102 | + } |
| 103 | + |
| 104 | + let cs = CopyingContainer<NSString>(object: "Happy 2012") |
| 105 | + expectEqual("Happy 2012", copyContainerContents(cs)) |
80 | 106 | }
|
81 | 107 |
|
82 |
| -func makeContainedAnimalMakeNoise<T: Animal>(x: AnimalContainer<T>) { |
83 |
| - x.object.makeNoise() |
| 108 | +ImportedObjCGenerics.test("ClassConstraints") { |
| 109 | + func makeContainedAnimalMakeNoise<T>(x: AnimalContainer<T>) -> NSString { |
| 110 | + return x.object.noise |
| 111 | + } |
| 112 | + let petCarrier = AnimalContainer(object: Dog()) |
| 113 | + expectEqual("woof", makeContainedAnimalMakeNoise(petCarrier)) |
84 | 114 | }
|
85 |
| -makeContainedAnimalMakeNoise(AnimalContainer(object: Dog())) |
86 |
| -// CHECK: woof |
| 115 | + |
| 116 | +runAllTests() |
0 commit comments