blob: 41abb822e7aad796629d7d0c32c2517d386f8314 [file] [log] [blame]
// Copyright 2015 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 <string>
#include "base/command_line.h"
#include "base/macros.h"
#include "base/scoped_observer.h"
#include "testing/gtest/include/gtest/gtest.h"
#include "ui/base/material_design/material_design_controller.h"
#include "ui/base/material_design/material_design_controller_observer.h"
#include "ui/base/ui_base_switches.h"
namespace ui {
using MD = MaterialDesignController;
using MDObserver = MaterialDesignControllerObserver;
namespace {
class TestObserver : public MDObserver {
public:
TestObserver() = default;
~TestObserver() override = default;
int touch_ui_changes() const { return touch_ui_changes_; }
private:
// MDObserver:
void OnTouchUiChanged() override { ++touch_ui_changes_; }
int touch_ui_changes_ = 0;
DISALLOW_COPY_AND_ASSIGN(TestObserver);
};
// Test fixture for the MaterialDesignController class.
class MaterialDesignControllerTest : public testing::Test {
public:
MaterialDesignControllerTest() = default;
~MaterialDesignControllerTest() override = default;
protected:
// testing::Test:
void SetUp() override {
testing::Test::SetUp();
MD::Initialize();
}
void TearDown() override {
testing::Test::TearDown();
}
void SetCommandLineSwitch(const std::string& value_string) {
base::CommandLine::ForCurrentProcess()->AppendSwitchASCII(
switches::kTopChromeTouchUi, value_string);
}
private:
DISALLOW_COPY_AND_ASSIGN(MaterialDesignControllerTest);
};
class MaterialDesignControllerTestCommandLineTouchUiDisabled
: public MaterialDesignControllerTest {
public:
MaterialDesignControllerTestCommandLineTouchUiDisabled() {
SetCommandLineSwitch(switches::kTopChromeTouchUiDisabled);
}
private:
DISALLOW_COPY_AND_ASSIGN(
MaterialDesignControllerTestCommandLineTouchUiDisabled);
};
class MaterialDesignControllerTestCommandLineTouchUiEnabled
: public MaterialDesignControllerTest {
public:
MaterialDesignControllerTestCommandLineTouchUiEnabled() {
SetCommandLineSwitch(switches::kTopChromeTouchUiEnabled);
}
private:
DISALLOW_COPY_AND_ASSIGN(
MaterialDesignControllerTestCommandLineTouchUiEnabled);
};
class MaterialDesignControllerTestCommandLineTouchUiAuto
: public MaterialDesignControllerTest {
public:
MaterialDesignControllerTestCommandLineTouchUiAuto() {
SetCommandLineSwitch(switches::kTopChromeTouchUiAuto);
}
private:
DISALLOW_COPY_AND_ASSIGN(MaterialDesignControllerTestCommandLineTouchUiAuto);
};
} // namespace
// Verifies that non-touch is the default.
TEST_F(MaterialDesignControllerTest, NoCommandLineFlagIsNonTouch) {
ASSERT_FALSE(base::CommandLine::ForCurrentProcess()->HasSwitch(
switches::kTopChromeTouchUi));
EXPECT_FALSE(MD::touch_ui());
}
// Verifies that switches::kTopChromeTouchUiDisabled maps to non-touch (the
// default).
TEST_F(MaterialDesignControllerTestCommandLineTouchUiDisabled,
CheckApiReturns) {
EXPECT_FALSE(MD::touch_ui());
}
// Verifies that switches::kTopChromeTouchUiEnabled maps to touch.
TEST_F(MaterialDesignControllerTestCommandLineTouchUiEnabled, CheckApiReturns) {
EXPECT_TRUE(MD::touch_ui());
}
// Verifies that switches::kTopChromeTouchUiAuto maps to non-touch.
TEST_F(MaterialDesignControllerTestCommandLineTouchUiAuto, CheckApiReturns) {
EXPECT_FALSE(MD::touch_ui());
}
// Verifies that when the mode is set to non-touch and the tablet mode toggles,
// the touch UI state does not change.
TEST_F(MaterialDesignControllerTestCommandLineTouchUiDisabled,
TabletOnTouchUiChanged) {
TestObserver observer;
ScopedObserver<MD, MDObserver> scoped_observer(&observer);
scoped_observer.Add(MD::GetInstance());
MD::OnTabletModeToggled(true);
EXPECT_FALSE(MD::touch_ui());
EXPECT_EQ(0, observer.touch_ui_changes());
MD::OnTabletModeToggled(false);
EXPECT_FALSE(MD::touch_ui());
EXPECT_EQ(0, observer.touch_ui_changes());
}
// Verifies that when the mode is set to auto and the tablet mode toggles, the
// touch UI state changes and the observer gets called back.
TEST_F(MaterialDesignControllerTestCommandLineTouchUiAuto,
TabletOnTouchUiChanged) {
TestObserver observer;
ScopedObserver<MD, MDObserver> scoped_observer(&observer);
scoped_observer.Add(MD::GetInstance());
MD::OnTabletModeToggled(true);
EXPECT_TRUE(MD::touch_ui());
EXPECT_EQ(1, observer.touch_ui_changes());
MD::OnTabletModeToggled(false);
EXPECT_FALSE(MD::touch_ui());
EXPECT_EQ(2, observer.touch_ui_changes());
}
} // namespace ui