Skip to content

Commit 3b5e095

Browse files
committed
Add some tests, fix some tests
- Test safeClassNameForObject: - Test safeObject:respondsToSelector: - Fix testAssumptionsAboutClasses: which was incorrectly written
1 parent c7850df commit 3b5e095

File tree

4 files changed

+87
-6
lines changed

4 files changed

+87
-6
lines changed

FLEX.xcodeproj/project.pbxproj

+23-5
Original file line numberDiff line numberDiff line change
@@ -204,6 +204,7 @@
204204
C36B096623E0D4A1008F5D47 /* UIMenu+FLEX.m in Sources */ = {isa = PBXBuildFile; fileRef = C36B096423E0D4A1008F5D47 /* UIMenu+FLEX.m */; };
205205
C36B097023E1EDCD008F5D47 /* FLEXTableViewSection.h in Headers */ = {isa = PBXBuildFile; fileRef = C36B096E23E1EDCD008F5D47 /* FLEXTableViewSection.h */; settings = {ATTRIBUTES = (Public, ); }; };
206206
C36B097123E1EDCD008F5D47 /* FLEXTableViewSection.m in Sources */ = {isa = PBXBuildFile; fileRef = C36B096F23E1EDCD008F5D47 /* FLEXTableViewSection.m */; };
207+
C36E1B26259D64CC00FEFEF6 /* FLEXNewRootClass.m in Sources */ = {isa = PBXBuildFile; fileRef = C36E1B25259D64CC00FEFEF6 /* FLEXNewRootClass.m */; settings = {COMPILER_FLAGS = "-fno-objc-arc"; }; };
207208
C36FBFCB230F3B98008D95D5 /* FLEXMirror.m in Sources */ = {isa = PBXBuildFile; fileRef = C36FBFB9230F3B97008D95D5 /* FLEXMirror.m */; };
208209
C36FBFCC230F3B98008D95D5 /* FLEXProtocolBuilder.h in Headers */ = {isa = PBXBuildFile; fileRef = C36FBFBA230F3B97008D95D5 /* FLEXProtocolBuilder.h */; settings = {ATTRIBUTES = (Public, ); }; };
209210
C36FBFCD230F3B98008D95D5 /* FLEXMethod.m in Sources */ = {isa = PBXBuildFile; fileRef = C36FBFBB230F3B97008D95D5 /* FLEXMethod.m */; };
@@ -567,6 +568,8 @@
567568
C36B096423E0D4A1008F5D47 /* UIMenu+FLEX.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = "UIMenu+FLEX.m"; sourceTree = "<group>"; };
568569
C36B096E23E1EDCD008F5D47 /* FLEXTableViewSection.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = FLEXTableViewSection.h; sourceTree = "<group>"; };
569570
C36B096F23E1EDCD008F5D47 /* FLEXTableViewSection.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = FLEXTableViewSection.m; sourceTree = "<group>"; };
571+
C36E1B24259D64CC00FEFEF6 /* FLEXNewRootClass.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = FLEXNewRootClass.h; sourceTree = "<group>"; };
572+
C36E1B25259D64CC00FEFEF6 /* FLEXNewRootClass.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = FLEXNewRootClass.m; sourceTree = "<group>"; };
570573
C36FBFB9230F3B97008D95D5 /* FLEXMirror.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = FLEXMirror.m; sourceTree = "<group>"; };
571574
C36FBFBA230F3B97008D95D5 /* FLEXProtocolBuilder.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FLEXProtocolBuilder.h; sourceTree = "<group>"; };
572575
C36FBFBB230F3B97008D95D5 /* FLEXMethod.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = FLEXMethod.m; sourceTree = "<group>"; };
@@ -738,6 +741,7 @@
738741
1C27A8B81F0E5A0400F0D02D /* FLEXTestsMethodsList.m */,
739742
C3854DEF23F36C1700FCD1E2 /* FLEXTypeEncodingParserTests.m */,
740743
1C27A8BA1F0E5A0400F0D02D /* Info.plist */,
744+
C36E1B27259D64D300FEFEF6 /* Supporting Files */,
741745
);
742746
path = FLEXTests;
743747
sourceTree = "<group>";
@@ -1180,6 +1184,15 @@
11801184
path = Cells;
11811185
sourceTree = "<group>";
11821186
};
1187+
C36E1B27259D64D300FEFEF6 /* Supporting Files */ = {
1188+
isa = PBXGroup;
1189+
children = (
1190+
C36E1B24259D64CC00FEFEF6 /* FLEXNewRootClass.h */,
1191+
C36E1B25259D64CC00FEFEF6 /* FLEXNewRootClass.m */,
1192+
);
1193+
path = "Supporting Files";
1194+
sourceTree = "<group>";
1195+
};
11831196
C36FBFB8230F3B52008D95D5 /* Runtime */ = {
11841197
isa = PBXGroup;
11851198
children = (
@@ -1658,7 +1671,7 @@
16581671
3A4C941E1B5B20570088C3F2 = {
16591672
CreatedOnToolsVersion = 6.4;
16601673
LastSwiftMigration = 1130;
1661-
ProvisioningStyle = Manual;
1674+
ProvisioningStyle = Automatic;
16621675
};
16631676
};
16641677
};
@@ -1704,6 +1717,7 @@
17041717
isa = PBXSourcesBuildPhase;
17051718
buildActionMask = 2147483647;
17061719
files = (
1720+
C36E1B26259D64CC00FEFEF6 /* FLEXNewRootClass.m in Sources */,
17071721
C33C825B23159EAF00DD2451 /* FLEXTests.m in Sources */,
17081722
1C27A8B91F0E5A0400F0D02D /* FLEXTestsMethodsList.m in Sources */,
17091723
C3854DF023F36C1700FCD1E2 /* FLEXTypeEncodingParserTests.m in Sources */,
@@ -2047,9 +2061,10 @@
20472061
CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = NO;
20482062
CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = NO;
20492063
CLANG_WARN_STRICT_PROTOTYPES = NO;
2050-
CODE_SIGN_IDENTITY = "";
2064+
CODE_SIGN_IDENTITY = "Apple Development";
20512065
"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "";
2052-
CODE_SIGN_STYLE = Manual;
2066+
"CODE_SIGN_IDENTITY[sdk=macosx*]" = "Apple Development";
2067+
CODE_SIGN_STYLE = Automatic;
20532068
DEFINES_MODULE = YES;
20542069
DEVELOPMENT_TEAM = "";
20552070
DYLIB_COMPATIBILITY_VERSION = 1;
@@ -2066,6 +2081,7 @@
20662081
PRODUCT_BUNDLE_IDENTIFIER = "com.flipboard.$(PRODUCT_NAME:rfc1034identifier)";
20672082
PRODUCT_NAME = "$(TARGET_NAME)";
20682083
PROVISIONING_PROFILE_SPECIFIER = "";
2084+
"PROVISIONING_PROFILE_SPECIFIER[sdk=macosx*]" = "";
20692085
SKIP_INSTALL = YES;
20702086
SWIFT_OPTIMIZATION_LEVEL = "-Onone";
20712087
SWIFT_VERSION = 5.0;
@@ -2080,9 +2096,10 @@
20802096
CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = NO;
20812097
CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = NO;
20822098
CLANG_WARN_STRICT_PROTOTYPES = NO;
2083-
CODE_SIGN_IDENTITY = "";
2099+
CODE_SIGN_IDENTITY = "Apple Development";
20842100
"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "";
2085-
CODE_SIGN_STYLE = Manual;
2101+
"CODE_SIGN_IDENTITY[sdk=macosx*]" = "Apple Development";
2102+
CODE_SIGN_STYLE = Automatic;
20862103
DEFINES_MODULE = YES;
20872104
DEVELOPMENT_TEAM = "";
20882105
DYLIB_COMPATIBILITY_VERSION = 1;
@@ -2099,6 +2116,7 @@
20992116
PRODUCT_BUNDLE_IDENTIFIER = "com.flipboard.$(PRODUCT_NAME:rfc1034identifier)";
21002117
PRODUCT_NAME = "$(TARGET_NAME)";
21012118
PROVISIONING_PROFILE_SPECIFIER = "";
2119+
"PROVISIONING_PROFILE_SPECIFIER[sdk=macosx*]" = "";
21022120
SKIP_INSTALL = YES;
21032121
SWIFT_VERSION = 5.0;
21042122
WARNING_CFLAGS = "-Wno-unsupported-availability-guard";

FLEXTests/FLEXTests.m

+20-1
Original file line numberDiff line numberDiff line change
@@ -13,8 +13,10 @@
1313
#import "FLEXPropertyAttributes.h"
1414
#import "FLEXProperty.h"
1515
#import "FLEXUtility.h"
16+
#import "FLEXRuntimeUtility.h"
1617
#import "FLEXMethod.h"
1718
#import "FLEXIvar.h"
19+
#import "FLEXNewRootClass.h"
1820

1921
@interface Subclass : NSObject {
2022
@public
@@ -39,6 +41,7 @@ - (void)testRuntimeAdditions {
3941
- (void)testAssumptionsAboutClasses {
4042
Class cls = [self class];
4143
Class meta = objc_getMetaClass(NSStringFromClass(cls).UTF8String);
44+
Class rootMeta = object_getClass(meta);
4245

4346
// Subsequent `class` calls yield self
4447
XCTAssertEqual(cls, [cls class]);
@@ -50,7 +53,7 @@ - (void)testAssumptionsAboutClasses {
5053

5154
// Subsequent object_getClass calls yield metaclass
5255
XCTAssertEqual(object_getClass(cls), meta);
53-
XCTAssertEqual(object_getClass(meta), meta);
56+
XCTAssertEqual(object_getClass(object_getClass(meta)), rootMeta);
5457

5558
// Superclass of a root class is nil
5659
XCTAssertNil(NSObject.superclass);
@@ -121,4 +124,20 @@ - (void)testIvarUnboxing {
121124
XCTAssertEqual(pointerValue[0], 0xaa);
122125
}
123126

127+
- (void)testSafeRespondsToSelector {
128+
XCTAssertFalse([FLEXRuntimeUtility
129+
safeObject:[NSObject class] respondsToSelector:@selector(testSafeRespondsToSelector)
130+
]);
131+
132+
Class root = NSClassFromString(@"FLEXNewRootClass");
133+
XCTAssertTrue([FLEXRuntimeUtility safeObject:root respondsToSelector:@selector(theOnlyMethod)]);
134+
XCTAssertFalse([FLEXRuntimeUtility safeObject:root respondsToSelector:@selector(class)]);
135+
}
136+
137+
- (void)testSafeGetClassName {
138+
id instance = [NSClassFromString(@"FLEXNewRootClass") alloc];
139+
NSString *className = [FLEXRuntimeUtility safeClassNameForObject:instance];
140+
XCTAssertEqualObjects(@"FLEXNewRootClass", className);
141+
}
142+
124143
@end
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
//
2+
// FLEXNewRootClass.h
3+
// FLEXTests
4+
//
5+
// Created by Tanner on 12/30/20.
6+
// Copyright © 2020 Flipboard. All rights reserved.
7+
//
8+
9+
#import <Foundation/Foundation.h>
10+
11+
/// Root class with one method
12+
OBJC_ROOT_CLASS
13+
@interface FLEXNewRootClass {
14+
Class isa OBJC_ISA_AVAILABILITY;
15+
}
16+
17+
- (void)theOnlyMethod;
18+
19+
@end
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
//
2+
// FLEXNewRootClass.m
3+
// FLEXTests
4+
//
5+
// Created by Tanner on 12/30/20.
6+
// Copyright © 2020 Flipboard. All rights reserved.
7+
//
8+
9+
#import "FLEXNewRootClass.h"
10+
#import <objc/runtime.h>
11+
12+
@implementation FLEXNewRootClass
13+
14+
+ (id)alloc {
15+
FLEXNewRootClass *obj = (__bridge id)calloc(1, class_getInstanceSize(self));
16+
object_setClass(obj, self);
17+
return obj;
18+
}
19+
20+
- (void)theOnlyMethod { }
21+
22+
- (void)retain { }
23+
- (void)release { }
24+
25+
@end

0 commit comments

Comments
 (0)