#include <memory>
#include "ash/system/palette/palette_tool.h"
#include "ash/system/palette/palette_tool_manager.h"
#include "base/functional/bind.h"
#include "base/memory/ptr_util.h"
#include "base/notreached.h"
#include "testing/gtest/include/gtest/gtest.h"
namespace ash {
namespace {
class TestTool : public PaletteTool {
public:
TestTool(Delegate* delegate, PaletteGroup group, PaletteToolId tool_id)
: PaletteTool(delegate), group_(group), tool_id_(tool_id) {}
TestTool(const TestTool&) = delete;
TestTool& operator=(const TestTool&) = delete;
PaletteGroup GetGroup() const override { return group_; }
PaletteToolId GetToolId() const override { return tool_id_; }
bool enabled() const { return PaletteTool::enabled(); }
private:
views::View* CreateView() override { NOTREACHED(); }
void OnViewDestroyed() override { FAIL(); }
PaletteGroup group_;
PaletteToolId tool_id_;
};
class PaletteToolManagerTest : public ::testing::Test,
public PaletteToolManager::Delegate,
public PaletteTool::Delegate {
public:
PaletteToolManagerTest()
: palette_tool_manager_(new PaletteToolManager(this)) {}
PaletteToolManagerTest(const PaletteToolManagerTest&) = delete;
PaletteToolManagerTest& operator=(const PaletteToolManagerTest&) = delete;
~PaletteToolManagerTest() override = default;
protected:
void HidePalette() override {}
void HidePaletteImmediately() override {}
void OnActiveToolChanged() override { ++tool_changed_count_; }
aura::Window* GetWindow() override { NOTREACHED(); }
void EnableTool(PaletteToolId tool_id) override {}
void DisableTool(PaletteToolId tool_id) override {}
TestTool* BuildTool(PaletteGroup group, PaletteToolId tool_id) {
auto* tool = new TestTool(this, group, tool_id);
palette_tool_manager_->AddTool(base::WrapUnique(tool));
return tool;
}
int tool_changed_count_ = 0;
std::unique_ptr<PaletteToolManager> palette_tool_manager_;
};
}
TEST_F(PaletteToolManagerTest, MultipleToolsActivateDeactivate) {
TestTool* action_1 =
BuildTool(PaletteGroup::ACTION, PaletteToolId::CREATE_NOTE);
TestTool* action_2 =
BuildTool(PaletteGroup::ACTION, PaletteToolId::ENTER_CAPTURE_MODE);
TestTool* mode_1 = BuildTool(PaletteGroup::MODE, PaletteToolId::MAGNIFY);
EXPECT_FALSE(palette_tool_manager_->HasTool(PaletteToolId::LASER_POINTER));
TestTool* mode_2 =
BuildTool(PaletteGroup::MODE, PaletteToolId::LASER_POINTER);
EXPECT_TRUE(palette_tool_manager_->HasTool(PaletteToolId::LASER_POINTER));
EXPECT_EQ(0, tool_changed_count_);
palette_tool_manager_->ActivateTool(mode_1->GetToolId());
EXPECT_FALSE(action_1->enabled());
EXPECT_FALSE(action_2->enabled());
EXPECT_TRUE(mode_1->enabled());
EXPECT_FALSE(mode_2->enabled());
palette_tool_manager_->ActivateTool(action_1->GetToolId());
EXPECT_TRUE(action_1->enabled());
EXPECT_FALSE(action_2->enabled());
EXPECT_TRUE(mode_1->enabled());
EXPECT_FALSE(mode_2->enabled());
palette_tool_manager_->DeactivateTool(action_1->GetToolId());
EXPECT_FALSE(action_1->enabled());
EXPECT_FALSE(action_2->enabled());
EXPECT_TRUE(mode_1->enabled());
EXPECT_FALSE(mode_2->enabled());
palette_tool_manager_->ActivateTool(action_1->GetToolId());
EXPECT_TRUE(action_1->enabled());
EXPECT_FALSE(action_2->enabled());
palette_tool_manager_->ActivateTool(action_2->GetToolId());
EXPECT_FALSE(action_1->enabled());
EXPECT_TRUE(action_2->enabled());
palette_tool_manager_->DeactivateTool(action_2->GetToolId());
palette_tool_manager_->ActivateTool(action_1->GetToolId());
EXPECT_TRUE(action_1->enabled());
EXPECT_FALSE(action_2->enabled());
palette_tool_manager_->ActivateTool(action_1->GetToolId());
EXPECT_TRUE(action_1->enabled());
EXPECT_FALSE(action_2->enabled());
palette_tool_manager_->DeactivateTool(action_1->GetToolId());
}
}