// Copyright 2018 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
// Unit tests for the TTS platform implementation in Chrome OS.
#include "chrome/browser/speech/tts_chromeos.h"
#include "base/values.h"
#include "chrome/common/extensions/extension_constants.h"
#include "content/public/browser/tts_controller.h"
#include "testing/gtest/include/gtest/gtest.h"
class TtsChromeosTest : public testing::Test {
public:
TtsPlatformImplChromeOs* impl() { return &impl_; }
private:
TtsPlatformImplChromeOs impl_;
};
TEST_F(TtsChromeosTest, TestGetVoices) {
TtsPlatformImplChromeOs* tts_chromeos =
TtsPlatformImplChromeOs::GetInstance();
// ARC++ (which supplies the voices for CHrome OS's tts platform), is
// unavailable here.
EXPECT_FALSE(tts_chromeos->PlatformImplSupported());
// Returns true to not interfere with tts controller queueing.
EXPECT_TRUE(tts_chromeos->PlatformImplInitialized());
std::unique_ptr<std::vector<content::VoiceData>> voices =
std::make_unique<std::vector<content::VoiceData>>();
tts_chromeos->GetVoices(voices.get());
EXPECT_TRUE(voices->empty());
}
TEST_F(TtsChromeosTest, PrefersGoogleTtsVoices) {
std::vector<content::VoiceData> voices(3);
voices[0].name = "google";
voices[0].engine_id = extension_misc::kGoogleSpeechSynthesisExtensionId;
voices[1].name = "Platform";
voices[1].native = true;
voices[2].name = "Espeak";
voices[2].engine_id = extension_misc::kEspeakSpeechSynthesisExtensionId;
impl()->FinalizeVoiceOrdering(voices);
ASSERT_EQ(3U, voices.size());
EXPECT_EQ(extension_misc::kGoogleSpeechSynthesisExtensionId,
voices[0].engine_id);
EXPECT_TRUE(voices[1].native);
EXPECT_EQ(extension_misc::kEspeakSpeechSynthesisExtensionId,
voices[2].engine_id);
// Swap Google with Platform.
std::iter_swap(voices.begin(), voices.begin() + 1);
// Finalize it again.
impl()->FinalizeVoiceOrdering(voices);
// Back to original ordering.
EXPECT_EQ(extension_misc::kGoogleSpeechSynthesisExtensionId,
voices[0].engine_id);
EXPECT_TRUE(voices[1].native);
EXPECT_EQ(extension_misc::kEspeakSpeechSynthesisExtensionId,
voices[2].engine_id);
// Swap Google with Espeak.
std::iter_swap(voices.begin(), voices.begin() + 2);
// Finalize it again.
impl()->FinalizeVoiceOrdering(voices);
// Back to original ordering.
EXPECT_EQ(extension_misc::kGoogleSpeechSynthesisExtensionId,
voices[0].engine_id);
EXPECT_TRUE(voices[1].native);
EXPECT_EQ(extension_misc::kEspeakSpeechSynthesisExtensionId,
voices[2].engine_id);
// Rotate to get Platform, Espeak, Google.
std::rotate(voices.begin(), voices.begin() + 1, voices.end());
// Finalize it again.
impl()->FinalizeVoiceOrdering(voices);
// Back to original ordering.
EXPECT_EQ(extension_misc::kGoogleSpeechSynthesisExtensionId,
voices[0].engine_id);
EXPECT_TRUE(voices[1].native);
EXPECT_EQ(extension_misc::kEspeakSpeechSynthesisExtensionId,
voices[2].engine_id);
}