// Copyright 2020 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/soda_proto_mojom_conversion.h"

namespace ml {

using speech::soda::chrome::SodaResponse;

TEST(SodaProtoMojomConversionTest, AudioLevelsTest) {
  SodaResponse response;
  response.set_soda_type(SodaResponse::AUDIO_LEVEL);
  response.mutable_audio_level_info()->set_audio_level(0.1);
  response.mutable_audio_level_info()->set_rms(0.3);
  auto actual_audio_mojom = internal::AudioLevelEventFromProto(response);

  auto expected_audio_mojom =
      chromeos::machine_learning::mojom::AudioLevelEvent::New();
  expected_audio_mojom->rms = 0.3;
  expected_audio_mojom->audio_level = 0.1;

  EXPECT_TRUE(actual_audio_mojom.Equals(expected_audio_mojom));

  // now for the full mojom
  auto actual_mojom = SpeechRecognizerEventFromProto(response);
  chromeos::machine_learning::mojom::SpeechRecognizerEventPtr expected_mojom =
      chromeos::machine_learning::mojom::SpeechRecognizerEvent::New();
  expected_mojom->set_audio_event(std::move(expected_audio_mojom));
  EXPECT_TRUE(actual_mojom.Equals(expected_mojom));

  // Let's check the other tests.
  EXPECT_FALSE(IsStopSodaResponse(response));
  EXPECT_FALSE(IsStartSodaResponse(response));
  EXPECT_FALSE(IsShutdownSodaResponse(response));
}

TEST(SodaProtoMojomConversionTest, PartialResultsTest) {
  SodaResponse response;
  response.set_soda_type(SodaResponse::RECOGNITION);
  auto* rec = response.mutable_recognition_result();
  rec->add_hypothesis("first hyp");
  rec->add_hypothesis("second hyp");
  rec->set_result_type(speech::soda::chrome::SodaRecognitionResult::PARTIAL);

  auto expected_rec_mojom =
      chromeos::machine_learning::mojom::PartialResult::New();
  expected_rec_mojom->partial_text.push_back("first hyp");
  expected_rec_mojom->partial_text.push_back("second hyp");
  auto actual_rec_mojom = internal::PartialResultFromProto(response);
  EXPECT_TRUE(actual_rec_mojom.Equals(expected_rec_mojom));

  // now for the full mojom
  auto actual_mojom = SpeechRecognizerEventFromProto(response);
  chromeos::machine_learning::mojom::SpeechRecognizerEventPtr expected_mojom =
      chromeos::machine_learning::mojom::SpeechRecognizerEvent::New();
  expected_mojom->set_partial_result(std::move(actual_rec_mojom));
  EXPECT_TRUE(actual_mojom.Equals(expected_mojom));

  // Let's check the other tests.
  EXPECT_FALSE(IsStopSodaResponse(response));
  EXPECT_FALSE(IsStartSodaResponse(response));
  EXPECT_FALSE(IsShutdownSodaResponse(response));
}

TEST(SodaProtoMojomConversionTest, PrefetchResultsTest) {
  // We decided to treat a PREFETCH as a Partial.
  SodaResponse response;
  response.set_soda_type(SodaResponse::RECOGNITION);
  auto* rec = response.mutable_recognition_result();
  rec->add_hypothesis("first hyp");
  rec->add_hypothesis("second hyp");
  rec->set_result_type(speech::soda::chrome::SodaRecognitionResult::PREFETCH);

  auto expected_rec_mojom =
      chromeos::machine_learning::mojom::PartialResult::New();
  expected_rec_mojom->partial_text.push_back("first hyp");
  expected_rec_mojom->partial_text.push_back("second hyp");
  auto actual_rec_mojom = internal::PartialResultFromPrefetchProto(response);
  EXPECT_TRUE(actual_rec_mojom.Equals(expected_rec_mojom));

  // now for the full mojom
  auto actual_mojom = SpeechRecognizerEventFromProto(response);
  chromeos::machine_learning::mojom::SpeechRecognizerEventPtr expected_mojom =
      chromeos::machine_learning::mojom::SpeechRecognizerEvent::New();
  expected_mojom->set_partial_result(std::move(actual_rec_mojom));
  EXPECT_TRUE(actual_mojom.Equals(expected_mojom));

  // Let's check the other tests.
  EXPECT_FALSE(IsStopSodaResponse(response));
  EXPECT_FALSE(IsStartSodaResponse(response));
  EXPECT_FALSE(IsShutdownSodaResponse(response));
}

TEST(SodaProtoMojomConversionTest, FinalResultsWithHypPartTest) {
  SodaResponse response;
  response.set_soda_type(SodaResponse::RECOGNITION);
  auto* rec = response.mutable_recognition_result();
  rec->add_hypothesis("first, hypo.");
  rec->add_hypothesis("second hypo");
  rec->set_result_type(speech::soda::chrome::SodaRecognitionResult::FINAL);
  // Add the hyp parts.
  auto* hyp_part = rec->add_hypothesis_part();
  hyp_part->add_text("first,");
  hyp_part->add_text("first");
  hyp_part->set_alignment_ms(0);

  hyp_part = rec->add_hypothesis_part();
  hyp_part->add_text("hypo.");
  hyp_part->add_text("hypo");
  hyp_part->set_alignment_ms(50);

  auto expected_rec_mojom =
      chromeos::machine_learning::mojom::FinalResult::New();
  expected_rec_mojom->final_hypotheses.push_back("first, hypo.");
  expected_rec_mojom->final_hypotheses.push_back("second hypo");
  expected_rec_mojom->hypothesis_part.emplace();
  auto part = chromeos::machine_learning::mojom::HypothesisPartInResult::New();
  part->text.push_back("first,");
  part->text.push_back("first");
  part->alignment = base::TimeDelta::FromMilliseconds(0);
  expected_rec_mojom->hypothesis_part->push_back(std::move(part));
  part = chromeos::machine_learning::mojom::HypothesisPartInResult::New();
  part->text.push_back("hypo.");
  part->text.push_back("hypo");
  part->alignment = base::TimeDelta::FromMilliseconds(50);
  expected_rec_mojom->hypothesis_part->push_back(std::move(part));

  auto actual_rec_mojom = internal::FinalResultFromProto(response);
  EXPECT_TRUE(actual_rec_mojom.Equals(expected_rec_mojom));
}

TEST(SodaProtoMojomConversionTest, FinalResultsTest) {
  SodaResponse response;
  response.set_soda_type(SodaResponse::RECOGNITION);
  auto* rec = response.mutable_recognition_result();
  rec->add_hypothesis("first hypo");
  rec->add_hypothesis("second hypo");
  rec->set_result_type(speech::soda::chrome::SodaRecognitionResult::FINAL);

  auto expected_rec_mojom =
      chromeos::machine_learning::mojom::FinalResult::New();
  expected_rec_mojom->final_hypotheses.push_back("first hypo");
  expected_rec_mojom->final_hypotheses.push_back("second hypo");
  auto actual_rec_mojom = internal::FinalResultFromProto(response);
  EXPECT_TRUE(actual_rec_mojom.Equals(expected_rec_mojom));

  // now for the full mojom
  auto actual_mojom = SpeechRecognizerEventFromProto(response);
  chromeos::machine_learning::mojom::SpeechRecognizerEventPtr expected_mojom =
      chromeos::machine_learning::mojom::SpeechRecognizerEvent::New();
  expected_mojom->set_final_result(std::move(actual_rec_mojom));
  EXPECT_TRUE(actual_mojom.Equals(expected_mojom));

  // Let's check the other tests.
  EXPECT_FALSE(IsStopSodaResponse(response));
  EXPECT_FALSE(IsStartSodaResponse(response));
  EXPECT_FALSE(IsShutdownSodaResponse(response));
}

TEST(SodaProtoMojomConversionTest, EndpointTest) {
  SodaResponse response;
  response.set_soda_type(SodaResponse::ENDPOINT);
  auto* end = response.mutable_endpoint_event();
  end->set_endpoint_type(
      speech::soda::chrome::SodaEndpointEvent::END_OF_SPEECH);

  auto expected_end_mojom =
      chromeos::machine_learning::mojom::EndpointerEvent::New();
  expected_end_mojom->endpointer_type =
      chromeos::machine_learning::mojom::EndpointerType::END_OF_SPEECH;
  auto actual_end_mojom = internal::EndpointerEventFromProto(response);
  EXPECT_TRUE(actual_end_mojom.Equals(expected_end_mojom));

  // now for the full mojom
  auto actual_mojom = SpeechRecognizerEventFromProto(response);
  chromeos::machine_learning::mojom::SpeechRecognizerEventPtr expected_mojom =
      chromeos::machine_learning::mojom::SpeechRecognizerEvent::New();
  expected_mojom->set_endpointer_event(std::move(actual_end_mojom));
  EXPECT_TRUE(actual_mojom.Equals(expected_mojom));

  // Let's check the other tests.
  EXPECT_FALSE(IsStopSodaResponse(response));
  EXPECT_FALSE(IsStartSodaResponse(response));
  EXPECT_FALSE(IsShutdownSodaResponse(response));
}

TEST(SodaProtoMojomConversionTest, BooleanFunctionTest) {
  SodaResponse response;

  response.set_soda_type(SodaResponse::STOP);
  EXPECT_TRUE(IsStopSodaResponse(response));
  EXPECT_FALSE(IsStartSodaResponse(response));
  EXPECT_FALSE(IsShutdownSodaResponse(response));

  response.set_soda_type(SodaResponse::START);
  EXPECT_FALSE(IsStopSodaResponse(response));
  EXPECT_TRUE(IsStartSodaResponse(response));
  EXPECT_FALSE(IsShutdownSodaResponse(response));

  response.set_soda_type(SodaResponse::SHUTDOWN);
  EXPECT_FALSE(IsStopSodaResponse(response));
  EXPECT_FALSE(IsStartSodaResponse(response));
  EXPECT_TRUE(IsShutdownSodaResponse(response));
}

}  // namespace ml
