FBRetainCycleDetectorTests/FBObjectiveCNSCFTimerTests.m (50 lines of code) (raw):
/**
* Copyright (c) 2016-present, Facebook, Inc.
* All rights reserved.
*
* This source code is licensed under the BSD-style license found in the
* LICENSE file in the root directory of this source tree.
*/
#import <UIKit/UIKit.h>
#import <XCTest/XCTest.h>
#import <FBRetainCycleDetector/FBObjectiveCBlock.h>
#import <FBRetainCycleDetector/FBObjectiveCGraphElement+Internal.h>
#import <FBRetainCycleDetector/FBObjectiveCNSCFTimer.h>
#import <FBRetainCycleDetector/FBObjectiveCObject.h>
#import <FBRetainCycleDetector/FBRetainCycleDetector+Internal.h>
@interface _RCDTestTimer : NSObject
@property (nonatomic, strong) NSTimer *timer;
@end
@implementation _RCDTestTimer
@end
@interface FBObjectiveCNSCFTimerTests : XCTestCase
@end
@implementation FBObjectiveCNSCFTimerTests
#if _INTERNAL_RCD_ENABLED
- (void)testThatNSTimerCreatesRetainCycleAndWillBeDetected
{
_RCDTestTimer *testObject = [_RCDTestTimer new];
testObject.timer = [NSTimer scheduledTimerWithTimeInterval:DISPATCH_TIME_FOREVER
target:testObject
selector:@selector(description)
userInfo:nil
repeats:NO];
FBRetainCycleDetector *detector = [FBRetainCycleDetector new];
[detector addCandidate:testObject];
NSSet *retainCycles = [detector findRetainCycles];
NSSet *expectedCycle = [NSSet setWithObject:[detector _shiftToUnifiedCycle:
@[[[FBObjectiveCObject alloc] initWithObject:testObject],
[[FBObjectiveCNSCFTimer alloc] initWithObject:testObject.timer]]]];
XCTAssertEqualObjects(retainCycles, expectedCycle);
}
- (void)testThatNSTimerCreatesRetainCycleButWillBeSkippedIfDetectorIsConfiguredToSkip
{
_RCDTestTimer *testObject = [_RCDTestTimer new];
testObject.timer = [NSTimer scheduledTimerWithTimeInterval:DISPATCH_TIME_FOREVER
target:testObject
selector:@selector(description)
userInfo:nil
repeats:NO];
FBObjectGraphConfiguration *configuration =
[[FBObjectGraphConfiguration alloc] initWithFilterBlocks:@[]
shouldInspectTimers:NO];
FBRetainCycleDetector *detector = [[FBRetainCycleDetector alloc] initWithConfiguration:configuration];
[detector addCandidate:testObject];
NSSet *retainCycles = [detector findRetainCycles];
XCTAssertEqual([retainCycles count], 0);
}
#endif //_INTERNAL_RCD_ENABLED
@end