Peter 9bc996374f Add 'submodules/AsyncDisplayKit/' from commit '02bedc12816e251ad71777f9d2578329b6d2bef6'
git-subtree-dir: submodules/AsyncDisplayKit
git-subtree-mainline: d06f423e0ed3df1fed9bd10d79ee312a9179b632
git-subtree-split: 02bedc12816e251ad71777f9d2578329b6d2bef6
2019-06-11 18:42:43 +01:00

108 lines
2.8 KiB
Plaintext

//
// ASCALayerTests.mm
// Texture
//
// Copyright (c) Facebook, Inc. and its affiliates. All rights reserved.
// Changes after 4/13/2017 are: Copyright (c) Pinterest, Inc. All rights reserved.
// Licensed under Apache 2.0: http://www.apache.org/licenses/LICENSE-2.0
//
#import <XCTest/XCTest.h>
#import <OCMock/OCMock.h>
/**
* Tests that confirm what we know about Core Animation behavior.
*
* These tests are not run during the normal test action. You can run them yourself
* to investigate and confirm CA behavior.
*/
@interface ASCALayerTests : XCTestCase
@end
#define DeclareLayerAndSublayer() \
CALayer *realSublayer = [CALayer layer]; \
id layer = [OCMockObject partialMockForObject:[CALayer layer]]; \
id sublayer = [OCMockObject partialMockForObject:realSublayer]; \
[layer addSublayer:realSublayer];
@implementation ASCALayerTests
- (void)testThatLayerBeginsWithCleanLayout
{
XCTAssertFalse([CALayer layer].needsLayout);
}
- (void)testThatAddingSublayersDirtysLayout
{
CALayer *layer = [CALayer layer];
[layer addSublayer:[CALayer layer]];
XCTAssertTrue([layer needsLayout]);
}
- (void)testThatRemovingSublayersDirtysLayout
{
DeclareLayerAndSublayer();
[layer layoutIfNeeded];
XCTAssertFalse([layer needsLayout]);
[sublayer removeFromSuperlayer];
XCTAssertTrue([layer needsLayout]);
}
- (void)testDirtySublayerLayoutDoesntDirtySuperlayer
{
DeclareLayerAndSublayer();
[layer layoutIfNeeded];
// Dirtying sublayer doesn't dirty superlayer.
[sublayer setNeedsLayout];
XCTAssertTrue([sublayer needsLayout]);
XCTAssertFalse([layer needsLayout]);
[[[sublayer expect] andForwardToRealObject] layoutSublayers];
// NOTE: We specifically don't expect layer to get -layoutSublayers
[sublayer layoutIfNeeded];
[sublayer verify];
[layer verify];
}
- (void)testDirtySuperlayerLayoutDoesntDirtySublayerLayout
{
DeclareLayerAndSublayer();
[layer layoutIfNeeded];
// Dirtying superlayer doesn't dirty sublayer.
[layer setNeedsLayout];
XCTAssertTrue([layer needsLayout]);
XCTAssertFalse([sublayer needsLayout]);
[[[layer expect] andForwardToRealObject] layoutSublayers];
// NOTE: We specifically don't expect sublayer to get -layoutSublayers
[layer layoutIfNeeded];
[sublayer verify];
[layer verify];
}
- (void)testDirtyHierarchyIsLaidOutTopDown
{
DeclareLayerAndSublayer();
[sublayer setNeedsLayout];
XCTAssertTrue([layer needsLayout]);
XCTAssertTrue([sublayer needsLayout]);
__block BOOL superlayerLaidOut = NO;
[[[[layer expect] andDo:^(NSInvocation *i) {
superlayerLaidOut = YES;
}] andForwardToRealObject] layoutSublayers];
[[[[sublayer expect] andDo:^(NSInvocation *i) {
XCTAssertTrue(superlayerLaidOut);
}] andForwardToRealObject] layoutSublayers];
[layer layoutIfNeeded];
[sublayer verify];
[layer verify];
}
@end