// Copyright 2014 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 "athena/env/public/athena_env.h"

#include "athena/test/base/athena_test_base.h"
#include "base/bind.h"
#include "ui/gfx/display.h"
#include "ui/gfx/screen.h"

namespace athena {

typedef test::AthenaTestBase AthenaEnvTest;

namespace {

class TerminatingCallback {
 public:
  TerminatingCallback()
      : on_terminating_count_(0),
        on_terminating_2_count_(0) {
  }

  void OnTerminating() {
    on_terminating_count_ ++;
  }

  void OnTerminating2() {
    on_terminating_2_count_ ++;
  }

  int on_terminating_count() const { return on_terminating_count_; }
  int on_terminating_2_count() const { return on_terminating_2_count_; }

  void Reset() {
    on_terminating_count_ = 0;
    on_terminating_2_count_ = 0;
  }

 private:
  int on_terminating_count_;
  int on_terminating_2_count_;

  DISALLOW_COPY_AND_ASSIGN(TerminatingCallback);
};

}  // namespace

TEST_F(AthenaEnvTest, TerminatingCallback) {
  TerminatingCallback callback_1;
  TerminatingCallback callback_2;
  AthenaEnv* env = AthenaEnv::Get();
  base::Closure cb_1_1 =
      base::Bind(&TerminatingCallback::OnTerminating,
                 base::Unretained(&callback_1));
  base::Closure cb_1_2 =
      base::Bind(&TerminatingCallback::OnTerminating2,
                 base::Unretained(&callback_1));
  base::Closure cb_2_1 =
      base::Bind(&TerminatingCallback::OnTerminating,
                 base::Unretained(&callback_2));

  env->AddTerminatingCallback(cb_1_1);
  env->AddTerminatingCallback(cb_1_2);
  env->AddTerminatingCallback(cb_2_1);
  env->OnTerminating();

  EXPECT_EQ(1, callback_1.on_terminating_count());
  EXPECT_EQ(1, callback_1.on_terminating_2_count());
  EXPECT_EQ(1, callback_2.on_terminating_count());

  // Remove callbacks.
  callback_1.Reset();
  callback_2.Reset();
  env->RemoveTerminatingCallback(cb_1_2);
  env->OnTerminating();
  EXPECT_EQ(1, callback_1.on_terminating_count());
  EXPECT_EQ(0, callback_1.on_terminating_2_count());
  EXPECT_EQ(1, callback_2.on_terminating_count());

  callback_1.Reset();
  callback_2.Reset();
  env->RemoveTerminatingCallback(cb_1_1);
  env->OnTerminating();
  EXPECT_EQ(0, callback_1.on_terminating_count());
  EXPECT_EQ(0, callback_1.on_terminating_2_count());
  EXPECT_EQ(1, callback_2.on_terminating_count());

  // Add removed callback.
  callback_1.Reset();
  callback_2.Reset();
  env->AddTerminatingCallback(cb_1_2);
  env->OnTerminating();
  EXPECT_EQ(0, callback_1.on_terminating_count());
  EXPECT_EQ(1, callback_1.on_terminating_2_count());
  EXPECT_EQ(1, callback_2.on_terminating_count());

  // Adding empty callback should not fail.
  env->AddTerminatingCallback(base::Closure());
  env->OnTerminating();
  env->RemoveTerminatingCallback(cb_1_2);
  env->RemoveTerminatingCallback(cb_2_1);
}

namespace {

class AthenaShutdownTest : public test::AthenaTestBase {
 public:
  AthenaShutdownTest() {}
  ~AthenaShutdownTest() override {}

  virtual void TearDown() {
    test::AthenaTestBase::TearDown();
    ASSERT_NE(
        gfx::Display::kInvalidDisplayID,
        gfx::Screen::GetNativeScreen()->GetPrimaryDisplay().id());
  }

 private:
  DISALLOW_COPY_AND_ASSIGN(AthenaShutdownTest);
};

}  // namespace

// gfx::Screen should be accessible after shutdown.
TEST_F(AthenaShutdownTest, Shutdown) {
}

}  // namespace athena
