// Copyright 2021 The Chromium OS Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#include <gtest/gtest.h>
#include <string>
#include <utility>

#include "ml/text_suggester_proto_mojom_conversion.h"

namespace ml {
namespace {

using ::chromeos::machine_learning::mojom::NextWordCompletionCandidate;
using ::chromeos::machine_learning::mojom::NextWordCompletionCandidatePtr;
using ::chromeos::machine_learning::mojom::TextSuggesterQuery;
using ::chromeos::machine_learning::mojom::TextSuggesterQueryPtr;
using ::chromeos::machine_learning::mojom::TextSuggesterResult;
using ::chromeos::machine_learning::mojom::TextSuggesterResultPtr;

TEST(TextSuggesterMojomConversionTest, QueryMojomToRequestProto) {
  TextSuggesterQueryPtr query = TextSuggesterQuery::New();
  query->text = "how are y";

  const chrome_knowledge::TextSuggesterRequest request_proto =
      TextSuggesterQueryToProto(std::move(query));

  EXPECT_EQ(request_proto.text(), "how are y");
  EXPECT_EQ(request_proto.next_word_candidates_size(), 0);
}

TEST(TextSuggesterMojomConversionTest,
     QueryMojomToRequestProtoWithNextWordCandidates) {
  TextSuggesterQueryPtr query = TextSuggesterQuery::New();
  query->text = "how are y";

  NextWordCompletionCandidatePtr candidate_one =
      NextWordCompletionCandidate::New();
  candidate_one->text = "you";
  candidate_one->normalized_score = 0.15f;
  query->next_word_candidates.push_back(std::move(candidate_one));

  NextWordCompletionCandidatePtr candidate_two =
      NextWordCompletionCandidate::New();
  candidate_two->text = "your";
  candidate_two->normalized_score = 0.4f;
  query->next_word_candidates.push_back(std::move(candidate_two));

  const chrome_knowledge::TextSuggesterRequest request_proto =
      TextSuggesterQueryToProto(std::move(query));

  EXPECT_EQ(request_proto.text(), "how are y");
  ASSERT_EQ(request_proto.next_word_candidates_size(), 2);
  EXPECT_EQ(request_proto.next_word_candidates(0).text(), "you");
  EXPECT_EQ(request_proto.next_word_candidates(0).normalized_score(), 0.15f);
  EXPECT_EQ(request_proto.next_word_candidates(1).text(), "your");
  EXPECT_EQ(request_proto.next_word_candidates(1).normalized_score(), 0.4f);
}

TEST(TextSuggesterMojomConversionTest, ResultProtoToResultMojom) {
  chrome_knowledge::TextSuggesterResult result_proto;

  chrome_knowledge::TextSuggestionCandidate* candidate_one =
      result_proto.add_candidates();
  chrome_knowledge::MultiWordSuggestionCandidate* multi_word_candidate_one =
      candidate_one->mutable_multi_word();
  multi_word_candidate_one->set_text("you doing");
  multi_word_candidate_one->set_normalized_score(0.15f);

  chrome_knowledge::TextSuggestionCandidate* candidate_two =
      result_proto.add_candidates();
  chrome_knowledge::MultiWordSuggestionCandidate* multi_word_candidate_two =
      candidate_two->mutable_multi_word();
  multi_word_candidate_two->set_text("you going");
  multi_word_candidate_two->set_normalized_score(0.35f);

  TextSuggesterResultPtr result = TextSuggesterResultFromProto(result_proto);

  EXPECT_EQ(result->status, TextSuggesterResult::Status::OK);
  ASSERT_EQ(result->candidates.size(), 2);
  EXPECT_TRUE(result->candidates[0]->is_multi_word());
  EXPECT_EQ(result->candidates[0]->get_multi_word()->text, "you doing");
  EXPECT_EQ(result->candidates[0]->get_multi_word()->normalized_score, 0.15f);
  EXPECT_TRUE(result->candidates[1]->is_multi_word());
  EXPECT_EQ(result->candidates[1]->get_multi_word()->text, "you going");
  EXPECT_EQ(result->candidates[1]->get_multi_word()->normalized_score, 0.35f);
}

}  // namespace
}  // namespace ml
