blob: abdd9c5d85b852c5628c734e00262c6cc22771a7 [file] [log] [blame]
// Copyright 2025 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#import "ios/chrome/browser/omnibox/model/omnibox_text_model.h"
#import <string>
#import "base/strings/utf_string_conversions.h"
#import "base/test/task_environment.h"
#import "components/omnibox/browser/test_omnibox_client.h"
#import "testing/gtest/include/gtest/gtest.h"
#import "testing/platform_test.h"
class OmniboxTextModelTest : public PlatformTest {
protected:
OmniboxTextModelTest() : model_(&client_) {}
// Helper to create OmniboxTextState for tests.
static OmniboxTextState CreateState(const std::string& text_utf8,
size_t sel_start,
size_t sel_end) {
OmniboxTextState state;
state.text = base::UTF8ToUTF16(text_utf8);
state.sel_start = sel_start;
state.sel_end = sel_end;
return state;
}
public:
base::test::TaskEnvironment task_environment_;
TestOmniboxClient client_;
OmniboxTextModel model_;
};
// Tests GetStateChanges correctly determines if text was deleted.
TEST_F(OmniboxTextModelTest, GetStateChanges_DeletedText) {
{
// Continuing autocompletion
auto state_before = CreateState("google.com", 10, 3); // goo[gle.com]
auto state_after = CreateState("goog", 4, 4); // goog|
auto state_changes = model_.GetStateChanges(state_before, state_after);
EXPECT_FALSE(state_changes.just_deleted_text);
}
{
// Typing not the autocompletion
auto state_before = CreateState("google.com", 1, 10); // g[oogle.com]
auto state_after = CreateState("gi", 2, 2); // gi|
auto state_changes = model_.GetStateChanges(state_before, state_after);
EXPECT_FALSE(state_changes.just_deleted_text);
}
{
// Deleting autocompletion
auto state_before = CreateState("google.com", 1, 10); // g[oogle.com]
auto state_after = CreateState("g", 1, 1); // g|
auto state_changes = model_.GetStateChanges(state_before, state_after);
EXPECT_TRUE(state_changes.just_deleted_text);
}
{
// Inserting
auto state_before = CreateState("goole.com", 3, 3); // goo|le.com
auto state_after = CreateState("google.com", 4, 4); // goog|le.com
auto state_changes = model_.GetStateChanges(state_before, state_after);
EXPECT_FALSE(state_changes.just_deleted_text);
}
{
// Deleting
auto state_before = CreateState("googgle.com", 5, 5); // googg|le.com
auto state_after = CreateState("google.com", 4, 4); // goog|le.com
auto state_changes = model_.GetStateChanges(state_before, state_after);
EXPECT_TRUE(state_changes.just_deleted_text);
}
{
// Replacing
auto state_before = CreateState("goojle.com", 3, 4); // goo[j]le.com
auto state_after = CreateState("google.com", 4, 4); // goog|le.com
auto state_changes = model_.GetStateChanges(state_before, state_after);
EXPECT_FALSE(state_changes.just_deleted_text);
}
{
// Replacing with shorter text, but cursor moved past original selection
// start (e.g. select "jkl" in "ghijkl" and type "x") "ghi[jkl]mno"
// (sel_start=3, sel_end=6) -> "ghixmno" (sel_start=4, sel_end=4) This
// should NOT be `just_deleted_text`.
auto state_before = CreateState("ghijklmno", 3, 6);
auto state_after = CreateState("ghixmno", 4, 4);
auto state_changes = model_.GetStateChanges(state_before, state_after);
EXPECT_FALSE(state_changes.just_deleted_text);
}
{
// Replacing with shorter text, cursor at original selection start
// (e.g. select "jkl" in "ghijkl" and type "x", then backspace to put cursor
// at start of "x") "ghi[jkl]mno" (sel_start=3, sel_end=6) -> "ghixmno"
// (sel_start=3, sel_end=3) This should be `just_deleted_text` because the
// new text is shorter AND the cursor is at or before the original
// selection's start.
auto state_before = CreateState("ghijklmno", 3, 6);
auto state_after = CreateState("ghixmno", 3, 3); // Cursor at 'x'
auto state_changes = model_.GetStateChanges(state_before, state_after);
EXPECT_TRUE(state_changes.just_deleted_text);
}
}