| 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());
 | 
| +}
 | 
| 
 |