14e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)// Copyright 2013 The Chromium Authors. All rights reserved.
24e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
34e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)// found in the LICENSE file.
44e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
54e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "ash/shell.h"
64e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "ash/test/ash_test_base.h"
7a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "ash/test/test_shelf_delegate.h"
84e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "ash/wm/mru_window_tracker.h"
94e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "ash/wm/window_state.h"
104e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "ash/wm/window_util.h"
114e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "base/compiler_specific.h"
124e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "ui/aura/test/test_window_delegate.h"
134e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "ui/aura/window.h"
14cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "ui/views/widget/widget.h"
154e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
164e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)namespace ash {
174e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
184e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)class MruWindowTrackerTest : public test::AshTestBase {
194e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) public:
204e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  MruWindowTrackerTest() {}
214e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  virtual ~MruWindowTrackerTest() {}
224e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
234e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  aura::Window* CreateWindow() {
244e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    return CreateTestWindowInShellWithBounds(gfx::Rect(0, 0, 400, 400));
254e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  }
264e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
274e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  ash::MruWindowTracker* mru_window_tracker() {
284e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    return Shell::GetInstance()->mru_window_tracker();
294e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  }
304e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
314e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) private:
324e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(MruWindowTrackerTest);
334e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)};
344e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
354e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)// Basic test that the activation order is tracked.
364e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)TEST_F(MruWindowTrackerTest, Basic) {
374e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  scoped_ptr<aura::Window> w1(CreateWindow());
384e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  scoped_ptr<aura::Window> w2(CreateWindow());
394e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  scoped_ptr<aura::Window> w3(CreateWindow());
404e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  wm::ActivateWindow(w3.get());
414e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  wm::ActivateWindow(w2.get());
424e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  wm::ActivateWindow(w1.get());
434e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
444e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  MruWindowTracker::WindowList window_list =
454e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      mru_window_tracker()->BuildMruWindowList();
464e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_EQ(w1.get(), window_list[0]);
474e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_EQ(w2.get(), window_list[1]);
484e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_EQ(w3.get(), window_list[2]);
494e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)}
504e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
514e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)// Test that minimized windows are considered least recently used (but kept in
524e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)// correct relative order).
534e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)TEST_F(MruWindowTrackerTest, MinimizedWindowsAreLru) {
544e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  scoped_ptr<aura::Window> w1(CreateWindow());
554e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  scoped_ptr<aura::Window> w2(CreateWindow());
564e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  scoped_ptr<aura::Window> w3(CreateWindow());
574e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  scoped_ptr<aura::Window> w4(CreateWindow());
584e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  scoped_ptr<aura::Window> w5(CreateWindow());
594e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  scoped_ptr<aura::Window> w6(CreateWindow());
604e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  wm::ActivateWindow(w6.get());
614e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  wm::ActivateWindow(w5.get());
624e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  wm::ActivateWindow(w4.get());
634e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  wm::ActivateWindow(w3.get());
644e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  wm::ActivateWindow(w2.get());
654e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  wm::ActivateWindow(w1.get());
664e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
674e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  wm::GetWindowState(w1.get())->Minimize();
684e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  wm::GetWindowState(w4.get())->Minimize();
694e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  wm::GetWindowState(w5.get())->Minimize();
704e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
714e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  // Expect the relative order of minimized windows to remain the same, but all
724e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  // minimized windows to be at the end of the list.
734e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  MruWindowTracker::WindowList window_list =
744e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      mru_window_tracker()->BuildMruWindowList();
754e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_EQ(w2.get(), window_list[0]);
764e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_EQ(w3.get(), window_list[1]);
774e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_EQ(w6.get(), window_list[2]);
784e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_EQ(w1.get(), window_list[3]);
794e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_EQ(w4.get(), window_list[4]);
804e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_EQ(w5.get(), window_list[5]);
814e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)}
824e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
834e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)}  // namespace ash
84