1 // Copyright 2020 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 #include "chrome/browser/chromeos/arc/input_method_manager/arc_input_method_state.h"
6
7 #include <memory>
8
9 #include "ash/public/cpp/tablet_mode.h"
10 #include "base/test/bind.h"
11 #include "chrome/test/base/testing_profile.h"
12 #include "components/arc/mojom/input_method_manager.mojom.h"
13 #include "content/public/test/browser_task_environment.h"
14 #include "testing/gtest/include/gtest/gtest.h"
15 #include "ui/base/ime/chromeos/extension_ime_util.h"
16
17 namespace arc {
18
19 using ::chromeos::extension_ime_util::GetArcInputMethodID;
20 using ::chromeos::input_method::InputMethodDescriptor;
21 using ::chromeos::input_method::InputMethodDescriptors;
22
23 namespace {
24
GenerateImeInfo(const std::string & id,bool enabled,bool always_allowed)25 mojom::ImeInfoPtr GenerateImeInfo(const std::string& id,
26 bool enabled,
27 bool always_allowed) {
28 mojom::ImeInfoPtr info = mojom::ImeInfo::New();
29 info->ime_id = id;
30 info->enabled = enabled;
31 info->is_allowed_in_clamshell_mode = always_allowed;
32 return info;
33 }
34
35 class FakeDelegate : public ArcInputMethodState::Delegate {
36 public:
ShouldArcIMEAllowed() const37 bool ShouldArcIMEAllowed() const override { return allowed; }
BuildInputMethodDescriptor(const mojom::ImeInfoPtr & info) const38 InputMethodDescriptor BuildInputMethodDescriptor(
39 const mojom::ImeInfoPtr& info) const override {
40 return InputMethodDescriptor(info->ime_id, "", "", {}, {}, false, GURL(),
41 GURL());
42 }
43 bool allowed = false;
44 };
45
46 } // namespace
47
TEST(ArcInputMethodState,Constructor)48 TEST(ArcInputMethodState, Constructor) {
49 FakeDelegate delegate;
50
51 ArcInputMethodState empty_state(&delegate);
52 InputMethodDescriptors empty_vector;
53 EXPECT_EQ(0u, empty_state.GetActiveInputMethods().size());
54 EXPECT_EQ(0u, empty_state.GetEnabledInputMethods().size());
55 }
56
TEST(ArcInputMethodState,InstallInputMethod)57 TEST(ArcInputMethodState, InstallInputMethod) {
58 FakeDelegate delegate;
59
60 ArcInputMethodState state(&delegate);
61 std::vector<mojom::ImeInfoPtr> imes;
62 imes.push_back(GenerateImeInfo("ime_a", true, false));
63 imes.push_back(GenerateImeInfo("ime_b", true, true));
64 imes.push_back(GenerateImeInfo("ime_c", false, false));
65 imes.push_back(GenerateImeInfo("ime_d", false, true));
66 state.InitializeWithImeInfo("ime_id", imes);
67
68 InputMethodDescriptors active_imes = state.GetActiveInputMethods();
69 EXPECT_EQ(2u, active_imes.size());
70 EXPECT_EQ("ime_b", active_imes[0].id());
71 EXPECT_EQ("ime_d", active_imes[1].id());
72
73 InputMethodDescriptors enabled_imes = state.GetEnabledInputMethods();
74 EXPECT_EQ(1u, enabled_imes.size());
75 EXPECT_EQ("ime_b", enabled_imes[0].id());
76 }
77
TEST(ArcInputMethodState,DisableInputMethod)78 TEST(ArcInputMethodState, DisableInputMethod) {
79 FakeDelegate delegate;
80
81 ArcInputMethodState state(&delegate);
82 std::vector<mojom::ImeInfoPtr> imes;
83 imes.push_back(GenerateImeInfo("ime_a", true, true));
84 state.InitializeWithImeInfo("ime_id", imes);
85 EXPECT_EQ(1u, state.GetEnabledInputMethods().size());
86
87 state.DisableInputMethod("ime_a");
88 EXPECT_EQ(0u, state.GetEnabledInputMethods().size());
89 }
90
TEST(ArcInputMethodState,AllowDisallowInputMethods)91 TEST(ArcInputMethodState, AllowDisallowInputMethods) {
92 FakeDelegate delegate;
93
94 ArcInputMethodState state(&delegate);
95 std::vector<mojom::ImeInfoPtr> imes;
96 imes.push_back(GenerateImeInfo("ime_a", true, true));
97 imes.push_back(GenerateImeInfo("ime_b", true, false));
98 state.InitializeWithImeInfo("ime_id", imes);
99
100 EXPECT_EQ(1u, state.GetActiveInputMethods().size());
101 EXPECT_EQ("ime_a", state.GetActiveInputMethods()[0].id());
102
103 delegate.allowed = true;
104 EXPECT_EQ(2u, state.GetActiveInputMethods().size());
105
106 delegate.allowed = false;
107 EXPECT_EQ(1u, state.GetActiveInputMethods().size());
108 EXPECT_EQ("ime_a", state.GetActiveInputMethods()[0].id());
109 }
110
111 } // namespace arc
112