0

picker: add source to text results

This is required for logging metrics of the category of inserted results.

Bug: b:322927522
Change-Id: I49846c0f5d6f372e27c707bf3f09ab2a86f9e665
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/5467907
Reviewed-by: Darren Shen <shend@chromium.org>
Commit-Queue: Jing Wang <jiwan@chromium.org>
Cr-Commit-Position: refs/heads/main@{#1291005}
This commit is contained in:
Jing Wang
2024-04-23 00:57:19 +00:00
committed by Chromium LUCI CQ
parent eb2d2b1029
commit c60118c6c8
8 changed files with 217 additions and 160 deletions

@ -398,8 +398,9 @@ void PickerController::TransformSelectedText(PickerCategory category) {
return;
}
std::u16string_view selected_text = model_->selected_text();
InsertResultOnNextFocus(
PickerSearchResult::Text(TransformText(selected_text, category)));
InsertResultOnNextFocus(PickerSearchResult::Text(
TransformText(selected_text, category),
PickerSearchResult::TextData::Source::kCaseTransform));
}
void PickerController::StartSearch(const std::u16string& query,

@ -74,14 +74,16 @@ PickerSearchResult MakeResult(const base::Time time,
return PickerSearchResult::Text(
base::LocalizedTimeFormatWithPattern(time, "LLLd"), secondary_text,
ui::ImageModel::FromVectorIcon(kPickerCalendarIcon,
cros_tokens::kCrosSysOnSurface));
cros_tokens::kCrosSysOnSurface),
PickerSearchResult::TextData::Source::kDate);
}
PickerSearchResult OverrideSecondaryText(PickerSearchResult result,
std::u16string_view secondary_text) {
const PickerSearchResult::TextData& data =
std::get<PickerSearchResult::TextData>(result.data());
return PickerSearchResult::Text(data.primary_text, secondary_text, data.icon);
return PickerSearchResult::Text(data.primary_text, secondary_text, data.icon,
data.source);
}
void HandleSpecificDayQueries(const base::Time& now,

@ -44,7 +44,11 @@ MATCHER(ResultMatchesDate, "") {
Property("data", &PickerSearchResult::data,
VariantWith<PickerSearchResult::TextData>(Field(
"text", &PickerSearchResult::TextData::secondary_text,
expected_result.secondary_text)))),
expected_result.secondary_text))),
Property("data", &PickerSearchResult::data,
VariantWith<PickerSearchResult::TextData>(
Field("source", &PickerSearchResult::TextData::source,
expected_result.source)))),
actual_result, result_listener);
}
@ -54,6 +58,13 @@ struct TestCase {
std::vector<PickerSearchResult::TextData> expected_results;
};
PickerSearchResult::TextData MakeResult(std::u16string primary_text,
std::u16string secondary_text = u"") {
return PickerSearchResult::TextData(
primary_text, secondary_text, ui::ImageModel(),
PickerSearchResult::TextData::Source::kDate);
}
class PickerDateSearchTest
: public ::testing::TestWithParam<std::tuple<std::string_view, TestCase>> {
};
@ -61,141 +72,136 @@ class PickerDateSearchTest
INSTANTIATE_TEST_SUITE_P(
,
PickerDateSearchTest,
Combine(
Values("00:00", "12:00", "23:59"),
Values(
// No result
TestCase{
.date = "23 Jan 2000",
.query = u"abc",
.expected_results = {},
},
// Today
TestCase{
.date = "23 Jan 2000",
.query = u"today",
.expected_results = {{.primary_text = u"Jan 23"}},
},
// Yesterday
TestCase{
.date = "23 Jan 2000",
.query = u"yesterday",
.expected_results = {{.primary_text = u"Jan 22"}},
},
// Tomorrow
TestCase{
.date = "23 Jan 2000",
.query = u"tomorrow",
.expected_results = {{.primary_text = u"Jan 24"}},
},
// X days from now
TestCase{
.date = "23 Jan 2000",
.query = u"10 days from now",
.expected_results = {{.primary_text = u"Feb 2"}},
},
// X days ago
TestCase{
.date = "23 Jan 2000",
.query = u"five days ago",
.expected_results = {{.primary_text = u"Jan 18"}},
},
// X weeks from now
TestCase{
.date = "23 Jan 2000",
.query = u"three weeks from now",
.expected_results = {{.primary_text = u"Feb 13"}},
},
// X weeks ago
TestCase{
.date = "23 Jan 2000",
.query = u"2 weeks ago",
.expected_results = {{.primary_text = u"Jan 9"}},
},
// search for Friday on Tuesday
TestCase{
.date = "19 Mar 2024",
.query = u"Friday",
.expected_results = {{.primary_text = u"Mar 22"}},
},
// search for this Friday on Tuesday
TestCase{
.date = "19 Mar 2024",
.query = u"this Friday",
.expected_results = {{.primary_text = u"Mar 22"}},
},
// search for next Friday on Tuesday
TestCase{
.date = "19 Mar 2024",
.query = u"next Friday",
.expected_results = {{.primary_text = u"Mar 29",
.secondary_text = u"Friday next week"},
{.primary_text = u"Mar 22",
.secondary_text = u"this coming Friday"}},
},
// search for last Friday on Tuesday
TestCase{
.date = "19 Mar 2024",
.query = u"last Friday",
.expected_results = {{.primary_text = u"Mar 15"}},
},
// search for Tuesday on Friday
TestCase{
.date = "22 Mar 2024",
.query = u"Tuesday",
.expected_results = {{.primary_text = u"Mar 26",
.secondary_text = u"this coming Tuesday"},
{.primary_text = u"Mar 19",
.secondary_text = u"this past Tuesday"}},
},
// search for this Tuesday on Friday
TestCase{
.date = "22 Mar 2024",
.query = u"this Tuesday",
.expected_results = {{.primary_text = u"Mar 26",
.secondary_text = u"this coming Tuesday"},
{.primary_text = u"Mar 19",
.secondary_text = u"this past Tuesday"}},
},
// search for next Tuesday on Friday
TestCase{
.date = "22 Mar 2024",
.query = u"next Tuesday",
.expected_results = {{.primary_text = u"Mar 26"}},
},
// search for last Tuesday on Friday
TestCase{
.date = "22 Mar 2024",
.query = u"last Tuesday",
.expected_results = {{.primary_text = u"Mar 12",
.secondary_text = u"Tuesday last week"},
{.primary_text = u"Mar 19",
.secondary_text = u"this past Tuesday"}},
},
// search for Monday on Monday
TestCase{
.date = "18 Mar 2024",
.query = u"Monday",
.expected_results = {{.primary_text = u"Mar 18"}},
},
// search for this Monday on Monday
TestCase{
.date = "18 Mar 2024",
.query = u"this Monday",
.expected_results = {{.primary_text = u"Mar 18"}},
},
// search for next Monday on Monday
TestCase{
.date = "18 Mar 2024",
.query = u"next Monday",
.expected_results = {{.primary_text = u"Mar 25"}},
},
// search for last Monday on Monday
TestCase{
.date = "18 Mar 2024",
.query = u"last Monday",
.expected_results = {{.primary_text = u"Mar 11"}},
})));
Combine(Values("00:00", "12:00", "23:59"),
Values(
// No result
TestCase{
.date = "23 Jan 2000",
.query = u"abc",
.expected_results = {},
},
// Today
TestCase{
.date = "23 Jan 2000",
.query = u"today",
.expected_results = {MakeResult(u"Jan 23")},
},
// Yesterday
TestCase{
.date = "23 Jan 2000",
.query = u"yesterday",
.expected_results = {MakeResult(u"Jan 22")},
},
// Tomorrow
TestCase{
.date = "23 Jan 2000",
.query = u"tomorrow",
.expected_results = {MakeResult(u"Jan 24")},
},
// X days from now
TestCase{
.date = "23 Jan 2000",
.query = u"10 days from now",
.expected_results = {MakeResult(u"Feb 2")},
},
// X days ago
TestCase{
.date = "23 Jan 2000",
.query = u"five days ago",
.expected_results = {MakeResult(u"Jan 18")},
},
// X weeks from now
TestCase{
.date = "23 Jan 2000",
.query = u"three weeks from now",
.expected_results = {MakeResult(u"Feb 13")},
},
// X weeks ago
TestCase{
.date = "23 Jan 2000",
.query = u"2 weeks ago",
.expected_results = {MakeResult(u"Jan 9")},
},
// search for Friday on Tuesday
TestCase{
.date = "19 Mar 2024",
.query = u"Friday",
.expected_results = {MakeResult(u"Mar 22")},
},
// search for this Friday on Tuesday
TestCase{
.date = "19 Mar 2024",
.query = u"this Friday",
.expected_results = {MakeResult(u"Mar 22")},
},
// search for next Friday on Tuesday
TestCase{
.date = "19 Mar 2024",
.query = u"next Friday",
.expected_results =
{MakeResult(u"Mar 29", u"Friday next week"),
MakeResult(u"Mar 22", u"this coming Friday")},
},
// search for last Friday on Tuesday
TestCase{
.date = "19 Mar 2024",
.query = u"last Friday",
.expected_results = {MakeResult(u"Mar 15")},
},
// search for Tuesday on Friday
TestCase{
.date = "22 Mar 2024",
.query = u"Tuesday",
.expected_results =
{MakeResult(u"Mar 26", u"this coming Tuesday"),
MakeResult(u"Mar 19", u"this past Tuesday")},
},
// search for this Tuesday on Friday
TestCase{
.date = "22 Mar 2024",
.query = u"this Tuesday",
.expected_results =
{MakeResult(u"Mar 26", u"this coming Tuesday"),
MakeResult(u"Mar 19", u"this past Tuesday")},
},
// search for next Tuesday on Friday
TestCase{
.date = "22 Mar 2024",
.query = u"next Tuesday",
.expected_results = {MakeResult(u"Mar 26")},
},
// search for last Tuesday on Friday
TestCase{
.date = "22 Mar 2024",
.query = u"last Tuesday",
.expected_results =
{MakeResult(u"Mar 12", u"Tuesday last week"),
MakeResult(u"Mar 19", u"this past Tuesday")},
},
// search for Monday on Monday
TestCase{
.date = "18 Mar 2024",
.query = u"Monday",
.expected_results = {MakeResult(u"Mar 18")},
},
// search for this Monday on Monday
TestCase{
.date = "18 Mar 2024",
.query = u"this Monday",
.expected_results = {MakeResult(u"Mar 18")},
},
// search for next Monday on Monday
TestCase{
.date = "18 Mar 2024",
.query = u"next Monday",
.expected_results = {MakeResult(u"Mar 25")},
},
// search for last Monday on Monday
TestCase{
.date = "18 Mar 2024",
.query = u"last Monday",
.expected_results = {MakeResult(u"Mar 11")},
})));
TEST_P(PickerDateSearchTest, ReturnsExpectedDates) {
std::string_view time = std::get<0>(GetParam());

@ -25,7 +25,9 @@ std::optional<PickerSearchResult> PickerMathSearch(std::u16string_view query) {
std::optional<std::string> result =
fend_core::evaluate(base::UTF16ToUTF8(query));
if (result.has_value()) {
return PickerSearchResult::Text(base::UTF8ToUTF16(*result));
return PickerSearchResult::Text(
base::UTF8ToUTF16(*result),
PickerSearchResult::TextData::Source::kMath);
}
return std::nullopt;
}

@ -10,6 +10,7 @@
namespace ash {
namespace {
using ::testing::AllOf;
using ::testing::Field;
using ::testing::IsEmpty;
using ::testing::Not;
@ -34,10 +35,15 @@ TEST(MAYBE_PickerMathSearchTest, NoResult) {
TEST(MAYBE_PickerMathSearchTest, OnePlusOneEqualsTwo) {
EXPECT_THAT(
PickerMathSearch(u"1 + 1"),
Optional(Property(
"data", &PickerSearchResult::data,
VariantWith<PickerSearchResult::TextData>(Field(
"text", &PickerSearchResult::TextData::primary_text, u"2")))));
Optional(AllOf(
Property(
"data", &PickerSearchResult::data,
VariantWith<PickerSearchResult::TextData>(Field(
"text", &PickerSearchResult::TextData::primary_text, u"2"))),
Property("data", &PickerSearchResult::data,
VariantWith<PickerSearchResult::TextData>(
Field("source", &PickerSearchResult::TextData::source,
PickerSearchResult::TextData::Source::kMath))))));
}
TEST(PickerMathSearchTest, ReturnsExamples) {

@ -14,6 +14,23 @@
namespace ash {
PickerSearchResult::TextData::TextData(std::u16string primary_text,
std::u16string secondary_text,
ui::ImageModel icon,
Source source)
: primary_text(std::move(primary_text)),
secondary_text(std::move(secondary_text)),
icon(std::move(icon)),
source(source) {}
PickerSearchResult::TextData::TextData(const PickerSearchResult::TextData&) =
default;
PickerSearchResult::TextData& PickerSearchResult::TextData::operator=(
const PickerSearchResult::TextData&) = default;
PickerSearchResult::TextData::~TextData() = default;
bool PickerSearchResult::TextData::operator==(
const PickerSearchResult::TextData&) const = default;
@ -114,19 +131,19 @@ PickerSearchResult::PickerSearchResult(PickerSearchResult&&) = default;
PickerSearchResult& PickerSearchResult::operator=(PickerSearchResult&&) =
default;
PickerSearchResult PickerSearchResult::Text(std::u16string_view text) {
return PickerSearchResult(TextData{.primary_text = std::u16string(text),
.secondary_text = u"",
.icon = ui::ImageModel()});
PickerSearchResult PickerSearchResult::Text(std::u16string_view text,
TextData::Source source) {
return PickerSearchResult(
TextData(std::u16string(text), u"", ui::ImageModel(), source));
}
PickerSearchResult PickerSearchResult::Text(std::u16string_view primary_text,
std::u16string_view secondary_text,
ui::ImageModel icon) {
return PickerSearchResult(
TextData{.primary_text = std::u16string(primary_text),
.secondary_text = std::u16string(secondary_text),
.icon = std::move(icon)});
ui::ImageModel icon,
TextData::Source source) {
return PickerSearchResult(TextData(std::u16string(primary_text),
std::u16string(secondary_text),
std::move(icon), source));
}
PickerSearchResult PickerSearchResult::SearchRequest(std::u16string_view text,

@ -25,9 +25,27 @@ namespace ash {
class ASH_PUBLIC_EXPORT PickerSearchResult {
public:
struct TextData {
enum class Source {
kUnknown, // This should only be used for tests.
kDate,
kMath,
kCaseTransform,
kOmnibox,
};
std::u16string primary_text;
std::u16string secondary_text;
ui::ImageModel icon;
Source source;
TextData(std::u16string primary_text,
std::u16string secondary_text,
ui::ImageModel icon,
Source source);
TextData(const TextData&);
TextData& operator=(const TextData&);
~TextData();
bool operator==(const TextData&) const;
};
@ -179,10 +197,14 @@ class ASH_PUBLIC_EXPORT PickerSearchResult {
static PickerSearchResult BrowsingHistory(const GURL& url,
std::u16string title,
ui::ImageModel icon);
static PickerSearchResult Text(std::u16string_view text);
static PickerSearchResult Text(std::u16string_view primary_text,
std::u16string_view secondary_text,
ui::ImageModel icon);
static PickerSearchResult Text(
std::u16string_view text,
TextData::Source source = TextData::Source::kUnknown);
static PickerSearchResult Text(
std::u16string_view primary_text,
std::u16string_view secondary_text,
ui::ImageModel icon,
TextData::Source source = TextData::Source::kUnknown);
static PickerSearchResult SearchRequest(std::u16string_view text,
ui::ImageModel icon);
static PickerSearchResult Emoji(std::u16string_view emoji);

@ -128,8 +128,9 @@ std::vector<ash::PickerSearchResult> ConvertSearchResults(
picker_results.push_back(ash::PickerSearchResult::BrowsingHistory(
*result_url, result->title(), result->icon().icon));
} else {
picker_results.push_back(
ash::PickerSearchResult::Text(result->title()));
picker_results.push_back(ash::PickerSearchResult::Text(
result->title(),
ash::PickerSearchResult::TextData::Source::kOmnibox));
}
break;
}