11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
|
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
|
-
+
+
-
+
+
|
* Public License, either version 2 or 3, which can be found in the file
* LICENSE.GPLv2 or LICENSE.GPLv3 respectively included in the packaging of this
* file.
*/
#include "config.h"
#import "TestsAppDelegate.h"
#import "ObjFW.h"
#import "ObjFWTest.h"
static OFString *const module = @"OFBlock";
@interface OFBlockTests: OTTestCase
@end
#if defined(OF_OBJFW_RUNTIME)
extern struct objc_class _NSConcreteStackBlock;
extern struct objc_class _NSConcreteGlobalBlock;
extern struct objc_class _NSConcreteMallocBlock;
#elif defined(OF_APPLE_RUNTIME)
extern void *_NSConcreteStackBlock;
|
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
|
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
|
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
-
-
-
-
-
-
-
-
-
-
-
-
-
+
-
-
-
-
-
-
+
-
-
+
-
-
-
-
-
-
-
-
-
-
-
-
|
block();
Block_release(block);
return d;
}
@implementation TestsAppDelegate (OFBlockTests)
- (void)blockTests
{
void *pool = objc_autoreleasePoolPush();
@implementation OFBlockTests
- (void)testClassOfStackBlock
{
__block int x;
void (^stackBlock)(void) = ^ {
x = 0;
(void)x;
};
OTAssertEqual((Class)&_NSConcreteStackBlock,
objc_getClass("OFStackBlock"));
OTAssertTrue([stackBlock isKindOfClass: [OFBlock class]]);
}
#if !defined(OF_WINDOWS) || !defined(__clang__)
- (void)testClassOfGlobalBlock
{
OTAssertEqual((Class)&_NSConcreteGlobalBlock,
objc_getClass("OFGlobalBlock"));
OTAssertTrue([globalBlock isKindOfClass: [OFBlock class]]);
}
#endif
- (void)testClassOfMallocBlock
{
OTAssertEqual((Class)&_NSConcreteMallocBlock,
objc_getClass("OFMallocBlock"));
}
- (void)testCopyStackBlock
{
__block int x;
void (^stackBlock)(void) = ^ {
x = 0;
(void)x;
};
void (^mallocBlock)(void);
mallocBlock = [[stackBlock copy] autorelease];
OTAssertEqual([mallocBlock class], objc_getClass("OFMallocBlock"));
OTAssertTrue([mallocBlock isKindOfClass: [OFBlock class]]);
}
- (void)testCopyStackBlockAndReferenceVariable
{
OTAssertEqual(forwardTest(), 5);
}
- (void)testCopyStackBlockAndReferenceCopiedVariable
{
int (^voidBlock)(void) = returnStackBlock();
OTAssertEqual(voidBlock(), 43);
OTAssertEqual(voidBlock(), 44);
OTAssertEqual(voidBlock(), 45);
}
#if !defined(OF_WINDOWS) || !defined(__clang__)
- (void)testCopyGlobalBlock
{
OTAssertEqual([[globalBlock copy] autorelease], (id)globalBlock);
}
#endif
- (void)testCopyMallocBlock
{
__block int x;
void (^stackBlock)(void) = ^ {
x = 0;
(void)x;
};
void (^mallocBlock)(void);
int (^voidBlock)(void);
TEST(@"Class of stack block",
(Class)&_NSConcreteStackBlock == objc_getClass("OFStackBlock") &&
[stackBlock isKindOfClass: [OFBlock class]])
#if !defined(OF_WINDOWS) || !defined(__clang__)
TEST(@"Class of global block",
(Class)&_NSConcreteGlobalBlock == objc_getClass("OFGlobalBlock") &&
[globalBlock isKindOfClass: [OFBlock class]])
#endif
TEST(@"Class of a malloc block",
(Class)&_NSConcreteMallocBlock == objc_getClass("OFMallocBlock"))
TEST(@"Copying a stack block",
(mallocBlock = [[stackBlock copy] autorelease]) &&
mallocBlock = [[stackBlock copy] autorelease];
[mallocBlock class] == objc_getClass("OFMallocBlock") &&
[mallocBlock isKindOfClass: [OFBlock class]])
TEST(@"Copying a stack block and referencing its variable",
forwardTest() == 5)
TEST(@"Copying a stack block and using its copied variable",
(voidBlock = returnStackBlock()) && voidBlock() == 43 &&
voidBlock() == 44 && voidBlock() == 45)
#if !defined(OF_WINDOWS) || !defined(__clang__)
TEST(@"Copying a global block",
(id)globalBlock == [[globalBlock copy] autorelease])
OTAssertEqual([[mallocBlock copy] autorelease], (id)mallocBlock);
#endif
#ifndef __clang_analyzer__
TEST(@"Copying a malloc block",
(id)mallocBlock == [mallocBlock copy] &&
[mallocBlock retainCount] == 2)
OTAssertEqual([mallocBlock retainCount], 2);
#endif
}
TEST(@"Autorelease a stack block", R([stackBlock autorelease]))
#if !defined(OF_WINDOWS) || !defined(__clang__)
TEST(@"Autorelease a global block", R([globalBlock autorelease]))
#endif
#ifndef __clang_analyzer__
TEST(@"Autorelease a malloc block", R([mallocBlock autorelease]))
#endif
objc_autoreleasePoolPop(pool);
}
@end
|