From 9fe2f476a1db7fb10e3d7a20f93a37f0e2ddd86f Mon Sep 17 00:00:00 2001 From: Max Wang Date: Sat, 2 Jun 2018 09:01:01 -0700 Subject: [PATCH] add ASTextNode2 snapshot test (#935) * fix SIMULATE_WEB_RESPONSE not imported #449 * Fix to make rangeMode update in right time * remove uncessary assert * textnode2-snapshot-test * add change log * fix image recording * disable recording * renaming test method * reset experiment in teardown --- AsyncDisplayKit.xcodeproj/project.pbxproj | 4 + CHANGELOG.md | 2 + Tests/ASTextNode2SnapshotTests.m | 150 ++++++++++++++++++ .../testShadowing_ASTextNode2@2x.png | Bin 0 -> 5844 bytes ...ContainerInsetHighlight_ASTextNode2@2x.png | Bin 0 -> 3926 bytes ...hSmallerConstrainedSize_ASTextNode2@2x.png | Bin 0 -> 4395 bytes .../testTextContainerInset_ASTextNode2@2x.png | Bin 0 -> 2669 bytes ...SlowPathTruncationWorks_ASTextNode2@2x.png | Bin 0 -> 4012 bytes .../testTextContainerInset2@2x.png | Bin 0 -> 2669 bytes 9 files changed, 156 insertions(+) create mode 100644 Tests/ASTextNode2SnapshotTests.m create mode 100644 Tests/ReferenceImages_iOS_10/ASTextNode2SnapshotTests/testShadowing_ASTextNode2@2x.png create mode 100644 Tests/ReferenceImages_iOS_10/ASTextNode2SnapshotTests/testTextContainerInsetHighlight_ASTextNode2@2x.png create mode 100644 Tests/ReferenceImages_iOS_10/ASTextNode2SnapshotTests/testTextContainerInsetIsIncludedWithSmallerConstrainedSize_ASTextNode2@2x.png create mode 100644 Tests/ReferenceImages_iOS_10/ASTextNode2SnapshotTests/testTextContainerInset_ASTextNode2@2x.png create mode 100644 Tests/ReferenceImages_iOS_10/ASTextNode2SnapshotTests/testThatSlowPathTruncationWorks_ASTextNode2@2x.png create mode 100644 Tests/ReferenceImages_iOS_10/ASTextNodeSnapshotTests/testTextContainerInset2@2x.png diff --git a/AsyncDisplayKit.xcodeproj/project.pbxproj b/AsyncDisplayKit.xcodeproj/project.pbxproj index c9f5cba820..e6efd3309b 100644 --- a/AsyncDisplayKit.xcodeproj/project.pbxproj +++ b/AsyncDisplayKit.xcodeproj/project.pbxproj @@ -311,6 +311,7 @@ B350625E1B0111780018CF92 /* AssetsLibrary.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 051943121A1575630030A7D0 /* AssetsLibrary.framework */; settings = {ATTRIBUTES = (Weak, ); }; }; BB5FC3CE1F9BA689007F191E /* ASNavigationControllerTests.m in Sources */ = {isa = PBXBuildFile; fileRef = BB5FC3CD1F9BA688007F191E /* ASNavigationControllerTests.m */; }; BB5FC3D11F9C9389007F191E /* ASTabBarControllerTests.m in Sources */ = {isa = PBXBuildFile; fileRef = BB5FC3D01F9C9389007F191E /* ASTabBarControllerTests.m */; }; + C057D9BD20B5453D00FC9112 /* ASTextNode2SnapshotTests.m in Sources */ = {isa = PBXBuildFile; fileRef = C057D9BC20B5453D00FC9112 /* ASTextNode2SnapshotTests.m */; }; C78F7E2B1BF7809800CDEAFC /* ASTableNode.h in Headers */ = {isa = PBXBuildFile; fileRef = B0F880581BEAEC7500D17647 /* ASTableNode.h */; settings = {ATTRIBUTES = (Public, ); }; }; CC034A091E60BEB400626263 /* ASDisplayNode+Convenience.h in Headers */ = {isa = PBXBuildFile; fileRef = CC034A071E60BEB400626263 /* ASDisplayNode+Convenience.h */; settings = {ATTRIBUTES = (Public, ); }; }; CC034A0A1E60BEB400626263 /* ASDisplayNode+Convenience.m in Sources */ = {isa = PBXBuildFile; fileRef = CC034A081E60BEB400626263 /* ASDisplayNode+Convenience.m */; }; @@ -816,6 +817,7 @@ BB5FC3CD1F9BA688007F191E /* ASNavigationControllerTests.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = ASNavigationControllerTests.m; sourceTree = ""; }; BB5FC3D01F9C9389007F191E /* ASTabBarControllerTests.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = ASTabBarControllerTests.m; sourceTree = ""; }; BDC2D162BD55A807C1475DA5 /* Pods-AsyncDisplayKitTests.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-AsyncDisplayKitTests.profile.xcconfig"; path = "Pods/Target Support Files/Pods-AsyncDisplayKitTests/Pods-AsyncDisplayKitTests.profile.xcconfig"; sourceTree = ""; }; + C057D9BC20B5453D00FC9112 /* ASTextNode2SnapshotTests.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = ASTextNode2SnapshotTests.m; sourceTree = ""; }; CC034A071E60BEB400626263 /* ASDisplayNode+Convenience.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "ASDisplayNode+Convenience.h"; sourceTree = ""; }; CC034A081E60BEB400626263 /* ASDisplayNode+Convenience.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "ASDisplayNode+Convenience.m"; sourceTree = ""; }; CC034A111E649F1300626263 /* AsyncDisplayKit+IGListKitMethods.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "AsyncDisplayKit+IGListKitMethods.h"; sourceTree = ""; }; @@ -1298,6 +1300,7 @@ 4496D0721FA9EA6B001CC8D5 /* ASTraitCollectionTests.m */, CC0AEEA31D66316E005D1C78 /* ASUICollectionViewTests.m */, AEEC47E31C21D3D200EC1693 /* ASVideoNodeTests.m */, + C057D9BC20B5453D00FC9112 /* ASTextNode2SnapshotTests.m */, CCA221D21D6FA7EF00AF6A0F /* ASViewControllerTests.m */, 83A7D95D1D446A6E00BF333E /* ASWeakMapTests.m */, CC3B208D1C3F7D0A00798563 /* ASWeakSetTests.m */, @@ -2279,6 +2282,7 @@ CC0AEEA41D66316E005D1C78 /* ASUICollectionViewTests.m in Sources */, CCE4F9B51F0DA4F300062E4E /* ASLayoutEngineTests.mm in Sources */, 69B225671D72535E00B25B22 /* ASDisplayNodeLayoutTests.mm in Sources */, + C057D9BD20B5453D00FC9112 /* ASTextNode2SnapshotTests.m in Sources */, ACF6ED621B178DC700DA7C62 /* ASRatioLayoutSpecSnapshotTests.mm in Sources */, 7AB338691C55B97B0055FDE8 /* ASRelativeLayoutSpecSnapshotTests.mm in Sources */, CCDD148B1EEDCD9D0020834E /* ASCollectionModernDataSourceTests.m in Sources */, diff --git a/CHANGELOG.md b/CHANGELOG.md index 238a009c5a..76d905564d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,8 @@ * Add your own contributions to the next release on the line below this with your name. - Make `ASPerformMainThreadDeallocation` visible in C. [Adlai Holler](https://github.com/Adlai-Holler) +- Add snapshot test for astextnode2. [Max Wang](https://github.com/wsdwsd0829) [#935](https://github.com/TextureGroup/Texture/pull/935) + ## 2.7 - Fix pager node for interface coalescing. [Max Wang](https://github.com/wsdwsd0829) [#877](https://github.com/TextureGroup/Texture/pull/877) - [ASTextNode2] Upgrade lock safety by protecting all ivars (including rarely-changed ones). diff --git a/Tests/ASTextNode2SnapshotTests.m b/Tests/ASTextNode2SnapshotTests.m new file mode 100644 index 0000000000..680433e971 --- /dev/null +++ b/Tests/ASTextNode2SnapshotTests.m @@ -0,0 +1,150 @@ +// +// ASTextNode2SnapshotTests.mm +// Texture +// +// Copyright (c) 2017-present, Pinterest, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// + + +#import "ASTestCase.h" +#import "ASSnapshotTestCase.h" +#import + +@interface ASTextNode2SnapshotTests : ASSnapshotTestCase + +@end + +@implementation ASTextNode2SnapshotTests + +- (void)setUp +{ + [super setUp]; + + // This will use ASTextNode2 for snapshot tests. + // All tests are duplicated from ASTextNodeSnapshotTests. + ASConfiguration *config = [[ASConfiguration alloc] initWithDictionary:nil]; + config.experimentalFeatures = ASExperimentalTextNode; + [ASConfigurationManager test_resetWithConfiguration:config]; + + self.recordMode = NO; +} + +- (void)tearDown +{ + [super tearDown]; + ASConfiguration *config = [[ASConfiguration alloc] initWithDictionary:nil]; + config.experimentalFeatures = kNilOptions; + [ASConfigurationManager test_resetWithConfiguration:config]; +} + +- (void)testTextContainerInset_ASTextNode2 +{ + // trivial test case to ensure ASSnapshotTestCase works + ASTextNode *textNode = [[ASTextNode alloc] init]; + textNode.attributedText = [[NSAttributedString alloc] initWithString:@"judar" + attributes:@{NSFontAttributeName : [UIFont italicSystemFontOfSize:24]}]; + textNode.textContainerInset = UIEdgeInsetsMake(0, 2, 0, 2); + ASDisplayNodeSizeToFitSizeRange(textNode, ASSizeRangeMake(CGSizeZero, CGSizeMake(CGFLOAT_MAX, CGFLOAT_MAX))); + + ASSnapshotVerifyNode(textNode, nil); +} + +- (void)testTextContainerInsetIsIncludedWithSmallerConstrainedSize_ASTextNode2 +{ + UIView *backgroundView = [[UIView alloc] initWithFrame:CGRectZero]; + backgroundView.layer.as_allowsHighlightDrawing = YES; + + ASTextNode *textNode = [[ASTextNode alloc] init]; + textNode.attributedText = [[NSAttributedString alloc] initWithString:@"judar judar judar judar judar judar" + attributes:@{ NSFontAttributeName : [UIFont systemFontOfSize:30] }]; + + textNode.textContainerInset = UIEdgeInsetsMake(10, 10, 10, 10); + + ASLayout *layout = [textNode layoutThatFits:ASSizeRangeMake(CGSizeZero, CGSizeMake(100, 80))]; + textNode.frame = CGRectMake(50, 50, layout.size.width, layout.size.height); + + [backgroundView addSubview:textNode.view]; + backgroundView.frame = UIEdgeInsetsInsetRect(textNode.bounds, UIEdgeInsetsMake(-50, -50, -50, -50)); + + textNode.highlightRange = NSMakeRange(0, textNode.attributedText.length); + + [ASSnapshotTestCase hackilySynchronouslyRecursivelyRenderNode:textNode]; + ASSnapshotVerifyLayer(backgroundView.layer, nil); +} + +- (void)testTextContainerInsetHighlight_ASTextNode2 +{ + UIView *backgroundView = [[UIView alloc] initWithFrame:CGRectZero]; + backgroundView.layer.as_allowsHighlightDrawing = YES; + + ASTextNode *textNode = [[ASTextNode alloc] init]; + textNode.attributedText = [[NSAttributedString alloc] initWithString:@"yolo" + attributes:@{ NSFontAttributeName : [UIFont systemFontOfSize:30] }]; + + textNode.textContainerInset = UIEdgeInsetsMake(5, 10, 10, 5); + ASLayout *layout = [textNode layoutThatFits:ASSizeRangeMake(CGSizeZero, CGSizeMake(INFINITY, INFINITY))]; + textNode.frame = CGRectMake(50, 50, layout.size.width, layout.size.height); + + [backgroundView addSubview:textNode.view]; + backgroundView.frame = UIEdgeInsetsInsetRect(textNode.bounds, UIEdgeInsetsMake(-50, -50, -50, -50)); + + textNode.highlightRange = NSMakeRange(0, textNode.attributedText.length); + + [ASSnapshotTestCase hackilySynchronouslyRecursivelyRenderNode:textNode]; + ASSnapshotVerifyView(backgroundView, nil); +} + +// This test is disabled because the fast-path is disabled. +- (void)DISABLED_testThatFastPathTruncationWorks_ASTextNode2 +{ + ASTextNode *textNode = [[ASTextNode alloc] init]; + textNode.attributedText = [[NSAttributedString alloc] initWithString:@"Quality is Important" attributes:@{ NSForegroundColorAttributeName: [UIColor blueColor], NSFontAttributeName: [UIFont italicSystemFontOfSize:24] }]; + [textNode layoutThatFits:ASSizeRangeMake(CGSizeZero, CGSizeMake(100, 50))]; + ASSnapshotVerifyNode(textNode, nil); +} + +- (void)testThatSlowPathTruncationWorks_ASTextNode2 +{ + ASTextNode *textNode = [[ASTextNode alloc] init]; + textNode.attributedText = [[NSAttributedString alloc] initWithString:@"Quality is Important" attributes:@{ NSForegroundColorAttributeName: [UIColor blueColor], NSFontAttributeName: [UIFont italicSystemFontOfSize:24] }]; + // Set exclusion paths to trigger slow path + textNode.exclusionPaths = @[ [UIBezierPath bezierPath] ]; + ASDisplayNodeSizeToFitSizeRange(textNode, ASSizeRangeMake(CGSizeZero, CGSizeMake(100, 50))); + ASSnapshotVerifyNode(textNode, nil); +} + +- (void)testShadowing_ASTextNode2 +{ + ASTextNode *textNode = [[ASTextNode alloc] init]; + textNode.attributedText = [[NSAttributedString alloc] initWithString:@"Quality is Important"]; + textNode.shadowColor = [UIColor blackColor].CGColor; + textNode.shadowOpacity = 0.3; + textNode.shadowRadius = 3; + textNode.shadowOffset = CGSizeMake(0, 1); + ASDisplayNodeSizeToFitSizeRange(textNode, ASSizeRangeMake(CGSizeZero, CGSizeMake(INFINITY, INFINITY))); + ASSnapshotVerifyNode(textNode, nil); +} + +/** + * https://github.com/TextureGroup/Texture/issues/822 + */ +- (void)DISABLED_testThatTruncationTokenAttributesPrecedeThoseInheritedFromTextWhenTruncateTailMode_ASTextNode2 +{ + ASTextNode *textNode = [[ASTextNode alloc] init]; + textNode.style.maxSize = CGSizeMake(20, 80); + NSMutableAttributedString *mas = [[NSMutableAttributedString alloc] initWithString:@"Quality is an important "]; + [mas appendAttributedString:[[NSAttributedString alloc] initWithString:@"thing" attributes:@{ NSBackgroundColorAttributeName : UIColor.yellowColor}]]; + textNode.attributedText = mas; + textNode.truncationMode = NSLineBreakByTruncatingTail; + + textNode.truncationAttributedText = [[NSAttributedString alloc] initWithString:@"\u2026" attributes:@{ NSBackgroundColorAttributeName: UIColor.greenColor }]; + ASDisplayNodeSizeToFitSizeRange(textNode, ASSizeRangeMake(CGSizeZero, CGSizeMake(INFINITY, INFINITY))); + ASSnapshotVerifyNode(textNode, nil); +} + +@end diff --git a/Tests/ReferenceImages_iOS_10/ASTextNode2SnapshotTests/testShadowing_ASTextNode2@2x.png b/Tests/ReferenceImages_iOS_10/ASTextNode2SnapshotTests/testShadowing_ASTextNode2@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..7a336db7235c93d850d09ffb1b8657806e69e731 GIT binary patch literal 5844 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 ech!97-5&x75D0f(&dpc=0000op#w zTJKjW!gW0|UYXKK)p)hjNC`<%l!V-qS$C~_|AtvTYyH-5pM8G&?0xp{yY}yM?wmV| zIwq+s2?BwRxw|3GgFxU5fPF7<80cAr1P%ZWj6aWZ2GvifE(145;@txAAdrHd$iVLB zbw2@}sxb&}Kfpr(6I}&>8UEJ;ZSk1G*D;fTw{%CG@w)+Do%Nz$j8pS?d%H_2J{6c2Ui)wb! zPSGZ9VaKt$zM8va$4E}$vTc(X{9<0=+a?zscq#}CflA0|erl#g3$ZM+Q~ z2)xHKR0DKA=CRmL-|p4U8e4(p=)qIrkq}8-q%^`7c!Ysti-i`65C~NH_&Kx+L32_I z9)19k~BNR*>31Gkxg6H(ECezcilShF7|z_6fw~n7d9c2Ac3+%)sQfCUI>w2wuV3Acs`;tz!MVbI})=<2~0H zWouNW8{Pw>vT?3A<<^r1-chWy!|ry#-se*MXD-Mw*G7nW_(IRrJ_U(Ys%3Asq3}@7 zFthQ^p}Zt~!z@0q%jR&m%6c5)aq!w+gVN500ZUom8CxmNb+#j`dr3yKaS-A?ycgB9 zmw1do^9{7xS;4V~#s&WfTC(_TE42=jH9%2gIEJ-_Bg8SAdwTHjLg>j%;$- zfm9FCNQm6Qt&JnQAG(H`e`C#5C)MWh5TnG+y&!Mwrfzw$UW&wI4M1Ihbj6io-aoJT!Y{WO_`?X}x6Ltok{>yki}SNKRjxZhxNE5$UMOVdqr=R4N=t00UGBuB5PCcacKVNS2dcz2 z)vPs(_Qv*Hev`$QhoCf9v69U0k@D6b5%tpkOHK=BLhi`404dD087uV z8&Y8AU*p;22SX)VHRG@7`Y13NDBbNdQ3pwCo0wWEu_tnMn(J+ZbDC_SPxsH9=Q<2u z%LJuefNu0$4h(5fy+6xU@}(XA2pd5e@$D_bOSN3Wp4ZL=v<{2jtnnUu6bw;OpnG4B z!iH}DyYz?McO%`XO;;3OZ*P>yT~o4ax06cj+#Ytwq?**4u;%f`FC=6xAs1KObV=sD z=mHur!@GzHr-b6(sUVzPMT;P@kRO#6j2eaX6p&K(LmB;%k~m!Fj_Rlh1RC_MwbHM- zot=#l+JTos%qyzWjR$TWYc7y? zkHF&0E}n6dI93*79);8&>NxODURh2o*`zTxiA#38o4vlmc{Xukjg;a`YDhM1xp=QV zNbD;0w(#L#yW~(+Z0tV?o>77$YZGPepFDl|D1J7s-;qLcatu>l2RC%~O1eC)_Cs`besMgX!vS_#e}t zx8tf=ozmiFi}Vv_lYbJBf&BD$ceXM)iam%0#@_t$);RvLny++$|_|%GJebJfphfYoRmtw^okA{mp_2krGDO`1r`gfgYtpvMiTazjY zZKt0!w&xJmLiT`f@mnmQ!$|U9Zp;!4%Q5k!Z1%7#H6~+lQE;sJ>Ueay=@w%uE9;CY zDiP1mjvH_4%k7`>;Nn#oGQbk$Zk)(jQG9Ot=WfQ^o&W>=l!P(9PVn< zdcZimB$V5+8Y?J$SuMvr)j*#0RaXW>qzvQzKg`N^l?~$_#n%gdk0WLKB|2qIt3Q~Z zerX%wJCG^crG0SsV>S=7AVb`2tsz_1^-Oj$@S@Z6(z(U^^yLgn%BvNOP>HyC5Xb** zz1^S5<5@DcN}HH!E-La|(^4V0lCnOqaz7Jvco-O5s)L;L}__GIsw4Yo*_53wkn~9`e z8TCO=mB1eGr(2Z0MRimI;h6k@|A92JUWEP;huCA)eg+F~E_}A%-{)jeJ|oF~udCWw zMzwPXe2bl{-q}zILYKrRmY4Zxeh56=}RIYJ|~OTAQE&Y0|Gn;TVeIf4?!wAr$ne+pmkpo7hsReE{v|NC=}uI!SMor z^wjg|{q-miNfQXM4u_^oa%k4?T4a4`w@H1A))GKim4vGL!}{zF1MU6uQ!LqK40cQ3 rU-PfYzS8$s`u_XT_y6S-{j9I|mhbHe$zn80^xx}_Jd3Dz4!`vu+vQ3I literal 0 HcmV?d00001 diff --git a/Tests/ReferenceImages_iOS_10/ASTextNode2SnapshotTests/testTextContainerInsetIsIncludedWithSmallerConstrainedSize_ASTextNode2@2x.png b/Tests/ReferenceImages_iOS_10/ASTextNode2SnapshotTests/testTextContainerInsetIsIncludedWithSmallerConstrainedSize_ASTextNode2@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..dd3b0ccf4d09d6c9b193e2af5ad5cf0548361be8 GIT binary patch literal 4395 zcmeHLcT`hp77rN)0tSXQf`J*(0Yn)LSvE9jQU#PcsDQLVq<4`{KnNI-B5hH+ND-v> zgpwtpkFY2K43N+>KrnPLK-ibro&9hB+jI6G-#Pc(@7?!1_kQnvw?2%8nGqi^j28p~ z@fqLLw*rAU5&=?&Z~+pbr~4ZK;|R7g(goFyN~{4lJOMXtgF&G4GHl{7wvyfggc6?m z=Dz?O3=sP&07&lN99VO0Mfcg@0p4k>f8&=h4*J|!b+&;R_m;SzZE^znDd!F6;$(8G zz-Rf33O?hlHrR8szu&QVsyr?W5t+qSp#>H%**%pP73>gTHvA61c_~3xe}Wi3M?hIUxdH7hgZZS5NpqMnRL%bRMaj zMBHc^#{bGAAXRS)hOcTV<5N=Li(B=WbGQd|Wxz#q(fD(=D>MvB*iG-`r$AMNm$jH- z^v;f~&U^#@ZKu~6`ox@hp#39a@*LXb9ZkU=%&87m`8ahxF^FaBPKP+~5+LTbshp6X zzdzEv8;M@n`(V2fY3Xv0>MpMY=6o!-Wz*k+UT|dcZw9cieAZ%w>7c2UhK43dkzmSDke*~pb zMkf~E3g#uW>T?0f#`$NCKf&r??hm2enBaoIWQWUn+itAmW7W+zl5Cac<|@D-*a!#1mXjqaT)OOLjv(UGK&dTmikYgc!-Q=3rbiJ zIryGB6VWhBL5Z!k-iqRcb_>zJ+d{AcU>MJ{ar8NiK#~|O{77<7H@Jf|w;z34Shq$+ zXRgCW*X(-?3Z`u4oXqkS`Hh{2hgi7eJY`T+$Mx z?4Z=ORqm%D0_4qK1=v_c%plxYkQy~&EbA0BOQyne!Inb5=aI37|5-ctKG=N z8Lr@%-PCrJMrBuWc~j}y6}?zc+()?Lio(HL#6-{f88UZwx5-y@$@I#HNDnA3-3BKVgvMqaAJ)A z0tjaVlmHEPD{eAM5Om!;d|=K4L+9aJ$LAK#N)absifJ8n)vWLUx_l$B6Q;;Q2|>&Bs)P= zkcr;hYW|x27sgKOeQFU=fm^I8iKSEf^)9ZE5kprG-5gGcL;^mm={{LZOL_1M5z*|Z zT6s74l{fS*H1*84m86oBszk|Mrs%q=rdHkuHfrTO{O&k;q1+tm4_l5}5_3Oe-RKHQ zSr}3pa0+>@HjC`&$$h&aOh7o72}#wXz}DrR%?J(mbn6~NE$xO!8mc^{Nkbbj!e+*9 zslGNt`{7Kqu+as7Q!A&s8gHnPV74Ccn!LAOhT}l3D}WVIzM!jzU6`_^U}F!)44mdC zLyGKtD9gzF!y&2bgjTOsS47O%YkMyznzj-AraI^joqw~0Iitu;* zQ%Fu>(R#n;1-kJwjb0ZJ4tJQnzCu5+y;Cjj%5}0qnL?W8p=?T6Ib$?g}w(PDlIPqDS0+oldKiG7BScVwg>gd%fdUa-=eKW>-wOBdKy+hTYj58ba;TqzYqLO*HsN1jS;*=i{tiSQz`t;E$tJN23vzLv*Mo&ylKRjJsCUqUb zDukj(0ZTy}m%@V5sZ)9OJqjK0n-i*DuDRZ3Dy%j-9W^#m=w(vcL8_<;aoyuSt1>$+ zFZJ`i0F+eK44@FOUN^r%Oyo@x#x}S@nAqx#{pSl>7-h4SzI9eam#?b_a{VR2{9li# zL)*wRC;7g-EX@qODo#FbTlvs$fgHQtDQ(&IcvWj?Vi%o>!PXxv zRi>1z-+y^elQH(7YqiO97S0_dKR$XK8ty==e_v_tgEDEJty|vLY%_iY1#S->NNU zy}H}{w$JYEa?%dXeZ>=#d`BgMeUhcT6KEVVq4gbVTb$h@2NZ)tMqaZ8b-_Rq`$Mpw zJvb>q-qGXsT4)AZmw+vBh|@6+!KI`i0kS8q_M+v&aaZSMJb5kRxfJPN!4(?g=$ zGB2?e5QK8Qp-y~+((jUcKLLRjtHTqe9vJ-^-ODb3jG literal 0 HcmV?d00001 diff --git a/Tests/ReferenceImages_iOS_10/ASTextNode2SnapshotTests/testTextContainerInset_ASTextNode2@2x.png b/Tests/ReferenceImages_iOS_10/ASTextNode2SnapshotTests/testTextContainerInset_ASTextNode2@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..d66bb3bce95ee96c590a8169a42d5231b1e23643 GIT binary patch literal 2669 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 b@+0scS>l3sMTmK^00000NkvXXu0mjfPuTKT literal 0 HcmV?d00001 diff --git a/Tests/ReferenceImages_iOS_10/ASTextNode2SnapshotTests/testThatSlowPathTruncationWorks_ASTextNode2@2x.png b/Tests/ReferenceImages_iOS_10/ASTextNode2SnapshotTests/testThatSlowPathTruncationWorks_ASTextNode2@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..b8123efd43164cd5cfe0ec4614bd80099d308747 GIT binary patch literal 4012 zcmb7{_cI)Bw8mMxdd=!=)UZkf5oE2^dk}T?61`h(^=KO`f7>@M5v+9yLbD^?xL(~cuT;o{tL*hp#R6)oLE)I5B)_wz&*r!c~Ds^Edl7J93 z0QUKnsr|M>!J;&ZeNt6mB|Q6^>c9)AJ0;|uX#O0CYg&TJHX>Nm+3Ozh2#w93CP)AU zmx;e>aM1;QYzii^Y3fW0W9RvRrmmFb88PXFT_cl@_O;--)Dnemf0{*9wShI3szq;s z(+wrdm+WwVIHrmYCy~_f<_+^wHJvR5?SkeN=qfhViK|gbByt{TN`1!OeN>n01Uck6 z4{^h`4*(to zVW^4LwBtUl|DE9q`DNNzpRA)FdTGHy^HK9`$BjQWX@dbmgM0oo=Ab8>L!V2gSBh{r z_L6X1>g#aQ#-E!Xq%Dg7_H@FQqyNF`5Q}RXqDy>7A+DT3K6aunvx1iSd^OkAE z-HE5qDS|Ejd3(uPmKJ9&T6@a^kQ>2x;XTC}0o>Wz(r=k{P+ez9Wk9)Yd&0bFA5NC} zTp2ZIuDclZ9hD?xAba0Ep6P^lC8G*EaH-#Z@_d(5JBA~#<&t|lI~kNOrx-jKl%pL~ z^e{&DLLi6TyV6-|&zJKh*8{~YrJWahlAG@8z5Eij9SSReU6+>Zd@sU#`#2cUk&&c#oZ$J?k$OV+OLaE|UCjL3B}rF=e4uV^e}_6T*TUNWF{DD<_DY zgi-HllL7KLk@`hSK}LblkQt4VMXK6*wej$fL+aYEt}jybmd@;lH>CS#o5*K(H0308 z@xIt>2ajW{j>;7y<^=q5?jMgm@@+l}`$@z^V}rq=U|?nZAvrq9)olwh-uP(u)V`nQ z=2&QwBhi0qB|L}jy85L<8#X()%6jse^4Zl+KvjDq~e}Kd> zz$qxAJUD>6EItDqoIgvYsS0B%Wg# z=z}wV)QnQ zFkKyOny3rApR8wye=&)N{Z}K2UZg3jcGk`6J5HPvo-*#>IpLEAq8pI2d!5OS@vSI`QSzVi{Q4eNtTNFAoYk)53=J3g6A; z7x`gSI_A)wyq%p<2k>mbnOlr_niNM}p?;NHsgW#9_t2Ee9XrZSrnwRXK4Q!3rMGM@ zm=3uK4ShTCHn?4jXNX^*p9OrPKz7No3DSH!Fm50VL2u6w5SR5=bL z)7#B-C-r>~E0`^g;X9t;Ll`|3_Z=B!WlHk8$U8z^n(k0ZL*QJXqwSfmlatpOy!aX| zl{4So>f{*UG`ICLtX2d3a16(%9S6*_?KYN43!sCwb+o^Fw&{$?$^15YpsFj#LUiEG z@a1XJMBTtzS!rij?T0*WJchinI_aR?FS2{)47n>R@6qcW^$T9Uze&MDkcShG-#^;>qOd50m_0k_3HcGcA$jlQoK&Y43pFq!HO5*O zISorBi>A~VILN?zyc6nEK6U}wW}pV;mEw2U0QIINM75gnvk6D?jg%jwyF+<=4|+F= z@7dX7Q(h3ZDla>zLGQ#?x`Ngd)F1PkK{J*g8zm1!9L#rFd3+ijym>d7G2*LeB}E%_ zbm(uAaGJ$cGhX_dZJk2M+OkE3IVWjYOVXHuWy2mbxa_DNo;<0g*;mI}w~{AfEWJqh zQ{lXrlTsK)VMqbH`<)2b7zK+wkA&wJa47qIl>h02SrF`LnL1L#yrh&K)t-S~Y9sh> z((xr3N6e7@2@?zp-7{8y@&-L(o9G4PtROgauCUmqb3LXI(-vBZh%zyt%IH{++0+@9UE2 z4@}*NBK5-f3ar!IyoBL$e%z8PgNXPNywMz$1Rmj?uIL6EZ(21gj&%uMIkX|a)YUjB z!qi!!W%ktyvlv?tNs>TSbe10XXP$kg$ji>9^|HdFKVssl&Kp2UyW%%X3#4swLg97~ zRQRFa3RgecOAX|rwR zi)Gax`B94KQ)*fG9B-Fnwp@${@gGVv_kk_CYz^rKO^N9-Y2&pf;;9{inW9SN>Nv3D zznEkJF21al(Bl(^8+JBrxJ^6cY%q@!oIw3ia^g7?K7(*Qh%Ei7qNGK~ix*2oHeLe= zjluq}7Dru>FFrh9Rew|c_+7Y$I%rB!w-!QN6O-j6&M86{+Ct1{1f`)jQjqU`=%kknn^H zFMqVO;LM8-ogFZ~w6)=`iOXgeJ`rB`D_}z`uw3!bEqGx9b;yo6t5(IH{^0$UHqwKvdXkp)}v18-)<@ZPl4xyU4Y*;oxf_zpF-V@1oJD{1z9MrUky z{ZA{&7Os5{jmoq?7MU8VMa@g_^e3Ps;1Osl;+Xi~D>yrEQpIXpPONn^9*5GzWbLL+P?A8?Wl^aaETgF0X8a8=mUvrV_ znn?n#VZif<4c(Mth(Dl+o`m_s6Q35rW2gsG? z%eDgdoT%M|OThl>D?#k4qcdWgnUIy_4d4ycvw{FAbVGW*$?=>lhR@kCt;X%uo=|3^b*zp<-6AeHAN;`zg^Ir zqjPZPF<3>NC<%YMVnii=6A-lCzvf@*5)&NdZN27CFlOxjAnz?3dt#Ey)+t^t&gk9o z+k)A&hC2nR8X!=DWAv`C^FuWai&Ru4>%Xxj{6noYYViFhL6*i%1qeGN%rEZwko{Fg z(MS0y^9WZlX8hF=(Jyq546@x+lgO|bG%p3bE({@!E12Gn7OEH*cgWMC=me|{6MpvD z^MyMnO&FGdD#idi)alnc+$8-bl*x`p&aZJ_OF($QB?(2>uKg)u);{%g%*?Fvwuf0K zqPx#32;bRa{vGqB>(^xB>_oNB=7(L032yVPgDQ^00IC2000000384T04M+e0384T z0384T1VRU+p4R{X1P)0=K~#7F>{wffO;H#g290YYDRL=8lgook4U?FeqVX^uMv@oP zDY=y?cO^*@FDA)@P^2LdQ9QUb@k;Yz@IVG-^5mAwFmA*5VbyJXK%S=bGo zvexq^T~qm`dR~Z`jVK@HT2<0q)SAq?=@x6f;Po|NZc<(+bxR~&>~xb#x(WS)E{@@U zxGPq9y+xmkoD))sEcXHHfB^}~cp37LPiI3y^2*sX4ypy+o3oWjNaDBEf+p#AEFnu2 zJ&k^#wy6c>|8|fptw0IlmhaD&EX^ZU*!<#~2h10+eFYYYadIaDab-3pNI(4ljVgUW zECW^ob-;Om2L${&p8?opEtGOWIVXxR|8ju7_|82IoC0`2u^gBS*lGl|Q^sRN<~~9& z2cw+=4glx=;4rRBf!I=v88Yc-4htt0Z>xjnQgi$JtZWQ-k%gWM$s#@mWSqKv9pf_r zDfQ?`UPm$a2Y(IlP|cGzO#41KEO>7qikt<>%;l9gH*X5YWIF>O=Qt2s^k+Tq5S!>E zD{Lf>j>VP|Rq(p0UOPdjJipryS4x(|Tysjqz68Hd*M z44Q}Uabo6{{la34wwd=U;G1KdoJ)Z3N##x?Ax#Xu2|5Ag7#1fZ>VfZ<<7J8I0szdK?;Da5Jw_w0$w}RJ@ny>vu6!X~LVJ88E(h zy^+R9@9a`s^11Eq0c`b#x^tr6YfTO_7onHIuXgZU>Y*5D7dCj~xQ-V2aU*^4V4Y84 z6d47QYnxtWF~DMS0j0l`g=bS$s(J6xcRf*86qo+^F_dwsg+-anQHO`;iZ|WCbE$Rm zcO1kT<%h9x3yLG#L6$k0_B4wTZli??7MfMXUoLr*($5$x^Y=U0#KCI=5cjvoVLDx1 zkFIpIB7OK*k9WP~d_c%Pl-^%sw9+NK}fzXpqV~Ls zWXIV-|A>HBrrHa_c3|&oU71rI_TetamQ0K(j`uZv)!1-3l!*U;bmJO?y@M=w8jiRN z0#2Fg2NxrHaOOGAvt>aG?C-l+^9#7Om^2XwfkEH~kj75e=RqV3QCgn*O_8&SY7?!= zWO>=~CTDm#b-VN5M!#=B-spJK0!~%cdoI?+6&(A+ITcI?dWfF^dN95Mdi(Ui+ZVu& zo!Xrsk~dLW?s*ZZ5xTi9(LF&>J(0gS-q3(oq`JiUzZQ_STG*RbyPoAXh5pXPYfpyY zs@%5%f1kddvi`Urc0Y7Gf%P32@EW38=@Lx}q8{fsKL(sKm6khuLt0wB3`1c#e|ka< zeQg`NOgz0^IqAf(71-SMwxfv}OTU;CxaqrIzMxeZ4f>*gTP1ay8sT!wCBz>QSbqqI4mj7aDn zbG&Oaye_LRa*4G3Mxr;;7GCQ?$3V@mq^P`Bp;x(gQKOf7I^})_1DQUlG9LHp4vLB)GFg~uyOPj`Z#Tl z^E3UvpsE}Q(I23qi5dXUt^$A2-@j^-T6t@6us5zxm`Hv?X?f8}F7lJ^Ft8n1{~Kip zM1yX5YUgSS-1n&V{q9k0#1=?rpu9=D6I^(mUoMScEzSs;O{1xo+3R> zk?2%wi@GKv1v-81taiSNb7sIzD!&Zs`%Q7G$^wYCR<$1woaZ{;ivcI6Is}7XMmJ>0 z+PiH%4`g^E(K2kZA;>P1GfI(PJYouwL8vl^lLeI zL9Z?!LQTc!s=|xJ?>W{t*IrCO|E;D6piK0Zya94?bNc!C3~_$%(9g+W3|l}hUZmF> zD!*;UFE>&C=T1F9O%d&3yFe;uz{=08Pva=W`PMDx!RM0mUlH zC7bH+0Fnv7^6%TD&Hp(A(NP6K7qAHqDKc-A+y zH=v&ZlBk_*y5=UzAD;BEHAQ9<)fTjIg&QlXvDDc!!}R)N_O(DL#JNE510f`M6f%h2sdU=9_g$<(!$ zUr4(B&Gn`N^%mX)>^GVwbb4}rcp*jRD21oV6@#yiltbcPY1xr9D&`0)A(2~{&v__yc0<95fjX-Mz b@+0scS>l3sMTmK^00000NkvXXu0mjfPuTKT literal 0 HcmV?d00001