 Chromium Code Reviews
 Chromium Code Reviews Issue 2686573003:
  [ObjC ARC] Converts ios/chrome/browser/ui/stack_view:unit_tests to ARC.  (Closed)
    
  
    Issue 2686573003:
  [ObjC ARC] Converts ios/chrome/browser/ui/stack_view:unit_tests to ARC.  (Closed) 
  | OLD | NEW | 
|---|---|
| 1 // Copyright 2012 The Chromium Authors. All rights reserved. | 1 // Copyright 2012 The Chromium Authors. All rights reserved. | 
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be | 
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. | 
| 4 | 4 | 
| 5 #include "base/mac/scoped_nsobject.h" | |
| 6 #include "ios/chrome/browser/ui/rtl_geometry.h" | 5 #include "ios/chrome/browser/ui/rtl_geometry.h" | 
| 7 #import "ios/chrome/browser/ui/stack_view/card_stack_layout_manager.h" | 6 #import "ios/chrome/browser/ui/stack_view/card_stack_layout_manager.h" | 
| 8 #import "ios/chrome/browser/ui/stack_view/stack_card.h" | 7 #import "ios/chrome/browser/ui/stack_view/stack_card.h" | 
| 9 #include "testing/gtest/include/gtest/gtest.h" | 8 #include "testing/gtest/include/gtest/gtest.h" | 
| 10 #include "testing/platform_test.h" | 9 #include "testing/platform_test.h" | 
| 11 | 10 | 
| 11 #if !defined(__has_feature) || !__has_feature(objc_arc) | |
| 12 #error "This file requires ARC support." | |
| 13 #endif | |
| 14 | |
| 12 @interface CardStackLayoutManager (Private) | 15 @interface CardStackLayoutManager (Private) | 
| 13 - (CGFloat)minStackStaggerAmount; | 16 - (CGFloat)minStackStaggerAmount; | 
| 14 - (CGFloat)scrollCardAwayFromNeighborAmount; | 17 - (CGFloat)scrollCardAwayFromNeighborAmount; | 
| 15 - (CGFloat)staggerOffsetForIndexFromEdge:(NSInteger)countFromEdge; | 18 - (CGFloat)staggerOffsetForIndexFromEdge:(NSInteger)countFromEdge; | 
| 16 - (CGFloat)maximumCardSeparation; | 19 - (CGFloat)maximumCardSeparation; | 
| 17 @end | 20 @end | 
| 18 | 21 | 
| 19 // A mock version of StackCard. | 22 // A mock version of StackCard. | 
| 20 @interface MockStackCard : NSObject | 23 @interface MockStackCard : NSObject | 
| 21 | 24 | 
| (...skipping 84 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 106 } | 109 } | 
| 107 } | 110 } | 
| 108 | 111 | 
| 109 // Creates a new |CardStackLayoutManager|, adds |n| cards to it, and sets | 112 // Creates a new |CardStackLayoutManager|, adds |n| cards to it, and sets | 
| 110 // dimensional/positioning parameters to the constants defined above. | 113 // dimensional/positioning parameters to the constants defined above. | 
| 111 CardStackLayoutManager* newStackOfNCards(unsigned int n, BOOL layoutIsVertical) | 114 CardStackLayoutManager* newStackOfNCards(unsigned int n, BOOL layoutIsVertical) | 
| 112 NS_RETURNS_RETAINED { | 115 NS_RETURNS_RETAINED { | 
| 113 CardStackLayoutManager* stack = [[CardStackLayoutManager alloc] init]; | 116 CardStackLayoutManager* stack = [[CardStackLayoutManager alloc] init]; | 
| 114 stack.layoutIsVertical = layoutIsVertical; | 117 stack.layoutIsVertical = layoutIsVertical; | 
| 115 for (unsigned int i = 0; i < n; ++i) { | 118 for (unsigned int i = 0; i < n; ++i) { | 
| 116 base::scoped_nsobject<StackCard> card( | 119 StackCard* card = (StackCard*)[[MockStackCard alloc] init]; | 
| 
sdefresne
2017/02/09 13:47:49
nit: please change this to use a static_cast:
  S
 
lody
2017/02/09 16:00:03
Done.
 | |
| 117 (StackCard*)[[MockStackCard alloc] init]); | |
| 118 [stack addCard:card]; | 120 [stack addCard:card]; | 
| 119 } | 121 } | 
| 120 | 122 | 
| 121 CGSize cardSize = CGSizeMake(kCardWidth, kCardHeight); | 123 CGSize cardSize = CGSizeMake(kCardWidth, kCardHeight); | 
| 122 [stack setCardSize:cardSize]; | 124 [stack setCardSize:cardSize]; | 
| 123 [stack setStartLimit:kMargin]; | 125 [stack setStartLimit:kMargin]; | 
| 124 [stack setMaxStagger:kMaxStagger]; | 126 [stack setMaxStagger:kMaxStagger]; | 
| 125 [stack setLayoutAxisPosition:kAxisPosition]; | 127 [stack setLayoutAxisPosition:kAxisPosition]; | 
| 126 CGFloat cardLength = layoutIsVertical ? cardSize.height : cardSize.width; | 128 CGFloat cardLength = layoutIsVertical ? cardSize.height : cardSize.width; | 
| 127 [stack setMaximumOverextensionAmount:cardLength / 2.0]; | 129 [stack setMaximumOverextensionAmount:cardLength / 2.0]; | 
| 128 | 130 | 
| 129 return stack; | 131 return stack; | 
| 130 } | 132 } | 
| 131 | 133 | 
| 132 TEST_F(CardStackLayoutManagerTest, CardSizing) { | 134 TEST_F(CardStackLayoutManagerTest, CardSizing) { | 
| 133 BOOL boolValues[2] = {NO, YES}; | 135 BOOL boolValues[2] = {NO, YES}; | 
| 134 for (unsigned long i = 0; i < arraysize(boolValues); i++) { | 136 for (unsigned long i = 0; i < arraysize(boolValues); i++) { | 
| 135 base::scoped_nsobject<CardStackLayoutManager> stack( | 137 CardStackLayoutManager* stack = [[CardStackLayoutManager alloc] init]; | 
| 136 [[CardStackLayoutManager alloc] init]); | 138 stack.layoutIsVertical = boolValues[i]; | 
| 137 stack.get().layoutIsVertical = boolValues[i]; | |
| 138 | 139 | 
| 139 base::scoped_nsobject<StackCard> view1( | 140 StackCard* view1 = (StackCard*)[[MockStackCard alloc] init]; | 
| 
sdefresne
2017/02/09 13:47:49
ditto x 3
 
lody
2017/02/09 16:00:03
Done.
 | |
| 140 (StackCard*)[[MockStackCard alloc] init]); | 141 StackCard* view2 = (StackCard*)[[MockStackCard alloc] init]; | 
| 141 base::scoped_nsobject<StackCard> view2( | 142 StackCard* view3 = (StackCard*)[[MockStackCard alloc] init]; | 
| 142 (StackCard*)[[MockStackCard alloc] init]); | 143 [stack addCard:view1]; | 
| 143 base::scoped_nsobject<StackCard> view3( | 144 [stack addCard:view2]; | 
| 144 (StackCard*)[[MockStackCard alloc] init]); | 145 [stack addCard:view3]; | 
| 145 [stack addCard:view1.get()]; | |
| 146 [stack addCard:view2.get()]; | |
| 147 [stack addCard:view3.get()]; | |
| 148 // Ensure that removed cards are not altered. | 146 // Ensure that removed cards are not altered. | 
| 149 [stack removeCard:view2]; | 147 [stack removeCard:view2]; | 
| 150 | 148 | 
| 151 CGSize cardSize = CGSizeMake(111, 222); | 149 CGSize cardSize = CGSizeMake(111, 222); | 
| 152 [stack setCardSize:cardSize]; | 150 [stack setCardSize:cardSize]; | 
| 153 | 151 | 
| 154 EXPECT_FLOAT_EQ(cardSize.width, [view1 size].width); | 152 EXPECT_FLOAT_EQ(cardSize.width, [view1 size].width); | 
| 155 EXPECT_FLOAT_EQ(cardSize.height, [view1 size].height); | 153 EXPECT_FLOAT_EQ(cardSize.height, [view1 size].height); | 
| 156 EXPECT_FLOAT_EQ(0.0, [view2 size].width); | 154 EXPECT_FLOAT_EQ(0.0, [view2 size].width); | 
| 157 EXPECT_FLOAT_EQ(0.0, [view2 size].height); | 155 EXPECT_FLOAT_EQ(0.0, [view2 size].height); | 
| 158 EXPECT_FLOAT_EQ(cardSize.width, [view3 size].width); | 156 EXPECT_FLOAT_EQ(cardSize.width, [view3 size].width); | 
| 159 EXPECT_FLOAT_EQ(cardSize.height, [view3 size].height); | 157 EXPECT_FLOAT_EQ(cardSize.height, [view3 size].height); | 
| 160 | 158 | 
| 161 // But it should be automatically updated when it's added again. | 159 // But it should be automatically updated when it's added again. | 
| 162 [stack addCard:view2]; | 160 [stack addCard:view2]; | 
| 163 EXPECT_FLOAT_EQ(cardSize.width, [view2 size].width); | 161 EXPECT_FLOAT_EQ(cardSize.width, [view2 size].width); | 
| 164 EXPECT_FLOAT_EQ(cardSize.height, [view2 size].height); | 162 EXPECT_FLOAT_EQ(cardSize.height, [view2 size].height); | 
| 165 } | 163 } | 
| 166 } | 164 } | 
| 167 | 165 | 
| 168 TEST_F(CardStackLayoutManagerTest, StackSizes) { | 166 TEST_F(CardStackLayoutManagerTest, StackSizes) { | 
| 169 BOOL boolValues[2] = {NO, YES}; | 167 BOOL boolValues[2] = {NO, YES}; | 
| 170 for (unsigned long i = 0; i < arraysize(boolValues); i++) { | 168 for (unsigned long i = 0; i < arraysize(boolValues); i++) { | 
| 171 base::scoped_nsobject<CardStackLayoutManager> stack( | 169 CardStackLayoutManager* stack = [[CardStackLayoutManager alloc] init]; | 
| 172 [[CardStackLayoutManager alloc] init]); | 170 stack.layoutIsVertical = boolValues[i]; | 
| 173 stack.get().layoutIsVertical = boolValues[i]; | |
| 174 CGRect cardFrame = CGRectMake(0, 0, 100, 200); | 171 CGRect cardFrame = CGRectMake(0, 0, 100, 200); | 
| 175 [stack setCardSize:cardFrame.size]; | 172 [stack setCardSize:cardFrame.size]; | 
| 176 [stack setMaxStagger:30]; | 173 [stack setMaxStagger:30]; | 
| 177 | 174 | 
| 178 // Asking the size for a collapsed stack should give the same result. | 175 // Asking the size for a collapsed stack should give the same result. | 
| 179 CGFloat emptyCollapsedSize = [stack fullyCollapsedStackLength]; | 176 CGFloat emptyCollapsedSize = [stack fullyCollapsedStackLength]; | 
| 180 for (int i = 0; i < 10; ++i) { | 177 for (int i = 0; i < 10; ++i) { | 
| 181 base::scoped_nsobject<StackCard> card( | 178 StackCard* card = (StackCard*)[[UIView alloc] initWithFrame:cardFrame]; | 
| 
sdefresne
2017/02/09 13:47:49
ditto
 
lody
2017/02/09 16:00:03
Done.
 | |
| 182 (StackCard*)[[UIView alloc] initWithFrame:cardFrame]); | |
| 183 [stack addCard:card]; | 179 [stack addCard:card]; | 
| 184 } | 180 } | 
| 185 CGFloat largeCollapsedSize = [stack fullyCollapsedStackLength]; | 181 CGFloat largeCollapsedSize = [stack fullyCollapsedStackLength]; | 
| 186 EXPECT_FLOAT_EQ(emptyCollapsedSize, largeCollapsedSize); | 182 EXPECT_FLOAT_EQ(emptyCollapsedSize, largeCollapsedSize); | 
| 187 | 183 | 
| 188 // But a fanned-out stack should get bigger, and the maximum stack size | 184 // But a fanned-out stack should get bigger, and the maximum stack size | 
| 189 // should be larger still. | 185 // should be larger still. | 
| 190 CGFloat largeExpandedSize = [stack fannedStackLength]; | 186 CGFloat largeExpandedSize = [stack fannedStackLength]; | 
| 191 EXPECT_GT(largeExpandedSize, largeCollapsedSize); | 187 EXPECT_GT(largeExpandedSize, largeCollapsedSize); | 
| 192 CGFloat largeMaximumSize = [stack maximumStackLength]; | 188 CGFloat largeMaximumSize = [stack maximumStackLength]; | 
| 193 EXPECT_GT(largeMaximumSize, largeExpandedSize); | 189 EXPECT_GT(largeMaximumSize, largeExpandedSize); | 
| 194 base::scoped_nsobject<StackCard> card( | 190 StackCard* card = (StackCard*)[[MockStackCard alloc] init]; | 
| 
sdefresne
2017/02/09 13:47:49
ditto
 
lody
2017/02/09 16:00:03
Done.
 | |
| 195 (StackCard*)[[MockStackCard alloc] init]); | |
| 196 [stack addCard:card]; | 191 [stack addCard:card]; | 
| 197 CGFloat evenLargerExpandedSize = [stack fannedStackLength]; | 192 CGFloat evenLargerExpandedSize = [stack fannedStackLength]; | 
| 198 EXPECT_LT(largeExpandedSize, evenLargerExpandedSize); | 193 EXPECT_LT(largeExpandedSize, evenLargerExpandedSize); | 
| 199 CGFloat evenLargerMaximumSize = [stack maximumStackLength]; | 194 CGFloat evenLargerMaximumSize = [stack maximumStackLength]; | 
| 200 EXPECT_LT(largeMaximumSize, evenLargerMaximumSize); | 195 EXPECT_LT(largeMaximumSize, evenLargerMaximumSize); | 
| 201 | 196 | 
| 202 // And start limit shouldn't matter. | 197 // And start limit shouldn't matter. | 
| 203 [stack setStartLimit:10]; | 198 [stack setStartLimit:10]; | 
| 204 EXPECT_FLOAT_EQ(emptyCollapsedSize, [stack fullyCollapsedStackLength]); | 199 EXPECT_FLOAT_EQ(emptyCollapsedSize, [stack fullyCollapsedStackLength]); | 
| 205 EXPECT_FLOAT_EQ(evenLargerExpandedSize, [stack fannedStackLength]); | 200 EXPECT_FLOAT_EQ(evenLargerExpandedSize, [stack fannedStackLength]); | 
| 206 EXPECT_FLOAT_EQ(evenLargerMaximumSize, [stack maximumStackLength]); | 201 EXPECT_FLOAT_EQ(evenLargerMaximumSize, [stack maximumStackLength]); | 
| 207 } | 202 } | 
| 208 } | 203 } | 
| 209 | 204 | 
| 210 TEST_F(CardStackLayoutManagerTest, StackLayout) { | 205 TEST_F(CardStackLayoutManagerTest, StackLayout) { | 
| 211 BOOL boolValues[2] = {NO, YES}; | 206 BOOL boolValues[2] = {NO, YES}; | 
| 212 for (unsigned long i = 0; i < arraysize(boolValues); i++) { | 207 for (unsigned long i = 0; i < arraysize(boolValues); i++) { | 
| 213 const unsigned int kCardCount = 30; | 208 const unsigned int kCardCount = 30; | 
| 214 base::scoped_nsobject<CardStackLayoutManager> stack( | 209 CardStackLayoutManager* stack = newStackOfNCards(kCardCount, boolValues[i]); | 
| 215 newStackOfNCards(kCardCount, boolValues[i])); | |
| 216 | 210 | 
| 217 const float kEndLimit = | 211 const float kEndLimit = | 
| 218 kDefaultEndLimitFraction * [stack fannedStackLength]; | 212 kDefaultEndLimitFraction * [stack fannedStackLength]; | 
| 219 [stack setEndLimit:kEndLimit]; | 213 [stack setEndLimit:kEndLimit]; | 
| 220 [stack fanOutCardsWithStartIndex:0]; | 214 [stack fanOutCardsWithStartIndex:0]; | 
| 221 | 215 | 
| 222 EXPECT_EQ(kCardCount, [[stack cards] count]); | 216 EXPECT_EQ(kCardCount, [[stack cards] count]); | 
| 223 ValidateCardPositioningConstraints(stack, kEndLimit, true); | 217 ValidateCardPositioningConstraints(stack, kEndLimit, true); | 
| 224 EXPECT_EQ(0, [stack lastStartStackCardIndex]); | 218 EXPECT_EQ(0, [stack lastStartStackCardIndex]); | 
| 225 EXPECT_LT(0, [stack firstEndStackCardIndex]); | 219 EXPECT_LT(0, [stack firstEndStackCardIndex]); | 
| 226 for (NSInteger i = 0; i < [stack firstEndStackCardIndex]; i++) { | 220 for (NSInteger i = 0; i < [stack firstEndStackCardIndex]; i++) { | 
| 227 StackCard* card = [[stack cards] objectAtIndex:i]; | 221 StackCard* card = [[stack cards] objectAtIndex:i]; | 
| 228 EXPECT_FLOAT_EQ(kMargin + i * kMaxStagger, | 222 EXPECT_FLOAT_EQ(kMargin + i * kMaxStagger, | 
| 229 LayoutOffset(stack, card.layout.position)); | 223 LayoutOffset(stack, card.layout.position)); | 
| 230 } | 224 } | 
| 231 } | 225 } | 
| 232 } | 226 } | 
| 233 | 227 | 
| 234 TEST_F(CardStackLayoutManagerTest, PreservingPositionsOnCardSizeChange) { | 228 TEST_F(CardStackLayoutManagerTest, PreservingPositionsOnCardSizeChange) { | 
| 235 BOOL boolValues[2] = {NO, YES}; | 229 BOOL boolValues[2] = {NO, YES}; | 
| 236 for (unsigned long i = 0; i < arraysize(boolValues); i++) { | 230 for (unsigned long i = 0; i < arraysize(boolValues); i++) { | 
| 237 const unsigned int kCardCount = 3; | 231 const unsigned int kCardCount = 3; | 
| 238 base::scoped_nsobject<CardStackLayoutManager> stack( | 232 CardStackLayoutManager* stack = newStackOfNCards(kCardCount, boolValues[i]); | 
| 239 newStackOfNCards(kCardCount, boolValues[i])); | |
| 240 | 233 | 
| 241 const float kEndLimit = | 234 const float kEndLimit = | 
| 242 kDefaultEndLimitFraction * [stack fannedStackLength]; | 235 kDefaultEndLimitFraction * [stack fannedStackLength]; | 
| 243 [stack setEndLimit:kEndLimit]; | 236 [stack setEndLimit:kEndLimit]; | 
| 244 [stack fanOutCardsWithStartIndex:0]; | 237 [stack fanOutCardsWithStartIndex:0]; | 
| 245 | 238 | 
| 246 EXPECT_EQ(kCardCount, [[stack cards] count]); | 239 EXPECT_EQ(kCardCount, [[stack cards] count]); | 
| 247 ValidateCardPositioningConstraints(stack, kEndLimit, true); | 240 ValidateCardPositioningConstraints(stack, kEndLimit, true); | 
| 248 EXPECT_EQ(0, [stack lastStartStackCardIndex]); | 241 EXPECT_EQ(0, [stack lastStartStackCardIndex]); | 
| 249 EXPECT_LT(0, [stack firstEndStackCardIndex]); | 242 EXPECT_LT(0, [stack firstEndStackCardIndex]); | 
| (...skipping 15 matching lines...) Expand all Loading... | |
| 265 EXPECT_FLOAT_EQ(kMargin + i * kMaxStagger, | 258 EXPECT_FLOAT_EQ(kMargin + i * kMaxStagger, | 
| 266 LayoutOffset(stack, card.layout.position)); | 259 LayoutOffset(stack, card.layout.position)); | 
| 267 } | 260 } | 
| 268 } | 261 } | 
| 269 } | 262 } | 
| 270 | 263 | 
| 271 TEST_F(CardStackLayoutManagerTest, SwappingPositionsOnOrientationChange) { | 264 TEST_F(CardStackLayoutManagerTest, SwappingPositionsOnOrientationChange) { | 
| 272 BOOL boolValues[2] = {NO, YES}; | 265 BOOL boolValues[2] = {NO, YES}; | 
| 273 for (unsigned long i = 0; i < arraysize(boolValues); i++) { | 266 for (unsigned long i = 0; i < arraysize(boolValues); i++) { | 
| 274 const unsigned int kCardCount = 3; | 267 const unsigned int kCardCount = 3; | 
| 275 base::scoped_nsobject<CardStackLayoutManager> stack( | 268 CardStackLayoutManager* stack = newStackOfNCards(kCardCount, boolValues[i]); | 
| 276 newStackOfNCards(kCardCount, boolValues[i])); | |
| 277 | 269 | 
| 278 const float kEndLimit = | 270 const float kEndLimit = | 
| 279 kDefaultEndLimitFraction * [stack fannedStackLength]; | 271 kDefaultEndLimitFraction * [stack fannedStackLength]; | 
| 280 [stack setEndLimit:kEndLimit]; | 272 [stack setEndLimit:kEndLimit]; | 
| 281 [stack fanOutCardsWithStartIndex:0]; | 273 [stack fanOutCardsWithStartIndex:0]; | 
| 282 | 274 | 
| 283 EXPECT_EQ(kCardCount, [[stack cards] count]); | 275 EXPECT_EQ(kCardCount, [[stack cards] count]); | 
| 284 ValidateCardPositioningConstraints(stack, kEndLimit, true); | 276 ValidateCardPositioningConstraints(stack, kEndLimit, true); | 
| 285 EXPECT_EQ(0, [stack lastStartStackCardIndex]); | 277 EXPECT_EQ(0, [stack lastStartStackCardIndex]); | 
| 286 EXPECT_LT(0, [stack firstEndStackCardIndex]); | 278 EXPECT_LT(0, [stack firstEndStackCardIndex]); | 
| (...skipping 14 matching lines...) Expand all Loading... | |
| 301 StackCard* card = [[stack cards] objectAtIndex:i]; | 293 StackCard* card = [[stack cards] objectAtIndex:i]; | 
| 302 EXPECT_FLOAT_EQ(kMargin + i * kMaxStagger, | 294 EXPECT_FLOAT_EQ(kMargin + i * kMaxStagger, | 
| 303 LayoutOffset(stack, card.layout.position)); | 295 LayoutOffset(stack, card.layout.position)); | 
| 304 } | 296 } | 
| 305 } | 297 } | 
| 306 } | 298 } | 
| 307 TEST_F(CardStackLayoutManagerTest, EndStackRecomputationOnEndLimitChange) { | 299 TEST_F(CardStackLayoutManagerTest, EndStackRecomputationOnEndLimitChange) { | 
| 308 BOOL boolValues[2] = {NO, YES}; | 300 BOOL boolValues[2] = {NO, YES}; | 
| 309 for (unsigned long i = 0; i < arraysize(boolValues); i++) { | 301 for (unsigned long i = 0; i < arraysize(boolValues); i++) { | 
| 310 const unsigned int kCardCount = 3; | 302 const unsigned int kCardCount = 3; | 
| 311 base::scoped_nsobject<CardStackLayoutManager> stack( | 303 CardStackLayoutManager* stack = newStackOfNCards(kCardCount, boolValues[i]); | 
| 312 newStackOfNCards(kCardCount, boolValues[i])); | |
| 313 | 304 | 
| 314 CGFloat endLimit = [stack maximumStackLength]; | 305 CGFloat endLimit = [stack maximumStackLength]; | 
| 315 [stack setEndLimit:endLimit]; | 306 [stack setEndLimit:endLimit]; | 
| 316 [stack fanOutCardsWithStartIndex:0]; | 307 [stack fanOutCardsWithStartIndex:0]; | 
| 317 | 308 | 
| 318 EXPECT_EQ(kCardCount, [[stack cards] count]); | 309 EXPECT_EQ(kCardCount, [[stack cards] count]); | 
| 319 ValidateCardPositioningConstraints(stack, endLimit, true); | 310 ValidateCardPositioningConstraints(stack, endLimit, true); | 
| 320 EXPECT_EQ(0, [stack lastStartStackCardIndex]); | 311 EXPECT_EQ(0, [stack lastStartStackCardIndex]); | 
| 321 EXPECT_EQ((int)kCardCount, [stack firstEndStackCardIndex]); | 312 EXPECT_EQ((int)kCardCount, [stack firstEndStackCardIndex]); | 
| 322 for (NSInteger i = 0; i < [stack firstEndStackCardIndex]; i++) { | 313 for (NSInteger i = 0; i < [stack firstEndStackCardIndex]; i++) { | 
| (...skipping 25 matching lines...) Expand all Loading... | |
| 348 EXPECT_FLOAT_EQ(kMargin + i * kMaxStagger, | 339 EXPECT_FLOAT_EQ(kMargin + i * kMaxStagger, | 
| 349 LayoutOffset(stack, card.layout.position)); | 340 LayoutOffset(stack, card.layout.position)); | 
| 350 } | 341 } | 
| 351 } | 342 } | 
| 352 } | 343 } | 
| 353 | 344 | 
| 354 TEST_F(CardStackLayoutManagerTest, StackLayoutAtSpecificIndex) { | 345 TEST_F(CardStackLayoutManagerTest, StackLayoutAtSpecificIndex) { | 
| 355 BOOL boolValues[2] = {NO, YES}; | 346 BOOL boolValues[2] = {NO, YES}; | 
| 356 for (unsigned long i = 0; i < arraysize(boolValues); i++) { | 347 for (unsigned long i = 0; i < arraysize(boolValues); i++) { | 
| 357 const unsigned int kCardCount = 30; | 348 const unsigned int kCardCount = 30; | 
| 358 base::scoped_nsobject<CardStackLayoutManager> stack( | 349 CardStackLayoutManager* stack = newStackOfNCards(kCardCount, boolValues[i]); | 
| 359 newStackOfNCards(kCardCount, boolValues[i])); | |
| 360 | 350 | 
| 361 NSInteger startIndex = 10; | 351 NSInteger startIndex = 10; | 
| 362 | 352 | 
| 363 const float kEndLimit = | 353 const float kEndLimit = | 
| 364 kDefaultEndLimitFraction * [stack fannedStackLength]; | 354 kDefaultEndLimitFraction * [stack fannedStackLength]; | 
| 365 [stack setEndLimit:kEndLimit]; | 355 [stack setEndLimit:kEndLimit]; | 
| 366 [stack fanOutCardsWithStartIndex:startIndex]; | 356 [stack fanOutCardsWithStartIndex:startIndex]; | 
| 367 | 357 | 
| 368 EXPECT_EQ(kCardCount, [[stack cards] count]); | 358 EXPECT_EQ(kCardCount, [[stack cards] count]); | 
| 369 ValidateCardPositioningConstraints(stack, kEndLimit, true); | 359 ValidateCardPositioningConstraints(stack, kEndLimit, true); | 
| 370 EXPECT_EQ(startIndex, [stack lastStartStackCardIndex]); | 360 EXPECT_EQ(startIndex, [stack lastStartStackCardIndex]); | 
| 371 // Take into account start stack when verifying position of card at | 361 // Take into account start stack when verifying position of card at | 
| 372 // |startIndex|. | 362 // |startIndex|. | 
| 373 StackCard* startCard = [[stack cards] objectAtIndex:startIndex]; | 363 StackCard* startCard = [[stack cards] objectAtIndex:startIndex]; | 
| 374 EXPECT_FLOAT_EQ(kMargin + [stack staggerOffsetForIndexFromEdge:startIndex], | 364 EXPECT_FLOAT_EQ(kMargin + [stack staggerOffsetForIndexFromEdge:startIndex], | 
| 375 LayoutOffset(stack, startCard.layout.position)); | 365 LayoutOffset(stack, startCard.layout.position)); | 
| 376 NSInteger firstEndStackCardIndex = [stack firstEndStackCardIndex]; | 366 NSInteger firstEndStackCardIndex = [stack firstEndStackCardIndex]; | 
| 377 for (NSInteger i = startIndex + 1; i < firstEndStackCardIndex; i++) { | 367 for (NSInteger i = startIndex + 1; i < firstEndStackCardIndex; i++) { | 
| 378 StackCard* card = [[stack cards] objectAtIndex:i]; | 368 StackCard* card = [[stack cards] objectAtIndex:i]; | 
| 379 EXPECT_FLOAT_EQ(kMargin + (i - startIndex) * kMaxStagger, | 369 EXPECT_FLOAT_EQ(kMargin + (i - startIndex) * kMaxStagger, | 
| 380 LayoutOffset(stack, card.layout.position)); | 370 LayoutOffset(stack, card.layout.position)); | 
| 381 } | 371 } | 
| 382 } | 372 } | 
| 383 } | 373 } | 
| 384 | 374 | 
| 385 TEST_F(CardStackLayoutManagerTest, CardIsCovered) { | 375 TEST_F(CardStackLayoutManagerTest, CardIsCovered) { | 
| 386 BOOL boolValues[2] = {NO, YES}; | 376 BOOL boolValues[2] = {NO, YES}; | 
| 387 for (unsigned long i = 0; i < arraysize(boolValues); i++) { | 377 for (unsigned long i = 0; i < arraysize(boolValues); i++) { | 
| 388 const unsigned int kCardCount = 3; | 378 const unsigned int kCardCount = 3; | 
| 389 base::scoped_nsobject<CardStackLayoutManager> stack( | 379 CardStackLayoutManager* stack = newStackOfNCards(kCardCount, boolValues[i]); | 
| 390 newStackOfNCards(kCardCount, boolValues[i])); | |
| 391 | 380 | 
| 392 const float kEndLimit = | 381 const float kEndLimit = | 
| 393 kDefaultEndLimitFraction * [stack fannedStackLength]; | 382 kDefaultEndLimitFraction * [stack fannedStackLength]; | 
| 394 [stack setEndLimit:kEndLimit]; | 383 [stack setEndLimit:kEndLimit]; | 
| 395 [stack fanOutCardsWithStartIndex:0]; | 384 [stack fanOutCardsWithStartIndex:0]; | 
| 396 | 385 | 
| 397 ValidateCardPositioningConstraints(stack, kEndLimit, true); | 386 ValidateCardPositioningConstraints(stack, kEndLimit, true); | 
| 398 EXPECT_EQ(0, [stack lastStartStackCardIndex]); | 387 EXPECT_EQ(0, [stack lastStartStackCardIndex]); | 
| 399 EXPECT_EQ((int)kCardCount, [stack firstEndStackCardIndex]); | 388 EXPECT_EQ((int)kCardCount, [stack firstEndStackCardIndex]); | 
| 400 // Since no cards are hidden in the start or end stack, all cards should | 389 // Since no cards are hidden in the start or end stack, all cards should | 
| 401 // be visible (i.e., not covered). | 390 // be visible (i.e., not covered). | 
| 402 for (NSUInteger i = 0; i < kCardCount; i++) { | 391 for (NSUInteger i = 0; i < kCardCount; i++) { | 
| 403 StackCard* card = [[stack cards] objectAtIndex:i]; | 392 StackCard* card = [[stack cards] objectAtIndex:i]; | 
| 404 EXPECT_FALSE([stack cardIsCovered:card]); | 393 EXPECT_FALSE([stack cardIsCovered:card]); | 
| 405 } | 394 } | 
| 406 // Moving the second card to the same location as the third card should | 395 // Moving the second card to the same location as the third card should | 
| 407 // result in the third card covering the second card. | 396 // result in the third card covering the second card. | 
| 408 StackCard* secondCard = [[stack cards] objectAtIndex:1]; | 397 StackCard* secondCard = [[stack cards] objectAtIndex:1]; | 
| 409 StackCard* thirdCard = [[stack cards] objectAtIndex:2]; | 398 StackCard* thirdCard = [[stack cards] objectAtIndex:2]; | 
| 410 secondCard.layout = thirdCard.layout; | 399 secondCard.layout = thirdCard.layout; | 
| 411 EXPECT_TRUE([stack cardIsCovered:secondCard]); | 400 EXPECT_TRUE([stack cardIsCovered:secondCard]); | 
| 412 EXPECT_FALSE([stack cardIsCovered:thirdCard]); | 401 EXPECT_FALSE([stack cardIsCovered:thirdCard]); | 
| 413 } | 402 } | 
| 414 } | 403 } | 
| 415 | 404 | 
| 416 TEST_F(CardStackLayoutManagerTest, CardIsCollapsed) { | 405 TEST_F(CardStackLayoutManagerTest, CardIsCollapsed) { | 
| 417 BOOL boolValues[2] = {NO, YES}; | 406 BOOL boolValues[2] = {NO, YES}; | 
| 418 for (unsigned long i = 0; i < arraysize(boolValues); i++) { | 407 for (unsigned long i = 0; i < arraysize(boolValues); i++) { | 
| 419 const unsigned int kCardCount = 3; | 408 const unsigned int kCardCount = 3; | 
| 420 base::scoped_nsobject<CardStackLayoutManager> stack( | 409 CardStackLayoutManager* stack = newStackOfNCards(kCardCount, boolValues[i]); | 
| 421 newStackOfNCards(kCardCount, boolValues[i])); | |
| 422 | 410 | 
| 423 const float kEndLimit = | 411 const float kEndLimit = | 
| 424 kDefaultEndLimitFraction * [stack fannedStackLength]; | 412 kDefaultEndLimitFraction * [stack fannedStackLength]; | 
| 425 [stack setEndLimit:kEndLimit]; | 413 [stack setEndLimit:kEndLimit]; | 
| 426 [stack fanOutCardsWithStartIndex:0]; | 414 [stack fanOutCardsWithStartIndex:0]; | 
| 427 | 415 | 
| 428 ValidateCardPositioningConstraints(stack, kEndLimit, true); | 416 ValidateCardPositioningConstraints(stack, kEndLimit, true); | 
| 429 EXPECT_EQ(0, [stack lastStartStackCardIndex]); | 417 EXPECT_EQ(0, [stack lastStartStackCardIndex]); | 
| 430 EXPECT_EQ((int)kCardCount, [stack firstEndStackCardIndex]); | 418 EXPECT_EQ((int)kCardCount, [stack firstEndStackCardIndex]); | 
| 431 // Since the cards are fully fanned out, no cards should be collapsed. | 419 // Since the cards are fully fanned out, no cards should be collapsed. | 
| (...skipping 12 matching lines...) Expand all Loading... | |
| 444 collapsedLayout.position.leading -= [stack minStackStaggerAmount]; | 432 collapsedLayout.position.leading -= [stack minStackStaggerAmount]; | 
| 445 secondCard.layout = collapsedLayout; | 433 secondCard.layout = collapsedLayout; | 
| 446 EXPECT_TRUE([stack cardIsCollapsed:secondCard]); | 434 EXPECT_TRUE([stack cardIsCollapsed:secondCard]); | 
| 447 } | 435 } | 
| 448 } | 436 } | 
| 449 | 437 | 
| 450 TEST_F(CardStackLayoutManagerTest, BasicScroll) { | 438 TEST_F(CardStackLayoutManagerTest, BasicScroll) { | 
| 451 BOOL boolValues[2] = {NO, YES}; | 439 BOOL boolValues[2] = {NO, YES}; | 
| 452 for (unsigned long i = 0; i < arraysize(boolValues); i++) { | 440 for (unsigned long i = 0; i < arraysize(boolValues); i++) { | 
| 453 const unsigned int kCardCount = 3; | 441 const unsigned int kCardCount = 3; | 
| 454 base::scoped_nsobject<CardStackLayoutManager> stack( | 442 CardStackLayoutManager* stack = newStackOfNCards(kCardCount, boolValues[i]); | 
| 455 newStackOfNCards(kCardCount, boolValues[i])); | |
| 456 StackCard* firstCard = [[stack cards] objectAtIndex:0]; | 443 StackCard* firstCard = [[stack cards] objectAtIndex:0]; | 
| 457 | 444 | 
| 458 const float kEndLimit = | 445 const float kEndLimit = | 
| 459 kDefaultEndLimitFraction * [stack fannedStackLength]; | 446 kDefaultEndLimitFraction * [stack fannedStackLength]; | 
| 460 [stack setEndLimit:kEndLimit]; | 447 [stack setEndLimit:kEndLimit]; | 
| 461 [stack fanOutCardsWithStartIndex:0]; | 448 [stack fanOutCardsWithStartIndex:0]; | 
| 462 ValidateCardPositioningConstraints(stack, kEndLimit, true); | 449 ValidateCardPositioningConstraints(stack, kEndLimit, true); | 
| 463 EXPECT_FLOAT_EQ(kMargin, LayoutOffset(stack, firstCard.layout.position)); | 450 EXPECT_FLOAT_EQ(kMargin, LayoutOffset(stack, firstCard.layout.position)); | 
| 464 EXPECT_FLOAT_EQ(kMaxStagger, SeparationOnLayoutAxis(stack, 0, 1)); | 451 EXPECT_FLOAT_EQ(kMaxStagger, SeparationOnLayoutAxis(stack, 0, 1)); | 
| 465 EXPECT_FLOAT_EQ(kMaxStagger, SeparationOnLayoutAxis(stack, 1, 2)); | 452 EXPECT_FLOAT_EQ(kMaxStagger, SeparationOnLayoutAxis(stack, 1, 2)); | 
| (...skipping 18 matching lines...) Expand all Loading... | |
| 484 EXPECT_FLOAT_EQ(kMargin, LayoutOffset(stack, firstCard.layout.position)); | 471 EXPECT_FLOAT_EQ(kMargin, LayoutOffset(stack, firstCard.layout.position)); | 
| 485 EXPECT_FLOAT_EQ(kMaxStagger, SeparationOnLayoutAxis(stack, 0, 1)); | 472 EXPECT_FLOAT_EQ(kMaxStagger, SeparationOnLayoutAxis(stack, 0, 1)); | 
| 486 EXPECT_FLOAT_EQ(kMaxStagger, SeparationOnLayoutAxis(stack, 1, 2)); | 473 EXPECT_FLOAT_EQ(kMaxStagger, SeparationOnLayoutAxis(stack, 1, 2)); | 
| 487 } | 474 } | 
| 488 } | 475 } | 
| 489 | 476 | 
| 490 TEST_F(CardStackLayoutManagerTest, ScrollCardAwayFromNeighbor) { | 477 TEST_F(CardStackLayoutManagerTest, ScrollCardAwayFromNeighbor) { | 
| 491 BOOL boolValues[2] = {NO, YES}; | 478 BOOL boolValues[2] = {NO, YES}; | 
| 492 for (unsigned long i = 0; i < arraysize(boolValues); i++) { | 479 for (unsigned long i = 0; i < arraysize(boolValues); i++) { | 
| 493 const unsigned int kCardCount = 3; | 480 const unsigned int kCardCount = 3; | 
| 494 base::scoped_nsobject<CardStackLayoutManager> stack( | 481 CardStackLayoutManager* stack = newStackOfNCards(kCardCount, boolValues[i]); | 
| 495 newStackOfNCards(kCardCount, boolValues[i])); | |
| 496 StackCard* firstCard = [[stack cards] objectAtIndex:0]; | 482 StackCard* firstCard = [[stack cards] objectAtIndex:0]; | 
| 497 | 483 | 
| 498 // Configure the stack so that the first card is > the scroll-away distance | 484 // Configure the stack so that the first card is > the scroll-away distance | 
| 499 // from the end stack, but the second card is not. | 485 // from the end stack, but the second card is not. | 
| 500 const float kEndLimit = | 486 const float kEndLimit = | 
| 501 [stack scrollCardAwayFromNeighborAmount] + 2 * [stack maxStagger]; | 487 [stack scrollCardAwayFromNeighborAmount] + 2 * [stack maxStagger]; | 
| 502 [stack setEndLimit:kEndLimit]; | 488 [stack setEndLimit:kEndLimit]; | 
| 503 [stack fanOutCardsWithStartIndex:0]; | 489 [stack fanOutCardsWithStartIndex:0]; | 
| 504 ValidateCardPositioningConstraints(stack, kEndLimit, true); | 490 ValidateCardPositioningConstraints(stack, kEndLimit, true); | 
| 505 EXPECT_FLOAT_EQ(kMargin, LayoutOffset(stack, firstCard.layout.position)); | 491 EXPECT_FLOAT_EQ(kMargin, LayoutOffset(stack, firstCard.layout.position)); | 
| (...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 551 EXPECT_FLOAT_EQ(separation, | 537 EXPECT_FLOAT_EQ(separation, | 
| 552 kEndLimit - LayoutOffset(stack, thirdCard.layout.position)); | 538 kEndLimit - LayoutOffset(stack, thirdCard.layout.position)); | 
| 553 EXPECT_EQ(3, [stack firstEndStackCardIndex]); | 539 EXPECT_EQ(3, [stack firstEndStackCardIndex]); | 
| 554 } | 540 } | 
| 555 } | 541 } | 
| 556 | 542 | 
| 557 TEST_F(CardStackLayoutManagerTest, ScrollNotScrollingLeadingCards) { | 543 TEST_F(CardStackLayoutManagerTest, ScrollNotScrollingLeadingCards) { | 
| 558 BOOL boolValues[2] = {NO, YES}; | 544 BOOL boolValues[2] = {NO, YES}; | 
| 559 for (unsigned long i = 0; i < arraysize(boolValues); i++) { | 545 for (unsigned long i = 0; i < arraysize(boolValues); i++) { | 
| 560 const unsigned int kCardCount = 4; | 546 const unsigned int kCardCount = 4; | 
| 561 base::scoped_nsobject<CardStackLayoutManager> stack( | 547 CardStackLayoutManager* stack = newStackOfNCards(kCardCount, boolValues[i]); | 
| 562 newStackOfNCards(kCardCount, boolValues[i])); | |
| 563 StackCard* firstCard = [[stack cards] objectAtIndex:0]; | 548 StackCard* firstCard = [[stack cards] objectAtIndex:0]; | 
| 564 | 549 | 
| 565 // Make the stack large enough to fan out all its cards to avoid having to | 550 // Make the stack large enough to fan out all its cards to avoid having to | 
| 566 // worry about the end stack below. | 551 // worry about the end stack below. | 
| 567 const float kEndLimit = [stack fannedStackLength]; | 552 const float kEndLimit = [stack fannedStackLength]; | 
| 568 [stack setEndLimit:kEndLimit]; | 553 [stack setEndLimit:kEndLimit]; | 
| 569 [stack fanOutCardsWithStartIndex:0]; | 554 [stack fanOutCardsWithStartIndex:0]; | 
| 570 ValidateCardPositioningConstraints(stack, kEndLimit, true); | 555 ValidateCardPositioningConstraints(stack, kEndLimit, true); | 
| 571 EXPECT_FLOAT_EQ(kMargin, LayoutOffset(stack, firstCard.layout.position)); | 556 EXPECT_FLOAT_EQ(kMargin, LayoutOffset(stack, firstCard.layout.position)); | 
| 572 EXPECT_FLOAT_EQ(kMaxStagger, SeparationOnLayoutAxis(stack, 0, 1)); | 557 EXPECT_FLOAT_EQ(kMaxStagger, SeparationOnLayoutAxis(stack, 0, 1)); | 
| (...skipping 30 matching lines...) Expand all Loading... | |
| 603 EXPECT_FLOAT_EQ(kMaxStagger, SeparationOnLayoutAxis(stack, 0, 1)); | 588 EXPECT_FLOAT_EQ(kMaxStagger, SeparationOnLayoutAxis(stack, 0, 1)); | 
| 604 EXPECT_FLOAT_EQ(kMaxStagger, SeparationOnLayoutAxis(stack, 1, 2)); | 589 EXPECT_FLOAT_EQ(kMaxStagger, SeparationOnLayoutAxis(stack, 1, 2)); | 
| 605 EXPECT_FLOAT_EQ(kMaxStagger - 10, SeparationOnLayoutAxis(stack, 2, 3)); | 590 EXPECT_FLOAT_EQ(kMaxStagger - 10, SeparationOnLayoutAxis(stack, 2, 3)); | 
| 606 } | 591 } | 
| 607 } | 592 } | 
| 608 | 593 | 
| 609 TEST_F(CardStackLayoutManagerTest, ScrollCollapseExpansionOfLargeStack) { | 594 TEST_F(CardStackLayoutManagerTest, ScrollCollapseExpansionOfLargeStack) { | 
| 610 BOOL boolValues[2] = {NO, YES}; | 595 BOOL boolValues[2] = {NO, YES}; | 
| 611 for (unsigned long i = 0; i < arraysize(boolValues); i++) { | 596 for (unsigned long i = 0; i < arraysize(boolValues); i++) { | 
| 612 const unsigned int kCardCount = 10; | 597 const unsigned int kCardCount = 10; | 
| 613 base::scoped_nsobject<CardStackLayoutManager> stack( | 598 CardStackLayoutManager* stack = newStackOfNCards(kCardCount, boolValues[i]); | 
| 614 newStackOfNCards(kCardCount, boolValues[i])); | |
| 615 | 599 | 
| 616 const float kEndLimit = | 600 const float kEndLimit = | 
| 617 kDefaultEndLimitFraction * [stack fannedStackLength]; | 601 kDefaultEndLimitFraction * [stack fannedStackLength]; | 
| 618 [stack setEndLimit:kEndLimit]; | 602 [stack setEndLimit:kEndLimit]; | 
| 619 | 603 | 
| 620 [stack fanOutCardsWithStartIndex:0]; | 604 [stack fanOutCardsWithStartIndex:0]; | 
| 621 ValidateCardPositioningConstraints(stack, kEndLimit, true); | 605 ValidateCardPositioningConstraints(stack, kEndLimit, true); | 
| 622 EXPECT_TRUE([stack stackIsFullyFannedOut]); | 606 EXPECT_TRUE([stack stackIsFullyFannedOut]); | 
| 623 EXPECT_FALSE([stack stackIsFullyCollapsed]); | 607 EXPECT_FALSE([stack stackIsFullyCollapsed]); | 
| 624 EXPECT_FALSE([stack stackIsFullyOverextended]); | 608 EXPECT_FALSE([stack stackIsFullyOverextended]); | 
| (...skipping 30 matching lines...) Expand all Loading... | |
| 655 EXPECT_FALSE([stack stackIsFullyFannedOut]); | 639 EXPECT_FALSE([stack stackIsFullyFannedOut]); | 
| 656 EXPECT_TRUE([stack stackIsFullyCollapsed]); | 640 EXPECT_TRUE([stack stackIsFullyCollapsed]); | 
| 657 EXPECT_TRUE([stack stackIsFullyOverextended]); | 641 EXPECT_TRUE([stack stackIsFullyOverextended]); | 
| 658 } | 642 } | 
| 659 } | 643 } | 
| 660 | 644 | 
| 661 TEST_F(CardStackLayoutManagerTest, ScrollCollapseExpansionOfStackCornerCases) { | 645 TEST_F(CardStackLayoutManagerTest, ScrollCollapseExpansionOfStackCornerCases) { | 
| 662 BOOL boolValues[2] = {NO, YES}; | 646 BOOL boolValues[2] = {NO, YES}; | 
| 663 const unsigned int kCardCount = 1; | 647 const unsigned int kCardCount = 1; | 
| 664 for (unsigned long i = 0; i < arraysize(boolValues); i++) { | 648 for (unsigned long i = 0; i < arraysize(boolValues); i++) { | 
| 665 base::scoped_nsobject<CardStackLayoutManager> stack( | 649 CardStackLayoutManager* stack = newStackOfNCards(kCardCount, boolValues[i]); | 
| 666 newStackOfNCards(kCardCount, boolValues[i])); | |
| 667 | 650 | 
| 668 // A laid-out stack with one card is fully collapsed and fully fanned out, | 651 // A laid-out stack with one card is fully collapsed and fully fanned out, | 
| 669 // but not fully overextended. | 652 // but not fully overextended. | 
| 670 [stack fanOutCardsWithStartIndex:0]; | 653 [stack fanOutCardsWithStartIndex:0]; | 
| 671 EXPECT_TRUE([stack stackIsFullyFannedOut]); | 654 EXPECT_TRUE([stack stackIsFullyFannedOut]); | 
| 672 EXPECT_TRUE([stack stackIsFullyCollapsed]); | 655 EXPECT_TRUE([stack stackIsFullyCollapsed]); | 
| 673 EXPECT_FALSE([stack stackIsFullyOverextended]); | 656 EXPECT_FALSE([stack stackIsFullyOverextended]); | 
| 674 | 657 | 
| 675 // A stack with no cards is fully collapsed, fully fanned out, and fully | 658 // A stack with no cards is fully collapsed, fully fanned out, and fully | 
| 676 // overextended. | 659 // overextended. | 
| 677 [stack removeCard:[[stack cards] objectAtIndex:0]]; | 660 [stack removeCard:[[stack cards] objectAtIndex:0]]; | 
| 678 EXPECT_TRUE([stack stackIsFullyFannedOut]); | 661 EXPECT_TRUE([stack stackIsFullyFannedOut]); | 
| 679 EXPECT_TRUE([stack stackIsFullyCollapsed]); | 662 EXPECT_TRUE([stack stackIsFullyCollapsed]); | 
| 680 EXPECT_TRUE([stack stackIsFullyOverextended]); | 663 EXPECT_TRUE([stack stackIsFullyOverextended]); | 
| 681 } | 664 } | 
| 682 } | 665 } | 
| 683 | 666 | 
| 684 TEST_F(CardStackLayoutManagerTest, OneCardOverscroll) { | 667 TEST_F(CardStackLayoutManagerTest, OneCardOverscroll) { | 
| 685 BOOL boolValues[2] = {NO, YES}; | 668 BOOL boolValues[2] = {NO, YES}; | 
| 686 for (unsigned long i = 0; i < arraysize(boolValues); i++) { | 669 for (unsigned long i = 0; i < arraysize(boolValues); i++) { | 
| 687 const unsigned int kCardCount = 1; | 670 const unsigned int kCardCount = 1; | 
| 688 const float kScrollAwayAmount = 20.0; | 671 const float kScrollAwayAmount = 20.0; | 
| 689 base::scoped_nsobject<CardStackLayoutManager> stack( | 672 CardStackLayoutManager* stack = newStackOfNCards(kCardCount, boolValues[i]); | 
| 690 newStackOfNCards(kCardCount, boolValues[i])); | |
| 691 StackCard* firstCard = [[stack cards] objectAtIndex:0]; | 673 StackCard* firstCard = [[stack cards] objectAtIndex:0]; | 
| 692 | 674 | 
| 693 const float kEndLimit = | 675 const float kEndLimit = | 
| 694 kDefaultEndLimitFraction * [stack fannedStackLength]; | 676 kDefaultEndLimitFraction * [stack fannedStackLength]; | 
| 695 [stack setEndLimit:kEndLimit]; | 677 [stack setEndLimit:kEndLimit]; | 
| 696 [stack fanOutCardsWithStartIndex:0]; | 678 [stack fanOutCardsWithStartIndex:0]; | 
| 697 ValidateCardPositioningConstraints(stack, kEndLimit, true); | 679 ValidateCardPositioningConstraints(stack, kEndLimit, true); | 
| 698 EXPECT_FLOAT_EQ(kMargin, LayoutOffset(stack, firstCard.layout.position)); | 680 EXPECT_FLOAT_EQ(kMargin, LayoutOffset(stack, firstCard.layout.position)); | 
| 699 | 681 | 
| 700 // Scrolling toward end should result in overscroll. | 682 // Scrolling toward end should result in overscroll. | 
| (...skipping 26 matching lines...) Expand all Loading... | |
| 727 EXPECT_FLOAT_EQ(kMargin - kScrollAwayAmount, | 709 EXPECT_FLOAT_EQ(kMargin - kScrollAwayAmount, | 
| 728 LayoutOffset(stack, firstCard.layout.position)); | 710 LayoutOffset(stack, firstCard.layout.position)); | 
| 729 } | 711 } | 
| 730 } | 712 } | 
| 731 | 713 | 
| 732 TEST_F(CardStackLayoutManagerTest, MaximumOverextensionAmount) { | 714 TEST_F(CardStackLayoutManagerTest, MaximumOverextensionAmount) { | 
| 733 BOOL boolValues[2] = {NO, YES}; | 715 BOOL boolValues[2] = {NO, YES}; | 
| 734 for (unsigned long i = 0; i < arraysize(boolValues); i++) { | 716 for (unsigned long i = 0; i < arraysize(boolValues); i++) { | 
| 735 const unsigned int kCardCount = 1; | 717 const unsigned int kCardCount = 1; | 
| 736 const float kScrollAwayAmount = 20.0; | 718 const float kScrollAwayAmount = 20.0; | 
| 737 base::scoped_nsobject<CardStackLayoutManager> stack( | 719 CardStackLayoutManager* stack = newStackOfNCards(kCardCount, boolValues[i]); | 
| 738 newStackOfNCards(kCardCount, boolValues[i])); | |
| 739 StackCard* firstCard = [[stack cards] objectAtIndex:0]; | 720 StackCard* firstCard = [[stack cards] objectAtIndex:0]; | 
| 740 | 721 | 
| 741 const float kEndLimit = | 722 const float kEndLimit = | 
| 742 kDefaultEndLimitFraction * [stack fannedStackLength]; | 723 kDefaultEndLimitFraction * [stack fannedStackLength]; | 
| 743 [stack setEndLimit:kEndLimit]; | 724 [stack setEndLimit:kEndLimit]; | 
| 744 [stack fanOutCardsWithStartIndex:0]; | 725 [stack fanOutCardsWithStartIndex:0]; | 
| 745 ValidateCardPositioningConstraints(stack, kEndLimit, true); | 726 ValidateCardPositioningConstraints(stack, kEndLimit, true); | 
| 746 EXPECT_FLOAT_EQ(kMargin, LayoutOffset(stack, firstCard.layout.position)); | 727 EXPECT_FLOAT_EQ(kMargin, LayoutOffset(stack, firstCard.layout.position)); | 
| 747 | 728 | 
| 748 // Scrolling toward start/end should have no impact. | 729 // Scrolling toward start/end should have no impact. | 
| (...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 800 LayoutOffset(stack, firstCard.layout.position)); | 781 LayoutOffset(stack, firstCard.layout.position)); | 
| 801 EXPECT_FLOAT_EQ(maxOverextensionAmount, [stack overextensionAmount]); | 782 EXPECT_FLOAT_EQ(maxOverextensionAmount, [stack overextensionAmount]); | 
| 802 } | 783 } | 
| 803 } | 784 } | 
| 804 | 785 | 
| 805 TEST_F(CardStackLayoutManagerTest, DecayOnOverscroll) { | 786 TEST_F(CardStackLayoutManagerTest, DecayOnOverscroll) { | 
| 806 BOOL boolValues[2] = {NO, YES}; | 787 BOOL boolValues[2] = {NO, YES}; | 
| 807 for (unsigned long i = 0; i < arraysize(boolValues); i++) { | 788 for (unsigned long i = 0; i < arraysize(boolValues); i++) { | 
| 808 const unsigned int kCardCount = 1; | 789 const unsigned int kCardCount = 1; | 
| 809 const float kScrollAwayAmount = 10.0; | 790 const float kScrollAwayAmount = 10.0; | 
| 810 base::scoped_nsobject<CardStackLayoutManager> stack( | 791 CardStackLayoutManager* stack = newStackOfNCards(kCardCount, boolValues[i]); | 
| 811 newStackOfNCards(kCardCount, boolValues[i])); | |
| 812 StackCard* firstCard = [[stack cards] objectAtIndex:0]; | 792 StackCard* firstCard = [[stack cards] objectAtIndex:0]; | 
| 813 | 793 | 
| 814 const float kEndLimit = | 794 const float kEndLimit = | 
| 815 kDefaultEndLimitFraction * [stack fannedStackLength]; | 795 kDefaultEndLimitFraction * [stack fannedStackLength]; | 
| 816 [stack setEndLimit:kEndLimit]; | 796 [stack setEndLimit:kEndLimit]; | 
| 817 [stack fanOutCardsWithStartIndex:0]; | 797 [stack fanOutCardsWithStartIndex:0]; | 
| 818 ValidateCardPositioningConstraints(stack, kEndLimit, true); | 798 ValidateCardPositioningConstraints(stack, kEndLimit, true); | 
| 819 EXPECT_FLOAT_EQ(kMargin, LayoutOffset(stack, firstCard.layout.position)); | 799 EXPECT_FLOAT_EQ(kMargin, LayoutOffset(stack, firstCard.layout.position)); | 
| 820 | 800 | 
| 821 // Scrolling toward end by |kScrollAwayAmount| should result in overscroll. | 801 // Scrolling toward end by |kScrollAwayAmount| should result in overscroll. | 
| (...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 856 EXPECT_GT(kMargin + 3 * kScrollAwayAmount, | 836 EXPECT_GT(kMargin + 3 * kScrollAwayAmount, | 
| 857 LayoutOffset(stack, firstCard.layout.position)); | 837 LayoutOffset(stack, firstCard.layout.position)); | 
| 858 } | 838 } | 
| 859 } | 839 } | 
| 860 | 840 | 
| 861 TEST_F(CardStackLayoutManagerTest, EliminateOverextension) { | 841 TEST_F(CardStackLayoutManagerTest, EliminateOverextension) { | 
| 862 BOOL boolValues[2] = {NO, YES}; | 842 BOOL boolValues[2] = {NO, YES}; | 
| 863 for (unsigned long i = 0; i < arraysize(boolValues); i++) { | 843 for (unsigned long i = 0; i < arraysize(boolValues); i++) { | 
| 864 const unsigned int kCardCount = 2; | 844 const unsigned int kCardCount = 2; | 
| 865 const float kScrollAwayAmount = 20.0; | 845 const float kScrollAwayAmount = 20.0; | 
| 866 base::scoped_nsobject<CardStackLayoutManager> stack( | 846 CardStackLayoutManager* stack = newStackOfNCards(kCardCount, boolValues[i]); | 
| 867 newStackOfNCards(kCardCount, boolValues[i])); | |
| 868 StackCard* firstCard = [[stack cards] objectAtIndex:0]; | 847 StackCard* firstCard = [[stack cards] objectAtIndex:0]; | 
| 869 StackCard* secondCard = [[stack cards] objectAtIndex:1]; | 848 StackCard* secondCard = [[stack cards] objectAtIndex:1]; | 
| 870 | 849 | 
| 871 const float kEndLimit = | 850 const float kEndLimit = | 
| 872 kDefaultEndLimitFraction * [stack fannedStackLength]; | 851 kDefaultEndLimitFraction * [stack fannedStackLength]; | 
| 873 [stack setEndLimit:kEndLimit]; | 852 [stack setEndLimit:kEndLimit]; | 
| 874 [stack fanOutCardsWithStartIndex:0]; | 853 [stack fanOutCardsWithStartIndex:0]; | 
| 875 ValidateCardPositioningConstraints(stack, kEndLimit, true); | 854 ValidateCardPositioningConstraints(stack, kEndLimit, true); | 
| 876 EXPECT_FLOAT_EQ(kMargin, LayoutOffset(stack, firstCard.layout.position)); | 855 EXPECT_FLOAT_EQ(kMargin, LayoutOffset(stack, firstCard.layout.position)); | 
| 877 | 856 | 
| (...skipping 71 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 949 EXPECT_FLOAT_EQ(secondCardInitialOrigin + kScrollAwayAmount, | 928 EXPECT_FLOAT_EQ(secondCardInitialOrigin + kScrollAwayAmount, | 
| 950 LayoutOffset(stack, secondCard.layout.position)); | 929 LayoutOffset(stack, secondCard.layout.position)); | 
| 951 } | 930 } | 
| 952 } | 931 } | 
| 953 | 932 | 
| 954 TEST_F(CardStackLayoutManagerTest, MultiCardOverscroll) { | 933 TEST_F(CardStackLayoutManagerTest, MultiCardOverscroll) { | 
| 955 BOOL boolValues[2] = {NO, YES}; | 934 BOOL boolValues[2] = {NO, YES}; | 
| 956 for (unsigned long i = 0; i < arraysize(boolValues); i++) { | 935 for (unsigned long i = 0; i < arraysize(boolValues); i++) { | 
| 957 const unsigned int kCardCount = 3; | 936 const unsigned int kCardCount = 3; | 
| 958 const float kScrollAwayAmount = 100.0; | 937 const float kScrollAwayAmount = 100.0; | 
| 959 base::scoped_nsobject<CardStackLayoutManager> stack( | 938 CardStackLayoutManager* stack = newStackOfNCards(kCardCount, boolValues[i]); | 
| 960 newStackOfNCards(kCardCount, boolValues[i])); | |
| 961 StackCard* firstCard = [[stack cards] objectAtIndex:0]; | 939 StackCard* firstCard = [[stack cards] objectAtIndex:0]; | 
| 962 | 940 | 
| 963 const float kEndLimit = | 941 const float kEndLimit = | 
| 964 kDefaultEndLimitFraction * [stack fannedStackLength]; | 942 kDefaultEndLimitFraction * [stack fannedStackLength]; | 
| 965 [stack setEndLimit:kEndLimit]; | 943 [stack setEndLimit:kEndLimit]; | 
| 966 [stack fanOutCardsWithStartIndex:0]; | 944 [stack fanOutCardsWithStartIndex:0]; | 
| 967 ValidateCardPositioningConstraints(stack, kEndLimit, true); | 945 ValidateCardPositioningConstraints(stack, kEndLimit, true); | 
| 968 EXPECT_FLOAT_EQ(kMargin, LayoutOffset(stack, firstCard.layout.position)); | 946 EXPECT_FLOAT_EQ(kMargin, LayoutOffset(stack, firstCard.layout.position)); | 
| 969 EXPECT_FLOAT_EQ(kMaxStagger, SeparationOnLayoutAxis(stack, 0, 1)); | 947 EXPECT_FLOAT_EQ(kMaxStagger, SeparationOnLayoutAxis(stack, 0, 1)); | 
| 970 EXPECT_FLOAT_EQ(kMaxStagger, SeparationOnLayoutAxis(stack, 1, 2)); | 948 EXPECT_FLOAT_EQ(kMaxStagger, SeparationOnLayoutAxis(stack, 1, 2)); | 
| (...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1006 EXPECT_TRUE([stack overextensionTowardStartOnCardAtIndex:0]); | 984 EXPECT_TRUE([stack overextensionTowardStartOnCardAtIndex:0]); | 
| 1007 EXPECT_FLOAT_EQ(kMargin - 10, | 985 EXPECT_FLOAT_EQ(kMargin - 10, | 
| 1008 LayoutOffset(stack, firstCard.layout.position)); | 986 LayoutOffset(stack, firstCard.layout.position)); | 
| 1009 } | 987 } | 
| 1010 } | 988 } | 
| 1011 | 989 | 
| 1012 TEST_F(CardStackLayoutManagerTest, Fling) { | 990 TEST_F(CardStackLayoutManagerTest, Fling) { | 
| 1013 BOOL boolValues[2] = {NO, YES}; | 991 BOOL boolValues[2] = {NO, YES}; | 
| 1014 for (unsigned long i = 0; i < arraysize(boolValues); i++) { | 992 for (unsigned long i = 0; i < arraysize(boolValues); i++) { | 
| 1015 const unsigned int kCardCount = 3; | 993 const unsigned int kCardCount = 3; | 
| 1016 base::scoped_nsobject<CardStackLayoutManager> stack( | 994 CardStackLayoutManager* stack = newStackOfNCards(kCardCount, boolValues[i]); | 
| 1017 newStackOfNCards(kCardCount, boolValues[i])); | |
| 1018 StackCard* firstCard = [[stack cards] objectAtIndex:0]; | 995 StackCard* firstCard = [[stack cards] objectAtIndex:0]; | 
| 1019 | 996 | 
| 1020 const float kEndLimit = | 997 const float kEndLimit = | 
| 1021 kDefaultEndLimitFraction * [stack fannedStackLength]; | 998 kDefaultEndLimitFraction * [stack fannedStackLength]; | 
| 1022 [stack setEndLimit:kEndLimit]; | 999 [stack setEndLimit:kEndLimit]; | 
| 1023 [stack fanOutCardsWithStartIndex:0]; | 1000 [stack fanOutCardsWithStartIndex:0]; | 
| 1024 ValidateCardPositioningConstraints(stack, kEndLimit, true); | 1001 ValidateCardPositioningConstraints(stack, kEndLimit, true); | 
| 1025 EXPECT_FLOAT_EQ(kMargin, LayoutOffset(stack, firstCard.layout.position)); | 1002 EXPECT_FLOAT_EQ(kMargin, LayoutOffset(stack, firstCard.layout.position)); | 
| 1026 EXPECT_FLOAT_EQ(kMaxStagger, SeparationOnLayoutAxis(stack, 0, 1)); | 1003 EXPECT_FLOAT_EQ(kMaxStagger, SeparationOnLayoutAxis(stack, 0, 1)); | 
| 1027 EXPECT_FLOAT_EQ(kMaxStagger, SeparationOnLayoutAxis(stack, 1, 2)); | 1004 EXPECT_FLOAT_EQ(kMaxStagger, SeparationOnLayoutAxis(stack, 1, 2)); | 
| (...skipping 16 matching lines...) Expand all Loading... | |
| 1044 ValidateCardPositioningConstraints(stack, kEndLimit, true); | 1021 ValidateCardPositioningConstraints(stack, kEndLimit, true); | 
| 1045 EXPECT_TRUE([stack overextensionTowardStartOnCardAtIndex:0]); | 1022 EXPECT_TRUE([stack overextensionTowardStartOnCardAtIndex:0]); | 
| 1046 EXPECT_FALSE([stack overextensionTowardEndOnFirstCard]); | 1023 EXPECT_FALSE([stack overextensionTowardEndOnFirstCard]); | 
| 1047 } | 1024 } | 
| 1048 } | 1025 } | 
| 1049 | 1026 | 
| 1050 TEST_F(CardStackLayoutManagerTest, ScrollAroundStartStack) { | 1027 TEST_F(CardStackLayoutManagerTest, ScrollAroundStartStack) { | 
| 1051 BOOL boolValues[2] = {NO, YES}; | 1028 BOOL boolValues[2] = {NO, YES}; | 
| 1052 for (unsigned long i = 0; i < arraysize(boolValues); i++) { | 1029 for (unsigned long i = 0; i < arraysize(boolValues); i++) { | 
| 1053 const unsigned int kCardCount = 3; | 1030 const unsigned int kCardCount = 3; | 
| 1054 base::scoped_nsobject<CardStackLayoutManager> stack( | 1031 CardStackLayoutManager* stack = newStackOfNCards(kCardCount, boolValues[i]); | 
| 1055 newStackOfNCards(kCardCount, boolValues[i])); | |
| 1056 | 1032 | 
| 1057 const float kEndLimit = | 1033 const float kEndLimit = | 
| 1058 kDefaultEndLimitFraction * [stack fannedStackLength]; | 1034 kDefaultEndLimitFraction * [stack fannedStackLength]; | 
| 1059 [stack setEndLimit:kEndLimit]; | 1035 [stack setEndLimit:kEndLimit]; | 
| 1060 [stack fanOutCardsWithStartIndex:0]; | 1036 [stack fanOutCardsWithStartIndex:0]; | 
| 1061 | 1037 | 
| 1062 EXPECT_FLOAT_EQ(kMaxStagger, SeparationOnLayoutAxis(stack, 0, 1)); | 1038 EXPECT_FLOAT_EQ(kMaxStagger, SeparationOnLayoutAxis(stack, 0, 1)); | 
| 1063 EXPECT_EQ(0, [stack lastStartStackCardIndex]); | 1039 EXPECT_EQ(0, [stack lastStartStackCardIndex]); | 
| 1064 ValidateCardPositioningConstraints(stack, kEndLimit, true); | 1040 ValidateCardPositioningConstraints(stack, kEndLimit, true); | 
| 1065 | 1041 | 
| (...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1107 ValidateCardPositioningConstraints(stack, kEndLimit, true); | 1083 ValidateCardPositioningConstraints(stack, kEndLimit, true); | 
| 1108 EXPECT_EQ(0, [stack lastStartStackCardIndex]); | 1084 EXPECT_EQ(0, [stack lastStartStackCardIndex]); | 
| 1109 EXPECT_FLOAT_EQ(kMaxStagger, SeparationOnLayoutAxis(stack, 1, 2)); | 1085 EXPECT_FLOAT_EQ(kMaxStagger, SeparationOnLayoutAxis(stack, 1, 2)); | 
| 1110 } | 1086 } | 
| 1111 } | 1087 } | 
| 1112 | 1088 | 
| 1113 TEST_F(CardStackLayoutManagerTest, ScrollAroundEndStack) { | 1089 TEST_F(CardStackLayoutManagerTest, ScrollAroundEndStack) { | 
| 1114 BOOL boolValues[2] = {NO, YES}; | 1090 BOOL boolValues[2] = {NO, YES}; | 
| 1115 for (unsigned long i = 0; i < arraysize(boolValues); i++) { | 1091 for (unsigned long i = 0; i < arraysize(boolValues); i++) { | 
| 1116 const unsigned int kCardCount = 7; | 1092 const unsigned int kCardCount = 7; | 
| 1117 base::scoped_nsobject<CardStackLayoutManager> stack( | 1093 CardStackLayoutManager* stack = newStackOfNCards(kCardCount, boolValues[i]); | 
| 1118 newStackOfNCards(kCardCount, boolValues[i])); | |
| 1119 | 1094 | 
| 1120 const float kEndLimit = 0.2 * [stack fannedStackLength]; | 1095 const float kEndLimit = 0.2 * [stack fannedStackLength]; | 
| 1121 [stack setEndLimit:kEndLimit]; | 1096 [stack setEndLimit:kEndLimit]; | 
| 1122 [stack fanOutCardsWithStartIndex:4]; | 1097 [stack fanOutCardsWithStartIndex:4]; | 
| 1123 | 1098 | 
| 1124 EXPECT_FLOAT_EQ(kMaxStagger, SeparationOnLayoutAxis(stack, 5, 6)); | 1099 EXPECT_FLOAT_EQ(kMaxStagger, SeparationOnLayoutAxis(stack, 5, 6)); | 
| 1125 EXPECT_EQ(4, [stack lastStartStackCardIndex]); | 1100 EXPECT_EQ(4, [stack lastStartStackCardIndex]); | 
| 1126 EXPECT_EQ(7, [stack firstEndStackCardIndex]); | 1101 EXPECT_EQ(7, [stack firstEndStackCardIndex]); | 
| 1127 ValidateCardPositioningConstraints(stack, kEndLimit, true); | 1102 ValidateCardPositioningConstraints(stack, kEndLimit, true); | 
| 1128 | 1103 | 
| (...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1171 ValidateCardPositioningConstraints(stack, kEndLimit, true); | 1146 ValidateCardPositioningConstraints(stack, kEndLimit, true); | 
| 1172 EXPECT_EQ([stack firstEndStackCardIndex], 7); | 1147 EXPECT_EQ([stack firstEndStackCardIndex], 7); | 
| 1173 EXPECT_FLOAT_EQ(kMaxStagger, SeparationOnLayoutAxis(stack, 5, 6)); | 1148 EXPECT_FLOAT_EQ(kMaxStagger, SeparationOnLayoutAxis(stack, 5, 6)); | 
| 1174 } | 1149 } | 
| 1175 } | 1150 } | 
| 1176 | 1151 | 
| 1177 TEST_F(CardStackLayoutManagerTest, BasicMultitouch) { | 1152 TEST_F(CardStackLayoutManagerTest, BasicMultitouch) { | 
| 1178 BOOL boolValues[2] = {NO, YES}; | 1153 BOOL boolValues[2] = {NO, YES}; | 
| 1179 for (unsigned long i = 0; i < arraysize(boolValues); i++) { | 1154 for (unsigned long i = 0; i < arraysize(boolValues); i++) { | 
| 1180 const unsigned int kCardCount = 3; | 1155 const unsigned int kCardCount = 3; | 
| 1181 base::scoped_nsobject<CardStackLayoutManager> stack( | 1156 CardStackLayoutManager* stack = newStackOfNCards(kCardCount, boolValues[i]); | 
| 1182 newStackOfNCards(kCardCount, boolValues[i])); | |
| 1183 | 1157 | 
| 1184 const float kEndLimit = | 1158 const float kEndLimit = | 
| 1185 kDefaultEndLimitFraction * [stack fannedStackLength]; | 1159 kDefaultEndLimitFraction * [stack fannedStackLength]; | 
| 1186 [stack setEndLimit:kEndLimit]; | 1160 [stack setEndLimit:kEndLimit]; | 
| 1187 [stack fanOutCardsWithStartIndex:0]; | 1161 [stack fanOutCardsWithStartIndex:0]; | 
| 1188 | 1162 | 
| 1189 ValidateCardPositioningConstraints(stack, kEndLimit, true); | 1163 ValidateCardPositioningConstraints(stack, kEndLimit, true); | 
| 1190 EXPECT_FLOAT_EQ(kMaxStagger, SeparationOnLayoutAxis(stack, 0, 1)); | 1164 EXPECT_FLOAT_EQ(kMaxStagger, SeparationOnLayoutAxis(stack, 0, 1)); | 
| 1191 EXPECT_FLOAT_EQ(kMaxStagger, SeparationOnLayoutAxis(stack, 1, 2)); | 1165 EXPECT_FLOAT_EQ(kMaxStagger, SeparationOnLayoutAxis(stack, 1, 2)); | 
| 1192 | 1166 | 
| 1193 [stack handleMultitouchWithFirstDelta:-10 | 1167 [stack handleMultitouchWithFirstDelta:-10 | 
| 1194 secondDelta:50 | 1168 secondDelta:50 | 
| 1195 firstCardIndex:1 | 1169 firstCardIndex:1 | 
| 1196 secondCardIndex:2 | 1170 secondCardIndex:2 | 
| 1197 decayOnOverpinch:YES]; | 1171 decayOnOverpinch:YES]; | 
| 1198 ValidateCardPositioningConstraints(stack, kEndLimit, false); | 1172 ValidateCardPositioningConstraints(stack, kEndLimit, false); | 
| 1199 EXPECT_FLOAT_EQ(kMaxStagger - 10, SeparationOnLayoutAxis(stack, 0, 1)); | 1173 EXPECT_FLOAT_EQ(kMaxStagger - 10, SeparationOnLayoutAxis(stack, 0, 1)); | 
| 1200 EXPECT_FLOAT_EQ(kMaxStagger + 60, SeparationOnLayoutAxis(stack, 1, 2)); | 1174 EXPECT_FLOAT_EQ(kMaxStagger + 60, SeparationOnLayoutAxis(stack, 1, 2)); | 
| 1201 } | 1175 } | 
| 1202 } | 1176 } | 
| 1203 | 1177 | 
| 1204 TEST_F(CardStackLayoutManagerTest, MultitouchBoundedByNeighbor) { | 1178 TEST_F(CardStackLayoutManagerTest, MultitouchBoundedByNeighbor) { | 
| 1205 BOOL boolValues[2] = {NO, YES}; | 1179 BOOL boolValues[2] = {NO, YES}; | 
| 1206 for (unsigned long i = 0; i < arraysize(boolValues); i++) { | 1180 for (unsigned long i = 0; i < arraysize(boolValues); i++) { | 
| 1207 const unsigned int kCardCount = 3; | 1181 const unsigned int kCardCount = 3; | 
| 1208 base::scoped_nsobject<CardStackLayoutManager> stack( | 1182 CardStackLayoutManager* stack = newStackOfNCards(kCardCount, boolValues[i]); | 
| 1209 newStackOfNCards(kCardCount, boolValues[i])); | |
| 1210 | 1183 | 
| 1211 // Make sure that the stack end limit isn't hit in this test. | 1184 // Make sure that the stack end limit isn't hit in this test. | 
| 1212 const float kEndLimit = 2.0 * [stack maximumStackLength]; | 1185 const float kEndLimit = 2.0 * [stack maximumStackLength]; | 
| 1213 [stack setEndLimit:kEndLimit]; | 1186 [stack setEndLimit:kEndLimit]; | 
| 1214 [stack fanOutCardsWithStartIndex:0]; | 1187 [stack fanOutCardsWithStartIndex:0]; | 
| 1215 | 1188 | 
| 1216 ValidateCardPositioningConstraints(stack, kEndLimit, true); | 1189 ValidateCardPositioningConstraints(stack, kEndLimit, true); | 
| 1217 EXPECT_FLOAT_EQ(kMaxStagger, SeparationOnLayoutAxis(stack, 0, 1)); | 1190 EXPECT_FLOAT_EQ(kMaxStagger, SeparationOnLayoutAxis(stack, 0, 1)); | 
| 1218 EXPECT_FLOAT_EQ(kMaxStagger, SeparationOnLayoutAxis(stack, 1, 2)); | 1191 EXPECT_FLOAT_EQ(kMaxStagger, SeparationOnLayoutAxis(stack, 1, 2)); | 
| 1219 | 1192 | 
| (...skipping 22 matching lines...) Expand all Loading... | |
| 1242 secondCardIndex:2 | 1215 secondCardIndex:2 | 
| 1243 decayOnOverpinch:YES]; | 1216 decayOnOverpinch:YES]; | 
| 1244 ValidateCardPositioningConstraints(stack, kEndLimit, false); | 1217 ValidateCardPositioningConstraints(stack, kEndLimit, false); | 
| 1245 } | 1218 } | 
| 1246 } | 1219 } | 
| 1247 | 1220 | 
| 1248 TEST_F(CardStackLayoutManagerTest, OverpinchTowardStart) { | 1221 TEST_F(CardStackLayoutManagerTest, OverpinchTowardStart) { | 
| 1249 BOOL boolValues[2] = {NO, YES}; | 1222 BOOL boolValues[2] = {NO, YES}; | 
| 1250 for (unsigned long i = 0; i < arraysize(boolValues); i++) { | 1223 for (unsigned long i = 0; i < arraysize(boolValues); i++) { | 
| 1251 const unsigned int kCardCount = 2; | 1224 const unsigned int kCardCount = 2; | 
| 1252 base::scoped_nsobject<CardStackLayoutManager> stack( | 1225 CardStackLayoutManager* stack = newStackOfNCards(kCardCount, boolValues[i]); | 
| 1253 newStackOfNCards(kCardCount, boolValues[i])); | |
| 1254 | 1226 | 
| 1255 const float kEndLimit = | 1227 const float kEndLimit = | 
| 1256 kDefaultEndLimitFraction * [stack fannedStackLength]; | 1228 kDefaultEndLimitFraction * [stack fannedStackLength]; | 
| 1257 [stack setEndLimit:kEndLimit]; | 1229 [stack setEndLimit:kEndLimit]; | 
| 1258 [stack fanOutCardsWithStartIndex:0]; | 1230 [stack fanOutCardsWithStartIndex:0]; | 
| 1259 | 1231 | 
| 1260 ValidateCardPositioningConstraints(stack, kEndLimit, true); | 1232 ValidateCardPositioningConstraints(stack, kEndLimit, true); | 
| 1261 StackCard* firstCard = [[stack cards] objectAtIndex:0]; | 1233 StackCard* firstCard = [[stack cards] objectAtIndex:0]; | 
| 1262 LayoutRectPosition firstCardPosition = firstCard.layout.position; | 1234 LayoutRectPosition firstCardPosition = firstCard.layout.position; | 
| 1263 StackCard* secondCard = [[stack cards] objectAtIndex:1]; | 1235 StackCard* secondCard = [[stack cards] objectAtIndex:1]; | 
| (...skipping 12 matching lines...) Expand all Loading... | |
| 1276 LayoutOffset(stack, firstCard.layout.position)); | 1248 LayoutOffset(stack, firstCard.layout.position)); | 
| 1277 EXPECT_FLOAT_EQ(LayoutOffset(stack, secondCardPosition) + 10, | 1249 EXPECT_FLOAT_EQ(LayoutOffset(stack, secondCardPosition) + 10, | 
| 1278 LayoutOffset(stack, secondCard.layout.position)); | 1250 LayoutOffset(stack, secondCard.layout.position)); | 
| 1279 } | 1251 } | 
| 1280 } | 1252 } | 
| 1281 | 1253 | 
| 1282 TEST_F(CardStackLayoutManagerTest, OverpinchTowardEnd) { | 1254 TEST_F(CardStackLayoutManagerTest, OverpinchTowardEnd) { | 
| 1283 BOOL boolValues[2] = {NO, YES}; | 1255 BOOL boolValues[2] = {NO, YES}; | 
| 1284 for (unsigned long i = 0; i < arraysize(boolValues); i++) { | 1256 for (unsigned long i = 0; i < arraysize(boolValues); i++) { | 
| 1285 const unsigned int kCardCount = 2; | 1257 const unsigned int kCardCount = 2; | 
| 1286 base::scoped_nsobject<CardStackLayoutManager> stack( | 1258 CardStackLayoutManager* stack = newStackOfNCards(kCardCount, boolValues[i]); | 
| 1287 newStackOfNCards(kCardCount, boolValues[i])); | |
| 1288 | 1259 | 
| 1289 const float kEndLimit = | 1260 const float kEndLimit = | 
| 1290 kDefaultEndLimitFraction * [stack fannedStackLength]; | 1261 kDefaultEndLimitFraction * [stack fannedStackLength]; | 
| 1291 [stack setEndLimit:kEndLimit]; | 1262 [stack setEndLimit:kEndLimit]; | 
| 1292 [stack fanOutCardsWithStartIndex:0]; | 1263 [stack fanOutCardsWithStartIndex:0]; | 
| 1293 | 1264 | 
| 1294 ValidateCardPositioningConstraints(stack, kEndLimit, true); | 1265 ValidateCardPositioningConstraints(stack, kEndLimit, true); | 
| 1295 StackCard* firstCard = [[stack cards] objectAtIndex:0]; | 1266 StackCard* firstCard = [[stack cards] objectAtIndex:0]; | 
| 1296 LayoutRectPosition firstCardPosition = firstCard.layout.position; | 1267 LayoutRectPosition firstCardPosition = firstCard.layout.position; | 
| 1297 StackCard* secondCard = [[stack cards] objectAtIndex:1]; | 1268 StackCard* secondCard = [[stack cards] objectAtIndex:1]; | 
| (...skipping 10 matching lines...) Expand all Loading... | |
| 1308 LayoutOffset(stack, firstCard.layout.position)); | 1279 LayoutOffset(stack, firstCard.layout.position)); | 
| 1309 EXPECT_FLOAT_EQ(LayoutOffset(stack, secondCardPosition) + 10, | 1280 EXPECT_FLOAT_EQ(LayoutOffset(stack, secondCardPosition) + 10, | 
| 1310 LayoutOffset(stack, secondCard.layout.position)); | 1281 LayoutOffset(stack, secondCard.layout.position)); | 
| 1311 } | 1282 } | 
| 1312 } | 1283 } | 
| 1313 | 1284 | 
| 1314 TEST_F(CardStackLayoutManagerTest, StressMultitouch) { | 1285 TEST_F(CardStackLayoutManagerTest, StressMultitouch) { | 
| 1315 BOOL boolValues[2] = {NO, YES}; | 1286 BOOL boolValues[2] = {NO, YES}; | 
| 1316 for (unsigned long i = 0; i < arraysize(boolValues); i++) { | 1287 for (unsigned long i = 0; i < arraysize(boolValues); i++) { | 
| 1317 const unsigned int kCardCount = 30; | 1288 const unsigned int kCardCount = 30; | 
| 1318 base::scoped_nsobject<CardStackLayoutManager> stack( | 1289 CardStackLayoutManager* stack = newStackOfNCards(kCardCount, boolValues[i]); | 
| 1319 newStackOfNCards(kCardCount, boolValues[i])); | |
| 1320 | 1290 | 
| 1321 const float kEndLimit = | 1291 const float kEndLimit = | 
| 1322 kDefaultEndLimitFraction * [stack fannedStackLength]; | 1292 kDefaultEndLimitFraction * [stack fannedStackLength]; | 
| 1323 [stack setEndLimit:kEndLimit]; | 1293 [stack setEndLimit:kEndLimit]; | 
| 1324 [stack fanOutCardsWithStartIndex:0]; | 1294 [stack fanOutCardsWithStartIndex:0]; | 
| 1325 | 1295 | 
| 1326 ValidateCardPositioningConstraints(stack, kEndLimit, true); | 1296 ValidateCardPositioningConstraints(stack, kEndLimit, true); | 
| 1327 | 1297 | 
| 1328 [stack handleMultitouchWithFirstDelta:-10 | 1298 [stack handleMultitouchWithFirstDelta:-10 | 
| 1329 secondDelta:50 | 1299 secondDelta:50 | 
| (...skipping 15 matching lines...) Expand all Loading... | |
| 1345 secondCardIndex:4 | 1315 secondCardIndex:4 | 
| 1346 decayOnOverpinch:YES]; | 1316 decayOnOverpinch:YES]; | 
| 1347 ValidateCardPositioningConstraints(stack, kEndLimit, false); | 1317 ValidateCardPositioningConstraints(stack, kEndLimit, false); | 
| 1348 } | 1318 } | 
| 1349 } | 1319 } | 
| 1350 | 1320 | 
| 1351 TEST_F(CardStackLayoutManagerTest, ScrollAfterMultitouch) { | 1321 TEST_F(CardStackLayoutManagerTest, ScrollAfterMultitouch) { | 
| 1352 BOOL boolValues[2] = {NO, YES}; | 1322 BOOL boolValues[2] = {NO, YES}; | 
| 1353 for (unsigned long i = 0; i < arraysize(boolValues); i++) { | 1323 for (unsigned long i = 0; i < arraysize(boolValues); i++) { | 
| 1354 const unsigned int kCardCount = 3; | 1324 const unsigned int kCardCount = 3; | 
| 1355 base::scoped_nsobject<CardStackLayoutManager> stack( | 1325 CardStackLayoutManager* stack = newStackOfNCards(kCardCount, boolValues[i]); | 
| 1356 newStackOfNCards(kCardCount, boolValues[i])); | |
| 1357 | 1326 | 
| 1358 const float kEndLimit = | 1327 const float kEndLimit = | 
| 1359 kDefaultEndLimitFraction * [stack fannedStackLength]; | 1328 kDefaultEndLimitFraction * [stack fannedStackLength]; | 
| 1360 const float kPinchDistance = 50; | 1329 const float kPinchDistance = 50; | 
| 1361 [stack setEndLimit:kEndLimit]; | 1330 [stack setEndLimit:kEndLimit]; | 
| 1362 [stack fanOutCardsWithStartIndex:0]; | 1331 [stack fanOutCardsWithStartIndex:0]; | 
| 1363 | 1332 | 
| 1364 ValidateCardPositioningConstraints(stack, kEndLimit, true); | 1333 ValidateCardPositioningConstraints(stack, kEndLimit, true); | 
| 1365 EXPECT_FLOAT_EQ(kMaxStagger, SeparationOnLayoutAxis(stack, 1, 2)); | 1334 EXPECT_FLOAT_EQ(kMaxStagger, SeparationOnLayoutAxis(stack, 1, 2)); | 
| 1366 | 1335 | 
| (...skipping 24 matching lines...) Expand all Loading... | |
| 1391 // Separation between cards should be maintained. | 1360 // Separation between cards should be maintained. | 
| 1392 EXPECT_FLOAT_EQ(kMaxStagger + kPinchDistance, | 1361 EXPECT_FLOAT_EQ(kMaxStagger + kPinchDistance, | 
| 1393 SeparationOnLayoutAxis(stack, 1, 2)); | 1362 SeparationOnLayoutAxis(stack, 1, 2)); | 
| 1394 } | 1363 } | 
| 1395 } | 1364 } | 
| 1396 | 1365 | 
| 1397 TEST_F(CardStackLayoutManagerTest, ScrollEveningOutAfterMultitouch) { | 1366 TEST_F(CardStackLayoutManagerTest, ScrollEveningOutAfterMultitouch) { | 
| 1398 BOOL boolValues[2] = {NO, YES}; | 1367 BOOL boolValues[2] = {NO, YES}; | 
| 1399 for (unsigned long i = 0; i < arraysize(boolValues); i++) { | 1368 for (unsigned long i = 0; i < arraysize(boolValues); i++) { | 
| 1400 const unsigned int kCardCount = 3; | 1369 const unsigned int kCardCount = 3; | 
| 1401 base::scoped_nsobject<CardStackLayoutManager> stack( | 1370 CardStackLayoutManager* stack = newStackOfNCards(kCardCount, boolValues[i]); | 
| 1402 newStackOfNCards(kCardCount, boolValues[i])); | |
| 1403 | 1371 | 
| 1404 const float kEndLimit = | 1372 const float kEndLimit = | 
| 1405 kDefaultEndLimitFraction * [stack fannedStackLength]; | 1373 kDefaultEndLimitFraction * [stack fannedStackLength]; | 
| 1406 const float kPinchDistance = kMaxStagger / 2.0; | 1374 const float kPinchDistance = kMaxStagger / 2.0; | 
| 1407 [stack setEndLimit:kEndLimit]; | 1375 [stack setEndLimit:kEndLimit]; | 
| 1408 [stack fanOutCardsWithStartIndex:0]; | 1376 [stack fanOutCardsWithStartIndex:0]; | 
| 1409 | 1377 | 
| 1410 ValidateCardPositioningConstraints(stack, kEndLimit, true); | 1378 ValidateCardPositioningConstraints(stack, kEndLimit, true); | 
| 1411 EXPECT_FLOAT_EQ(kMaxStagger, SeparationOnLayoutAxis(stack, 1, 2)); | 1379 EXPECT_FLOAT_EQ(kMaxStagger, SeparationOnLayoutAxis(stack, 1, 2)); | 
| 1412 | 1380 | 
| (...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1451 scrollLeadingCards:YES]; | 1419 scrollLeadingCards:YES]; | 
| 1452 ValidateCardPositioningConstraints(stack, kEndLimit, false); | 1420 ValidateCardPositioningConstraints(stack, kEndLimit, false); | 
| 1453 EXPECT_FLOAT_EQ(kMaxStagger, SeparationOnLayoutAxis(stack, 1, 2)); | 1421 EXPECT_FLOAT_EQ(kMaxStagger, SeparationOnLayoutAxis(stack, 1, 2)); | 
| 1454 } | 1422 } | 
| 1455 } | 1423 } | 
| 1456 | 1424 | 
| 1457 TEST_F(CardStackLayoutManagerTest, ScrollAroundStartStackAfterMultitouch) { | 1425 TEST_F(CardStackLayoutManagerTest, ScrollAroundStartStackAfterMultitouch) { | 
| 1458 BOOL boolValues[2] = {NO, YES}; | 1426 BOOL boolValues[2] = {NO, YES}; | 
| 1459 for (unsigned long i = 0; i < arraysize(boolValues); i++) { | 1427 for (unsigned long i = 0; i < arraysize(boolValues); i++) { | 
| 1460 const unsigned int kCardCount = 3; | 1428 const unsigned int kCardCount = 3; | 
| 1461 base::scoped_nsobject<CardStackLayoutManager> stack( | 1429 CardStackLayoutManager* stack = newStackOfNCards(kCardCount, boolValues[i]); | 
| 1462 newStackOfNCards(kCardCount, boolValues[i])); | |
| 1463 | 1430 | 
| 1464 const float kEndLimit = | 1431 const float kEndLimit = | 
| 1465 kDefaultEndLimitFraction * [stack fannedStackLength]; | 1432 kDefaultEndLimitFraction * [stack fannedStackLength]; | 
| 1466 const float kPinchDistance = 50; | 1433 const float kPinchDistance = 50; | 
| 1467 [stack setEndLimit:kEndLimit]; | 1434 [stack setEndLimit:kEndLimit]; | 
| 1468 [stack fanOutCardsWithStartIndex:0]; | 1435 [stack fanOutCardsWithStartIndex:0]; | 
| 1469 | 1436 | 
| 1470 EXPECT_FLOAT_EQ(kMaxStagger, SeparationOnLayoutAxis(stack, 0, 1)); | 1437 EXPECT_FLOAT_EQ(kMaxStagger, SeparationOnLayoutAxis(stack, 0, 1)); | 
| 1471 ValidateCardPositioningConstraints(stack, kEndLimit, true); | 1438 ValidateCardPositioningConstraints(stack, kEndLimit, true); | 
| 1472 | 1439 | 
| (...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1510 decayOnOverscroll:YES | 1477 decayOnOverscroll:YES | 
| 1511 scrollLeadingCards:YES]; | 1478 scrollLeadingCards:YES]; | 
| 1512 EXPECT_FLOAT_EQ(kMaxStagger, SeparationOnLayoutAxis(stack, 1, 2)); | 1479 EXPECT_FLOAT_EQ(kMaxStagger, SeparationOnLayoutAxis(stack, 1, 2)); | 
| 1513 } | 1480 } | 
| 1514 } | 1481 } | 
| 1515 | 1482 | 
| 1516 TEST_F(CardStackLayoutManagerTest, ScrollAroundEndStackAfterMultitouch) { | 1483 TEST_F(CardStackLayoutManagerTest, ScrollAroundEndStackAfterMultitouch) { | 
| 1517 BOOL boolValues[2] = {NO, YES}; | 1484 BOOL boolValues[2] = {NO, YES}; | 
| 1518 for (unsigned long i = 0; i < arraysize(boolValues); i++) { | 1485 for (unsigned long i = 0; i < arraysize(boolValues); i++) { | 
| 1519 const unsigned int kCardCount = 7; | 1486 const unsigned int kCardCount = 7; | 
| 1520 base::scoped_nsobject<CardStackLayoutManager> stack( | 1487 CardStackLayoutManager* stack = newStackOfNCards(kCardCount, boolValues[i]); | 
| 1521 newStackOfNCards(kCardCount, boolValues[i])); | |
| 1522 | 1488 | 
| 1523 const float kEndLimit = 0.3 * [stack fannedStackLength]; | 1489 const float kEndLimit = 0.3 * [stack fannedStackLength]; | 
| 1524 const float kPinchDistance = 20; | 1490 const float kPinchDistance = 20; | 
| 1525 [stack setEndLimit:kEndLimit]; | 1491 [stack setEndLimit:kEndLimit]; | 
| 1526 // Start in the middle of the stack to be able to scroll cards into the end | 1492 // Start in the middle of the stack to be able to scroll cards into the end | 
| 1527 // stack. | 1493 // stack. | 
| 1528 [stack fanOutCardsWithStartIndex:4]; | 1494 [stack fanOutCardsWithStartIndex:4]; | 
| 1529 | 1495 | 
| 1530 EXPECT_FLOAT_EQ(kMaxStagger, SeparationOnLayoutAxis(stack, 5, 6)); | 1496 EXPECT_FLOAT_EQ(kMaxStagger, SeparationOnLayoutAxis(stack, 5, 6)); | 
| 1531 ValidateCardPositioningConstraints(stack, kEndLimit, true); | 1497 ValidateCardPositioningConstraints(stack, kEndLimit, true); | 
| (...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1571 decayOnOverscroll:YES | 1537 decayOnOverscroll:YES | 
| 1572 scrollLeadingCards:YES]; | 1538 scrollLeadingCards:YES]; | 
| 1573 EXPECT_FLOAT_EQ(SeparationOnLayoutAxis(stack, 5, 6), kMaxStagger); | 1539 EXPECT_FLOAT_EQ(SeparationOnLayoutAxis(stack, 5, 6), kMaxStagger); | 
| 1574 } | 1540 } | 
| 1575 } | 1541 } | 
| 1576 | 1542 | 
| 1577 TEST_F(CardStackLayoutManagerTest, ScrollAfterPinchOutOfStartStack) { | 1543 TEST_F(CardStackLayoutManagerTest, ScrollAfterPinchOutOfStartStack) { | 
| 1578 BOOL boolValues[2] = {NO, YES}; | 1544 BOOL boolValues[2] = {NO, YES}; | 
| 1579 for (unsigned long i = 0; i < arraysize(boolValues); i++) { | 1545 for (unsigned long i = 0; i < arraysize(boolValues); i++) { | 
| 1580 const unsigned int kCardCount = 3; | 1546 const unsigned int kCardCount = 3; | 
| 1581 base::scoped_nsobject<CardStackLayoutManager> stack( | 1547 CardStackLayoutManager* stack = newStackOfNCards(kCardCount, boolValues[i]); | 
| 1582 newStackOfNCards(kCardCount, boolValues[i])); | |
| 1583 | 1548 | 
| 1584 const float kEndLimit = | 1549 const float kEndLimit = | 
| 1585 kDefaultEndLimitFraction * [stack fannedStackLength]; | 1550 kDefaultEndLimitFraction * [stack fannedStackLength]; | 
| 1586 const float kPinchDistance = 50; | 1551 const float kPinchDistance = 50; | 
| 1587 [stack setEndLimit:kEndLimit]; | 1552 [stack setEndLimit:kEndLimit]; | 
| 1588 [stack fanOutCardsWithStartIndex:0]; | 1553 [stack fanOutCardsWithStartIndex:0]; | 
| 1589 | 1554 | 
| 1590 EXPECT_FLOAT_EQ(kMaxStagger, SeparationOnLayoutAxis(stack, 0, 1)); | 1555 EXPECT_FLOAT_EQ(kMaxStagger, SeparationOnLayoutAxis(stack, 0, 1)); | 
| 1591 ValidateCardPositioningConstraints(stack, kEndLimit, true); | 1556 ValidateCardPositioningConstraints(stack, kEndLimit, true); | 
| 1592 | 1557 | 
| (...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1641 ValidateCardPositioningConstraints(stack, kEndLimit, false); | 1606 ValidateCardPositioningConstraints(stack, kEndLimit, false); | 
| 1642 EXPECT_FLOAT_EQ(inStackSeparation + kMaxStagger, | 1607 EXPECT_FLOAT_EQ(inStackSeparation + kMaxStagger, | 
| 1643 SeparationOnLayoutAxis(stack, 1, 2)); | 1608 SeparationOnLayoutAxis(stack, 1, 2)); | 
| 1644 } | 1609 } | 
| 1645 } | 1610 } | 
| 1646 | 1611 | 
| 1647 TEST_F(CardStackLayoutManagerTest, ScrollAfterPinchOutOfEndStack) { | 1612 TEST_F(CardStackLayoutManagerTest, ScrollAfterPinchOutOfEndStack) { | 
| 1648 BOOL boolValues[2] = {NO, YES}; | 1613 BOOL boolValues[2] = {NO, YES}; | 
| 1649 for (unsigned long i = 0; i < arraysize(boolValues); i++) { | 1614 for (unsigned long i = 0; i < arraysize(boolValues); i++) { | 
| 1650 const unsigned int kCardCount = 7; | 1615 const unsigned int kCardCount = 7; | 
| 1651 base::scoped_nsobject<CardStackLayoutManager> stack( | 1616 CardStackLayoutManager* stack = newStackOfNCards(kCardCount, boolValues[i]); | 
| 1652 newStackOfNCards(kCardCount, boolValues[i])); | |
| 1653 | 1617 | 
| 1654 const float kEndLimit = 0.3 * [stack fannedStackLength]; | 1618 const float kEndLimit = 0.3 * [stack fannedStackLength]; | 
| 1655 const float kPinchDistance = 20; | 1619 const float kPinchDistance = 20; | 
| 1656 [stack setEndLimit:kEndLimit]; | 1620 [stack setEndLimit:kEndLimit]; | 
| 1657 // Start in the middle of the stack to be able to scroll cards into the end | 1621 // Start in the middle of the stack to be able to scroll cards into the end | 
| 1658 // stack. | 1622 // stack. | 
| 1659 [stack fanOutCardsWithStartIndex:4]; | 1623 [stack fanOutCardsWithStartIndex:4]; | 
| 1660 | 1624 | 
| 1661 EXPECT_FLOAT_EQ(kMaxStagger, SeparationOnLayoutAxis(stack, 5, 6)); | 1625 EXPECT_FLOAT_EQ(kMaxStagger, SeparationOnLayoutAxis(stack, 5, 6)); | 
| 1662 ValidateCardPositioningConstraints(stack, kEndLimit, true); | 1626 ValidateCardPositioningConstraints(stack, kEndLimit, true); | 
| (...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1716 decayOnOverscroll:YES | 1680 decayOnOverscroll:YES | 
| 1717 scrollLeadingCards:YES]; | 1681 scrollLeadingCards:YES]; | 
| 1718 ValidateCardPositioningConstraints(stack, kEndLimit, false); | 1682 ValidateCardPositioningConstraints(stack, kEndLimit, false); | 
| 1719 EXPECT_EQ(7, [stack firstEndStackCardIndex]); | 1683 EXPECT_EQ(7, [stack firstEndStackCardIndex]); | 
| 1720 EXPECT_FLOAT_EQ(inStackSeparation + 2 * kMaxStagger, | 1684 EXPECT_FLOAT_EQ(inStackSeparation + 2 * kMaxStagger, | 
| 1721 SeparationOnLayoutAxis(stack, 5, 6)); | 1685 SeparationOnLayoutAxis(stack, 5, 6)); | 
| 1722 } | 1686 } | 
| 1723 } | 1687 } | 
| 1724 | 1688 | 
| 1725 } // namespace | 1689 } // namespace | 
| OLD | NEW |