From 69a915356dc48f566951361225004c156035d39c Mon Sep 17 00:00:00 2001 From: Huy Nguyen Date: Sun, 6 Aug 2017 13:20:33 +0100 Subject: [PATCH] [ASStackLayoutSpec] Fix interitem spacing not being reset on new lines and add snapshot tests #trivial (#491) * Add snapshot tests for interitem and interline spacings of stack spec * Improve comment * Make sure item spacings are properly considered and reset on new lines, snapshot tests included --- .../Layout/ASStackUnpositionedLayout.mm | 12 +- Tests/ASStackLayoutSpecSnapshotTests.mm | 114 +++++++++++++++++- ...eSpacingOverflow_alignContentCenter@2x.png | Bin 0 -> 2044 bytes ...LineSpacingOverflow_alignContentEnd@2x.png | Bin 0 -> 2051 bytes ...ingOverflow_alignContentSpaceAround@2x.png | Bin 0 -> 2044 bytes ...ngOverflow_alignContentSpaceBetween@2x.png | Bin 0 -> 2023 bytes ...neSpacingOverflow_alignContentStart@2x.png | Bin 0 -> 2023 bytes ...SpacingUnderflow_alignContentCenter@2x.png | Bin 0 -> 5395 bytes ...ineSpacingUnderflow_alignContentEnd@2x.png | Bin 0 -> 5372 bytes ...ngUnderflow_alignContentSpaceAround@2x.png | Bin 0 -> 5255 bytes ...gUnderflow_alignContentSpaceBetween@2x.png | Bin 0 -> 5366 bytes ...eSpacingUnderflow_alignContentStart@2x.png | Bin 0 -> 5417 bytes ...pacingUnderflow_alignContentStretch@2x.png | Bin 0 -> 5325 bytes .../testFlexWrapWithItemSpacings@2x.png | Bin 0 -> 7346 bytes ...ithItemSpacingsBeingResetOnNewLines@2x.png | Bin 0 -> 10115 bytes 15 files changed, 120 insertions(+), 6 deletions(-) create mode 100644 Tests/ReferenceImages_64/ASStackLayoutSpecSnapshotTests/testAlignContentAndLineSpacingOverflow_alignContentCenter@2x.png create mode 100644 Tests/ReferenceImages_64/ASStackLayoutSpecSnapshotTests/testAlignContentAndLineSpacingOverflow_alignContentEnd@2x.png create mode 100644 Tests/ReferenceImages_64/ASStackLayoutSpecSnapshotTests/testAlignContentAndLineSpacingOverflow_alignContentSpaceAround@2x.png create mode 100644 Tests/ReferenceImages_64/ASStackLayoutSpecSnapshotTests/testAlignContentAndLineSpacingOverflow_alignContentSpaceBetween@2x.png create mode 100644 Tests/ReferenceImages_64/ASStackLayoutSpecSnapshotTests/testAlignContentAndLineSpacingOverflow_alignContentStart@2x.png create mode 100644 Tests/ReferenceImages_64/ASStackLayoutSpecSnapshotTests/testAlignContentAndLineSpacingUnderflow_alignContentCenter@2x.png create mode 100644 Tests/ReferenceImages_64/ASStackLayoutSpecSnapshotTests/testAlignContentAndLineSpacingUnderflow_alignContentEnd@2x.png create mode 100644 Tests/ReferenceImages_64/ASStackLayoutSpecSnapshotTests/testAlignContentAndLineSpacingUnderflow_alignContentSpaceAround@2x.png create mode 100644 Tests/ReferenceImages_64/ASStackLayoutSpecSnapshotTests/testAlignContentAndLineSpacingUnderflow_alignContentSpaceBetween@2x.png create mode 100644 Tests/ReferenceImages_64/ASStackLayoutSpecSnapshotTests/testAlignContentAndLineSpacingUnderflow_alignContentStart@2x.png create mode 100644 Tests/ReferenceImages_64/ASStackLayoutSpecSnapshotTests/testAlignContentAndLineSpacingUnderflow_alignContentStretch@2x.png create mode 100644 Tests/ReferenceImages_64/ASStackLayoutSpecSnapshotTests/testFlexWrapWithItemSpacings@2x.png create mode 100644 Tests/ReferenceImages_64/ASStackLayoutSpecSnapshotTests/testFlexWrapWithItemSpacingsBeingResetOnNewLines@2x.png diff --git a/Source/Private/Layout/ASStackUnpositionedLayout.mm b/Source/Private/Layout/ASStackUnpositionedLayout.mm index 8bed958aa4..54a17bb089 100644 --- a/Source/Private/Layout/ASStackUnpositionedLayout.mm +++ b/Source/Private/Layout/ASStackUnpositionedLayout.mm @@ -485,7 +485,8 @@ static CGFloat computeItemsStackDimensionSum(const std::vector collectChildrenIntoLines(const std:: std::vector lines; std::vector lineItems; CGFloat lineStackDimensionSum = 0; + CGFloat interitemSpacing = 0; for(auto it = items.begin(); it != items.end(); ++it) { const auto &item = *it; const CGFloat itemStackDimension = stackDimension(style.direction, item.layout.size); - const CGFloat itemAndSpacingStackDimension = (lineItems.empty() ? 0.0 : style.spacing) + item.child.style.spacingBefore + itemStackDimension + item.child.style.spacingAfter; - const BOOL negativeViolationIfAddItem = (ASStackUnpositionedLayout::computeStackViolation(lineStackDimensionSum + itemAndSpacingStackDimension, style, sizeRange) < 0); + const CGFloat itemAndSpacingStackDimension = item.child.style.spacingBefore + itemStackDimension + item.child.style.spacingAfter; + const BOOL negativeViolationIfAddItem = (ASStackUnpositionedLayout::computeStackViolation(lineStackDimensionSum + interitemSpacing + itemAndSpacingStackDimension, style, sizeRange) < 0); const BOOL breakCurrentLine = negativeViolationIfAddItem && !lineItems.empty(); if (breakCurrentLine) { lines.push_back({.items = std::vector (lineItems)}); lineItems.clear(); lineStackDimensionSum = 0; + interitemSpacing = 0; } lineItems.push_back(std::move(item)); - lineStackDimensionSum += itemAndSpacingStackDimension; + lineStackDimensionSum += interitemSpacing + itemAndSpacingStackDimension; + interitemSpacing = style.spacing; } // Handle last line diff --git a/Tests/ASStackLayoutSpecSnapshotTests.mm b/Tests/ASStackLayoutSpecSnapshotTests.mm index 042203fe1b..7f4c3251f6 100644 --- a/Tests/ASStackLayoutSpecSnapshotTests.mm +++ b/Tests/ASStackLayoutSpecSnapshotTests.mm @@ -110,6 +110,7 @@ static NSArray *defaultTextNodes() alignItems:style.alignItems flexWrap:style.flexWrap alignContent:style.alignContent + lineSpacing:style.lineSpacing children:children]; [self testStackLayoutSpec:stackLayoutSpec sizeRange:sizeRange subnodes:subnodes identifier:identifier]; @@ -163,6 +164,7 @@ static NSArray *defaultTextNodes() } - (void)testStackLayoutSpecWithAlignContent:(ASStackLayoutAlignContent)alignContent + lineSpacing:(CGFloat)lineSpacing sizeRange:(ASSizeRange)sizeRange identifier:(NSString *)identifier { @@ -170,8 +172,9 @@ static NSArray *defaultTextNodes() .direction = ASStackLayoutDirectionHorizontal, .flexWrap = ASStackLayoutFlexWrapWrap, .alignContent = alignContent, + .lineSpacing = lineSpacing, }; - + CGSize subnodeSize = {50, 50}; NSArray *subnodes = @[ ASDisplayNodeWithBackgroundColor([UIColor redColor], subnodeSize), @@ -181,10 +184,17 @@ static NSArray *defaultTextNodes() ASDisplayNodeWithBackgroundColor([UIColor greenColor], subnodeSize), ASDisplayNodeWithBackgroundColor([UIColor cyanColor], subnodeSize), ]; - + [self testStackLayoutSpecWithStyle:style sizeRange:sizeRange subnodes:subnodes identifier:identifier]; } +- (void)testStackLayoutSpecWithAlignContent:(ASStackLayoutAlignContent)alignContent + sizeRange:(ASSizeRange)sizeRange + identifier:(NSString *)identifier +{ + [self testStackLayoutSpecWithAlignContent:alignContent lineSpacing:0.0 sizeRange:sizeRange identifier:identifier]; +} + #pragma mark - - (void)testDefaultStackLayoutElementFlexProperties @@ -1209,6 +1219,77 @@ static NSArray *defaultTextNodes() [self testStackLayoutSpec:stackLayoutSpec sizeRange:kSize subnodes:children identifier:nil]; } +#pragma mark - Flex wrap and item spacings test + +- (void)testFlexWrapWithItemSpacings +{ + ASStackLayoutSpecStyle style = { + .spacing = 50, + .direction = ASStackLayoutDirectionHorizontal, + .flexWrap = ASStackLayoutFlexWrapWrap, + .alignContent = ASStackLayoutAlignContentStart, + .lineSpacing = 5, + }; + + CGSize subnodeSize = {50, 50}; + NSArray *subnodes = @[ + ASDisplayNodeWithBackgroundColor([UIColor redColor], subnodeSize), + ASDisplayNodeWithBackgroundColor([UIColor yellowColor], subnodeSize), + ASDisplayNodeWithBackgroundColor([UIColor blueColor], subnodeSize), + ]; + + for (ASDisplayNode *subnode in subnodes) { + subnode.style.spacingBefore = 5; + subnode.style.spacingAfter = 5; + } + + // 3 items, each item has a size of {50, 50} + // width is 230px, enough to fit all items without taking all spacings into account + // Test that all spacings are included and therefore the last item is pushed to a second line. + // See: https://github.com/TextureGroup/Texture/pull/472 + static ASSizeRange kSize = {{230, 300}, {230, 300}}; + [self testStackLayoutSpecWithStyle:style sizeRange:kSize subnodes:subnodes identifier:nil]; +} + +- (void)testFlexWrapWithItemSpacingsBeingResetOnNewLines +{ + ASStackLayoutSpecStyle style = { + .spacing = 5, + .direction = ASStackLayoutDirectionHorizontal, + .flexWrap = ASStackLayoutFlexWrapWrap, + .alignContent = ASStackLayoutAlignContentStart, + .lineSpacing = 5, + }; + + CGSize subnodeSize = {50, 50}; + NSArray *subnodes = @[ + // 1st line + ASDisplayNodeWithBackgroundColor([UIColor redColor], subnodeSize), + ASDisplayNodeWithBackgroundColor([UIColor yellowColor], subnodeSize), + ASDisplayNodeWithBackgroundColor([UIColor blueColor], subnodeSize), + // 2nd line + ASDisplayNodeWithBackgroundColor([UIColor magentaColor], subnodeSize), + ASDisplayNodeWithBackgroundColor([UIColor greenColor], subnodeSize), + ASDisplayNodeWithBackgroundColor([UIColor cyanColor], subnodeSize), + // 3rd line + ASDisplayNodeWithBackgroundColor([UIColor brownColor], subnodeSize), + ASDisplayNodeWithBackgroundColor([UIColor orangeColor], subnodeSize), + ASDisplayNodeWithBackgroundColor([UIColor purpleColor], subnodeSize), + ]; + + for (ASDisplayNode *subnode in subnodes) { + subnode.style.spacingBefore = 5; + subnode.style.spacingAfter = 5; + } + + // 3 lines, each line has 3 items, each item has a size of {50, 50} + // width is 190px, enough to fit 3 items into a line + // Test that interitem spacing is reset on new lines. Otherwise, lines after the 1st line would have only 2 items. + // See: https://github.com/TextureGroup/Texture/pull/472 + static ASSizeRange kSize = {{190, 300}, {190, 300}}; + [self testStackLayoutSpecWithStyle:style sizeRange:kSize subnodes:subnodes identifier:nil]; +} + #pragma mark - Content alignment tests - (void)testAlignContentUnderflow @@ -1282,4 +1363,33 @@ static NSArray *defaultTextNodes() [self testStackLayoutSpecWithStyle:style sizeRange:kSize subnodes:subnodes identifier:nil]; } +#pragma mark - Line spacing tests + +- (void)testAlignContentAndLineSpacingUnderflow +{ + // 3 lines, each line has 2 items, each item has a size of {50, 50} + // 10px between lines + // width is 110px. It's 10px bigger than the required width of each line (110px vs 100px) to test that items are still correctly collected into lines + static ASSizeRange kSize = {{110, 320}, {110, 320}}; + [self testStackLayoutSpecWithAlignContent:ASStackLayoutAlignContentStart lineSpacing:10 sizeRange:kSize identifier:@"alignContentStart"]; + [self testStackLayoutSpecWithAlignContent:ASStackLayoutAlignContentCenter lineSpacing:10 sizeRange:kSize identifier:@"alignContentCenter"]; + [self testStackLayoutSpecWithAlignContent:ASStackLayoutAlignContentEnd lineSpacing:10 sizeRange:kSize identifier:@"alignContentEnd"]; + [self testStackLayoutSpecWithAlignContent:ASStackLayoutAlignContentSpaceBetween lineSpacing:10 sizeRange:kSize identifier:@"alignContentSpaceBetween"]; + [self testStackLayoutSpecWithAlignContent:ASStackLayoutAlignContentSpaceAround lineSpacing:10 sizeRange:kSize identifier:@"alignContentSpaceAround"]; + [self testStackLayoutSpecWithAlignContent:ASStackLayoutAlignContentStretch lineSpacing:10 sizeRange:kSize identifier:@"alignContentStretch"]; +} + +- (void)testAlignContentAndLineSpacingOverflow +{ + // 6 lines, each line has 1 item, each item has a size of {50, 50} + // 10px between lines + // width is 40px. It's 10px smaller than the width of each item (40px vs 50px) to test that items are still correctly collected into lines + static ASSizeRange kSize = {{40, 310}, {40, 310}}; + [self testStackLayoutSpecWithAlignContent:ASStackLayoutAlignContentStart lineSpacing:10 sizeRange:kSize identifier:@"alignContentStart"]; + [self testStackLayoutSpecWithAlignContent:ASStackLayoutAlignContentCenter lineSpacing:10 sizeRange:kSize identifier:@"alignContentCenter"]; + [self testStackLayoutSpecWithAlignContent:ASStackLayoutAlignContentEnd lineSpacing:10 sizeRange:kSize identifier:@"alignContentEnd"]; + [self testStackLayoutSpecWithAlignContent:ASStackLayoutAlignContentSpaceBetween lineSpacing:10 sizeRange:kSize identifier:@"alignContentSpaceBetween"]; + [self testStackLayoutSpecWithAlignContent:ASStackLayoutAlignContentSpaceAround lineSpacing:10 sizeRange:kSize identifier:@"alignContentSpaceAround"]; +} + @end diff --git a/Tests/ReferenceImages_64/ASStackLayoutSpecSnapshotTests/testAlignContentAndLineSpacingOverflow_alignContentCenter@2x.png b/Tests/ReferenceImages_64/ASStackLayoutSpecSnapshotTests/testAlignContentAndLineSpacingOverflow_alignContentCenter@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..188cd6007e74b51c09f058c2719e3f17d98f531c GIT binary patch literal 2044 zcmeAS@N?(olHy`uVBq!ia0vp^0SpXGIUH<2R+gCxNPw|8$lZxy-8q?;Kn`btM`SSr zgP1A^GkON8d;ki{WV-l=0BI&51_DMiAfW-FL2TwPJsV6Sfb;=R7srqa#y58zvko)x zusHnxe|hC+*0l<2tQzI6pXfIEaqanM8~OUrd~#3Ep8j37{J;k$(G>^Yumm5 z%}EE+Ck~_?zH}3;-k@}e<$0jK35{plmTrcqf8|j;52#Opc{Za3iOksYJq_rr4UGnQ%%T!z0>^R}Fdb$)w1YP!;f906_C_uq zX^zKc0gZ{wiFeqv4005DZac8H@wOC7gEjrjdr;2#*Vj5AVTTP@$b8gKSSc@F1P-E#gPUGj8-R6O>F2ft zTec_R<`-G8j)GUmTV=qO#cjy>#Rt}5@%1rf&NDFouvcM!A#;4=-zGK@i7DTEwQzWqQei0|kvDD-PTjN@31jz`JH&)2oM*&-brg!vu`?SK2G&>P~NbV#x)J z-qq_DRQ))zZd3*>3?5iM{Gajv`^WPCfAFPl9_~NP3=IGO$2Qb22Il3ppuGGRn3H83 zMOZHG`@b~z7grbmS{Hw((>h%WT4@Kk?f?H#Ve*fX{?BaS#h}nI(P56UzyS}1bCMhh zDgw`W&M?Hc{Hr_jfN?!1OF~U81JjLp3BD4b+$vw+y5ju%r1zZFhvsciuemtssU3!>j0IzU$kfJ`;-5Jiw%@= zK%6~n$Nn*JJlM_%s##tHTkK)7># zfrt6PpZ}LPpA^?|R?g@B5_nLsY~pR3`tzTko4&(2_vi8+r5$GMaVJMI?-Rf))iBx>rP-g{5p66(`I2G&drU$c1kW+nj3lktZn=c%<=#K7hj(b z%H}gc+5GL@gSj$}B1bNqw0}8Ot@Y`{)eF>}k2guP%)Z>fUuSpz`Qz`^Z2T4X4_Du0 zl*m_TVA!S|A$$yIY{4(dr(C-at=pg-GoR^nHSZM%-YW;5wq4zvy?`xi0o%1co%f~z z%s@0=rG4v;DCq1IZ2KL6@lkG zECxay#cWIxoJTB~8GBeB&1n>U@cVqxKNhA$u0P%kAeE80RFY`$FjOw_zyDjkef>Y% zMh*tzLl_Yd^>M6!+1MViR;;gKV5*p{04ho^Z%_F3q5dH!8!(wX_@X<*ZV%hBe+(QC zau0w?;a^>PGWm=R4ENGnKs5kZcYDbj zexL~39H7X8^#yxaK{g4(ZIZjR(HuiE+>SkK=T){GId< Z<|~``f9YRXcmY&Pd%F6$taD0e0sw+nGM4}V literal 0 HcmV?d00001 diff --git a/Tests/ReferenceImages_64/ASStackLayoutSpecSnapshotTests/testAlignContentAndLineSpacingOverflow_alignContentSpaceAround@2x.png b/Tests/ReferenceImages_64/ASStackLayoutSpecSnapshotTests/testAlignContentAndLineSpacingOverflow_alignContentSpaceAround@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..188cd6007e74b51c09f058c2719e3f17d98f531c GIT binary patch literal 2044 zcmeAS@N?(olHy`uVBq!ia0vp^0SpXGIUH<2R+gCxNPw|8$lZxy-8q?;Kn`btM`SSr zgP1A^GkON8d;ki{WV-l=0BI&51_DMiAfW-FL2TwPJsV6Sfb;=R7srqa#y58zvko)x zusHnxe|hC+*0l<2tQzI6pXfIEaqanM8~OUrd~#3Ep8j37{J;k$(G>^Yumm5 z%}EE+Ck~_?zH}3;-k@}e<$0jK35{plmTrcqf8|j;52#Opc{Za3iOksYJq_rr4UGnQ%%T!z0>^R}Fdb$)w1YP!;f906_C_uq zX^zKc0gZ{wiFeqv4005DZac8H@wOC7gEjrjdr;2#*Vj5AVTTP@$b8gKSSc@F1P-E#gPUGj8-R6O>F2ft zTec_R<`-G8j)GUmTV=qO#cjy>#Rt}5@%1rf&NDFouvcM!A#;4=-zGK@i7DTEwQzWqQei0|kvDD-PTjN@31jz`JH&)2oM*&-brg!vu`?SK2G&>P~NbV#x)J z-qq_DRQ))zZd3*>3?5iM{Gajv`^WPCfAFPl9_~NP3=IGO$2Qb22Il3ppuGGRn3H83 zMOZHG`@b~z7grbmS{Hw((>h%WT4@Kk?f?H#Ve*fX{?BaS#h}nI(P56UzyS}1bCMhh zDgw`W&M?Hc{Hr_jfN?!1OF~U81JjLp3BD4b+$vw+y5ju%r1zZFhvsciuemtssU3!>j0IzU$kfJ`;-5Jiw%@= zK%6~n$Nn*JJlM_%s##tHTkK2f2hvkKT^vIy7~fnw*m;D3 zhxx#l`(I)&HKj(Rq$SSh>f6w6Q-A*RbNlxX0`KkFv)-DuO?-s|Ynu8Dp)}^)1-xti z^%NcQyTNJw@JsLl%kvIwMiUy(wk_RkJfV>%CE=Av@jM`{z&xARJ3U>2S@OhzD-)mD z0BHv{GwEsP&VkjhR6bh?(#MlyrZaagSbebjtj{2Qk~eZ9tgON6m-U%E2kA4~aC1XR z8CboKZ00$LMVk{}z5%PBVRdN^#GbC=J&1 zFYm$jmVcM|L?rb3nM8j?*X1nW-O_k9o)HvsiRw0gyY^2=1_uxKG~fG;;2>CD7jwc8 z6p9a6PcM6a031@m_IghwKwC!q%)Xv6TXUu z@XxQQ%Sjal22EJJ|M=+1QYW{;Uy&hU;rGp~0tY-4&Pj44 zs0cjgVKETuC}v}l;5=f<%-F;7Xig)88&lyq2L|Ovi*$vCi4Jp&4VY^LfBl%ChGGE=JJ;-ss_CSdvS-=&55ATzHV=$^J_-a@eaj$7-ytFysQiQAI$ zl?Nh!wJ!EfG}tL0sNvKK?gzpg3=$9a1~cFYIeY>Ar}BT|jrk4=K8^L944~lWCc_Xc zv4zjhp{o4x|BL^gKR-WTU4W5+=wyo&5a(Af$WLI1YxsVOU7_K=uK=)QJn%Byp!Vng zhw2jWY$YY}n;9t0YXK@a>$#7IGbl8~pFLskr+>Xx!}6vps3!Jw^>bP0l+XkKMS%o; literal 0 HcmV?d00001 diff --git a/Tests/ReferenceImages_64/ASStackLayoutSpecSnapshotTests/testAlignContentAndLineSpacingOverflow_alignContentStart@2x.png b/Tests/ReferenceImages_64/ASStackLayoutSpecSnapshotTests/testAlignContentAndLineSpacingOverflow_alignContentStart@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..20d303b586029a5ef5c5f72240c7f0268d49d1a6 GIT binary patch literal 2023 zcmeAS@N?(olHy`uVBq!ia0vp^0SpXGIUH<2R+gCxNPw|8$lZxy-8q?;Kn`btM`SSr zgP1A^GkON8d;ki{WV-l=0BI&51_DMiAfW-FL2Tv|i|>2f2hvkKT^vIy7~fnw*m;D3 zhxx#l`(I)&HKj(Rq$SSh>f6w6Q-A*RbNlxX0`KkFv)-DuO?-s|Ynu8Dp)}^)1-xti z^%NcQyTNJw@JsLl%kvIwMiUy(wk_RkJfV>%CE=Av@jM`{z&xARJ3U>2S@OhzD-)mD z0BHv{GwEsP&VkjhR6bh?(#MlyrZaagSbebjtj{2Qk~eZ9tgON6m-U%E2kA4~aC1XR z8CboKZ00$LMVk{}z5%PBVRdN^#GbC=J&1 zFYm$jmVcM|L?rb3nM8j?*X1nW-O_k9o)HvsiRw0gyY^2=1_uxKG~fG;;2>CD7jwc8 z6p9a6PcM6a031@m_IghwKwC!q%)Xv6TXUu z@XxQQ%Sjal22EJJ|M=+1QYW{;Uy&hU;rGp~0tY-4&Pj44 zs0cjgVKETuC}v}l;5=f<%-F;7Xig)88&lyq2L|Ovi*$vCi4Jp&4VY^LfBl%ChGGE=JJ;-ss_CSdvS-=&55ATzHV=$^J_-a@eaj$7-ytFysQiQAI$ zl?Nh!wJ!EfG}tL0sNvKK?gzpg3=$9a1~cFYIeY>Ar}BT|jrk4=K8^L944~lWCc_Xc zv4zjhp{o4x|BL^gKR-WTU4W5+=wyo&5a(Af$WLI1YxsVOU7_K=uK=)QJn%Byp!Vng zhw2jWY$YY}n;9t0YXK@a>$#7IGbl8~pFLskr+>Xx!}6vps3!Jw^>bP0l+XkKMS%o; literal 0 HcmV?d00001 diff --git a/Tests/ReferenceImages_64/ASStackLayoutSpecSnapshotTests/testAlignContentAndLineSpacingUnderflow_alignContentCenter@2x.png b/Tests/ReferenceImages_64/ASStackLayoutSpecSnapshotTests/testAlignContentAndLineSpacingUnderflow_alignContentCenter@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..27b26426db5c4cd34f9189461069fd32031aa606 GIT binary patch literal 5395 zcmeHLX;f258ch%(!G(YjP?)WmjUi^c$vMm7OigphQ-fZDVDm^o+qoS8A_ywpo2U#05Sz28^& zo!IE@u|VlhN(cmE0m0MF543y)Lhdk10o;wB&@ccEGRDut1;OHK^?(m($TKhofzU97 zFC@Xw;63Qn+U4f63AA$H0xzT!cr%%4;d`Z4ONF`1L3@SZ=DcY?vXAe}>abUv`wLD= zpe!-M=xduQX!uc8B8^AmL@jw+rPCwMh@?~Zwq_fkkn$20Z!`vl##quUl#rYrgq$9d zbL?k#JttdjCtU+4Hm2M}9#t?0MUzKqax{)1g!>Rl=?I}q%SDVXW1%iaRW}3`tR_c$ zhLm@aqs`l%;&K?WKkVdr7}ERR7lrXw{5tqoSpHwx@_u}9k6ky-Q!>k{*#?2>fp{fA{+9hy<~;TwcfxA$B7~8 z!9ilq@Y!4o*|8{o0?0>3GX{8?3_aXr6Z+vEcpYg zNl(gSO*vUs{Shhyfe&MhOoi1~3?fYoWl`}ZH^&rk>mL;DXn>cLYYmokXtTKLuCbPI z9g|N{pLn(xp3wpeO-dK&1B<(riYL@g5li$vJe%}RF>h+CRy<4 zS7{^JXEO6LWl`OAO>Im1%oi7@>iL^I<0f)x=doj(hXyB^5N%2PUcu%!J`VvsP&Q>D z{L{IAw?#NU_c=E0V{3ST+?{jQJKOEmgYBD+Od&}+XlpSV)JB{1P=j$!AE zl@UsjZLK^yWL9m zy=WyqxX@#l-A@i04>7pt(*vs#@pDG;1&@_wM^K)rLwf%8o9uYTX zw}_nI5>Qvun*g@ItMO1k65iq`c=RWGfAC0zNlFXuov3xY$|AiQds9CM;rt66-jY&6 z(I0kmFGTllqM1duH7?_qW_J@eapKn#nl^gLqDI0a`xnGzp9-i?$7b##;YpmwYE#!H zD2IGx>>f0IUm${Kv?R!KpaJxOe~Qwko<+SFz23f5JfTe{z00f@e_vvj6!v&=S#-`x z=n4@RNK1G*%sAm?y9Y~H>_w18g5hbrae2@U7}n)*#x0ecE_D zbgrZ<1RmY>VV(9znHDH6c+p3hl$BQriMF3fWGH&Vn+J$`^RjrL=T@mE5GAoVug9HT8v#u&Wtje3F7P>Tf98Rj(|_BO39qkqw(RaW6-w zwF|IGJ8o;P)(L1R49`8VloKne>2!8w*XHYj1o4@zMlt=)M%fo+;;GX2X9y9;FTU+mvfJF}&vRw7 z#1w~}C`yYO!09u*uOnEF4S!M1l*w=%EWh7t z%4#k#1pB=?hbkZ`5`mCPE0Y)Q1BYD!d|>V8-zRsiQ$_erOMTK>lacSNE% zJ{Jt$K+9ba|tFL15(oAiu-Max6IFhAzcE)D^i zPKrwgn-a3cPsV`}YyPNjWCu0YMHakVo%~&iao7I(#W13er&9r<*0S1jD5N^Z86!)f zqjnNdVN@$C1tkDgBUvR%OQBfKu(fJ!JzVpqD#H?nAL1t# zM*6X%V$FQ>-xAx#4ou_Lzv1nxx%!cPj1kmVz;tDkKT<+g(Gs@6hmFq)6hwsKj}i~c zG?J6MLweTqp2C$uQ|gw<-&)AHtCL7*Hpf6D!Fy+zmaaQvtiC-z}Y=S4k!t*NK& zmlKWHXk>D6M2Ef!sJa7U{#D32MRsC=bwVDXm;;@_Ntyg>XGhMwnG*|(Hw2RHWFo7X zDIQk7>q=J}2zup}SqNx*Crrv!ov?njeD_+iUV+9`VK;G}%|T`-#_5fwTya93rX0!* zSem3Y3Q3wsPV1Z*_p$^SoW5BP^doRGakFM;9q>cASyyuj7@tqx2sj+>tO;rdK8ZBz zcA|kHDxLLAYk;k4h0RfOjZOoV>HcO!Qul3f@Kmt$T-<3WtqQtJiO2hTaU8wVd)BHB z5W;~nw@wZ96E03qhr!wm)ex(9ypnFPo30I@xRZHG)?lPQ@7sXdo}24 zOUzc3E=EN+M854C`7j_-<(Wqk|4^jh3C4di2Yem=EB60h_4w~&j$}?7?h>TtJfH}k PS0V`R-fk?HZAX3s){xbV literal 0 HcmV?d00001 diff --git a/Tests/ReferenceImages_64/ASStackLayoutSpecSnapshotTests/testAlignContentAndLineSpacingUnderflow_alignContentEnd@2x.png b/Tests/ReferenceImages_64/ASStackLayoutSpecSnapshotTests/testAlignContentAndLineSpacingUnderflow_alignContentEnd@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..740100fce28daaf85e717e6e2021b5ba9c30f4a8 GIT binary patch literal 5372 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 Nzdp#P-s{gt{s9X%OcMYA literal 0 HcmV?d00001 diff --git a/Tests/ReferenceImages_64/ASStackLayoutSpecSnapshotTests/testAlignContentAndLineSpacingUnderflow_alignContentSpaceBetween@2x.png b/Tests/ReferenceImages_64/ASStackLayoutSpecSnapshotTests/testAlignContentAndLineSpacingUnderflow_alignContentSpaceBetween@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..a60f63f145e052bbaf8713642c478c2d05e97afd GIT binary patch literal 5366 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 literal 0 HcmV?d00001 diff --git a/Tests/ReferenceImages_64/ASStackLayoutSpecSnapshotTests/testAlignContentAndLineSpacingUnderflow_alignContentStretch@2x.png b/Tests/ReferenceImages_64/ASStackLayoutSpecSnapshotTests/testAlignContentAndLineSpacingUnderflow_alignContentStretch@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..461c786922265fff8c12723e1ea07b33420c9fd0 GIT binary patch literal 5325 zcmeHKeK?fq8XwbeULV6uzA7Umgi@!NgW2(&!PX3hrZkdDA3|@&M@i8b+CEI2SnIP7 zMbZvBr9sh*T8oT|G8)BXWg{bL7HhE2P;2-6b^bcnbwTZ+e%|}K@8@^_?&rSW z_p~>egjQLmfVSuMkKhwrQie}tL8@eT#a;S5H|ouO;0yxzat9oMNcDo-7#)HGcy!I z3o0Iq+ofi6FyIq*=MvR}#U(Y-#VJuArBhPr&_PVnaJ5cQ(vtRT*0r@i;yo&Nj~a{C zDWz6UO*UG0-ApmViEr;LS5zk1^0AWP<Qrvj`(3IfTT>jj?J} zX4n_8^LS?s`2^=`$pSlExGxc^)6_bMrrd4PL18G5(L33j_xK6vl(LA1ItexR4b@Rs zoDyz-zX==oJE%@M zb&R9>OVbU~ZH6{KFgc;26{2;n`+#AUzM zoipSoG*wLKxP#%~A24Uy*Yf@Ov5nF;I-f|Z+^xA(8{g4ZDjF%9Y%dybZ{5fZ&Lx*c zvT{vL0XD_K{h5m|z^t>$YqSR%84yV51KhgFbqz$i^NTYG0q;YL z?>9?9Q@x+kh%K4fh}}({vns% z`-9B;w+2AwC&M&x_sE7nQKW{K^eKQ}>PmV=mm%55wb2#TL2LJp@kS*v45y zIPFSLUU&2wRw=r?$5DC~&ioJ5=`BQpE0tRu8ST>*UqVc@+P+TFr=4ezXl)|9*b`$75yZ z;LMheC&RMQ60g=+{!rRL=-cb%Lu$WfbjpokBo;El33qPOTdhv^;LpdgvxZ3j!SS6M zD-+!>l46{C5+L06?{tw63&L2TUM@kYBUu*~p_nL0mlduB<_Zh*g*f~VhU;!%Yi}ySqW5a<9(ldafE>A|LgRN^k?b5s!H3_K)1q) zafDoU{vMU4+mT;AhnKN4oXuz3wg4#Iis4^^O16ROMO-g5KY4;6?{D;S&p8DmUEkk+ zTI97}F(kllM<};oXY7xM8z{-bI;{?&uE9_v&_%tw}KJU}x1Z)UVkAsx#CPMW=Tf%0q(X2uAAN zJOU}l-wU#W;{O)%4Ay>?u_};ZA5L(X_JZ!2ja_=%i|o{XUowcX(w)}VLyJ@H7=o=f zUCNNt5A}QQeU%i2b8ghiIM7$?Q!ho;xUvZ^0Gxmr34uTH&_+(TjlM1o56MHqDrLyl zVSPKO1~sF7x(hV^|IrxweFFGXn3-u)V|+v)AWQl0!O#n5Hjaly@g`=9k5w56zgE{z zP4szEk-3Cwd-h_30TQ+TBqgTN2#H$GTdHu<+X*(Rq@qy!7NJ}ec*#OC7L$j@K#C~c zU4)HJFy6^f3q${ANK1j&iC9oxh{k^*H+n{o%K8J5t#vab+1MJT?rBRGxNK6D6n5zJ zP=aif0y9UiOpmNpS=%*;ocP7j<37BDJCUA1$Z4J_=s}rrK}s`K`(uvk;cKQB3{Rg=(TsXc3W@^$`8QSua8KNWC ztm<6m<(hkFy>1mU@T3S_!V!99?R_-h=!=|nH@J5@Pnir~P6S&Jg!g7v%T(s&p^x~m zcuQO0SqtomUlo4OH!H|!UJiVnl6pwd40uL@E!f^or44+vM9s_1qVkdN=fPHvcm5w-X3dr=to)!D|K{6FcpboK+Ox23~6^6EYh8Pvd>S4^8 z#GbH3r&WerjL00x{Fed}WTs14F$4*e7L@;L(QvF7DTH|&t{Q>w2ZZNFvKz-`C-XOt Cb5WxJ literal 0 HcmV?d00001 diff --git a/Tests/ReferenceImages_64/ASStackLayoutSpecSnapshotTests/testFlexWrapWithItemSpacings@2x.png b/Tests/ReferenceImages_64/ASStackLayoutSpecSnapshotTests/testFlexWrapWithItemSpacings@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..31df2f6199a0fd2493027f480dee0629af16e4fc GIT binary patch literal 7346 zcmeHM`&ZLf690Zf0!dgUh?@F>COJT&)iR1CwW#YC@7z%aZG!w8>}onge-(h~=O3lpN&V72Y@^&n6(qmzXg zHhVF8;V}t5CK#N*V=ZqZAOT+RhcAJD@4rLzOcP$>e0C0y9kX`z#{Kw^w(Gd|Ze3)& zb&5B7DI`eBSUp7DoLyPEOpK?eEDEOcGAw%A*bPfZnU|NBZJFi|L!Mc;hE!yG8b0~O z@zt+N=Ud_>9qIiyMJ@Z{matU^MbqiDdm(kh1)-CgT+4yca)wNrU$EK6-^yW<>TfOL z?cdB{CQg+!*N2*}Wf7$QvKQ-=HV)vRh!~6$6Peosh33nEEThQOM@nS6bO`lbAeYC9 zCVm3BdT;i#agax^hCjap^V}o0=0vM!wrwizP}cCNg7z)fD>pJp!h1cx8vJF_Im>%V znps?RD%0E&KvnR44I@Lrt_r^Vrs?q$ih_UV_~_$ekUc{ULq|at1dX+HBmIp*CxZ_J z-(2d}B;`{FGERlRTnYZFca2vTkinpS;QXFNVDRv4*^N>#aE}N#&Hw}5)s@zDfckmi z!;^p|aiL>d0M+KO@mGL;#!&Mfz>0fewugY4vQ-8tVAlD*EIuT%U_Gz#A|&!4jb610 z66w-L)P4YoEPb?FGn1>78{+fP=+AYkprCdMH@` zwt9jHi)`r`h)t)_xa!GYQYX7+Bi%RW@>`Qgpi?!@5!w3C78;+*bSfX<9Dk5Gd67kh z)wz|G=4ovd!?FwxzGXf0MoRf#^LNIhGFY)tWX(ccny8l&9vRHT>%2SmCxFh}8kXO) z4Uv`|Yc2Mi0j>-G_KByt22s@?{qq{)6nq&eH#s8$R@-mh>yh=`Dpz2$-J(p5lF?N6i0rS@QDCBqVo_)mSP9$bR`rWO$5kCXiGuMi zQBG_CyduJcK|wNUNM2P6&sQc@=2(6;eh6~mcdliAAZLzHlAsK@kM*^|Q0Im%g>Adx zxNN)AIB*u`e{n~i6AvzHZtq!f6(T%TZEN2J+nuUHT^=i*8r2$(^fSwWDLZHWCa< z7klNog29V*3q%V6$K1coM>z+VR}}^T_FFv*a{-HW3l1y;?9|JPb^&&?Q`npXc{&Li-+l#o&dXz4+5zk7 zjU(A8Zw-6oIp8*p(!vL965$?u(K=?8w+}CbW3ZhWi`M;j-zpudpW#FqDvOZar`m-S z*sKYEt_KWPHpJ+ZXs4_*6=*o_$pv#N+Mgn7HyW zFCU|{twb^wkdc|JmXjT!g>3R+V5lfk^(CN)~uGB)Ky< zVot4?KTs6v=f@Fal6AOxSIfu;U_rY(i`J&ytLukHMkk!mV~^7!#V}b(kXBgUR8}IM zxg=t}`;#kR!C@qEm_k+6DGx*mM|=5a1+$Q+eyVo5;PsS?GO?p7Gz59!D8zi*%;?gc z1KP^d?+E>6%E6p{@8VMMm$%~m1F5WLX-e8e%qzI%>Ua+HSSJp7Nk zMrNo?nUszC6^*fhPHSsC=La27+)TjLsiu=#PomcNnjlSP4HJ>grwoS7HT=hb8K^bF z{b%ry9C|HIa3vCj>ZsgEWOK=tEa>a>K%JB?5%UAb?$$;ln;cwSGw%Qab8UaeLT<*be1AyMI;k( z^!Ie2tx)*zIPYAOUxH>)-9{t*u?dm;M{hx8!R8 literal 0 HcmV?d00001 diff --git a/Tests/ReferenceImages_64/ASStackLayoutSpecSnapshotTests/testFlexWrapWithItemSpacingsBeingResetOnNewLines@2x.png b/Tests/ReferenceImages_64/ASStackLayoutSpecSnapshotTests/testFlexWrapWithItemSpacingsBeingResetOnNewLines@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..1824a25085daea323ef17c3fe66240e90f0026cf GIT binary patch literal 10115 zcmeHNX;f2L5>5y-5CoAeB8zkj1Bi+{0!D%&f{qCg1!OTut3gpgA%YMRM1zeWC@##f zMRAD^5I~4FiwUHqU3wrQn_xqd!68Njq96pa&3nO|Ioj=B9|axFqomgpHC1B1}DQ{TA_O10F(o3Ba?szo)ENSD~#E0Ee0O+mxq6JwU4k+`tFE0{C*8Yr)@^?`;WJ?SZz=-^Y7TGW=tqcfL)% zp$^HBf293Zth5dt6d##$u*=ESqU7}r#pCTRP^`eGo-lSJ}U2?QNK#qvA#Y>T#p5^!N zu|^LaX$*^fX~|OA-IbVAD)$ELCbuaJI3soOKMU`0Ljb$z3FxjoyyY9Tk=Ydi%?uli1$>Lg6Y3SG!F z`hL-4Q3oI#=c(wPcK%9Lb@zJ>>;f$EB2~|dG-g)a(`^_=a+bJ#3?w(P)AJc7|`rtHzN%r6LH2E02@N;cCR{n*kC&!f-*~O^5{eVmbULd{y*GuQlrVQOXC5FsUS>sjx3<<-oq(H&%I7j`SCYxj8T- zjaZn2b^C)iVK#b0t0y9dl{>}40)rU3I7Ovh;j_75%vrZtfKp(K3n~L!@ zEDz(Kv-3t8HZpp4w>Zn0rWpMT39Lloh67E~ADOWUM+eM`x#J%2Yw?>H(Q_brNyo93 zMHzT$q+_~?k?5$n{U|s2)5*x*;jRYfO*B49%SjlIZSDDhS?s!nsYa)xLD&7dr2G7* ze+)G++a8ec@kq{yb^upce6h0o?0j_PcRkDX=b7Se9$t=^k1k|aQn2ZKQ}v(a?;BLdWj{8x%Tzvx7h}8r-V?pEkp1 zG#qX{5zKe05e}X=CA*?)oWLXt!$u&z_;_3$0!WOmeN5-NX0?{7xn_)<oLUwqW!F95Fm&=oI1uFK=;T;6n->F6IQ36-i;BC5LVLopL% zaa1`u98wCb=I-|#szSN$8)dK<{?Bqr5&OB5AQ{`&dqqL8SgP2wsDzYLu*wFpd5w}p z5LL-IE4Ii2rAQS|;@lsm8qJ)=2xX`(CD*U0>n{bV!VZUEpg7Zhky|Bw7=9bIONL@o zg|fT`D}rrJTO|5^+2jf4k?RB}pbi2SfmljWuGN0+Z_ifQ-kzf%snfd-cX!=t0;@bg z?T1Vwj4fRsm+am#{i72WA;B;9laX`maJ;mo@%5Gr%j;#zT`>h>^E7bQ+$!Z02~jOWsG!@*5CkrLrP7e zqvc?Li%z-39Q484mFvfgI8mTtH@~{hbwSmD0iF9S-E}sjBxA~oj_kXhFC>{^&Y^Qa ze?4*Q3}3DTDrS3^m6Tq|*bDmZ<#T62eR|R~@zVYk1OAzAT{|^EPaCw!hF$*xD4sMl z8J*10ScZl3bebByVke`;*tJc!f;B)NhsO-MQCmR8ahGEl#5)?xkjbkA0}9X+N%=xU zmIi43z}5-&jKN_*aoRZ_PxLa4W%%X<`1lwP@I=Ga1#$PUYkLLHa<5SaSo_rsl{76|t_hPfZB*AGO3+znVkp`PoFI?U<+i=Mg4i?&zI>&W&o4= zQYoF^Tojs4xu@OErB7J0c@hPy&A`j{B9+2>hW@rJY1WqKTCl}gn&B$V80Sl>D7Aj; zC|mw4(IKcW>e$4nW0QLcd#^0q1LfNwAGZcUGi&_$X- z{jU(qJ4f|+m7uL>Y*+1UCoM{CN}j1#yF|!NB|HI@(^28!p4( zT18qJoHMBKMRpiFl(D?H3!|m2cMPeg9F9D;Jsoy70wYNXLg+&sLOz714YX3A-~h!# nXitH*Q7ChOlBNHZ{7^v1G_o*8lQ-S~|0U