Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(139)

Side by Side Diff: ios/chrome/browser/ui/stack_view/card_stack_layout_manager_unittest.mm

Issue 2686573003: [ObjC ARC] Converts ios/chrome/browser/ui/stack_view:unit_tests to ARC. (Closed)
Patch Set: weak Created 3 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698