blob: 1833cdbfd6a551f2f4e2deffaae1d59042263f16 [file] [log] [blame]
// Copyright 2017 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.
#include "chrome/browser/ui/views/payments/payment_request_item_list.h"
#include <memory>
#include <utility>
#include <vector>
#include "testing/gtest/include/gtest/gtest.h"
#include "ui/views/view.h"
namespace payments {
namespace {
class TestListItem : public PaymentRequestItemList::Item {
public:
TestListItem(PaymentRequestItemList* list, bool selected)
: PaymentRequestItemList::Item(nullptr,
nullptr,
list,
selected,
/*clickable=*/true,
/*show_edit_button=*/false),
selected_state_changed_calls_count_(0) {
Init();
}
int selected_state_changed_calls_count() {
return selected_state_changed_calls_count_;
}
private:
std::unique_ptr<views::View> CreateContentView(
base::string16* accessible_content) override {
return std::make_unique<views::View>();
}
base::string16 GetNameForDataType() override { return base::string16(); }
bool CanBeSelected() override { return true; }
void PerformSelectionFallback() override {}
void EditButtonPressed() override {}
void SelectedStateChanged() override {
++selected_state_changed_calls_count_;
}
int selected_state_changed_calls_count_;
DISALLOW_COPY_AND_ASSIGN(TestListItem);
};
} // namespace
TEST(PaymentRequestItemListTest, TestAddItem) {
PaymentRequestItemList list(nullptr);
std::unique_ptr<views::View> list_view = list.CreateListView();
EXPECT_TRUE(list_view->children().empty());
std::vector<std::unique_ptr<TestListItem>> items;
items.push_back(std::make_unique<TestListItem>(&list, false));
items.push_back(std::make_unique<TestListItem>(&list, true));
items.push_back(std::make_unique<TestListItem>(&list, false));
items.push_back(std::make_unique<TestListItem>(&list, true));
// The unique_ptr objects will become owned by |list|, but the underlying
// pointers will be needed for assertions after the unique_ptr is moved.
std::vector<TestListItem*> item_pointers;
for (auto& item : items) {
item_pointers.push_back(item.get());
list.AddItem(std::move(item));
}
EXPECT_FALSE(item_pointers[0]->selected());
// Only one item should be selected at a time, so adding item at index 3 with
// |selected| set to true should have deselected item at index 1.
EXPECT_FALSE(item_pointers[1]->selected());
EXPECT_FALSE(item_pointers[2]->selected());
EXPECT_TRUE(item_pointers[3]->selected());
list_view = list.CreateListView();
EXPECT_EQ(4u, list_view->children().size());
}
TEST(PaymentRequestItemListTest, TestSelectItemResultsInSingleItemSelected) {
PaymentRequestItemList list(nullptr);
std::vector<std::unique_ptr<TestListItem>> items;
items.push_back(std::make_unique<TestListItem>(&list, false));
items.push_back(std::make_unique<TestListItem>(&list, false));
items.push_back(std::make_unique<TestListItem>(&list, false));
// The unique_ptr objects will become owned by |list|, but the underlying
// pointers will be needed for assertions after the unique_ptr is moved.
std::vector<TestListItem*> item_pointers;
for (auto& item : items) {
item_pointers.push_back(item.get());
list.AddItem(std::move(item));
}
// Only one item should be selected at once and items should have their
// SelectedStateChanged() function called when they are selected and when
// they are unselected.
list.SelectItem(item_pointers[0]);
EXPECT_TRUE(item_pointers[0]->selected());
EXPECT_EQ(1, item_pointers[0]->selected_state_changed_calls_count());
EXPECT_FALSE(item_pointers[1]->selected());
EXPECT_EQ(0, item_pointers[1]->selected_state_changed_calls_count());
EXPECT_FALSE(item_pointers[2]->selected());
EXPECT_EQ(0, item_pointers[2]->selected_state_changed_calls_count());
list.SelectItem(item_pointers[2]);
EXPECT_FALSE(item_pointers[0]->selected());
EXPECT_EQ(2, item_pointers[0]->selected_state_changed_calls_count());
EXPECT_FALSE(item_pointers[1]->selected());
EXPECT_EQ(0, item_pointers[1]->selected_state_changed_calls_count());
EXPECT_TRUE(item_pointers[2]->selected());
EXPECT_EQ(1, item_pointers[2]->selected_state_changed_calls_count());
list.SelectItem(item_pointers[1]);
EXPECT_FALSE(item_pointers[0]->selected());
EXPECT_EQ(2, item_pointers[0]->selected_state_changed_calls_count());
EXPECT_TRUE(item_pointers[1]->selected());
EXPECT_EQ(1, item_pointers[1]->selected_state_changed_calls_count());
EXPECT_FALSE(item_pointers[2]->selected());
EXPECT_EQ(2, item_pointers[2]->selected_state_changed_calls_count());
}
} // namespace payments