1
    2
    3
    4
    5
    6
    7
    8
    9
   10
   11
   12
   13
   14
   15
   16
   17
   18
   19
   20
   21
   22
   23
   24
   25
   26
   27
   28
   29
   30
   31
   32
   33
   34
   35
   36
   37
   38
   39
   40
   41
   42
   43
   44
   45
   46
   47
   48
   49
   50
   51
   52
   53
   54
   55
   56
   57
   58
   59
   60
   61
   62
   63
   64
   65
   66
   67
   68
   69
   70
   71
   72
   73
   74
   75
   76
   77
   78
   79
   80
   81
   82
   83
   84
   85
   86
   87
   88
   89
   90
   91
   92
   93
   94
   95
   96
   97
   98
   99
  100
  101
  102
  103
  104
  105
  106

ash / quick_insert / quick_insert_action_on_next_focus_request_unittest.cc [blame]

// Copyright 2024 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#include "ash/quick_insert/quick_insert_action_on_next_focus_request.h"

#include "base/functional/callback.h"
#include "base/functional/callback_helpers.h"
#include "base/test/task_environment.h"
#include "base/test/test_future.h"
#include "base/time/time.h"
#include "testing/gtest/include/gtest/gtest.h"
#include "ui/base/ime/ash/input_method_ash.h"
#include "ui/base/ime/fake_text_input_client.h"

namespace ash {
namespace {

class QuickInsertActionOnNextFocusRequestTest : public testing::Test {
 protected:
  base::test::SingleThreadTaskEnvironment& task_environment() {
    return task_environment_;
  }

 private:
  base::test::SingleThreadTaskEnvironment task_environment_{
      base::test::TaskEnvironment::TimeSource::MOCK_TIME};
};

TEST_F(QuickInsertActionOnNextFocusRequestTest, PerformsActionOnNextFocus) {
  ui::FakeTextInputClient client(ui::TEXT_INPUT_TYPE_TEXT);
  InputMethodAsh input_method(nullptr);

  base::test::TestFuture<void> action_future;
  QuickInsertActionOnNextFocusRequest request(
      &input_method, /*action_timeout=*/base::Seconds(1),
      action_future.GetCallback(), base::DoNothing());
  input_method.SetFocusedTextInputClient(&client);

  EXPECT_TRUE(action_future.Wait());
}

TEST_F(QuickInsertActionOnNextFocusRequestTest,
       PerformsActionOnlyOnceWithMultipleFocus) {
  ui::FakeTextInputClient client1(ui::TEXT_INPUT_TYPE_TEXT);
  ui::FakeTextInputClient client2(ui::TEXT_INPUT_TYPE_TEXT);
  InputMethodAsh input_method(nullptr);

  base::test::TestFuture<void> action_future;
  QuickInsertActionOnNextFocusRequest request(
      &input_method, /*action_timeout=*/base::Seconds(1),
      action_future.GetCallback(), base::DoNothing());
  input_method.SetFocusedTextInputClient(&client1);
  input_method.SetFocusedTextInputClient(&client2);

  EXPECT_TRUE(action_future.Wait());
}

TEST_F(QuickInsertActionOnNextFocusRequestTest,
       DoesNotCallTimeoutCallbackAfterSuccessfulAction) {
  ui::FakeTextInputClient client(ui::TEXT_INPUT_TYPE_TEXT);
  InputMethodAsh input_method(nullptr);
  base::test::TestFuture<void> action_future;
  base::test::TestFuture<void> timeout_future;
  QuickInsertActionOnNextFocusRequest request(
      &input_method, /*action_timeout=*/base::Seconds(1),
      action_future.GetCallback(), timeout_future.GetCallback());

  input_method.SetFocusedTextInputClient(&client);
  task_environment().FastForwardBy(base::Seconds(2));

  EXPECT_TRUE(action_future.Wait());
  EXPECT_FALSE(timeout_future.IsReady());
}

TEST_F(QuickInsertActionOnNextFocusRequestTest, CallsTimeoutCallbackOnTimeout) {
  InputMethodAsh input_method(nullptr);

  base::test::TestFuture<void> timeout_future;
  QuickInsertActionOnNextFocusRequest request(
      &input_method, /*action_timeout=*/base::Seconds(1), base::DoNothing(),
      timeout_future.GetCallback());
  task_environment().FastForwardBy(base::Seconds(2));

  EXPECT_TRUE(timeout_future.Wait());
}

TEST_F(QuickInsertActionOnNextFocusRequestTest,
       DoesNotPerformActionAfterTimeout) {
  ui::FakeTextInputClient client(ui::TEXT_INPUT_TYPE_TEXT);
  InputMethodAsh input_method(nullptr);
  base::test::TestFuture<void> action_future;
  base::test::TestFuture<void> timeout_future;
  QuickInsertActionOnNextFocusRequest request(
      &input_method, /*action_timeout=*/base::Seconds(1),
      action_future.GetCallback(), timeout_future.GetCallback());

  task_environment().FastForwardBy(base::Seconds(2));
  input_method.SetFocusedTextInputClient(&client);

  EXPECT_FALSE(action_future.IsReady());
  EXPECT_TRUE(timeout_future.Wait());
}

}  // namespace
}  // namespace ash