blob: 3a946aedb286c154253ab0ee9b965c132f571164 [file] [log] [blame]
// 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.
#include "components/translate/content/browser/partial_translate_manager.h"
#include "base/functional/callback_helpers.h"
#include "base/memory/raw_ptr.h"
#include "components/touch_to_search/core/browser/contextual_search_delegate.h"
#include "components/touch_to_search/core/browser/resolved_search_term.h"
#include "testing/gtest/include/gtest/gtest.h"
namespace {
class FakeContextualSearchDelegate : public ContextualSearchDelegate {
public:
void GatherAndSaveSurroundingText(
base::WeakPtr<ContextualSearchContext> contextual_search_context,
content::WebContents* web_contents,
SurroundingTextCallback callback) override {
// Unused.
}
void StartSearchTermResolutionRequest(
base::WeakPtr<ContextualSearchContext> contextual_search_context,
content::WebContents* web_contents,
ContextualSearchDelegate::SearchTermResolutionCallback callback)
override {
context_ = contextual_search_context;
search_term_callback_ = std::move(callback);
}
const ContextualSearchContext& GetContext() { return *context_; }
void RunSearchTermCallback(const ResolvedSearchTerm& resolved_search_term) {
search_term_callback_.Run(resolved_search_term);
}
private:
base::WeakPtr<ContextualSearchContext> context_;
ContextualSearchDelegate::SearchTermResolutionCallback search_term_callback_;
};
class PartialTranslateManagerTest : public testing::Test {
public:
PartialTranslateManagerTest() = default;
void SetUp() override {
auto delegate = std::make_unique<FakeContextualSearchDelegate>();
delegate_ = delegate.get();
manager_ = std::make_unique<PartialTranslateManager>(std::move(delegate));
}
void TearDown() override {}
protected:
std::unique_ptr<PartialTranslateManager> manager_;
// Owned by manager_.
raw_ptr<FakeContextualSearchDelegate> delegate_;
};
TEST_F(PartialTranslateManagerTest, CreateContext) {
PartialTranslateRequest request;
request.selection_text = u"Selected text";
request.selection_encoding = "UTF16";
request.source_language = "en-US";
request.target_language = "ja-JP";
request.apply_lang_hint = true;
manager_->StartPartialTranslate(nullptr, request, base::DoNothing());
const ContextualSearchContext& context = delegate_->GetContext();
ASSERT_EQ(context.GetRequestType(),
ContextualSearchContext::RequestType::PARTIAL_TRANSLATE);
ASSERT_EQ(context.GetSurroundingText(), u"Selected text");
ASSERT_EQ(context.GetTranslationLanguages().detected_language, "en-US");
ASSERT_EQ(context.GetTranslationLanguages().target_language, "ja-JP");
ASSERT_TRUE(context.GetApplyLangHint());
}
TEST_F(PartialTranslateManagerTest, CreateResponse) {
PartialTranslateRequest request;
request.selection_text = u"Selected text";
request.selection_encoding = "UTF16";
request.source_language = "en-US";
request.target_language = "ja-JP";
PartialTranslateResponse response;
PartialTranslateManager::PartialTranslateCallback callback = base::BindOnce(
[](PartialTranslateResponse* out_response,
const PartialTranslateResponse& in_response) {
*out_response = in_response;
},
&response);
manager_->StartPartialTranslate(nullptr, request, std::move(callback));
ResolvedSearchTerm resolved_search_term(
/*is_invalid=*/false,
/*response_code=*/200,
/*search_term=*/"",
/*display_text=*/"",
/*alternate_term=*/"",
/*mid=*/"",
/*prevent_preload=*/false,
/*selection_start_adjust=*/0,
/*selection_end_adjust=*/0,
/*context_language=*/"en-CA",
/*thumbnail_url=*/"",
/*caption=*/"Translated",
/*quick_action_uri=*/"",
/*quick_action_category=*/QUICK_ACTION_CATEGORY_NONE,
/*search_url_full=*/"",
/*search_url_preload=*/"",
/*coca_card_tag=*/200,
/*related_searches_json=*/"");
delegate_->RunSearchTermCallback(resolved_search_term);
ASSERT_EQ(response.translated_text, u"Translated");
ASSERT_EQ(response.source_language, "en-CA");
ASSERT_EQ(response.target_language, "ja-JP");
}
TEST_F(PartialTranslateManagerTest, SubsumeRequest) {
bool first_ran = false;
PartialTranslateManager::PartialTranslateCallback first_callback =
base::BindOnce(
[](bool* callback_ran, const PartialTranslateResponse&) {
*callback_ran = true;
},
&first_ran);
bool second_ran = false;
PartialTranslateManager::PartialTranslateCallback second_callback =
base::BindOnce(
[](bool* callback_ran, const PartialTranslateResponse&) {
*callback_ran = true;
},
&second_ran);
manager_->StartPartialTranslate(nullptr, PartialTranslateRequest(),
std::move(first_callback));
// Start another request before the first one returns.
manager_->StartPartialTranslate(nullptr, PartialTranslateRequest(),
std::move(second_callback));
ASSERT_FALSE(first_ran);
ASSERT_FALSE(second_ran);
delegate_->RunSearchTermCallback(ResolvedSearchTerm(200));
ASSERT_FALSE(first_ran);
ASSERT_TRUE(second_ran);
}
} // namespace