// 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/test/athena_test_base.h"

#include "athena/test/athena_test_helper.h"
#include "ui/aura/test/event_generator_delegate_aura.h"
#include "ui/compositor/test/context_factories_for_test.h"

#if defined(USE_X11)
#include "ui/aura/window_tree_host_x11.h"
#endif

namespace athena {
namespace test {

AthenaTestBase::AthenaTestBase()
    : setup_called_(false), teardown_called_(false) {
}

AthenaTestBase::~AthenaTestBase() {
  CHECK(setup_called_)
      << "You have overridden SetUp but never called super class's SetUp";
  CHECK(teardown_called_)
      << "You have overridden TearDown but never called super class's TearDown";
}

void AthenaTestBase::SetUp() {
  setup_called_ = true;
  testing::Test::SetUp();

  // The ContextFactory must exist before any Compositors are created.
  bool enable_pixel_output = false;
  ui::ContextFactory* context_factory =
      ui::InitializeContextFactoryForTests(enable_pixel_output);

  helper_.reset(new AthenaTestHelper(&message_loop_));
#if defined(USE_X11)
  aura::test::SetUseOverrideRedirectWindowByDefault(true);
#endif
  aura::test::InitializeAuraEventGeneratorDelegate();
  helper_->SetUp(context_factory);
}

void AthenaTestBase::TearDown() {
  teardown_called_ = true;

  // Flush the message loop because we have pending release tasks
  // and these tasks if un-executed would upset Valgrind.
  RunAllPendingInMessageLoop();

  helper_->TearDown();
  ui::TerminateContextFactoryForTests();
  testing::Test::TearDown();
}

void AthenaTestBase::RunAllPendingInMessageLoop() {
  helper_->RunAllPendingInMessageLoop();
}

}  // namespace test
}  // namespace athena
