Chromium Code Reviews| Index: ui/views/view_unittest.cc |
| diff --git a/ui/views/view_unittest.cc b/ui/views/view_unittest.cc |
| index e9af12ad5a964d0a67207326d15e99dbd2163f12..2f5b288adc6e5a17d3b610fdd0fd1d2ef2de6766 100644 |
| --- a/ui/views/view_unittest.cc |
| +++ b/ui/views/view_unittest.cc |
| @@ -41,6 +41,7 @@ |
| #include "ui/views/controls/textfield/textfield.h" |
| #include "ui/views/focus/view_storage.h" |
| #include "ui/views/test/views_test_base.h" |
| +#include "ui/views/view_observer.h" |
| #include "ui/views/widget/native_widget.h" |
| #include "ui/views/widget/root_view.h" |
| #include "ui/views/window/dialog_client_view.h" |
| @@ -4577,4 +4578,150 @@ TEST_F(ViewTest, CrashOnAddFromFromOnNativeThemeChanged) { |
| EXPECT_TRUE(v->on_native_theme_changed_called()); |
| } |
| +//////////////////////////////////////////////////////////////////////////////// |
| +// Observer tests. |
| +//////////////////////////////////////////////////////////////////////////////// |
| + |
| +class ViewObserverTest : public ViewTest, public ViewObserver { |
| + public: |
| + ViewObserverTest() |
| + : view_visibility_changed_(nullptr), |
| + view_enabled_changed_(nullptr), |
| + view_bounds_changed_(nullptr), |
| + view_reordered_(nullptr) {} |
| + |
| + ~ViewObserverTest() override {} |
| + |
| + void OnViewParentChanged(View* target, |
|
sky
2016/11/21 16:33:37
Generally we prefix overrides with the class they
Sarmad Hashmi
2016/11/21 17:09:54
Done.
|
| + View* old_parent, |
| + View* new_parent) override { |
| + ViewParentChangedDetails details; |
| + details.target = target; |
| + details.old_parent = old_parent; |
| + details.new_parent = new_parent; |
| + views_parent_changed_details_.push_back(details); |
| + } |
| + |
| + void OnViewVisibilityChanged(View* view) override { |
| + view_visibility_changed_ = view; |
| + } |
| + |
| + void OnViewEnabledChanged(View* view) override { |
| + view_enabled_changed_ = view; |
| + } |
| + |
| + void OnViewBoundsChanged(View* view) override { view_bounds_changed_ = view; } |
| + |
| + void OnChildViewReordered(View* view, int index) override { |
| + view_reordered_ = view; |
| + } |
| + |
| + bool DidChangeParent(View* target, View* old_parent, View* new_parent) { |
| + for (auto& details : views_parent_changed_details_) { |
| + if (details.target == target && details.old_parent == old_parent && |
| + details.new_parent == new_parent) |
| + return true; |
| + } |
| + return false; |
| + } |
| + |
| + void reset() { |
| + views_parent_changed_details_.clear(); |
| + view_visibility_changed_ = nullptr; |
| + view_enabled_changed_ = nullptr; |
| + view_bounds_changed_ = nullptr; |
| + view_reordered_ = nullptr; |
| + } |
| + |
| + std::unique_ptr<View> NewView() { |
| + auto view = base::MakeUnique<View>(); |
| + view->AddObserver(this); |
| + return view; |
| + } |
| + |
| + int views_parent_changed_times() const { |
| + return static_cast<int>(views_parent_changed_details_.size()); |
| + } |
| + const View* view_visibility_changed() const { |
| + return view_visibility_changed_; |
| + } |
| + const View* view_enabled_changed() const { return view_enabled_changed_; } |
| + const View* view_bounds_changed() const { return view_bounds_changed_; } |
| + const View* view_reordered() const { return view_reordered_; } |
| + |
| + private: |
| + struct ViewParentChangedDetails { |
| + View* target; |
| + View* old_parent; |
| + View* new_parent; |
| + }; |
| + std::vector<ViewParentChangedDetails> views_parent_changed_details_; |
| + View* view_visibility_changed_; |
| + View* view_enabled_changed_; |
| + View* view_bounds_changed_; |
| + View* view_reordered_; |
| +}; |
|
sky
2016/11/21 16:33:37
DISALLOW...
Sarmad Hashmi
2016/11/21 17:09:53
Done.
|
| + |
| +TEST_F(ViewObserverTest, ViewParentChanged) { |
| + std::unique_ptr<View> parent1 = NewView(); |
| + std::unique_ptr<View> parent2 = NewView(); |
| + std::unique_ptr<View> child_view = NewView(); |
| + |
| + parent1->AddChildView(child_view.get()); |
| + EXPECT_EQ(1, views_parent_changed_times()); |
| + EXPECT_TRUE(DidChangeParent(child_view.get(), nullptr, parent1.get())); |
| + reset(); |
| + |
| + // Removed from parent1, added to parent2 |
| + parent2->AddChildView(child_view.get()); |
| + EXPECT_EQ(2, views_parent_changed_times()); |
| + EXPECT_TRUE(DidChangeParent(child_view.get(), parent1.get(), nullptr)); |
| + EXPECT_TRUE(DidChangeParent(child_view.get(), nullptr, parent2.get())); |
| + |
| + reset(); |
| + |
| + parent2->RemoveChildView(child_view.get()); |
| + EXPECT_EQ(1, views_parent_changed_times()); |
| + EXPECT_TRUE(DidChangeParent(child_view.get(), parent2.get(), nullptr)); |
| +} |
| + |
| +TEST_F(ViewObserverTest, ViewVisibilityChanged) { |
| + std::unique_ptr<View> view = NewView(); |
| + view->SetVisible(false); |
| + EXPECT_EQ(view.get(), view_visibility_changed()); |
| + EXPECT_EQ(false, view->visible()); |
| +} |
| + |
| +TEST_F(ViewObserverTest, ViewEnabledChanged) { |
| + std::unique_ptr<View> view = NewView(); |
| + view->SetEnabled(false); |
| + EXPECT_EQ(view.get(), view_enabled_changed()); |
| + EXPECT_EQ(false, view->enabled()); |
| +} |
| + |
| +TEST_F(ViewObserverTest, ViewBoundsChanged) { |
| + std::unique_ptr<View> view = NewView(); |
| + gfx::Rect bounds(2, 2, 2, 2); |
| + view->SetBoundsRect(bounds); |
| + EXPECT_EQ(view.get(), view_bounds_changed()); |
| + EXPECT_EQ(bounds, view->bounds()); |
| + |
| + reset(); |
| + |
| + gfx::Rect new_bounds(1, 1, 1, 1); |
| + view->SetBoundsRect(new_bounds); |
| + EXPECT_EQ(view.get(), view_bounds_changed()); |
| + EXPECT_EQ(new_bounds, view->bounds()); |
| +} |
| + |
| +TEST_F(ViewObserverTest, ChildViewReordered) { |
| + std::unique_ptr<View> view = NewView(); |
| + std::unique_ptr<View> child_view = NewView(); |
| + std::unique_ptr<View> child_view2 = NewView(); |
| + view->AddChildView(child_view.get()); |
| + view->AddChildView(child_view2.get()); |
| + view->ReorderChildView(child_view2.get(), 0); |
| + EXPECT_EQ(child_view2.get(), view_reordered()); |
| +} |
| + |
| } // namespace views |