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 |