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..27802439915b450d6c146a325cb86beb19d2dd26 |
--- /dev/null |
+++ b/chrome/browser/ui/views/payments/view_stack_unittest.cc |
@@ -0,0 +1,123 @@ |
+// 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 "chrome/browser/ui/views/payments/view_stack_state.h" |
+#include "ui/gfx/animation/test_animation_delegate.h" |
+#include "ui/views/test/views_test_base.h" |
+ |
+class TestStackState : public ViewStackState { |
+ public: |
+ class Observer { |
+ public: |
+ Observer() : state_deleted_(false) {} |
+ |
+ void OnStateBeingDeleted() { |
+ state_deleted_ = true; |
+ } |
+ |
+ bool state_deleted() { return state_deleted_; } |
+ |
+ private: |
+ bool state_deleted_; |
+ }; |
+ |
+ TestStackState() {} |
+ ~TestStackState() override { |
+ for (auto& observer: observers_) { |
+ observer.OnStateBeingDeleted(); |
+ } |
+ } |
+ |
+ void AddObserver(Observer* observer) { |
+ observers_.AddObserver(observer); |
+ } |
+ |
+ private: |
+ views::View* CreateView() override { |
+ return new views::View; |
+ } |
+ |
+ base::ObserverList<Observer> observers_; |
+ |
+ DISALLOW_COPY_AND_ASSIGN(TestStackState); |
+}; |
+ |
+class ViewStackTest : public views::ViewsTestBase { |
+ public: |
+ ViewStackTest() { |
+ view_stack_.reset(new ViewStack(base::MakeUnique<TestStackState>())); |
+ } |
+ |
+ 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_->PushState(base::MakeUnique<TestStackState>()); |
+ EXPECT_EQ(2, view_stack_->child_count()); |
+} |
+ |
+TEST_F(ViewStackTest, TestPopStateRemovesChildViewAndCleansUpState) { |
+ view_stack_->SetBounds(0, 0, 10, 10); |
+ |
+ TestStackState::Observer observer; |
+ std::unique_ptr<TestStackState> state = base::MakeUnique<TestStackState>(); |
+ state->AddObserver(&observer); |
+ views::View* state_view = state->GetView(); |
+ |
+ view_stack_->PushState(std::move(state)); |
+ EXPECT_TRUE(view_stack_->slide_in_animator_->IsAnimating()); |
+ view_stack_->slide_in_animator_->SetAnimationDelegate( |
+ state_view, |
+ std::unique_ptr<gfx::AnimationDelegate>( |
+ new gfx::TestAnimationDelegate())); |
+ |
+ base::RunLoop().Run(); |
+ EXPECT_FALSE(view_stack_->slide_in_animator_->IsAnimating()); |
+ view_stack_->PopState(); |
+ |
+ EXPECT_TRUE(view_stack_->slide_out_animator_->IsAnimating()); |
+ view_stack_->slide_out_animator_->SetAnimationDelegate( |
+ state_view, |
+ std::unique_ptr<gfx::AnimationDelegate>( |
+ new gfx::TestAnimationDelegate())); |
+ |
+ base::RunLoop().Run(); |
+ EXPECT_FALSE(view_stack_->slide_out_animator_->IsAnimating()); |
+ |
+ ASSERT_TRUE(observer.state_deleted()); |
+} |
+ |
+TEST_F(ViewStackTest, TestDeletingViewCleansUpState) { |
+ view_stack_->SetBounds(0, 0, 10, 10); |
+ |
+ TestStackState::Observer observer; |
+ std::unique_ptr<TestStackState> state = base::MakeUnique<TestStackState>(); |
+ state->AddObserver(&observer); |
+ views::View* state_view = state->GetView(); |
+ |
+ view_stack_->PushState(std::move(state)); |
+ EXPECT_TRUE(view_stack_->slide_in_animator_->IsAnimating()); |
+ view_stack_->slide_in_animator_->SetAnimationDelegate( |
+ state_view, |
+ std::unique_ptr<gfx::AnimationDelegate>( |
+ new gfx::TestAnimationDelegate())); |
+ |
+ base::RunLoop().Run(); |
+ EXPECT_FALSE(view_stack_->slide_in_animator_->IsAnimating()); |
+ view_stack_->PopState(); |
+ |
+ EXPECT_TRUE(view_stack_->slide_out_animator_->IsAnimating()); |
+ view_stack_.reset(); |
+ |
+ ASSERT_TRUE(observer.state_deleted()); |
+} |