| // Copyright 2020 The Chromium Authors |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #include "components/omnibox/browser/voice_suggest_provider.h" |
| |
| #include <memory> |
| |
| #include "base/test/task_environment.h" |
| #include "build/build_config.h" |
| #include "components/omnibox/browser/autocomplete_enums.h" |
| #include "components/omnibox/browser/fake_autocomplete_provider_client.h" |
| #include "testing/gmock/include/gmock/gmock.h" |
| #include "testing/gtest/include/gtest/gtest.h" |
| |
| class VoiceSuggestProviderTest : public testing::Test { |
| public: |
| VoiceSuggestProviderTest() = default; |
| VoiceSuggestProviderTest(const VoiceSuggestProviderTest&) = delete; |
| VoiceSuggestProviderTest& operator=(const VoiceSuggestProviderTest&) = delete; |
| |
| void SetUp() override; |
| |
| protected: |
| base::test::TaskEnvironment environment_; |
| FakeAutocompleteProviderClient client_; |
| scoped_refptr<VoiceSuggestProvider> provider_; |
| std::unique_ptr<AutocompleteInput> input_; |
| }; |
| |
| void VoiceSuggestProviderTest::SetUp() { |
| provider_ = base::MakeRefCounted<VoiceSuggestProvider>(&client_); |
| input_ = std::make_unique<AutocompleteInput>( |
| std::u16string(), metrics::OmniboxEventProto::OTHER, |
| TestSchemeClassifier()); |
| } |
| |
| TEST_F(VoiceSuggestProviderTest, ServesNoSuggestionsByDefault) { |
| provider_->Start(*input_, false); |
| EXPECT_TRUE(provider_->matches().empty()); |
| } |
| |
| TEST_F(VoiceSuggestProviderTest, ServesSuppliedVoiceSuggestions) { |
| provider_->AddVoiceSuggestion(u"Alice", 0.6f); |
| provider_->AddVoiceSuggestion(u"Bob", 0.5f); |
| provider_->AddVoiceSuggestion(u"Carol", 0.4f); |
| provider_->Start(*input_, false); |
| |
| ASSERT_EQ(3U, provider_->matches().size()); |
| EXPECT_EQ(u"Alice", provider_->matches()[0].contents); |
| EXPECT_EQ(u"Bob", provider_->matches()[1].contents); |
| EXPECT_EQ(u"Carol", provider_->matches()[2].contents); |
| } |
| |
| TEST_F(VoiceSuggestProviderTest, ConfidenceScoreImpliesOrdering) { |
| provider_->AddVoiceSuggestion(u"Carol", 0.4f); |
| provider_->AddVoiceSuggestion(u"Bob", 0.5f); |
| provider_->AddVoiceSuggestion(u"Alice", 0.6f); |
| provider_->Start(*input_, false); |
| |
| ASSERT_EQ(3U, provider_->matches().size()); |
| EXPECT_EQ(u"Alice", provider_->matches()[0].contents); |
| EXPECT_EQ(u"Bob", provider_->matches()[1].contents); |
| EXPECT_EQ(u"Carol", provider_->matches()[2].contents); |
| } |
| |
| TEST_F(VoiceSuggestProviderTest, |
| VoiceSuggestionsAreNotReusedInSubsequentRequests) { |
| provider_->AddVoiceSuggestion(u"Alice", 0.6f); |
| provider_->AddVoiceSuggestion(u"Bob", 0.5f); |
| provider_->AddVoiceSuggestion(u"Carol", 0.4f); |
| provider_->Start(*input_, false); |
| provider_->Stop(AutocompleteStopReason::kClobbered); |
| provider_->Start(*input_, false); |
| |
| EXPECT_TRUE(provider_->matches().empty()); |
| } |
| |
| TEST_F(VoiceSuggestProviderTest, ClearCachePurgesAvailableVoiceSuggestions) { |
| provider_->AddVoiceSuggestion(u"Alice", 0.6f); |
| provider_->AddVoiceSuggestion(u"Bob", 0.5f); |
| provider_->AddVoiceSuggestion(u"Carol", 0.4f); |
| provider_->ClearCache(); |
| provider_->Start(*input_, false); |
| |
| EXPECT_TRUE(provider_->matches().empty()); |
| } |
| |
| TEST_F(VoiceSuggestProviderTest, MatchesWithSameScoresAreNotDropped) { |
| provider_->AddVoiceSuggestion(u"Alice", 0.6f); |
| provider_->AddVoiceSuggestion(u"Bob", 0.6f); |
| provider_->AddVoiceSuggestion(u"Carol", 0.6f); |
| provider_->Start(*input_, false); |
| |
| ASSERT_EQ(3U, provider_->matches().size()); |
| EXPECT_EQ(u"Alice", provider_->matches()[0].contents); |
| EXPECT_EQ(u"Bob", provider_->matches()[1].contents); |
| EXPECT_EQ(u"Carol", provider_->matches()[2].contents); |
| } |
| |
| TEST_F(VoiceSuggestProviderTest, DuplicateMatchesAreMerged) { |
| provider_->AddVoiceSuggestion(u"Alice", 0.6f); |
| provider_->AddVoiceSuggestion(u"Bob", 0.5f); |
| provider_->AddVoiceSuggestion(u"Bob", 0.4f); |
| provider_->Start(*input_, false); |
| |
| ASSERT_EQ(2U, provider_->matches().size()); |
| EXPECT_EQ(u"Alice", provider_->matches()[0].contents); |
| EXPECT_EQ(u"Bob", provider_->matches()[1].contents); |
| } |
| |
| TEST_F(VoiceSuggestProviderTest, HighConfidenceScoreDropsAlternatives) { |
| provider_->AddVoiceSuggestion(u"Alice", 0.9f); |
| provider_->AddVoiceSuggestion(u"Bob", 0.5f); |
| provider_->AddVoiceSuggestion(u"Carol", 0.4f); |
| provider_->Start(*input_, false); |
| |
| ASSERT_EQ(1U, provider_->matches().size()); |
| EXPECT_EQ(u"Alice", provider_->matches()[0].contents); |
| } |
| |
| TEST_F(VoiceSuggestProviderTest, LowConfidenceScoresAreRejected) { |
| provider_->AddVoiceSuggestion(u"Alice", 0.35f); |
| provider_->AddVoiceSuggestion(u"Bob", 0.25f); |
| provider_->AddVoiceSuggestion(u"Carol", 0.2f); |
| provider_->Start(*input_, false); |
| |
| ASSERT_EQ(1U, provider_->matches().size()); |
| EXPECT_EQ(u"Alice", provider_->matches()[0].contents); |
| } |
| |
| TEST_F(VoiceSuggestProviderTest, VoiceSuggestionResultsCanBeLimited) { |
| provider_->AddVoiceSuggestion(u"Alice", 0.75f); |
| provider_->AddVoiceSuggestion(u"Bob", 0.65f); |
| provider_->AddVoiceSuggestion(u"Carol", 0.55f); |
| provider_->AddVoiceSuggestion(u"Dave", 0.45f); |
| provider_->AddVoiceSuggestion(u"Eve", 0.35f); |
| provider_->Start(*input_, false); |
| |
| ASSERT_EQ(3U, provider_->matches().size()); |
| EXPECT_EQ(u"Alice", provider_->matches()[0].contents); |
| EXPECT_EQ(u"Bob", provider_->matches()[1].contents); |
| EXPECT_EQ(u"Carol", provider_->matches()[2].contents); |
| } |