blob: fb83d1bdbfd039438169fa0acf88d54e05fdb91d [file] [log] [blame]
// Copyright 2021 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "chrome/browser/ash/input_method/input_method_settings.h"
#include "ash/constants/ash_features.h"
#include "ash/constants/ash_pref_names.h"
#include "base/feature_list.h"
#include "base/strings/strcat.h"
#include "base/test/gtest_util.h"
#include "base/test/scoped_feature_list.h"
#include "chrome/common/pref_names.h"
#include "chromeos/ash/services/ime/public/mojom/input_method.mojom-shared.h"
#include "chromeos/ash/services/ime/public/mojom/japanese_settings.mojom.h"
#include "components/prefs/pref_registry_simple.h"
#include "components/prefs/testing_pref_service.h"
#include "testing/gmock/include/gmock/gmock.h"
#include "testing/gtest/include/gtest/gtest.h"
namespace ash {
namespace input_method {
namespace {
namespace mojom = ::ash::ime::mojom;
constexpr char kUsEnglishEngineId[] = "xkb:us::eng";
constexpr char kKoreanEngineId[] = "ko-t-i0-und";
constexpr char kPinyinEngineId[] = "zh-t-i0-pinyin";
constexpr char kZhuyinEngineId[] = "zh-hant-t-i0-und";
constexpr char kJapaneseEngineId[] = "nacl_mozc_jp";
constexpr char kVietnameseVniEngineId[] = "vkd_vi_vni";
constexpr char kVietnameseTelexEngineId[] = "vkd_vi_telex";
// This should be kept in sync with the values on the settings page's
// InputMethodOptions. This should match
// https://source.chromium.org/chromium/chromium/src/+/main:chrome/browser/resources/settings/chromeos/os_languages_page/input_method_util.js;l=71-88;drc=6c88edbfe6096489ccac66b3ef5c84d479892181.
constexpr char kJapaneseInputMode[] = "JapaneseInputMode";
constexpr char kJapanesePunctuationStyle[] = "JapanesePunctuationStyle";
constexpr char kJapaneseSymbolStyle[] = "JapaneseSymbolStyle";
constexpr char kJapaneseSpaceInputStyle[] = "JapaneseSpaceInputStyle";
constexpr char kJapaneseSelectionShortcut[] = "JapaneseSectionShortcut";
constexpr char kJapaneseKeymapStyle[] = "JapaneseKeymapStyle";
constexpr char kJapaneseUseInputHistory[] = "UseInputHistory";
constexpr char kJapaneseUseSystemDictionary[] = "UseSystemDictionary";
constexpr char kJapaneseNumberOfSuggestions[] = "numberOfSuggestions";
constexpr char kJapaneseAutomaticallySwitchToHalfwidth[] =
"AutomaticallySwitchToHalfwidth";
constexpr char kJapaneseShiftKeyModeStyle[] = "ShiftKeyModeStyle";
constexpr char kJapaneseDisablePersonalizedSuggestions[] =
"JapaneseDisableSuggestions";
constexpr char kJapaneseAutomaticallySendStatisticsToGoogle[] =
"AutomaticallySendStatisticsToGoogle";
// This should match the strings listed here:
//
// https://crsrc.org/c/chrome/browser/resources/settings/chromeos/os_languages_page/input_method_types.js;l=8-71;drc=7df206933530e6ac65a7e17a88757cbb780c829e
// These are possible values for their corresponding enum type.
constexpr char kJapaneseInputModeKana[] = "Kana";
constexpr char kJapaneseInputModeRomaji[] = "Romaji";
constexpr char kJapanesePunctuationStyleKutenTouten[] = "KutenTouten";
constexpr char kJapanesePunctuationStyleCommaPeriod[] = "CommaPeriod";
constexpr char kJapanesePunctuationStyleKutenPeriod[] = "KutenPeriod";
constexpr char kJapanesePunctuationStyleCommaTouten[] = "CommaTouten";
constexpr char kJapaneseSymbolStyleCornerBracketMiddleDot[] =
"CornerBracketMiddleDot";
constexpr char kJapaneseSymbolStyleSquareBracketSlash[] = "SquareBracketSlash";
constexpr char kJapaneseSymbolStyleCornerBracketSlash[] = "CornerBracketSlash";
constexpr char kJapaneseSymbolStyleSquareBracketMiddleDot[] =
"SquareBracketMiddleDot";
constexpr char kJapaneseSpaceInputStyleInputMode[] = "InputMode";
constexpr char kJapaneseSpaceInputStyleFullwidth[] = "Fullwidth";
constexpr char kJapaneseSpaceInputStyleHalfwidth[] = "Halfwidth";
constexpr char kJapaneseSelectionShortcutNoShortcut[] = "NoShortcut";
constexpr char kJapaneseSelectionShortcutDigits123456789[] = "Digits123456789";
constexpr char kJapaneseSelectionShortcutAsdfghjkl[] = "ASDFGHJKL";
constexpr char kJapaneseKeymapStyleCustom[] = "Custom";
constexpr char kJapaneseKeymapStyleAtok[] = "Atok";
constexpr char kJapaneseKeymapStyleMsIme[] = "MsIme";
constexpr char kJapaneseKeymapStyleKotoeri[] = "Kotoeri";
constexpr char kJapaneseKeymapStyleMobile[] = "Mobile";
constexpr char kJapaneseKeymapStyleChromeOs[] = "ChromeOs";
constexpr char kJapaneseShiftKeyModeStyleOff[] = "Off";
constexpr char kJapaneseShiftKeyModeStyleAlphanumeric[] = "Alphanumeric";
constexpr char kJapaneseShiftKeyModeStyleKatakana[] = "Katakana";
void RegisterTestingPrefs(TestingPrefServiceSimple& prefs,
const base::Value::Dict& dict) {
prefs.registry()->RegisterDictionaryPref(
::prefs::kLanguageInputMethodSpecificSettings);
prefs.Set(::prefs::kLanguageInputMethodSpecificSettings,
base::Value(dict.Clone()));
}
TEST(CreateSettingsFromPrefsTest, CreateLatinSettingsDefault) {
base::Value::Dict dict;
TestingPrefServiceSimple prefs;
RegisterTestingPrefs(prefs, dict);
const auto settings = CreateSettingsFromPrefs(prefs, kUsEnglishEngineId);
ASSERT_TRUE(settings->is_latin_settings());
const auto& latin_settings = *settings->get_latin_settings();
EXPECT_FALSE(latin_settings.autocorrect);
EXPECT_FALSE(latin_settings.predictive_writing);
}
class SetJapanesePrefsFromSettingsTest : public ::testing::Test {
protected:
void SetUp() override { RegisterTestingPrefs(prefs, dict); }
public:
const base::Value::Dict* GetJapaneseDict() {
return prefs.GetDict(::prefs::kLanguageInputMethodSpecificSettings)
.FindDict(kJapaneseEngineId);
}
base::Value::Dict dict;
TestingPrefServiceSimple prefs;
};
TEST_F(SetJapanesePrefsFromSettingsTest,
JapaneseMigrationIsNotCompleteByDefault) {
EXPECT_FALSE(IsJapaneseSettingsMigrationComplete(prefs));
}
TEST_F(SetJapanesePrefsFromSettingsTest, SetJapaneseMigrationDone) {
SetJapaneseSettingsMigrationComplete(prefs, true);
EXPECT_TRUE(IsJapaneseSettingsMigrationComplete(prefs));
}
TEST_F(SetJapanesePrefsFromSettingsTest, SetJapaneseMigrationToFalse) {
SetJapaneseSettingsMigrationComplete(prefs, true);
SetJapaneseSettingsMigrationComplete(prefs, false);
EXPECT_FALSE(IsJapaneseSettingsMigrationComplete(prefs));
}
TEST_F(SetJapanesePrefsFromSettingsTest,
SetJapaneseSettingsIfMigratedCausesDeath) {
SetJapaneseSettingsMigrationComplete(prefs, true);
mojom::JapaneseConfig config;
EXPECT_CHECK_DEATH(MigrateJapaneseSettingsToPrefs(prefs, config));
}
TEST_F(SetJapanesePrefsFromSettingsTest,
SetJapaneseSettingsWillMarkMigrationAsDone) {
mojom::JapaneseConfig config;
MigrateJapaneseSettingsToPrefs(prefs, std::move(config));
EXPECT_TRUE(IsJapaneseSettingsMigrationComplete(prefs));
}
// Test Japanese settings persistence
// Test input mode is set.
TEST_F(SetJapanesePrefsFromSettingsTest, SetJapaneseInputModeToRomaji) {
mojom::JapaneseConfig config;
config.input_mode = mojom::InputMode::kRomaji;
MigrateJapaneseSettingsToPrefs(prefs, std::move(config));
const base::Value::Dict* result_dict = GetJapaneseDict();
EXPECT_EQ(*(result_dict->FindString(kJapaneseInputMode)),
std::string(kJapaneseInputModeRomaji));
}
TEST_F(SetJapanesePrefsFromSettingsTest, SetJapaneseInputModeToKana) {
mojom::JapaneseConfig config;
config.input_mode = mojom::InputMode::kKana;
MigrateJapaneseSettingsToPrefs(prefs, std::move(config));
const base::Value::Dict* result_dict = GetJapaneseDict();
EXPECT_EQ(*(result_dict->FindString(kJapaneseInputMode)),
std::string(kJapaneseInputModeKana));
}
// Test Punctuation style is set.
TEST_F(SetJapanesePrefsFromSettingsTest,
SetJapanesePunctuationStyleToKutenTouten) {
mojom::JapaneseConfig config;
config.punctuation_style = mojom::PunctuationStyle::kKutenTouten;
MigrateJapaneseSettingsToPrefs(prefs, std::move(config));
const base::Value::Dict* result_dict = GetJapaneseDict();
EXPECT_EQ(*(result_dict->FindString(kJapanesePunctuationStyle)),
std::string(kJapanesePunctuationStyleKutenTouten));
}
TEST_F(SetJapanesePrefsFromSettingsTest,
SetJapanesePunctuationStyleToCommaPeriod) {
mojom::JapaneseConfig config;
config.punctuation_style = mojom::PunctuationStyle::kCommaPeriod;
MigrateJapaneseSettingsToPrefs(prefs, std::move(config));
const base::Value::Dict* result_dict = GetJapaneseDict();
EXPECT_EQ(*(result_dict->FindString(kJapanesePunctuationStyle)),
std::string(kJapanesePunctuationStyleCommaPeriod));
}
TEST_F(SetJapanesePrefsFromSettingsTest,
SetJapanesePunctuationStyleToKutenPeriod) {
mojom::JapaneseConfig config;
config.punctuation_style = mojom::PunctuationStyle::kKutenPeriod;
MigrateJapaneseSettingsToPrefs(prefs, std::move(config));
const base::Value::Dict* result_dict = GetJapaneseDict();
EXPECT_EQ(*(result_dict->FindString(kJapanesePunctuationStyle)),
std::string(kJapanesePunctuationStyleKutenPeriod));
}
TEST_F(SetJapanesePrefsFromSettingsTest,
SetJapanesePunctuationStyleToCommaTouten) {
mojom::JapaneseConfig config;
config.punctuation_style = mojom::PunctuationStyle::kCommaTouten;
MigrateJapaneseSettingsToPrefs(prefs, std::move(config));
const base::Value::Dict* result_dict = GetJapaneseDict();
EXPECT_EQ(*(result_dict->FindString(kJapanesePunctuationStyle)),
std::string(kJapanesePunctuationStyleCommaTouten));
}
// Test symbol style is set.
TEST_F(SetJapanesePrefsFromSettingsTest,
SetJapaneseSymbolStyleToCornerBracketMiddleDot) {
mojom::JapaneseConfig config;
config.symbol_style = mojom::SymbolStyle::kCornerBracketMiddleDot;
MigrateJapaneseSettingsToPrefs(prefs, std::move(config));
const base::Value::Dict* result_dict = GetJapaneseDict();
EXPECT_EQ(*(result_dict->FindString(kJapaneseSymbolStyle)),
std::string(kJapaneseSymbolStyleCornerBracketMiddleDot));
}
TEST_F(SetJapanesePrefsFromSettingsTest,
SetJapaneseSymbolStyleToSquareBracketSlash) {
mojom::JapaneseConfig config;
config.symbol_style = mojom::SymbolStyle::kSquareBracketSlash;
MigrateJapaneseSettingsToPrefs(prefs, std::move(config));
const base::Value::Dict* result_dict = GetJapaneseDict();
EXPECT_EQ(*(result_dict->FindString(kJapaneseSymbolStyle)),
std::string(kJapaneseSymbolStyleSquareBracketSlash));
}
TEST_F(SetJapanesePrefsFromSettingsTest,
SetJapaneseSymbolStyleToCornerBracketSlash) {
mojom::JapaneseConfig config;
config.symbol_style = mojom::SymbolStyle::kCornerBracketSlash;
MigrateJapaneseSettingsToPrefs(prefs, std::move(config));
const base::Value::Dict* result_dict = GetJapaneseDict();
EXPECT_EQ(*(result_dict->FindString(kJapaneseSymbolStyle)),
std::string(kJapaneseSymbolStyleCornerBracketSlash));
}
TEST_F(SetJapanesePrefsFromSettingsTest,
SetJapaneseSymbolStyleToSquareBracketMiddleDot) {
mojom::JapaneseConfig config;
config.symbol_style = mojom::SymbolStyle::kSquareBracketMiddleDot;
MigrateJapaneseSettingsToPrefs(prefs, std::move(config));
const base::Value::Dict* result_dict = GetJapaneseDict();
EXPECT_EQ(*(result_dict->FindString(kJapaneseSymbolStyle)),
std::string(kJapaneseSymbolStyleSquareBracketMiddleDot));
}
// Test setting space input style.
TEST_F(SetJapanesePrefsFromSettingsTest,
SetJapaneseSpaceInputStyleToInputMode) {
mojom::JapaneseConfig config;
config.space_input_style = mojom::SpaceInputStyle::kInputMode;
MigrateJapaneseSettingsToPrefs(prefs, std::move(config));
const base::Value::Dict* result_dict = GetJapaneseDict();
EXPECT_EQ(*(result_dict->FindString(kJapaneseSpaceInputStyle)),
std::string(kJapaneseSpaceInputStyleInputMode));
}
TEST_F(SetJapanesePrefsFromSettingsTest,
SetJapaneseSpaceInputStyleToFullwidth) {
mojom::JapaneseConfig config;
config.space_input_style = mojom::SpaceInputStyle::kFullwidth;
MigrateJapaneseSettingsToPrefs(prefs, std::move(config));
const base::Value::Dict* result_dict = GetJapaneseDict();
EXPECT_EQ(*(result_dict->FindString(kJapaneseSpaceInputStyle)),
std::string(kJapaneseSpaceInputStyleFullwidth));
}
TEST_F(SetJapanesePrefsFromSettingsTest,
SetJapaneseSpaceInputStyleToHalfwidth) {
mojom::JapaneseConfig config;
config.space_input_style = mojom::SpaceInputStyle::kHalfwidth;
MigrateJapaneseSettingsToPrefs(prefs, std::move(config));
const base::Value::Dict* result_dict = GetJapaneseDict();
EXPECT_EQ(*(result_dict->FindString(kJapaneseSpaceInputStyle)),
std::string(kJapaneseSpaceInputStyleHalfwidth));
}
// Test Japanese selection shortcut.
TEST_F(SetJapanesePrefsFromSettingsTest,
SetJapaneseSelectionShortcutToNoShortcut) {
mojom::JapaneseConfig config;
config.selection_shortcut = mojom::SelectionShortcut::kNoShortcut;
MigrateJapaneseSettingsToPrefs(prefs, std::move(config));
const base::Value::Dict* result_dict = GetJapaneseDict();
EXPECT_EQ(*(result_dict->FindString(kJapaneseSelectionShortcut)),
std::string(kJapaneseSelectionShortcutNoShortcut));
}
TEST_F(SetJapanesePrefsFromSettingsTest,
SetJapaneseSelectionShortcutToDigits123456789) {
mojom::JapaneseConfig config;
config.selection_shortcut = mojom::SelectionShortcut::kDigits123456789;
MigrateJapaneseSettingsToPrefs(prefs, std::move(config));
const base::Value::Dict* result_dict = GetJapaneseDict();
EXPECT_EQ(*(result_dict->FindString(kJapaneseSelectionShortcut)),
std::string(kJapaneseSelectionShortcutDigits123456789));
}
TEST_F(SetJapanesePrefsFromSettingsTest,
SetJapaneseSelectionShortcutToAsdfghjkl) {
mojom::JapaneseConfig config;
config.selection_shortcut = mojom::SelectionShortcut::kAsdfghjkl;
MigrateJapaneseSettingsToPrefs(prefs, std::move(config));
const base::Value::Dict* result_dict = GetJapaneseDict();
EXPECT_EQ(*(result_dict->FindString(kJapaneseSelectionShortcut)),
std::string(kJapaneseSelectionShortcutAsdfghjkl));
}
// Test Japanese keymap style.
TEST_F(SetJapanesePrefsFromSettingsTest, SetJapaneseKeymapStyleToCustom) {
mojom::JapaneseConfig config;
config.keymap_style = mojom::KeymapStyle::kCustom;
MigrateJapaneseSettingsToPrefs(prefs, std::move(config));
const base::Value::Dict* result_dict = GetJapaneseDict();
EXPECT_EQ(*(result_dict->FindString(kJapaneseKeymapStyle)),
std::string(kJapaneseKeymapStyleCustom));
}
TEST_F(SetJapanesePrefsFromSettingsTest, SetJapaneseKeymapStyleToAtok) {
mojom::JapaneseConfig config;
config.keymap_style = mojom::KeymapStyle::kAtok;
MigrateJapaneseSettingsToPrefs(prefs, std::move(config));
const base::Value::Dict* result_dict = GetJapaneseDict();
EXPECT_EQ(*(result_dict->FindString(kJapaneseKeymapStyle)),
std::string(kJapaneseKeymapStyleAtok));
}
TEST_F(SetJapanesePrefsFromSettingsTest, SetJapaneseKeymapStyleToMsIme) {
mojom::JapaneseConfig config;
config.keymap_style = mojom::KeymapStyle::kMsIme;
MigrateJapaneseSettingsToPrefs(prefs, std::move(config));
const base::Value::Dict* result_dict = GetJapaneseDict();
EXPECT_EQ(*(result_dict->FindString(kJapaneseKeymapStyle)),
std::string(kJapaneseKeymapStyleMsIme));
}
TEST_F(SetJapanesePrefsFromSettingsTest, SetJapaneseKeymapStyleToKotoeri) {
mojom::JapaneseConfig config;
config.keymap_style = mojom::KeymapStyle::kKotoeri;
MigrateJapaneseSettingsToPrefs(prefs, std::move(config));
const base::Value::Dict* result_dict = GetJapaneseDict();
EXPECT_EQ(*(result_dict->FindString(kJapaneseKeymapStyle)),
std::string(kJapaneseKeymapStyleKotoeri));
}
TEST_F(SetJapanesePrefsFromSettingsTest, SetJapaneseKeymapStyleToMobile) {
mojom::JapaneseConfig config;
config.keymap_style = mojom::KeymapStyle::kMobile;
MigrateJapaneseSettingsToPrefs(prefs, std::move(config));
const base::Value::Dict* result_dict = GetJapaneseDict();
EXPECT_EQ(*(result_dict->FindString(kJapaneseKeymapStyle)),
std::string(kJapaneseKeymapStyleMobile));
}
TEST_F(SetJapanesePrefsFromSettingsTest, SetJapaneseKeymapStyleToChromeOs) {
mojom::JapaneseConfig config;
config.keymap_style = mojom::KeymapStyle::kChromeOs;
MigrateJapaneseSettingsToPrefs(prefs, std::move(config));
const base::Value::Dict* result_dict = GetJapaneseDict();
EXPECT_EQ(*(result_dict->FindString(kJapaneseKeymapStyle)),
std::string(kJapaneseKeymapStyleChromeOs));
}
// Test automatically switch to halfwidth.
TEST_F(SetJapanesePrefsFromSettingsTest,
SetAutomaticallySwitchToHalfwitdhToTrue) {
mojom::JapaneseConfig config;
config.automatically_switch_to_halfwidth = true;
MigrateJapaneseSettingsToPrefs(prefs, std::move(config));
const base::Value::Dict* result_dict = GetJapaneseDict();
EXPECT_TRUE(*result_dict->FindBool(kJapaneseAutomaticallySwitchToHalfwidth));
}
TEST_F(SetJapanesePrefsFromSettingsTest,
SetAutomaticallySwitchToHalfwitdhToFalse) {
mojom::JapaneseConfig config;
config.automatically_switch_to_halfwidth = false;
MigrateJapaneseSettingsToPrefs(prefs, std::move(config));
const base::Value::Dict* result_dict = GetJapaneseDict();
EXPECT_FALSE(*result_dict->FindBool(kJapaneseAutomaticallySwitchToHalfwidth));
}
// Test Japanese shift key mode switch.
TEST_F(SetJapanesePrefsFromSettingsTest, SetJapaneseShiftKeyModeStyleToOff) {
mojom::JapaneseConfig config;
config.shift_key_mode_switch = mojom::ShiftKeyModeSwitch::kOff;
MigrateJapaneseSettingsToPrefs(prefs, std::move(config));
const base::Value::Dict* result_dict = GetJapaneseDict();
EXPECT_EQ(*(result_dict->FindString(kJapaneseShiftKeyModeStyle)),
std::string(kJapaneseShiftKeyModeStyleOff));
}
TEST_F(SetJapanesePrefsFromSettingsTest,
SetJapaneseShiftKeyModeStyleToAlphanumeric) {
mojom::JapaneseConfig config;
config.shift_key_mode_switch = mojom::ShiftKeyModeSwitch::kAlphanumeric;
MigrateJapaneseSettingsToPrefs(prefs, std::move(config));
const base::Value::Dict* result_dict = GetJapaneseDict();
EXPECT_EQ(*(result_dict->FindString(kJapaneseShiftKeyModeStyle)),
std::string(kJapaneseShiftKeyModeStyleAlphanumeric));
}
TEST_F(SetJapanesePrefsFromSettingsTest,
SetJapaneseShiftKeyModeStyleToKatakana) {
mojom::JapaneseConfig config;
config.shift_key_mode_switch = mojom::ShiftKeyModeSwitch::kKatakana;
MigrateJapaneseSettingsToPrefs(prefs, std::move(config));
const base::Value::Dict* result_dict = GetJapaneseDict();
EXPECT_EQ(*(result_dict->FindString(kJapaneseShiftKeyModeStyle)),
std::string(kJapaneseShiftKeyModeStyleKatakana));
}
// Test Japanese use input history.
TEST_F(SetJapanesePrefsFromSettingsTest, SetUseInputHistoryToTrue) {
mojom::JapaneseConfig config;
config.use_input_history = true;
MigrateJapaneseSettingsToPrefs(prefs, std::move(config));
const base::Value::Dict* result_dict = GetJapaneseDict();
EXPECT_TRUE(*result_dict->FindBool(kJapaneseUseInputHistory));
}
TEST_F(SetJapanesePrefsFromSettingsTest, SetUseInputHistoryToFalse) {
mojom::JapaneseConfig config;
config.use_input_history = false;
MigrateJapaneseSettingsToPrefs(prefs, std::move(config));
const base::Value::Dict* result_dict = GetJapaneseDict();
EXPECT_FALSE(*result_dict->FindBool(kJapaneseUseInputHistory));
}
// Test use system dictionary.
TEST_F(SetJapanesePrefsFromSettingsTest, SetUseSystemDictionaryToTrue) {
mojom::JapaneseConfig config;
config.use_system_dictionary = true;
MigrateJapaneseSettingsToPrefs(prefs, std::move(config));
const base::Value::Dict* result_dict = GetJapaneseDict();
EXPECT_TRUE(*result_dict->FindBool(kJapaneseUseSystemDictionary));
}
TEST_F(SetJapanesePrefsFromSettingsTest, SetUseSystemDictionaryToFalse) {
mojom::JapaneseConfig config;
config.use_system_dictionary = false;
MigrateJapaneseSettingsToPrefs(prefs, std::move(config));
const base::Value::Dict* result_dict = GetJapaneseDict();
EXPECT_FALSE(*result_dict->FindBool(kJapaneseUseSystemDictionary));
}
// Test number of suggestions.
TEST_F(SetJapanesePrefsFromSettingsTest, SetNumberOfSuggestionsTo1) {
mojom::JapaneseConfig config;
config.number_of_suggestions = 1;
MigrateJapaneseSettingsToPrefs(prefs, std::move(config));
const base::Value::Dict* result_dict = GetJapaneseDict();
EXPECT_EQ(*result_dict->FindInt(kJapaneseNumberOfSuggestions), 1);
}
TEST_F(SetJapanesePrefsFromSettingsTest, SetNumberOfSuggestionsTo5) {
mojom::JapaneseConfig config;
config.number_of_suggestions = 5;
MigrateJapaneseSettingsToPrefs(prefs, std::move(config));
const base::Value::Dict* result_dict = GetJapaneseDict();
EXPECT_EQ(*result_dict->FindInt(kJapaneseNumberOfSuggestions), 5);
}
TEST_F(SetJapanesePrefsFromSettingsTest, SetNumberOfSuggestionsTo9) {
mojom::JapaneseConfig config;
config.number_of_suggestions = 9;
MigrateJapaneseSettingsToPrefs(prefs, std::move(config));
const base::Value::Dict* result_dict = GetJapaneseDict();
EXPECT_EQ(*result_dict->FindInt(kJapaneseNumberOfSuggestions), 9);
}
// Test disable personalized suggestions.
TEST_F(SetJapanesePrefsFromSettingsTest,
SetDisablePersonalizedSuggestionsToTrue) {
mojom::JapaneseConfig config;
config.disable_personalized_suggestions = true;
MigrateJapaneseSettingsToPrefs(prefs, std::move(config));
const base::Value::Dict* result_dict = GetJapaneseDict();
EXPECT_TRUE(*result_dict->FindBool(kJapaneseDisablePersonalizedSuggestions));
}
TEST_F(SetJapanesePrefsFromSettingsTest,
SetDisablePersonalizedSuggestionsToFalse) {
mojom::JapaneseConfig config;
config.disable_personalized_suggestions = false;
MigrateJapaneseSettingsToPrefs(prefs, std::move(config));
const base::Value::Dict* result_dict = GetJapaneseDict();
EXPECT_FALSE(*result_dict->FindBool(kJapaneseDisablePersonalizedSuggestions));
}
// Test sending statistics to Google.
TEST_F(SetJapanesePrefsFromSettingsTest, SetSendStatisticsToGoogleToTrue) {
mojom::JapaneseConfig config;
config.send_statistics_to_google = true;
MigrateJapaneseSettingsToPrefs(prefs, std::move(config));
const base::Value::Dict* result_dict = GetJapaneseDict();
EXPECT_TRUE(
*result_dict->FindBool(kJapaneseAutomaticallySendStatisticsToGoogle));
}
TEST_F(SetJapanesePrefsFromSettingsTest, SetSendStatisticsToGoogleToFalse) {
mojom::JapaneseConfig config;
config.send_statistics_to_google = false;
MigrateJapaneseSettingsToPrefs(prefs, std::move(config));
const base::Value::Dict* result_dict = GetJapaneseDict();
EXPECT_FALSE(
*result_dict->FindBool(kJapaneseAutomaticallySendStatisticsToGoogle));
}
// End of Japanese tests
TEST(CreateSettingsFromPrefsTest, CreateLatinSettings) {
base::test::ScopedFeatureList features;
features.InitWithFeatures({features::kAssistMultiWord}, {});
TestingPrefServiceSimple prefs;
base::Value::Dict dict;
dict.SetByDottedPath(base::StrCat({kUsEnglishEngineId,
".physicalKeyboardAutoCorrectionLevel"}),
1);
RegisterTestingPrefs(prefs, dict);
prefs.registry()->RegisterBooleanPref(prefs::kAssistPredictiveWritingEnabled,
true);
const auto settings = CreateSettingsFromPrefs(prefs, kUsEnglishEngineId);
ASSERT_TRUE(settings->is_latin_settings());
const auto& latin_settings = *settings->get_latin_settings();
EXPECT_TRUE(latin_settings.autocorrect);
EXPECT_TRUE(latin_settings.predictive_writing);
}
TEST(CreateSettingsFromPrefsTest,
PredictiveWritingEnabledWhenMultiWordAllowedAndEnabled) {
base::test::ScopedFeatureList features;
features.InitWithFeatures({features::kAssistMultiWord}, {});
TestingPrefServiceSimple prefs;
base::Value::Dict dict;
RegisterTestingPrefs(prefs, dict);
prefs.registry()->RegisterBooleanPref(prefs::kAssistPredictiveWritingEnabled,
true);
const auto settings = CreateSettingsFromPrefs(prefs, kUsEnglishEngineId);
ASSERT_TRUE(settings->is_latin_settings());
const auto& latin_settings = *settings->get_latin_settings();
EXPECT_TRUE(latin_settings.predictive_writing);
}
TEST(CreateSettingsFromPrefsTest,
PredictiveWritingDisabledWhenMultiwordDisabled) {
base::test::ScopedFeatureList features;
features.InitWithFeatures({}, {features::kAssistMultiWord});
TestingPrefServiceSimple prefs;
base::Value::Dict dict;
RegisterTestingPrefs(prefs, dict);
prefs.registry()->RegisterBooleanPref(prefs::kAssistPredictiveWritingEnabled,
true);
const auto settings = CreateSettingsFromPrefs(prefs, kUsEnglishEngineId);
ASSERT_TRUE(settings->is_latin_settings());
const auto& latin_settings = *settings->get_latin_settings();
EXPECT_FALSE(latin_settings.predictive_writing);
}
TEST(CreateSettingsFromPrefsTest, CreateKoreanSettingsDefault) {
base::Value::Dict dict;
TestingPrefServiceSimple prefs;
RegisterTestingPrefs(prefs, dict);
const auto settings = CreateSettingsFromPrefs(prefs, kKoreanEngineId);
ASSERT_TRUE(settings->is_korean_settings());
const auto& korean_settings = *settings->get_korean_settings();
EXPECT_EQ(korean_settings.layout, mojom::KoreanLayout::kDubeolsik);
EXPECT_FALSE(korean_settings.input_multiple_syllables);
}
TEST(CreateSettingsFromPrefsTest, CreateKoreanSettings) {
base::Value::Dict dict;
dict.SetByDottedPath(base::StrCat({kKoreanEngineId, ".koreanKeyboardLayout"}),
"3 Set (390) / 세벌식 (390)");
dict.SetByDottedPath(
base::StrCat({kKoreanEngineId, ".koreanEnableSyllableInput"}), false);
TestingPrefServiceSimple prefs;
RegisterTestingPrefs(prefs, dict);
const auto settings = CreateSettingsFromPrefs(prefs, kKoreanEngineId);
ASSERT_TRUE(settings->is_korean_settings());
const auto& korean_settings = *settings->get_korean_settings();
EXPECT_EQ(korean_settings.layout, mojom::KoreanLayout::kSebeolsik390);
EXPECT_TRUE(korean_settings.input_multiple_syllables);
}
TEST(CreateSettingsFromPrefsTest, CreatePinyinSettingsDefault) {
base::Value::Dict dict;
TestingPrefServiceSimple prefs;
RegisterTestingPrefs(prefs, dict);
const auto settings = CreateSettingsFromPrefs(prefs, kPinyinEngineId);
ASSERT_TRUE(settings->is_pinyin_settings());
const auto& pinyin_settings = *settings->get_pinyin_settings();
ASSERT_TRUE(pinyin_settings.fuzzy_pinyin);
const auto& fuzzy_pinyin = *pinyin_settings.fuzzy_pinyin;
EXPECT_FALSE(fuzzy_pinyin.an_ang);
EXPECT_FALSE(fuzzy_pinyin.en_eng);
EXPECT_FALSE(fuzzy_pinyin.ian_iang);
EXPECT_FALSE(fuzzy_pinyin.k_g);
EXPECT_FALSE(fuzzy_pinyin.r_l);
EXPECT_FALSE(fuzzy_pinyin.uan_uang);
EXPECT_FALSE(fuzzy_pinyin.c_ch);
EXPECT_FALSE(fuzzy_pinyin.f_h);
EXPECT_FALSE(fuzzy_pinyin.in_ing);
EXPECT_FALSE(fuzzy_pinyin.l_n);
EXPECT_FALSE(fuzzy_pinyin.s_sh);
EXPECT_FALSE(fuzzy_pinyin.z_zh);
EXPECT_EQ(pinyin_settings.layout, mojom::PinyinLayout::kUsQwerty);
EXPECT_TRUE(pinyin_settings.use_hyphen_and_equals_to_page_candidates);
EXPECT_TRUE(pinyin_settings.use_comma_and_period_to_page_candidates);
EXPECT_TRUE(pinyin_settings.default_to_chinese);
EXPECT_FALSE(pinyin_settings.default_to_full_width_characters);
EXPECT_TRUE(pinyin_settings.default_to_full_width_punctuation);
}
TEST(CreateSettingsFromPrefsTest, CreatePinyinSettings) {
base::Value::Dict dict;
dict.SetByDottedPath(base::StrCat({kPinyinEngineId, ".en:eng"}), true);
dict.SetByDottedPath(base::StrCat({kPinyinEngineId, ".k:g"}), true);
dict.SetByDottedPath(base::StrCat({kPinyinEngineId, ".in:ing"}), true);
dict.SetByDottedPath(base::StrCat({kPinyinEngineId, ".xkbLayout"}),
"Colemak");
dict.SetByDottedPath(
base::StrCat({kPinyinEngineId, ".pinyinEnableLowerPaging"}), false);
dict.SetByDottedPath(
base::StrCat({kPinyinEngineId, ".pinyinEnableUpperPaging"}), false);
dict.SetByDottedPath(base::StrCat({kPinyinEngineId, ".pinyinDefaultChinese"}),
false);
dict.SetByDottedPath(
base::StrCat({kPinyinEngineId, ".pinyinFullWidthCharacter"}), true);
dict.SetByDottedPath(
base::StrCat({kPinyinEngineId, ".pinyinChinesePunctuation"}), false);
TestingPrefServiceSimple prefs;
RegisterTestingPrefs(prefs, dict);
const auto settings = CreateSettingsFromPrefs(prefs, kPinyinEngineId);
ASSERT_TRUE(settings->is_pinyin_settings());
const auto& pinyin_settings = *settings->get_pinyin_settings();
ASSERT_TRUE(pinyin_settings.fuzzy_pinyin);
const auto& fuzzy_pinyin = *pinyin_settings.fuzzy_pinyin;
EXPECT_FALSE(fuzzy_pinyin.an_ang);
EXPECT_TRUE(fuzzy_pinyin.en_eng);
EXPECT_FALSE(fuzzy_pinyin.ian_iang);
EXPECT_TRUE(fuzzy_pinyin.k_g);
EXPECT_FALSE(fuzzy_pinyin.r_l);
EXPECT_FALSE(fuzzy_pinyin.uan_uang);
EXPECT_FALSE(fuzzy_pinyin.c_ch);
EXPECT_FALSE(fuzzy_pinyin.f_h);
EXPECT_TRUE(fuzzy_pinyin.in_ing);
EXPECT_FALSE(fuzzy_pinyin.l_n);
EXPECT_FALSE(fuzzy_pinyin.s_sh);
EXPECT_FALSE(fuzzy_pinyin.z_zh);
EXPECT_EQ(pinyin_settings.layout, mojom::PinyinLayout::kColemak);
EXPECT_FALSE(pinyin_settings.use_comma_and_period_to_page_candidates);
EXPECT_FALSE(pinyin_settings.use_hyphen_and_equals_to_page_candidates);
EXPECT_FALSE(pinyin_settings.default_to_chinese);
EXPECT_TRUE(pinyin_settings.default_to_full_width_characters);
EXPECT_FALSE(pinyin_settings.default_to_full_width_punctuation);
}
TEST(CreateSettingsFromPrefsTest, CreateZhuyinSettingsDefault) {
base::Value::Dict dict;
TestingPrefServiceSimple prefs;
RegisterTestingPrefs(prefs, dict);
const auto settings = CreateSettingsFromPrefs(prefs, kZhuyinEngineId);
ASSERT_TRUE(settings->is_zhuyin_settings());
const auto& zhuyin_settings = *settings->get_zhuyin_settings();
EXPECT_EQ(zhuyin_settings.layout, mojom::ZhuyinLayout::kStandard);
EXPECT_EQ(zhuyin_settings.selection_keys,
mojom::ZhuyinSelectionKeys::k1234567890);
EXPECT_EQ(zhuyin_settings.page_size, 10u);
}
TEST(CreateSettingsFromPrefsTest, CreateVietnameseVniSettings) {
base::Value::Dict dict;
TestingPrefServiceSimple prefs;
RegisterTestingPrefs(prefs, dict);
const auto settings = CreateSettingsFromPrefs(prefs, kVietnameseVniEngineId);
ASSERT_TRUE(settings->is_vietnamese_vni_settings());
}
TEST(CreateSettingsFromPrefsTest, CreateVietnameseTelexSettings) {
base::Value::Dict dict;
TestingPrefServiceSimple prefs;
RegisterTestingPrefs(prefs, dict);
const auto settings =
CreateSettingsFromPrefs(prefs, kVietnameseTelexEngineId);
ASSERT_TRUE(settings->is_vietnamese_telex_settings());
}
TEST(CreateSettingsFromPrefsTest, CreateZhuyinSettings) {
base::Value::Dict dict;
dict.SetByDottedPath(base::StrCat({kZhuyinEngineId, ".zhuyinKeyboardLayout"}),
"IBM");
dict.SetByDottedPath(base::StrCat({kZhuyinEngineId, ".zhuyinSelectKeys"}),
"asdfghjkl;");
dict.SetByDottedPath(base::StrCat({kZhuyinEngineId, ".zhuyinPageSize"}), "8");
TestingPrefServiceSimple prefs;
RegisterTestingPrefs(prefs, dict);
const auto settings = CreateSettingsFromPrefs(prefs, kZhuyinEngineId);
ASSERT_TRUE(settings->is_zhuyin_settings());
const auto& zhuyin_settings = *settings->get_zhuyin_settings();
EXPECT_EQ(zhuyin_settings.layout, mojom::ZhuyinLayout::kIbm);
EXPECT_EQ(zhuyin_settings.selection_keys,
mojom::ZhuyinSelectionKeys::kAsdfghjkl);
EXPECT_EQ(zhuyin_settings.page_size, 8u);
}
TEST(CreateSettingsFromPrefsTest, AutocorrectIsSupportedForLatin) {
ASSERT_TRUE(IsAutocorrectSupported("xkb:ca:multix:fra"));
ASSERT_TRUE(IsAutocorrectSupported("xkb:de::ger"));
ASSERT_TRUE(IsAutocorrectSupported("xkb:us::eng"));
ASSERT_TRUE(IsAutocorrectSupported("xkb:us:intl_pc:por"));
ASSERT_TRUE(IsAutocorrectSupported("xkb:us:workman-intl:eng"));
}
TEST(CreateSettingsFromPrefsTest, AutocorrectIsNotSupportedForNonLatin) {
ASSERT_FALSE(IsAutocorrectSupported("ko-t-i0-und"));
ASSERT_FALSE(IsAutocorrectSupported("nacl_mozc_us"));
ASSERT_FALSE(IsAutocorrectSupported("xkb:am:phonetic:arm"));
ASSERT_FALSE(IsAutocorrectSupported("xkb:in::eng"));
ASSERT_FALSE(IsAutocorrectSupported("zh-hant-t-i0-pinyin"));
ASSERT_FALSE(IsAutocorrectSupported("zh-hant-t-i0-und"));
ASSERT_FALSE(IsAutocorrectSupported("zh-t-i0-pinyin"));
}
} // namespace
} // namespace input_method
} // namespace ash