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