This source file includes following definitions.
- TEST
- TEST
#include "chrome/common/extensions/command.h"
#include "base/memory/scoped_ptr.h"
#include "base/strings/string_number_conversions.h"
#include "base/strings/string_util.h"
#include "base/strings/utf_string_conversions.h"
#include "base/values.h"
#include "testing/gtest/include/gtest/gtest.h"
class CommandTest : public testing::Test {
};
TEST(CommandTest, ExtensionCommandParsing) {
const ui::Accelerator none = ui::Accelerator();
const ui::Accelerator shift_f = ui::Accelerator(ui::VKEY_F,
ui::EF_SHIFT_DOWN);
#if defined(OS_MACOSX)
int ctrl = ui::EF_COMMAND_DOWN;
#else
int ctrl = ui::EF_CONTROL_DOWN;
#endif
const ui::Accelerator ctrl_f = ui::Accelerator(ui::VKEY_F, ctrl);
const ui::Accelerator alt_f = ui::Accelerator(ui::VKEY_F, ui::EF_ALT_DOWN);
const ui::Accelerator ctrl_shift_f =
ui::Accelerator(ui::VKEY_F, ctrl | ui::EF_SHIFT_DOWN);
const ui::Accelerator alt_shift_f =
ui::Accelerator(ui::VKEY_F, ui::EF_ALT_DOWN | ui::EF_SHIFT_DOWN);
const ui::Accelerator ctrl_1 = ui::Accelerator(ui::VKEY_1, ctrl);
const ui::Accelerator ctrl_comma = ui::Accelerator(ui::VKEY_OEM_COMMA, ctrl);
const ui::Accelerator ctrl_dot = ui::Accelerator(ui::VKEY_OEM_PERIOD, ctrl);
const ui::Accelerator ctrl_left = ui::Accelerator(ui::VKEY_LEFT, ctrl);
const ui::Accelerator ctrl_right = ui::Accelerator(ui::VKEY_RIGHT, ctrl);
const ui::Accelerator ctrl_up = ui::Accelerator(ui::VKEY_UP, ctrl);
const ui::Accelerator ctrl_down = ui::Accelerator(ui::VKEY_DOWN, ctrl);
const ui::Accelerator ctrl_ins = ui::Accelerator(ui::VKEY_INSERT, ctrl);
const ui::Accelerator ctrl_del = ui::Accelerator(ui::VKEY_DELETE, ctrl);
const ui::Accelerator ctrl_home = ui::Accelerator(ui::VKEY_HOME, ctrl);
const ui::Accelerator ctrl_end = ui::Accelerator(ui::VKEY_END, ctrl);
const ui::Accelerator ctrl_pgup = ui::Accelerator(ui::VKEY_PRIOR, ctrl);
const ui::Accelerator ctrl_pgdwn = ui::Accelerator(ui::VKEY_NEXT, ctrl);
const ui::Accelerator next_track =
ui::Accelerator(ui::VKEY_MEDIA_NEXT_TRACK, ui::EF_NONE);
const ui::Accelerator prev_track =
ui::Accelerator(ui::VKEY_MEDIA_PREV_TRACK, ui::EF_NONE);
const ui::Accelerator play_pause =
ui::Accelerator(ui::VKEY_MEDIA_PLAY_PAUSE, ui::EF_NONE);
const ui::Accelerator stop =
ui::Accelerator(ui::VKEY_MEDIA_STOP, ui::EF_NONE);
const struct {
bool expected_result;
ui::Accelerator accelerator;
const char* command_name;
const char* key;
const char* description;
} kTests[] = {
{ false, none, "command", "", "" },
{ false, none, "command", "Ctrl+f", "" },
{ false, none, "command", "Ctrl+Alt+F", "description" },
{ false, none, "command", "A", "description" },
{ false, none, "command", "F10", "description" },
{ false, none, "command", "Ctrl+F+G", "description" },
{ false, none, "command", "Ctrl+Alt+Shift+G", "description" },
{ false, shift_f, "command", "Shift+F", "description" },
{ false, shift_f, "command", "F+Shift", "description" },
{ true, none, "command", "", "description" },
{ true, ctrl_f, "command", "Ctrl+F", "description" },
{ true, alt_f, "command", "Alt+F", "description" },
{ true, ctrl_shift_f, "command", "Ctrl+Shift+F", "description" },
{ true, alt_shift_f, "command", "Alt+Shift+F", "description" },
{ true, ctrl_1, "command", "Ctrl+1", "description" },
{ true, ctrl_f, "command", "F+Ctrl", "description" },
{ true, alt_f, "command", "F+Alt", "description" },
{ true, ctrl_shift_f, "command", "F+Ctrl+Shift", "description" },
{ true, ctrl_shift_f, "command", "F+Shift+Ctrl", "description" },
{ true, alt_shift_f, "command", "F+Alt+Shift", "description" },
{ true, alt_shift_f, "command", "F+Shift+Alt", "description" },
{ false, ctrl_f, "command", "Ctrl+f", "description" },
{ false, ctrl_f, "command", "cTrL+F", "description" },
{ true, ctrl_f, "_execute_browser_action", "Ctrl+F", "" },
{ true, ctrl_f, "_execute_page_action", "Ctrl+F", "" },
{ true, ctrl_comma, "_execute_browser_action", "Ctrl+Comma", "" },
{ true, ctrl_dot, "_execute_browser_action", "Ctrl+Period", "" },
{ true, ctrl_left, "_execute_browser_action", "Ctrl+Left", "" },
{ true, ctrl_right, "_execute_browser_action", "Ctrl+Right", "" },
{ true, ctrl_up, "_execute_browser_action", "Ctrl+Up", "" },
{ true, ctrl_down, "_execute_browser_action", "Ctrl+Down", "" },
{ true, ctrl_ins, "_execute_browser_action", "Ctrl+Insert", "" },
{ true, ctrl_del, "_execute_browser_action", "Ctrl+Delete", "" },
{ true, ctrl_home, "_execute_browser_action", "Ctrl+Home", "" },
{ true, ctrl_end, "_execute_browser_action", "Ctrl+End", "" },
{ true, ctrl_pgup, "_execute_browser_action", "Ctrl+PageUp", "" },
{ true, ctrl_pgdwn, "_execute_browser_action", "Ctrl+PageDown", "" },
{ true, next_track, "command", "MediaNextTrack", "description" },
{ true, play_pause, "command", "MediaPlayPause", "description" },
{ true, prev_track, "command", "MediaPrevTrack", "description" },
{ true, stop, "command", "MediaStop", "description" },
{ false, none, "_execute_browser_action", "MediaNextTrack", "" },
{ false, none, "_execute_page_action", "MediaPrevTrack", "" },
{ false, none, "command", "Ctrl+Shift+MediaPrevTrack", "description" },
};
for (size_t i = 0; i < ARRAYSIZE_UNSAFE(kTests); ++i) {
scoped_ptr<base::DictionaryValue> input(new base::DictionaryValue);
input->SetString("suggested_key", kTests[i].key);
input->SetString("description", kTests[i].description);
SCOPED_TRACE(std::string("Command name: |") + kTests[i].command_name +
"| key: |" + kTests[i].key +
"| description: |" + kTests[i].description +
"| index: " + base::IntToString(i));
extensions::Command command;
base::string16 error;
bool result =
command.Parse(input.get(), kTests[i].command_name, i, &error);
EXPECT_EQ(kTests[i].expected_result, result);
if (result) {
EXPECT_STREQ(kTests[i].description,
base::UTF16ToASCII(command.description()).c_str());
EXPECT_STREQ(kTests[i].command_name, command.command_name().c_str());
EXPECT_EQ(kTests[i].accelerator, command.accelerator());
}
if (kTests[i].key[0] != '\0') {
input.reset(new base::DictionaryValue);
base::DictionaryValue* key_dict = new base::DictionaryValue();
key_dict->SetString("default", kTests[i].key);
key_dict->SetString("windows", kTests[i].key);
key_dict->SetString("mac", kTests[i].key);
input->Set("suggested_key", key_dict);
input->SetString("description", kTests[i].description);
result = command.Parse(input.get(), kTests[i].command_name, i, &error);
EXPECT_EQ(kTests[i].expected_result, result);
if (result) {
EXPECT_STREQ(kTests[i].description,
base::UTF16ToASCII(command.description()).c_str());
EXPECT_STREQ(kTests[i].command_name, command.command_name().c_str());
EXPECT_EQ(kTests[i].accelerator, command.accelerator());
}
}
}
}
TEST(CommandTest, ExtensionCommandParsingFallback) {
std::string description = "desc";
std::string command_name = "foo";
scoped_ptr<base::DictionaryValue> input(new base::DictionaryValue);
base::DictionaryValue* key_dict = new base::DictionaryValue();
key_dict->SetString("default", "Ctrl+Shift+D");
key_dict->SetString("windows", "Ctrl+Shift+W");
key_dict->SetString("mac", "Ctrl+Shift+M");
key_dict->SetString("linux", "Ctrl+Shift+L");
key_dict->SetString("chromeos", "Ctrl+Shift+C");
input->Set("suggested_key", key_dict);
input->SetString("description", description);
extensions::Command command;
base::string16 error;
EXPECT_TRUE(command.Parse(input.get(), command_name, 0, &error));
EXPECT_STREQ(description.c_str(),
base::UTF16ToASCII(command.description()).c_str());
EXPECT_STREQ(command_name.c_str(), command.command_name().c_str());
#if defined(OS_WIN)
ui::Accelerator accelerator(ui::VKEY_W,
ui::EF_SHIFT_DOWN | ui::EF_CONTROL_DOWN);
#elif defined(OS_MACOSX)
ui::Accelerator accelerator(ui::VKEY_M,
ui::EF_SHIFT_DOWN | ui::EF_COMMAND_DOWN);
#elif defined(OS_CHROMEOS)
ui::Accelerator accelerator(ui::VKEY_C,
ui::EF_SHIFT_DOWN | ui::EF_CONTROL_DOWN);
#elif defined(OS_LINUX)
ui::Accelerator accelerator(ui::VKEY_L,
ui::EF_SHIFT_DOWN | ui::EF_CONTROL_DOWN);
#else
ui::Accelerator accelerator(ui::VKEY_D,
ui::EF_SHIFT_DOWN | ui::EF_CONTROL_DOWN);
#endif
EXPECT_EQ(accelerator, command.accelerator());
key_dict->SetString("windosw", "Ctrl+M");
EXPECT_FALSE(command.Parse(input.get(), command_name, 0, &error));
EXPECT_TRUE(key_dict->Remove("windosw", NULL));
EXPECT_TRUE(key_dict->Remove("windows", NULL));
EXPECT_TRUE(key_dict->Remove("mac", NULL));
EXPECT_TRUE(key_dict->Remove("linux", NULL));
EXPECT_TRUE(key_dict->Remove("chromeos", NULL));
EXPECT_TRUE(command.Parse(input.get(), command_name, 0, &error));
EXPECT_EQ(ui::VKEY_D, command.accelerator().key_code());
EXPECT_TRUE(key_dict->Remove("default", NULL));
EXPECT_FALSE(command.Parse(input.get(), command_name, 0, &error));
key_dict->SetString("default", "Command+M");
EXPECT_FALSE(command.Parse(input.get(), command_name, 0, &error));
EXPECT_TRUE(key_dict->Remove("default", NULL));
key_dict->SetString("windows", "Command+M");
EXPECT_FALSE(command.Parse(input.get(), command_name, 0, &error));
EXPECT_TRUE(key_dict->Remove("windows", NULL));
#if defined(OS_WIN)
key_dict->SetString("mac", "Ctrl+Shift+M");
#else
key_dict->SetString("windows", "Ctrl+Shift+W");
#endif
EXPECT_FALSE(command.Parse(input.get(), command_name, 0, &error));
#if !defined(OS_MACOSX)
key_dict->SetString("windows", "Command+Shift+M");
EXPECT_FALSE(command.Parse(input.get(), command_name, 0, &error));
#endif
}