ComponentKitTests/Scope/CKComponentKeyTests.mm (79 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/CKComponentKey.h> #import <ComponentKit/CKComponentScope.h> #import <ComponentKit/CKCompositeComponent.h> #import <ComponentKit/CKComponentScopeRoot.h> #import <ComponentKit/CKComponentScopeRootFactory.h> #import <ComponentKit/CKThreadLocalComponentScope.h> #import <ComponentKit/ComponentUtilities.h> @interface CKComponentKeyTests : XCTestCase @end /** Implements isEqual and hash in terms of the underlying key string. */ @interface CKKeyWrapper : NSObject - (instancetype)initWithKey:(NSString *)key; @end @implementation CKComponentKeyTests - (void)testComponentScopeStateIsDistinguishedByKey { CKComponentScopeRoot *root1 = CKComponentScopeRootWithDefaultPredicates(nil, nil); CKComponentScopeRoot *root2; { CKThreadLocalComponentScope threadScope(root1, {}); { CKComponentKey key(@"foo"); CKComponentScope scope([CKCompositeComponent class], nil, ^{ return @42; }); } root2 = CKThreadLocalComponentScope::currentScope()->newScopeRoot; } { CKThreadLocalComponentScope threadScope(root2, {}); { CKComponentKey key(@"bar"); CKComponentScope scope([CKCompositeComponent class], nil, ^{ return @365; }); XCTAssertEqualObjects(scope.state(), @365, @"Key changing from foo to bar should cause separate state"); } } } - (void)testComponentScopeStateIsRecoveredWithKeysThatAreEqualButNotPointerIdentical { CKComponentScopeRoot *root1 = CKComponentScopeRootWithDefaultPredicates(nil, nil); CKComponentScopeRoot *root2; { CKThreadLocalComponentScope threadScope(root1, {}); { CKComponentKey key([[CKKeyWrapper alloc] initWithKey:@"foo"]); CKComponentScope scope([CKCompositeComponent class], nil, ^{ return @42; }); } root2 = CKThreadLocalComponentScope::currentScope()->newScopeRoot; } { CKThreadLocalComponentScope threadScope(root2, {}); { CKComponentKey key([[CKKeyWrapper alloc] initWithKey:@"foo"]); CKComponentScope scope([CKCompositeComponent class], nil, ^{ return @365; }); XCTAssertEqualObjects(scope.state(), @42, @"Even though key is not pointer equal, it is isEqual equal"); } } } @end @implementation CKKeyWrapper { NSString *_key; } - (instancetype)initWithKey:(NSString *)key { if (self = [super init]) { _key = [key copy]; } return self; } - (BOOL)isEqual:(id)object { return RCCompareObjectEquality(self, object, ^(CKKeyWrapper *a, CKKeyWrapper *b){ return [a->_key isEqual:b->_key]; }); } - (NSUInteger)hash { return [_key hash]; } @end