summaryrefslogtreecommitdiff
path: root/chromium/ash/wm/header_painter_unittest.cc
diff options
context:
space:
mode:
Diffstat (limited to 'chromium/ash/wm/header_painter_unittest.cc')
-rw-r--r--chromium/ash/wm/header_painter_unittest.cc155
1 files changed, 155 insertions, 0 deletions
diff --git a/chromium/ash/wm/header_painter_unittest.cc b/chromium/ash/wm/header_painter_unittest.cc
new file mode 100644
index 00000000000..8ce8917a581
--- /dev/null
+++ b/chromium/ash/wm/header_painter_unittest.cc
@@ -0,0 +1,155 @@
+// Copyright 2013 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 "ash/wm/header_painter.h"
+
+#include "ash/shell.h"
+#include "ash/test/ash_test_base.h"
+#include "ash/wm/caption_buttons/frame_caption_button_container_view.h"
+#include "ash/wm/window_state.h"
+#include "base/memory/scoped_ptr.h"
+#include "grit/ash_resources.h"
+#include "ui/gfx/font.h"
+#include "ui/views/widget/widget.h"
+#include "ui/views/window/non_client_view.h"
+
+using ash::HeaderPainter;
+using views::NonClientFrameView;
+using views::Widget;
+
+namespace {
+
+// Modifies the values of kInactiveWindowOpacity, kActiveWindowOpacity, and
+// kSoloWindowOpacity for the lifetime of the class. This is useful so that
+// the constants each have different values.
+class ScopedOpacityConstantModifier {
+ public:
+ ScopedOpacityConstantModifier()
+ : initial_active_window_opacity_(
+ ash::HeaderPainter::kActiveWindowOpacity),
+ initial_inactive_window_opacity_(
+ ash::HeaderPainter::kInactiveWindowOpacity),
+ initial_solo_window_opacity_(ash::HeaderPainter::kSoloWindowOpacity) {
+ ash::HeaderPainter::kActiveWindowOpacity = 100;
+ ash::HeaderPainter::kInactiveWindowOpacity = 120;
+ ash::HeaderPainter::kSoloWindowOpacity = 140;
+ }
+ ~ScopedOpacityConstantModifier() {
+ ash::HeaderPainter::kActiveWindowOpacity = initial_active_window_opacity_;
+ ash::HeaderPainter::kInactiveWindowOpacity =
+ initial_inactive_window_opacity_;
+ ash::HeaderPainter::kSoloWindowOpacity = initial_solo_window_opacity_;
+ }
+
+ private:
+ int initial_active_window_opacity_;
+ int initial_inactive_window_opacity_;
+ int initial_solo_window_opacity_;
+
+ DISALLOW_COPY_AND_ASSIGN(ScopedOpacityConstantModifier);
+};
+
+// Creates a new HeaderPainter with empty buttons. Caller owns the memory.
+HeaderPainter* CreateTestPainter(Widget* widget) {
+ HeaderPainter* painter = new HeaderPainter();
+ NonClientFrameView* frame_view = widget->non_client_view()->frame_view();
+ ash::FrameCaptionButtonContainerView* container =
+ new ash::FrameCaptionButtonContainerView(
+ widget,
+ ash::FrameCaptionButtonContainerView::MINIMIZE_ALLOWED);
+ // Add the container to the widget's non-client frame view so that it will be
+ // deleted when the widget is destroyed.
+ frame_view->AddChildView(container);
+ painter->Init(widget, frame_view, NULL, container);
+ return painter;
+}
+
+} // namespace
+
+namespace ash {
+
+class HeaderPainterTest : public ash::test::AshTestBase {
+ public:
+ // Creates a test widget that owns its native widget.
+ Widget* CreateTestWidget() {
+ Widget* widget = new Widget;
+ Widget::InitParams params;
+ params.ownership = Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET;
+ params.context = CurrentContext();
+ widget->Init(params);
+ return widget;
+ }
+};
+
+TEST_F(HeaderPainterTest, GetHeaderOpacity) {
+ // Create a widget and a painter for it.
+ scoped_ptr<Widget> w1(CreateTestWidget());
+ scoped_ptr<HeaderPainter> p1(CreateTestPainter(w1.get()));
+ w1->Show();
+
+ // Modify the values of the opacity constants so that they each have a
+ // different value.
+ ScopedOpacityConstantModifier opacity_constant_modifier;
+
+ // Solo active window has solo window opacity.
+ EXPECT_EQ(HeaderPainter::kSoloWindowOpacity,
+ p1->GetHeaderOpacity(HeaderPainter::ACTIVE,
+ IDR_AURA_WINDOW_HEADER_BASE_ACTIVE,
+ 0));
+
+ // Create a second widget and painter.
+ scoped_ptr<Widget> w2(CreateTestWidget());
+ scoped_ptr<HeaderPainter> p2(CreateTestPainter(w2.get()));
+ w2->Show();
+
+ // Active window has active window opacity.
+ EXPECT_EQ(HeaderPainter::kActiveWindowOpacity,
+ p2->GetHeaderOpacity(HeaderPainter::ACTIVE,
+ IDR_AURA_WINDOW_HEADER_BASE_ACTIVE,
+ 0));
+
+ // Inactive window has inactive window opacity.
+ EXPECT_EQ(HeaderPainter::kInactiveWindowOpacity,
+ p2->GetHeaderOpacity(HeaderPainter::INACTIVE,
+ IDR_AURA_WINDOW_HEADER_BASE_INACTIVE,
+ 0));
+
+ // Regular maximized windows are fully opaque.
+ wm::GetWindowState(w1->GetNativeWindow())->Maximize();
+ EXPECT_EQ(255,
+ p1->GetHeaderOpacity(HeaderPainter::ACTIVE,
+ IDR_AURA_WINDOW_HEADER_BASE_ACTIVE,
+ 0));
+}
+
+// Ensure the title text is vertically aligned with the window icon.
+TEST_F(HeaderPainterTest, TitleIconAlignment) {
+ scoped_ptr<Widget> w(CreateTestWidget());
+ HeaderPainter p;
+ ash::FrameCaptionButtonContainerView container(w.get(),
+ ash::FrameCaptionButtonContainerView::MINIMIZE_ALLOWED);
+ views::View window_icon;
+ window_icon.SetBounds(0, 0, 16, 16);
+ p.Init(w.get(),
+ w->non_client_view()->frame_view(),
+ &window_icon,
+ &container);
+ w->SetBounds(gfx::Rect(0, 0, 500, 500));
+ w->Show();
+
+ // Title and icon are aligned when shorter_header is false.
+ p.LayoutHeader(false);
+ gfx::Font default_font;
+ gfx::Rect large_header_title_bounds = p.GetTitleBounds(default_font);
+ EXPECT_EQ(window_icon.bounds().CenterPoint().y(),
+ large_header_title_bounds.CenterPoint().y());
+
+ // Title and icon are aligned when shorter_header is true.
+ p.LayoutHeader(true);
+ gfx::Rect short_header_title_bounds = p.GetTitleBounds(default_font);
+ EXPECT_EQ(window_icon.bounds().CenterPoint().y(),
+ short_header_title_bounds.CenterPoint().y());
+}
+
+} // namespace ash