| // Copyright 2022 The Chromium Authors |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #ifndef COMPONENTS_OMNIBOX_BROWSER_FAKE_AUTOCOMPLETE_CONTROLLER_H_ |
| #define COMPONENTS_OMNIBOX_BROWSER_FAKE_AUTOCOMPLETE_CONTROLLER_H_ |
| |
| #include <memory> |
| #include <string> |
| #include <vector> |
| |
| #include "base/memory/raw_ptr.h" |
| #include "base/test/task_environment.h" |
| #include "components/omnibox/browser/autocomplete_controller.h" |
| #include "components/omnibox/browser/autocomplete_match_type.h" |
| #include "components/omnibox/browser/fake_autocomplete_provider.h" |
| |
| class FakeAutocompleteControllerObserver |
| : public AutocompleteController::Observer { |
| public: |
| void OnResultChanged(AutocompleteController* controller, |
| bool default_match_changed) override; |
| void OnAutocompleteStopTimerTriggered( |
| const AutocompleteInput& input) override; |
| int on_result_changed_call_count_ = 0; |
| bool last_default_match_changed = false; |
| int on_autocomplete_stop_timer_stopped_call_count = 0; |
| }; |
| |
| class FakeAutocompleteController : public AutocompleteController { |
| public: |
| FakeAutocompleteController( |
| raw_ptr<base::test::SingleThreadTaskEnvironment> task_environment); |
| ~FakeAutocompleteController() override; |
| |
| // Getter for `providers_`. |
| template <typename T = FakeAutocompleteProvider> |
| T& GetFakeProvider(size_t index = 0) { |
| DCHECK_LT(index, providers_.size()); |
| return *static_cast<T*>(providers_[index].get()); |
| } |
| |
| // Helper to create `AutocompleteInput`. |
| static AutocompleteInput CreateInput( |
| std::u16string text, |
| bool omit_async = false, |
| bool prevent_inline_autocomplete = false); |
| |
| // Simulates an autocomplete pass. |
| // - Also verifies exactly 1 notification occurs after the pass, at the |
| // correct time (which depends on the type of pass simulated), and no |
| // additional notification occurred. This means `SimulateAutocompletePass()` |
| // waits for the notification. So if the test needs to interrupt the |
| // notification, it can't use `SimulateAutocompletePass()`. |
| // - Returns the match contents. |
| // - Does not reset `internal_result_`. Can be used to simulate a sequence |
| // of passes. |
| // - `input` is only used if `sync` is true. |
| std::vector<std::string> SimulateAutocompletePass( |
| bool sync, |
| bool done, |
| std::vector<AutocompleteMatch> matches, |
| AutocompleteInput input = CreateInput(u"test")); |
| |
| // Simulates a `kSyncPassOnly` (the simplest pass) with a clean |
| // `internal_result_`. See `SimulateAutocompletePass()`'s comment. |
| std::vector<std::string> SimulateCleanAutocompletePass( |
| std::vector<AutocompleteMatch> matches); |
| |
| // Simulates the expire pass. |
| // - Also verifies exactly 1 notification occur at the correct time, and no |
| // additional notification occurred. This means `SimulateExpirePass()` waits |
| // for the notification. So if the test needs to interrupt the notification, |
| // it can't use `SimulateExpirePass()`. |
| // - Returns the match contents. |
| std::vector<std::string> SimulateExpirePass(); |
| |
| // Helper to get minimal representation of the controller results: a vector of |
| // each match's contents. |
| std::vector<std::string> GetResultContents(bool published); |
| |
| // Verifies the controller sends a single notification at `delay_ms`, and no |
| // notification before. |
| void ExpectOnResultChanged( |
| int delay_ms, |
| AutocompleteController::UpdateType last_update_type); |
| |
| // Verifies the controller stops after `delay_ms` with no notification. |
| // `explicit_stop` is whether the stop was user triggered, rather than the |
| // stop timer triggering `Stop()`. |
| void ExpectStopAfter(int delay_ms, bool explicit_stop = false); |
| |
| // Verifies neither a notification nor stop occur. |
| void ExpectNoNotificationOrStop(); |
| |
| // AutocompleteController (structs): |
| using AutocompleteController::OldResult; |
| |
| // AutocompleteController (methods): |
| using AutocompleteController::CheckWhetherDefaultMatchChanged; |
| using AutocompleteController::MaybeRemoveCompanyEntityImages; |
| using AutocompleteController::ShouldRunProvider; |
| using AutocompleteController::UpdateAssociatedKeywords; |
| using AutocompleteController::UpdateResult; |
| using AutocompleteController::UpdateSearchboxStats; |
| using AutocompleteController::UpdateShownInSession; |
| |
| // AutocompleteController (fields): |
| using AutocompleteController::input_; |
| using AutocompleteController::internal_result_; |
| using AutocompleteController::keyword_provider_; |
| using AutocompleteController::last_time_default_match_changed_; |
| using AutocompleteController::last_update_type_; |
| using AutocompleteController::metrics_; |
| using AutocompleteController::providers_; |
| using AutocompleteController::published_result_; |
| using AutocompleteController::template_url_service_; |
| |
| // Used to verify the correct number of notifications occur. |
| std::unique_ptr<FakeAutocompleteControllerObserver> observer_; |
| // Used to simulate time passing. |
| raw_ptr<base::test::SingleThreadTaskEnvironment> task_environment_; |
| }; |
| |
| #endif // COMPONENTS_OMNIBOX_BROWSER_FAKE_AUTOCOMPLETE_CONTROLLER_H_ |