ComponentKitTests/CKOptimisticViewMutationsTests.mm (87 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/CKButtonComponent.h> #import <ComponentKit/CKComponent.h> #import <ComponentKit/CKComponentAnimation.h> #import <ComponentKit/CKComponentSubclass.h> #import <ComponentKit/CKOptimisticViewMutations.h> #import "CKComponentTestCase.h" @interface CKOptimisticViewMutationsTests : CKComponentTestCase @end @implementation CKOptimisticViewMutationsTests - (void)testOptimisticViewMutationIsTornDown { CKComponent *blueComponent = CK::ComponentBuilder() .viewClass([UIView class]) .backgroundColor([UIColor blueColor]) .build(); CKComponentLifecycleTestHelper *componentLifecycleTestController = [[CKComponentLifecycleTestHelper alloc] initWithComponentProvider:nullptr sizeRangeProvider:nil]; [componentLifecycleTestController updateWithState:{ .componentLayout = [blueComponent layoutThatFits:{{0, 0}, {10, 10}} parentSize:kCKComponentParentSizeUndefined] }]; UIView *containerView = [UIView new]; [componentLifecycleTestController attachToView:containerView]; UIView *view = [blueComponent viewContext].view; XCTAssertEqualObjects(view.backgroundColor, [UIColor blueColor], @"Expected blue view"); CKPerformOptimisticViewMutation(view, @"backgroundColor", [UIColor redColor]); XCTAssertEqualObjects(view.backgroundColor, [UIColor redColor], @"Expected optimistic red mutation"); // detaching and reattaching to the view should reset it back to blue. [componentLifecycleTestController detachFromView]; [componentLifecycleTestController attachToView:containerView]; XCTAssertEqualObjects(view.backgroundColor, [UIColor blueColor], @"Expected blue to be reset by OptimisticViewMutation"); } - (void)testTwoSequentialOptimisticViewMutationsAreTornDown { CKComponent *blueComponent = CK::ComponentBuilder() .viewClass([UIView class]) .backgroundColor([UIColor blueColor]) .build(); CKComponentLifecycleTestHelper *componentLifecycleTestController = [[CKComponentLifecycleTestHelper alloc] initWithComponentProvider:nullptr sizeRangeProvider:nil]; [componentLifecycleTestController updateWithState:{ .componentLayout = [blueComponent layoutThatFits:{{0, 0}, {10, 10}} parentSize:kCKComponentParentSizeUndefined] }]; UIView *containerView = [UIView new]; [componentLifecycleTestController attachToView:containerView]; UIView *view = [blueComponent viewContext].view; XCTAssertEqualObjects(view.backgroundColor, [UIColor blueColor], @"Expected blue view"); CKPerformOptimisticViewMutation(view, @"backgroundColor", [UIColor redColor]); CKPerformOptimisticViewMutation(view, @"backgroundColor", [UIColor yellowColor]); XCTAssertEqualObjects(view.backgroundColor, [UIColor yellowColor], @"Expected view to yellow after second optimistic mutation"); // detaching and reattaching to the view should reset it back to blue. [componentLifecycleTestController detachFromView]; [componentLifecycleTestController attachToView:containerView]; XCTAssertEqualObjects(view.backgroundColor, [UIColor blueColor], @"Expected blue to be reset by OptimisticViewMutation"); } - (void)testFunctionBasedViewMutationsAreAppliedAndTornDownCorrectly { auto const buttonComponent = CK::ButtonComponentBuilder() .action(nullptr) .title(@"Original") .build(); CKComponentLifecycleTestHelper *componentLifecycleTestController = [[CKComponentLifecycleTestHelper alloc] initWithComponentProvider:nullptr sizeRangeProvider:nil]; [componentLifecycleTestController updateWithState:{ .componentLayout = [buttonComponent layoutThatFits:{{0, 0}, {10, 10}} parentSize:kCKComponentParentSizeUndefined] }]; UIView *containerView = [UIView new]; [componentLifecycleTestController attachToView:containerView]; UIButton *view = (UIButton *)[buttonComponent viewContext].view; XCTAssertEqualObjects([view titleForState:UIControlStateNormal], @"Original"); CKPerformOptimisticViewMutation(view, &buttonTitleGetter, &buttonTitleSetter, @"NewValue"); XCTAssertEqualObjects([view titleForState:UIControlStateNormal], @"NewValue"); // detaching and reattaching to the view should reset it back to blue. [componentLifecycleTestController detachFromView]; [componentLifecycleTestController attachToView:containerView]; XCTAssertEqualObjects([view titleForState:UIControlStateNormal], @"Original", @"Expected title to be reset by OptimisticViewMutation"); } static id buttonTitleGetter(UIView *button, id context) { return [(UIButton *)button titleForState:UIControlStateNormal]; } static void buttonTitleSetter(UIView *button, id value, id context) { [(UIButton *)button setTitle:value forState:UIControlStateNormal]; } @end