| OLD | NEW |
| 1 // Copyright 2016 The Chromium Authors. All rights reserved. | 1 // Copyright 2016 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 #import "ios/chrome/browser/ui/collection_view/collection_view_model.h" | 5 #import "ios/chrome/browser/ui/collection_view/collection_view_model.h" |
| 6 | 6 |
| 7 #include "base/bind.h" |
| 7 #include "base/mac/foundation_util.h" | 8 #include "base/mac/foundation_util.h" |
| 9 #include "base/test/logging_utils.h" |
| 8 #import "ios/chrome/browser/ui/collection_view/cells/collection_view_item.h" | 10 #import "ios/chrome/browser/ui/collection_view/cells/collection_view_item.h" |
| 9 #include "testing/gtest/include/gtest/gtest.h" | 11 #include "testing/gtest/include/gtest/gtest.h" |
| 10 #include "testing/gtest_mac.h" | 12 #include "testing/gtest_mac.h" |
| 11 | 13 |
| 12 #if !defined(__has_feature) || !__has_feature(objc_arc) | 14 #if !defined(__has_feature) || !__has_feature(objc_arc) |
| 13 #error "This file requires ARC support." | 15 #error "This file requires ARC support." |
| 14 #endif | 16 #endif |
| 15 | 17 |
| 16 @interface CollectionViewModel (Testing) | 18 @interface CollectionViewModel (Testing) |
| 17 // Adds an item with the given type to the section with the given identifier. | 19 // Adds an item with the given type to the section with the given identifier. |
| (...skipping 29 matching lines...) Expand all Loading... |
| 47 ItemTypeCheeseHeader = kItemTypeEnumZero, | 49 ItemTypeCheeseHeader = kItemTypeEnumZero, |
| 48 ItemTypeCheeseCheddar, | 50 ItemTypeCheeseCheddar, |
| 49 ItemTypeCheeseGouda, | 51 ItemTypeCheeseGouda, |
| 50 ItemTypeCheesePepperJack, | 52 ItemTypeCheesePepperJack, |
| 51 ItemTypeWeasleyRon, | 53 ItemTypeWeasleyRon, |
| 52 ItemTypeWeasleyGinny, | 54 ItemTypeWeasleyGinny, |
| 53 ItemTypeWeasleyArthur, | 55 ItemTypeWeasleyArthur, |
| 54 ItemTypeWeasleyFooter, | 56 ItemTypeWeasleyFooter, |
| 55 }; | 57 }; |
| 56 | 58 |
| 57 void LogSink(const std::string& str) { | 59 void LogSink(const char* file, |
| 60 int line, |
| 61 size_t message_start, |
| 62 size_t stack_start, |
| 63 const std::string& str) { |
| 58 // No-op. | 64 // No-op. |
| 59 } | 65 } |
| 60 | 66 |
| 61 // Test generic model boxing (check done at compilation time). | 67 // Test generic model boxing (check done at compilation time). |
| 62 TEST(CollectionViewModelTest, GenericModelBoxing) { | 68 TEST(CollectionViewModelTest, GenericModelBoxing) { |
| 63 CollectionViewModel<TestCollectionViewItemSubclass*>* specificModel = | 69 CollectionViewModel<TestCollectionViewItemSubclass*>* specificModel = |
| 64 [[CollectionViewModel alloc] init]; | 70 [[CollectionViewModel alloc] init]; |
| 65 | 71 |
| 66 // |generalModel| is a superclass of |specificModel|. So specificModel can be | 72 // |generalModel| is a superclass of |specificModel|. So specificModel can be |
| 67 // boxed into generalModel, but not the other way around. | 73 // boxed into generalModel, but not the other way around. |
| (...skipping 237 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 305 EXPECT_EQ(3U, [cheeseItems count]); | 311 EXPECT_EQ(3U, [cheeseItems count]); |
| 306 EXPECT_NSEQ(cheddar, cheeseItems[0]); | 312 EXPECT_NSEQ(cheddar, cheeseItems[0]); |
| 307 EXPECT_NSEQ(pepperJack, cheeseItems[1]); | 313 EXPECT_NSEQ(pepperJack, cheeseItems[1]); |
| 308 EXPECT_NSEQ(gouda, cheeseItems[2]); | 314 EXPECT_NSEQ(gouda, cheeseItems[2]); |
| 309 } | 315 } |
| 310 | 316 |
| 311 TEST(CollectionViewModelTest, InvalidIndexPath) { | 317 TEST(CollectionViewModelTest, InvalidIndexPath) { |
| 312 CollectionViewModel* model = [[CollectionViewModel alloc] init]; | 318 CollectionViewModel* model = [[CollectionViewModel alloc] init]; |
| 313 [model addSectionWithIdentifier:SectionIdentifierCheese]; | 319 [model addSectionWithIdentifier:SectionIdentifierCheese]; |
| 314 | 320 |
| 315 logging::SetLogAssertHandler(&LogSink); | 321 logging::ScopedLogAssertHandler scoped_assert_handler(base::Bind(LogSink)); |
| 316 bool out_of_bounds_exception_thrown = false; | 322 bool out_of_bounds_exception_thrown = false; |
| 317 @try { | 323 @try { |
| 318 [model indexInItemTypeForIndexPath:[NSIndexPath indexPathForItem:0 | 324 [model indexInItemTypeForIndexPath:[NSIndexPath indexPathForItem:0 |
| 319 inSection:0]]; | 325 inSection:0]]; |
| 320 } @catch (NSException* exception) { | 326 } @catch (NSException* exception) { |
| 321 if ([[exception name] isEqualToString:NSRangeException]) { | 327 if ([[exception name] isEqualToString:NSRangeException]) { |
| 322 out_of_bounds_exception_thrown = true; | 328 out_of_bounds_exception_thrown = true; |
| 323 } | 329 } |
| 324 } | 330 } |
| 325 EXPECT_TRUE(out_of_bounds_exception_thrown); | 331 EXPECT_TRUE(out_of_bounds_exception_thrown); |
| 326 logging::SetLogAssertHandler(nullptr); | |
| 327 } | 332 } |
| 328 | 333 |
| 329 TEST(CollectionViewModelTest, RemoveItems) { | 334 TEST(CollectionViewModelTest, RemoveItems) { |
| 330 CollectionViewModel* model = [[CollectionViewModel alloc] init]; | 335 CollectionViewModel* model = [[CollectionViewModel alloc] init]; |
| 331 | 336 |
| 332 [model addSectionWithIdentifier:SectionIdentifierCheese]; | 337 [model addSectionWithIdentifier:SectionIdentifierCheese]; |
| 333 [model addItemWithType:ItemTypeCheesePepperJack | 338 [model addItemWithType:ItemTypeCheesePepperJack |
| 334 toSectionWithIdentifier:SectionIdentifierCheese]; | 339 toSectionWithIdentifier:SectionIdentifierCheese]; |
| 335 [model addItemWithType:ItemTypeCheeseGouda | 340 [model addItemWithType:ItemTypeCheeseGouda |
| 336 toSectionWithIdentifier:SectionIdentifierCheese]; | 341 toSectionWithIdentifier:SectionIdentifierCheese]; |
| (...skipping 248 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 585 | 590 |
| 586 EXPECT_FALSE([model footerForSectionWithIdentifier:SectionIdentifierCheese]); | 591 EXPECT_FALSE([model footerForSectionWithIdentifier:SectionIdentifierCheese]); |
| 587 EXPECT_FALSE([model footerForSection:cheeseSection]); | 592 EXPECT_FALSE([model footerForSection:cheeseSection]); |
| 588 | 593 |
| 589 EXPECT_EQ(weasleyFooter, | 594 EXPECT_EQ(weasleyFooter, |
| 590 [model footerForSectionWithIdentifier:SectionIdentifierWeasley]); | 595 [model footerForSectionWithIdentifier:SectionIdentifierWeasley]); |
| 591 EXPECT_EQ(weasleyFooter, [model footerForSection:weasleySection]); | 596 EXPECT_EQ(weasleyFooter, [model footerForSection:weasleySection]); |
| 592 } | 597 } |
| 593 | 598 |
| 594 } // namespace | 599 } // namespace |
| OLD | NEW |