#include <gtest/gtest.h>
#include <Ecore.h>
#include <system_info.h>
+#include <tzplatform_config.h>
#include <tts.h>
#include <tts_internal.h>
the front-end. The back-end?often referred to as the synthesizer?then converts the symbolic linguistic representation into sound. In certain systems, this part includes the computation \
of the target prosody (pitch contour, phoneme durations),[4] which is then imposed on the output speech. From Wikipedia";
+static const int g_sample_rate = 24000;
+
static bool __tts_supported_voice_cb(tts_h tts, const char* language, int voice_type, void* user_data)
{
return true;
EXPECT_EQ(ret, TTS_ERROR_NONE);
}
+
+/**
+ * @testcase utc_tts_add_pcm_p
+ * @since_tizen 2.3
+ * @description test whether pcm data is added properly.
+ */
+TEST_F(TTSTest, utc_tts_add_pcm_p)
+{
+ if (g_supported == false) {
+ EXPECT_EQ(tts_add_pcm(g_tts, 1, nullptr, 0, 0, g_sample_rate), TTS_ERROR_NOT_SUPPORTED);
+ return;
+ }
+
+ EXPECT_EQ(is_created_hndl, TTS_ERROR_NONE);
+ EXPECT_EQ(tts_prepare(g_tts), TTS_ERROR_NONE);
+ EXPECT_EQ(true, __is_state_changed(TTS_STATE_READY, 20));
+
+ char data[10] = {0, };
+ EXPECT_EQ(tts_add_pcm(g_tts, 1, data, 10, 0, g_sample_rate), TTS_ERROR_NONE);
+ EXPECT_EQ(tts_add_pcm(g_tts, 2, data, 10, 0, g_sample_rate), TTS_ERROR_NONE);
+
+ EXPECT_EQ(tts_unprepare(g_tts), TTS_ERROR_NONE);
+}
+
+/**
+ * @testcase utc_tts_add_pcm_p2
+ * @since_tizen 2.3
+ * @description test whether null pcm data is added properly as a final event.
+ */
+TEST_F(TTSTest, utc_tts_add_pcm_p2)
+{
+ if (g_supported == false) {
+ EXPECT_EQ(tts_add_pcm(g_tts, 1, nullptr, 0, 0, g_sample_rate), TTS_ERROR_NOT_SUPPORTED);
+ return;
+ }
+
+ EXPECT_EQ(is_created_hndl, TTS_ERROR_NONE);
+ EXPECT_EQ(tts_prepare(g_tts), TTS_ERROR_NONE);
+ EXPECT_EQ(true, __is_state_changed(TTS_STATE_READY, 10));
+
+ EXPECT_EQ(tts_add_pcm(g_tts, 3, nullptr, 0, 0, g_sample_rate), TTS_ERROR_NONE);
+
+ EXPECT_EQ(tts_unprepare(g_tts), TTS_ERROR_NONE);
+}
+
+/**
+ * @testcase utc_tts_add_pcm_n
+ * @since_tizen 2.3
+ * @description test whether function returns error with NULL parameter.
+ */
+TEST_F(TTSTest, utc_tts_add_pcm_n)
+{
+ if (g_supported == false) {
+ EXPECT_EQ(tts_add_pcm(g_tts, 1, nullptr, 0, 0, g_sample_rate), TTS_ERROR_NOT_SUPPORTED);
+ return;
+ }
+
+ EXPECT_EQ(is_created_hndl, TTS_ERROR_NONE);
+ EXPECT_EQ(tts_prepare(g_tts), TTS_ERROR_NONE);
+ EXPECT_EQ(true, __is_state_changed(TTS_STATE_READY, 5));
+
+ char data[10] = {0, };
+ EXPECT_EQ(tts_add_pcm(nullptr, 1, data, 10, 0, g_sample_rate), TTS_ERROR_INVALID_PARAMETER);
+
+ EXPECT_EQ(tts_unprepare(g_tts), TTS_ERROR_NONE);
+}
+
+/**
+ * @testcase utc_tts_add_pcm_n2
+ * @since_tizen 2.3
+ * @description test whether function returns error when tts is in create state.
+ */
+TEST_F(TTSTest, utc_tts_add_pcm_n2)
+{
+ if (g_supported == false) {
+ EXPECT_EQ(tts_add_pcm(g_tts, 1, nullptr, 0, 0, g_sample_rate), TTS_ERROR_NOT_SUPPORTED);
+ return;
+ }
+
+ EXPECT_EQ(is_created_hndl, TTS_ERROR_NONE);
+
+ char data[10] = {0, };
+ EXPECT_EQ(tts_add_pcm(g_tts, 1, data, 10, 0, g_sample_rate), TTS_ERROR_INVALID_STATE);
+}
+
+/**
+ * @testcase utc_tts_add_pcm_n3
+ * @since_tizen 2.3
+ * @description test whether function returns error with invliad data size.
+ */
+TEST_F(TTSTest, utc_tts_add_pcm_n3)
+{
+ if (g_supported == false) {
+ EXPECT_EQ(tts_add_pcm(g_tts, 1, nullptr, 0, 0, g_sample_rate), TTS_ERROR_NOT_SUPPORTED);
+ return;
+ }
+
+ EXPECT_EQ(is_created_hndl, TTS_ERROR_NONE);
+ EXPECT_EQ(tts_prepare(g_tts), TTS_ERROR_NONE);
+ EXPECT_EQ(true, __is_state_changed(TTS_STATE_READY, 5));
+
+ char data[10] = {0, };
+ EXPECT_EQ(tts_add_pcm(g_tts, 1, data, -10, 0, g_sample_rate), TTS_ERROR_INVALID_PARAMETER);
+
+ EXPECT_EQ(tts_unprepare(g_tts), TTS_ERROR_NONE);
+}
+
+/**
+ * @testcase utc_tts_add_pcm_n4
+ * @since_tizen 2.3
+ * @description test whether function returns error with invalid audio type.
+ */
+TEST_F(TTSTest, utc_tts_add_pcm_n4)
+{
+ if (g_supported == false) {
+ EXPECT_EQ(tts_add_pcm(g_tts, 1, nullptr, 0, 0, g_sample_rate), TTS_ERROR_NOT_SUPPORTED);
+ return;
+ }
+
+ EXPECT_EQ(is_created_hndl, TTS_ERROR_NONE);
+ EXPECT_EQ(tts_prepare(g_tts), TTS_ERROR_NONE);
+ EXPECT_EQ(true, __is_state_changed(TTS_STATE_READY, 5));
+
+ char data[10] = {0, };
+ EXPECT_EQ(tts_add_pcm(g_tts, 1, data, 10, -1, g_sample_rate), TTS_ERROR_INVALID_PARAMETER);
+
+ EXPECT_EQ(tts_unprepare(g_tts), TTS_ERROR_NONE);
+}
+
+/**
+ * @testcase utc_tts_add_pcm_n5
+ * @since_tizen 2.3
+ * @description test whether function returns error with invalid sampling rate.
+ */
+TEST_F(TTSTest, utc_tts_add_pcm_n5)
+{
+ if (g_supported == false) {
+ EXPECT_EQ(tts_add_pcm(g_tts, 1, nullptr, 0, 0, g_sample_rate), TTS_ERROR_NOT_SUPPORTED);
+ return;
+ }
+
+ EXPECT_EQ(is_created_hndl, TTS_ERROR_NONE);
+ EXPECT_EQ(tts_prepare(g_tts), TTS_ERROR_NONE);
+ EXPECT_EQ(true, __is_state_changed(TTS_STATE_READY, 5));
+
+ char data[10] = {0, };
+ EXPECT_EQ(tts_add_pcm(g_tts, 1, data, 10, 0, -1), TTS_ERROR_INVALID_PARAMETER);
+
+ EXPECT_EQ(tts_unprepare(g_tts), TTS_ERROR_NONE);
+}
+
+/**
+ * @testcase utc_tts_play_pcm_p
+ * @since_tizen 2.3
+ * @description test whether tts is played properly.
+ */
+TEST_F(TTSTest, utc_tts_play_pcm_p)
+{
+ if (g_supported == false) {
+ EXPECT_EQ(tts_play_pcm(g_tts), TTS_ERROR_NOT_SUPPORTED);
+ return;
+ }
+
+ EXPECT_EQ(is_created_hndl, TTS_ERROR_NONE);
+ EXPECT_EQ(tts_prepare(g_tts), TTS_ERROR_NONE);
+ EXPECT_EQ(true, __is_state_changed(TTS_STATE_READY, 5));
+
+ EXPECT_EQ(tts_play_pcm(g_tts), TTS_ERROR_NONE);
+ EXPECT_EQ(true, __is_state_changed(TTS_STATE_PLAYING, 5));
+
+ EXPECT_EQ(tts_stop_pcm(g_tts), TTS_ERROR_NONE);
+ EXPECT_EQ(true, __is_state_changed(TTS_STATE_READY, 5));
+
+ EXPECT_EQ(tts_unprepare(g_tts), TTS_ERROR_NONE);
+}
+
+/**
+ * @testcase utc_tts_play_pcm_p2
+ * @since_tizen 2.3
+ * @description test whether tts is played all pcm data properly.
+ */
+TEST_F(TTSTest, utc_tts_play_pcm_p2)
+{
+ if (g_supported == false) {
+ EXPECT_EQ(tts_play_pcm(g_tts), TTS_ERROR_NOT_SUPPORTED);
+ return;
+ }
+
+ EXPECT_EQ(is_created_hndl, TTS_ERROR_NONE);
+ EXPECT_EQ(tts_set_utterance_started_cb(g_tts, __tts_utterance_started_cb, NULL), TTS_ERROR_NONE);
+ EXPECT_EQ(tts_set_utterance_completed_cb(g_tts, __tts_utterance_completed_cb, NULL), TTS_ERROR_NONE);
+
+ EXPECT_EQ(tts_prepare(g_tts), TTS_ERROR_NONE);
+ EXPECT_EQ(true, __is_state_changed(TTS_STATE_READY, 5));
+
+ g_utterance_completed_cb = false;
+ const char* pcm_path = tzplatform_mkpath(tzplatform_getid("TZ_SYS_RO_APP"), "/org.tizen.tts-unittests/res/test_pcm.dat");
+ FILE* fp_in = fopen(pcm_path, "rb");
+ ASSERT_NE(fp_in, nullptr);
+
+ fseek(fp_in, 0, SEEK_END);
+ size_t size = ftell(fp_in);
+ fseek(fp_in, 0, SEEK_SET);
+
+ const size_t shift_size = 12000;
+ char* data = (char*)calloc(sizeof(char), size);
+ size_t read_size = fread(data, sizeof(char), size, fp_in);
+ ASSERT_GT(read_size, 0);
+
+ int data_num = size / shift_size;
+ for (int i = 0; i <= data_num; i++ ) {
+ if (0 == i) {
+ EXPECT_EQ(tts_add_pcm(g_tts, 1, &data[i*shift_size], shift_size, 0, g_sample_rate), TTS_ERROR_NONE);
+ } else if (data_num == i) {
+ EXPECT_EQ(tts_add_pcm(g_tts, 3, &data[i*shift_size], size % shift_size, 0, g_sample_rate), TTS_ERROR_NONE);
+ } else {
+ EXPECT_EQ(tts_add_pcm(g_tts, 2, &data[i*shift_size], shift_size, 0, g_sample_rate), TTS_ERROR_NONE);
+ }
+ }
+
+ EXPECT_EQ(tts_play_pcm(g_tts), TTS_ERROR_NONE);
+ EXPECT_EQ(true, __is_state_changed(TTS_STATE_PLAYING, 5));
+
+ while (true != g_utterance_completed_cb) {
+ ecore_main_loop_iterate();
+ }
+
+ EXPECT_EQ(tts_stop_pcm(g_tts), TTS_ERROR_NONE);
+ EXPECT_EQ(true, __is_state_changed(TTS_STATE_READY, 5));
+
+ EXPECT_EQ(tts_unprepare(g_tts), TTS_ERROR_NONE);
+}
+
+/**
+ * @testcase utc_tts_play_pcm_n
+ * @since_tizen 2.3
+ * @description test whether function returns error with NULL parameter.
+ */
+TEST_F(TTSTest, utc_tts_play_pcm_n)
+{
+ if (g_supported == false) {
+ EXPECT_EQ(tts_play_pcm(g_tts), TTS_ERROR_NOT_SUPPORTED);
+ return;
+ }
+ EXPECT_EQ(is_created_hndl, TTS_ERROR_NONE);
+ EXPECT_EQ(tts_play_pcm(nullptr), TTS_ERROR_INVALID_PARAMETER);
+}
+
+/**
+ * @testcase utc_tts_play_pcm_n2
+ * @since_tizen 2.3
+ * @description test whether function returns error when tts is in create state.
+ */
+TEST_F(TTSTest, utc_tts_play_pcm_n2)
+{
+ if (g_supported == false) {
+ EXPECT_EQ(tts_play_pcm(g_tts), TTS_ERROR_NOT_SUPPORTED);
+ return;
+ }
+ EXPECT_EQ(is_created_hndl, TTS_ERROR_NONE);
+ EXPECT_EQ(tts_play_pcm(g_tts), TTS_ERROR_INVALID_STATE);
+}
+
+/**
+ * @testcase utc_tts_stop_pcm_p
+ * @since_tizen 2.3
+ * @description test whether tts is stopped properly.
+ */
+TEST_F(TTSTest, utc_tts_stop_pcm_p)
+{
+ if (g_supported == false) {
+ EXPECT_EQ(tts_stop_pcm(g_tts), TTS_ERROR_NOT_SUPPORTED);
+ return;
+ }
+
+ EXPECT_EQ(is_created_hndl, TTS_ERROR_NONE);
+
+ EXPECT_EQ(tts_prepare(g_tts), TTS_ERROR_NONE);
+ EXPECT_EQ(true, __is_state_changed(TTS_STATE_READY, 5));
+
+ EXPECT_EQ(tts_play_pcm(g_tts), TTS_ERROR_NONE);
+ EXPECT_EQ(true, __is_state_changed(TTS_STATE_PLAYING, 5));
+
+ EXPECT_EQ(tts_stop_pcm(g_tts), TTS_ERROR_NONE);
+ EXPECT_EQ(true, __is_state_changed(TTS_STATE_READY, 5));
+
+ EXPECT_EQ(tts_unprepare(g_tts), TTS_ERROR_NONE);
+}
+
+/**
+ * @testcase utc_tts_stop_pcm_n
+ * @since_tizen 2.3
+ * @description test whether function returns error with NULL parameter.
+ */
+TEST_F(TTSTest, utc_tts_stop_pcm_n)
+{
+ if (g_supported == false) {
+ EXPECT_EQ(tts_stop_pcm(nullptr), TTS_ERROR_NOT_SUPPORTED);
+ return;
+ }
+ EXPECT_EQ(is_created_hndl, TTS_ERROR_NONE);
+ EXPECT_EQ(tts_stop_pcm(nullptr), TTS_ERROR_INVALID_PARAMETER);
+}
+
+/**
+ * @testcase utc_tts_stop_pcm_n2
+ * @since_tizen 2.3
+ * @description test whether function returns error when tts is in create state.
+ */
+TEST_F(TTSTest, utc_tts_stop_pcm_n2)
+{
+ if (g_supported == false) {
+ EXPECT_EQ(tts_stop_pcm(g_tts), TTS_ERROR_NOT_SUPPORTED);
+ return;
+ }
+ EXPECT_EQ(is_created_hndl, TTS_ERROR_NONE);
+ EXPECT_EQ(tts_stop_pcm(g_tts), TTS_ERROR_INVALID_STATE);
+}
+
} // namespace