ComponentKitTests/RCAssociatedObjectTests.mm (59 lines of code) (raw):
/*
* Copyright (c) 2014-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. An additional grant
* of patent rights can be found in the PATENTS file in the same directory.
*
*/
#import <XCTest/XCTest.h>
#import <ComponentKit/RCAssociatedObject.h>
static char kTestObjectKey1 = ' ';
static char kTestObjectKey2 = ' ';
@interface RCAssociatedObjectTests : XCTestCase
@end
@implementation RCAssociatedObjectTests
- (void)test_NilIsReturnedWhenThereIsNoAssociatedObject
{
const auto obj = [NSObject new];
XCTAssertNil(RCGetAssociatedObject_MainThreadAffined(obj, &kTestObjectKey1));
}
- (void)test_ValueIsReturnedAfterSettingAssociatedObject
{
const auto obj1 = [NSObject new];
const auto obj2 = [NSObject new];
const auto value1 = [NSObject new];
const auto value2 = [NSObject new];
RCSetAssociatedObject_MainThreadAffined(obj1, &kTestObjectKey1, value1);
RCSetAssociatedObject_MainThreadAffined(obj1, &kTestObjectKey2, value2);
RCSetAssociatedObject_MainThreadAffined(obj2, &kTestObjectKey1, value1);
RCSetAssociatedObject_MainThreadAffined(obj2, &kTestObjectKey2, value2);
XCTAssertEqual(RCGetAssociatedObject_MainThreadAffined(obj1, &kTestObjectKey1), value1);
XCTAssertEqual(RCGetAssociatedObject_MainThreadAffined(obj1, &kTestObjectKey2), value2);
XCTAssertEqual(RCGetAssociatedObject_MainThreadAffined(obj2, &kTestObjectKey1), value1);
XCTAssertEqual(RCGetAssociatedObject_MainThreadAffined(obj2, &kTestObjectKey2), value2);
}
- (void)test_NilIsReturnedWhenValueIsSetToNil
{
const auto obj = [NSObject new];
const auto value = [NSObject new];
RCSetAssociatedObject_MainThreadAffined(obj, &kTestObjectKey1, value);
RCSetAssociatedObject_MainThreadAffined(obj, &kTestObjectKey1, nil);
XCTAssertNil(RCGetAssociatedObject_MainThreadAffined(obj, &kTestObjectKey1));
}
- (void)test_ValueIsOverwrittenAfterSettingNewAssociatedObject
{
const auto obj = [NSObject new];
const auto value1 = [NSObject new];
const auto value2 = [NSObject new];
RCSetAssociatedObject_MainThreadAffined(obj, &kTestObjectKey1, value1);
XCTAssertEqual(RCGetAssociatedObject_MainThreadAffined(obj, &kTestObjectKey1), value1);
RCSetAssociatedObject_MainThreadAffined(obj, &kTestObjectKey1, value2);
XCTAssertEqual(RCGetAssociatedObject_MainThreadAffined(obj, &kTestObjectKey1), value2);
}
- (void)test_ValueIsReleasedAfterObjectIsDeallocated
{
__weak NSObject *weakValue = nil;
@autoreleasepool {
const auto obj = [NSObject new];
const auto value = [NSObject new];
weakValue = value;
RCSetAssociatedObject_MainThreadAffined(obj, &kTestObjectKey1, value);
XCTAssertEqual(RCGetAssociatedObject_MainThreadAffined(obj, &kTestObjectKey1), value);
XCTAssertNotNil(weakValue);
}
XCTAssertNil(weakValue);
}
@end