// Copyright (c) 2012 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.

#ifndef ASH_TEST_SHELL_TEST_API_H_
#define ASH_TEST_SHELL_TEST_API_H_

#include "base/basictypes.h"

namespace ash {
class AppListController;
class AshNativeCursorManager;
class DragDropController;
class MaximizeModeWindowManager;
class RootWindowLayoutManager;
class SessionStateDelegate;
class ScreenPositionController;
class ShelfDelegate;
class ShelfModel;
class Shell;
class SystemGestureEventFilter;
class WorkspaceController;

namespace test {

// Accesses private data from a Shell for testing.
class ShellTestApi {
public:
  explicit ShellTestApi(Shell* shell);

  RootWindowLayoutManager* root_window_layout();
  SystemGestureEventFilter* system_gesture_event_filter();
  WorkspaceController* workspace_controller();
  ScreenPositionController* screen_position_controller();
  AshNativeCursorManager* ash_native_cursor_manager();
  ShelfModel* shelf_model();
  DragDropController* drag_drop_controller();
  AppListController* app_list_controller();
  MaximizeModeWindowManager* maximize_mode_window_manager();
  void DisableDisplayConfiguratorAnimation();

  // Set ShelfDelegate.
  void SetShelfDelegate(ShelfDelegate* delegate);

  // Set SessionStateDelegate.
  void SetSessionStateDelegate(SessionStateDelegate* session_state_delegate);

 private:
  Shell* shell_;  // not owned

  DISALLOW_COPY_AND_ASSIGN(ShellTestApi);
};

}  // namespace test
}  // namespace ash

#endif  // ASH_TEST_SHELL_TEST_API_H_
