Index: chrome/browser/ui/views/payments/view_stack_unittest.cc |
diff --git a/chrome/browser/ui/views/payments/view_stack_unittest.cc b/chrome/browser/ui/views/payments/view_stack_unittest.cc |
new file mode 100644 |
index 0000000000000000000000000000000000000000..eb77a71aece2a5baac46ed2254f4ae8756a9b395 |
--- /dev/null |
+++ b/chrome/browser/ui/views/payments/view_stack_unittest.cc |
@@ -0,0 +1,119 @@ |
+// 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. |
+ |
+#include "base/observer_list.h" |
+#include "base/run_loop.h" |
+#include "chrome/browser/ui/views/payments/view_stack.h" |
+#include "ui/gfx/animation/test_animation_delegate.h" |
+#include "ui/views/test/views_test_base.h" |
+ |
+class TestStackView : public views::View { |
+ public: |
+ class Observer { |
+ public: |
+ Observer() : view_deleted_(false) {} |
+ |
+ void OnViewBeingDeleted() { |
+ view_deleted_ = true; |
+ } |
+ |
+ bool view_deleted() { return view_deleted_; } |
+ |
+ private: |
+ bool view_deleted_; |
+ }; |
+ |
+ TestStackView() {} |
+ ~TestStackView() override { |
+ for (auto& observer: observers_) { |
+ observer.OnViewBeingDeleted(); |
+ } |
+ } |
+ |
+ void AddObserver(Observer* observer) { |
+ observers_.AddObserver(observer); |
+ } |
+ |
+ private: |
+ base::ObserverList<Observer> observers_; |
+ |
+ DISALLOW_COPY_AND_ASSIGN(TestStackView); |
+}; |
+ |
+class ViewStackTest : public views::ViewsTestBase { |
+ public: |
+ ViewStackTest() { |
+ view_stack_.reset(new ViewStack()); |
sky
2016/12/12 20:30:56
Use MakeUnique, or just make ViewStack a value mam
anthonyvd
2016/12/12 22:20:48
Used MakeUnique here to be able to delete the view
|
+ view_stack_->Push(base::MakeUnique<TestStackView>(), false); |
+ } |
+ |
+ std::unique_ptr<ViewStack> view_stack_; |
+ |
+ DISALLOW_COPY_AND_ASSIGN(ViewStackTest); |
+}; |
+ |
+TEST_F(ViewStackTest, TestInitialStateAddedAsChildView) { |
+ EXPECT_EQ(1, view_stack_->child_count()); |
+} |
+ |
+TEST_F(ViewStackTest, TestPushStateAddsViewToChildren) { |
+ view_stack_->Push(base::MakeUnique<TestStackView>(), true); |
+ EXPECT_EQ(2, view_stack_->child_count()); |
+} |
sky
2016/12/12 20:30:56
Please add assertions around bounds and visibility
anthonyvd
2016/12/12 22:20:48
Added some around bounds, let me know if you had a
|
+ |
+TEST_F(ViewStackTest, TestPopStateRemovesChildViewAndCleansUpState) { |
+ view_stack_->SetBounds(0, 0, 10, 10); |
+ |
+ TestStackView::Observer observer; |
+ std::unique_ptr<TestStackView> view = base::MakeUnique<TestStackView>(); |
+ view->AddObserver(&observer); |
+ views::View* view_ptr = view.get(); |
+ |
+ view_stack_->Push(std::move(view), true); |
+ EXPECT_TRUE(view_stack_->slide_in_animator_->IsAnimating()); |
+ view_stack_->slide_in_animator_->SetAnimationDelegate( |
+ view_ptr, |
+ std::unique_ptr<gfx::AnimationDelegate>( |
+ new gfx::TestAnimationDelegate())); |
+ |
+ base::RunLoop().Run(); |
sky
2016/12/12 20:30:56
Do these tests set the animation time to 0? If the
anthonyvd
2016/12/12 22:20:48
It looks like this makes the base::RunLoop().Run()
sky
2016/12/12 23:57:00
That would seem to indicate your delegate isn't be
|
+ EXPECT_FALSE(view_stack_->slide_in_animator_->IsAnimating()); |
+ view_stack_->Pop(); |
+ |
+ EXPECT_TRUE(view_stack_->slide_out_animator_->IsAnimating()); |
+ view_stack_->slide_out_animator_->SetAnimationDelegate( |
+ view_ptr, |
+ std::unique_ptr<gfx::AnimationDelegate>( |
+ new gfx::TestAnimationDelegate())); |
+ |
+ base::RunLoop().Run(); |
+ EXPECT_FALSE(view_stack_->slide_out_animator_->IsAnimating()); |
+ |
+ ASSERT_TRUE(observer.view_deleted()); |
+} |
+ |
+TEST_F(ViewStackTest, TestDeletingViewCleansUpState) { |
+ view_stack_->SetBounds(0, 0, 10, 10); |
+ |
+ TestStackView::Observer observer; |
+ std::unique_ptr<TestStackView> view = base::MakeUnique<TestStackView>(); |
+ view->AddObserver(&observer); |
+ views::View* view_ptr = view.get(); |
+ |
+ view_stack_->Push(std::move(view), true); |
+ EXPECT_TRUE(view_stack_->slide_in_animator_->IsAnimating()); |
+ view_stack_->slide_in_animator_->SetAnimationDelegate( |
+ view_ptr, |
+ std::unique_ptr<gfx::AnimationDelegate>( |
+ new gfx::TestAnimationDelegate())); |
+ |
+ base::RunLoop().Run(); |
+ EXPECT_FALSE(view_stack_->slide_in_animator_->IsAnimating()); |
+ view_stack_->Pop(); |
+ |
+ EXPECT_TRUE(view_stack_->slide_out_animator_->IsAnimating()); |
+ view_stack_.reset(); |
+ |
+ ASSERT_TRUE(observer.view_deleted()); |
+} |