ComponentKitTests/CKComponentViewContextTests.mm (78 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 <ComponentKitTestHelpers/CKComponentLifecycleTestHelper.h> #import <ComponentKit/CKComponent.h> #import <ComponentKit/CKComponentAnimation.h> #import <ComponentKit/CKComponentProvider.h> #import <ComponentKit/CKCompositeComponent.h> #import <ComponentKit/CKStaticLayoutComponent.h> @interface CKComponentViewContextTests : XCTestCase @end @interface CKNestedComponent : CKCompositeComponent @property (nonatomic, strong) CKComponent *subcomponent; + (instancetype)new; @end @implementation CKComponentViewContextTests static CKComponent *singleViewComponentProvider(id<NSObject> model, id<NSObject>context) { return CK::ComponentBuilder() .viewClass([UIImageView class]) .build(); } static CKComponent *nestedComponentProvider(id<NSObject> model, id<NSObject>context) { return [CKNestedComponent new]; } static const CKSizeRange size = {{100, 100}, {100, 100}}; - (void)testMountingComponentWithViewExposesViewContextWithTheCreatedView { CKComponentLifecycleTestHelper *componentLifecycleTestController = [[CKComponentLifecycleTestHelper alloc] initWithComponentProvider:singleViewComponentProvider sizeRangeProvider:nil]; const CKComponentLifecycleTestHelperState state = [componentLifecycleTestController prepareForUpdateWithModel:nil constrainedSize:size context:nil]; [componentLifecycleTestController updateWithState:state]; CKComponent *component = (CKComponent *)state.componentLayout.component; UIView *rootView = [[UIView alloc] initWithFrame:{{0,0}, size.max}]; [componentLifecycleTestController attachToView:rootView]; UIImageView *createdView = [[rootView subviews] firstObject]; XCTAssertTrue([createdView isKindOfClass:[UIImageView class]], @"Expected image view but got %@", createdView); CKComponentViewContext context = [component viewContext]; XCTAssertTrue(context.view == createdView, @"Expected view context to be the created view"); XCTAssertTrue(CGRectEqualToRect(context.frame, CGRectMake(0, 0, 100, 100)), @"Expected frame to match"); } - (void)testMountingComponentWithViewAndNestedComponentWithoutViewExposesViewContextWithSubcomponentFrameInOuterView { CKComponentLifecycleTestHelper *componentLifecycleTestController = [[CKComponentLifecycleTestHelper alloc] initWithComponentProvider:nestedComponentProvider sizeRangeProvider:nil]; const CKComponentLifecycleTestHelperState state = [componentLifecycleTestController prepareForUpdateWithModel:nil constrainedSize:size context:nil]; [componentLifecycleTestController updateWithState:state]; CKNestedComponent *component = (CKNestedComponent *)state.componentLayout.component; UIView *rootView = [[UIView alloc] initWithFrame:{{0,0}, size.max}]; [componentLifecycleTestController attachToView:rootView]; CKComponent *subcomponent = component.subcomponent; CKComponentViewContext context = [subcomponent viewContext]; XCTAssertTrue(context.view == rootView, @"Expected view context to be the root view since neither component created a view"); XCTAssertTrue(CGRectEqualToRect(context.frame, CGRectMake(25, 25, 50, 50)), @"Expected frame to match"); } @end @implementation CKNestedComponent + (instancetype)new { CKComponent *subcomponent = CK::ComponentBuilder() .width(50) .height(50) .build(); CKNestedComponent *c = [super newWithComponent: [CKStaticLayoutComponent newWithView:{} size:{100, 100} children:{ {{25, 25}, subcomponent} }]]; c->_subcomponent = subcomponent; return c; } @end