blob: 626866a8e011b22aeadbe4bc482d0040625640d4 [file] [log] [blame]
// Copyright 2016 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#import "ios/chrome/browser/ui/collection_view/collection_view_controller_test.h"
#include "base/logging.h"
#import "base/mac/foundation_util.h"
#import "ios/chrome/browser/ui/collection_view/cells/collection_view_detail_item.h"
#import "ios/chrome/browser/ui/collection_view/cells/collection_view_footer_item.h"
#import "ios/chrome/browser/ui/collection_view/cells/collection_view_item.h"
#import "ios/chrome/browser/ui/collection_view/cells/collection_view_switch_item.h"
#import "ios/chrome/browser/ui/collection_view/cells/collection_view_text_item.h"
#import "ios/chrome/browser/ui/collection_view/collection_view_controller.h"
#import "ios/chrome/browser/ui/collection_view/collection_view_model.h"
#include "testing/gtest_mac.h"
#include "ui/base/l10n/l10n_util.h"
#if !defined(__has_feature) || !__has_feature(objc_arc)
#error "This file requires ARC support."
#endif
CollectionViewControllerTest::CollectionViewControllerTest() {}
CollectionViewControllerTest::~CollectionViewControllerTest() {}
void CollectionViewControllerTest::TearDown() {
// Delete the controller before deleting other test variables, such as a
// profile, to ensure things are cleaned up in the same order as in Chrome.
controller_.reset();
BlockCleanupTest::TearDown();
}
void CollectionViewControllerTest::CreateController() {
DCHECK(!controller_);
controller_.reset(NewController());
// Force the model to be loaded.
[controller_ loadModel];
// Force the collectionView to be built.
EXPECT_TRUE([controller_ view]);
}
CollectionViewController* CollectionViewControllerTest::controller() {
if (!controller_)
CreateController();
return controller_.get();
}
void CollectionViewControllerTest::ResetController() {
controller_.reset();
}
void CollectionViewControllerTest::CheckController() {
EXPECT_TRUE([controller_ view]);
EXPECT_TRUE([controller_ collectionView]);
EXPECT_TRUE([controller_ collectionViewModel]);
EXPECT_EQ(controller_.get(), [controller_ collectionView].dataSource);
EXPECT_EQ(controller_.get(), [controller_ collectionView].delegate);
}
int CollectionViewControllerTest::NumberOfSections() {
return [[controller_ collectionViewModel] numberOfSections];
}
int CollectionViewControllerTest::NumberOfItemsInSection(int section) {
return [[controller_ collectionViewModel] numberOfItemsInSection:section];
}
id CollectionViewControllerTest::GetCollectionViewItem(int section, int item) {
CollectionViewModel* model = [controller_ collectionViewModel];
NSIndexPath* index_path =
[NSIndexPath indexPathForItem:item inSection:section];
CollectionViewItem* collection_view_item =
[model hasItemAtIndexPath:index_path] ? [model itemAtIndexPath:index_path]
: nil;
EXPECT_TRUE(collection_view_item);
return collection_view_item;
}
void CollectionViewControllerTest::CheckTitle(NSString* expected_title) {
EXPECT_NSEQ(expected_title, [controller_ title]);
}
void CollectionViewControllerTest::CheckTitleWithId(int expected_title_id) {
CheckTitle(l10n_util::GetNSString(expected_title_id));
}
void CollectionViewControllerTest::CheckSectionHeader(NSString* expected_title,
int section) {
CollectionViewItem* header =
[[controller_ collectionViewModel] headerForSection:section];
ASSERT_TRUE([header respondsToSelector:@selector(text)]);
EXPECT_NSEQ(expected_title, [(id)header text]);
}
void CollectionViewControllerTest::CheckSectionHeaderWithId(
int expected_title_id,
int section) {
CheckSectionHeader(l10n_util::GetNSString(expected_title_id), section);
}
void CollectionViewControllerTest::CheckSectionFooter(NSString* expected_text,
int section) {
ASSERT_EQ(1, NumberOfItemsInSection(section));
CollectionViewFooterItem* footer_item =
base::mac::ObjCCastStrict<CollectionViewFooterItem>(
GetCollectionViewItem(section, 0));
EXPECT_NSEQ(expected_text, footer_item.text);
}
void CollectionViewControllerTest::CheckSectionFooterWithId(
int expected_text_id,
int section) {
return CheckSectionFooter(l10n_util::GetNSString(expected_text_id), section);
}
void CollectionViewControllerTest::CheckTextCellTitle(NSString* expected_title,
int section,
int item) {
CollectionViewTextItem* cell = GetCollectionViewItem(section, item);
EXPECT_NSEQ(expected_title, cell.text);
EXPECT_FALSE(cell.detailText);
}
void CollectionViewControllerTest::CheckTextCellTitleWithId(
int expected_title_id,
int section,
int item) {
CheckTextCellTitle(l10n_util::GetNSString(expected_title_id), section, item);
}
void CollectionViewControllerTest::CheckTextCellTitleAndSubtitle(
NSString* expected_title,
NSString* expected_subtitle,
int section,
int item) {
CollectionViewTextItem* cell = GetCollectionViewItem(section, item);
EXPECT_NSEQ(expected_title, cell.text);
EXPECT_NSEQ(expected_subtitle, cell.detailText);
}
void CollectionViewControllerTest::CheckDetailItemTextWithIds(
int expected_text_id,
int expected_detail_text_id,
int section_id,
int item_id) {
CollectionViewDetailItem* item = GetCollectionViewItem(section_id, item_id);
EXPECT_NSEQ(l10n_util::GetNSString(expected_text_id), item.text);
EXPECT_NSEQ(l10n_util::GetNSString(expected_detail_text_id), item.detailText);
}
void CollectionViewControllerTest::CheckSwitchCellStateAndTitle(
BOOL expected_state,
NSString* expected_title,
int section,
int item) {
CollectionViewSwitchItem* cell = GetCollectionViewItem(section, item);
EXPECT_NSEQ(expected_title, cell.text);
EXPECT_EQ(expected_state, cell.isOn);
}
void CollectionViewControllerTest::CheckSwitchCellStateAndTitleWithId(
BOOL expected_state,
int expected_title_id,
int section,
int item) {
CheckSwitchCellStateAndTitle(
expected_state, l10n_util::GetNSString(expected_title_id), section, item);
}
void CollectionViewControllerTest::CheckAccessoryType(
MDCCollectionViewCellAccessoryType accessory_type,
int section,
int item) {
id text_item = GetCollectionViewItem(section, item);
EXPECT_TRUE([text_item respondsToSelector:@selector(accessoryType)]);
EXPECT_EQ(accessory_type,
(MDCCollectionViewCellAccessoryType)[text_item accessoryType]);
}
void CollectionViewControllerTest::DeleteItem(
int section,
int item,
ProceduralBlock completion_block) {
NSIndexPath* index_path =
[NSIndexPath indexPathForItem:item inSection:section];
__weak CollectionViewController* weak_controller = controller_;
void (^batch_updates)() = ^{
CollectionViewController* strong_controller = weak_controller;
if (!strong_controller)
return;
// Notify delegate to delete data.
[strong_controller collectionView:[strong_controller collectionView]
willDeleteItemsAtIndexPaths:@[ index_path ]];
// Delete index paths.
[[strong_controller collectionView]
deleteItemsAtIndexPaths:@[ index_path ]];
};
void (^completion)(BOOL finished) = ^(BOOL finished) {
// Notify delegate of deletion.
CollectionViewController* strong_controller = weak_controller;
if (!strong_controller)
return;
[strong_controller collectionView:[strong_controller collectionView]
didDeleteItemsAtIndexPaths:@[ index_path ]];
if (completion_block) {
completion_block();
}
};
[[controller_ collectionView] performBatchUpdates:batch_updates
completion:completion];
}