From: sungwook park Date: Fri, 27 Sep 2024 10:15:03 +0000 (+0000) Subject: Revert "[UTC][TTS][ACR-1862] Add APIs to support personal voice" X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=02e9fbdde4834c6dc63df97c1111637aee371a0b;p=test%2Ftct%2Fnative%2Fapi.git Revert "[UTC][TTS][ACR-1862] Add APIs to support personal voice" This reverts commit 1c0d092ea67757fd446d194d21b1f06d09311ded. Change-Id: Icc5cc065c559316c927198244c85f657f4435e4a --- diff --git a/src/utc/tts/public.list b/src/utc/tts/public.list index f1b628c73..12ad3db6e 100755 --- a/src/utc/tts/public.list +++ b/src/utc/tts/public.list @@ -6,7 +6,6 @@ tts_prepare tts_prepare_sync tts_unprepare tts_foreach_supported_voices -tts_foreach_supported_personal_voices tts_get_default_voice tts_get_max_text_size tts_get_state @@ -63,6 +62,4 @@ ttse_get_activated_mode ttse_set_activated_mode_changed_cb tts_set_synthesized_pcm_cb tts_unset_synthesized_pcm_cb -tts_set_playing_mode -ttse_send_personal_voice -ttse_set_personal_tts_id_set_cb \ No newline at end of file +tts_set_playing_mode \ No newline at end of file diff --git a/src/utc/tts/tct-tts-core_mobile.h b/src/utc/tts/tct-tts-core_mobile.h index 79552051c..efdab78c3 100755 --- a/src/utc/tts/tct-tts-core_mobile.h +++ b/src/utc/tts/tct-tts-core_mobile.h @@ -54,10 +54,6 @@ extern int utc_tts_foreach_supported_voices_p(void); extern int utc_tts_foreach_supported_voices_n(void); extern int utc_tts_foreach_supported_voices_n2(void); extern int utc_tts_foreach_supported_voices_n3(void); -extern int utc_tts_foreach_supported_personal_voices_p(void); -extern int utc_tts_foreach_supported_personal_voices_n(void); -extern int utc_tts_foreach_supported_personal_voices_n2(void); -extern int utc_tts_foreach_supported_personal_voices_n3(void); extern int utc_tts_get_default_voice_p(void); extern int utc_tts_get_default_voice_n(void); extern int utc_tts_get_default_voice_n2(void); @@ -255,10 +251,6 @@ extern int utc_ttse_get_activated_mode_n2(void); extern int utc_ttse_set_activated_mode_changed_cb_p(void); extern int utc_ttse_set_activated_mode_changed_cb_n(void); extern int utc_ttse_set_activated_mode_changed_cb_n2(void); -extern int utc_ttse_send_personal_voice_p(void); -extern int utc_ttse_set_personal_tts_id_set_cb_p(void); -extern int utc_ttse_set_personal_tts_id_set_cb_n(void); -extern int utc_ttse_set_personal_tts_id_set_cb_n2(void); testcase tc_array[] = { {"utc_tts_create_p",utc_tts_create_p,utc_tts_startup,utc_tts_cleanup}, @@ -291,10 +283,6 @@ testcase tc_array[] = { {"utc_tts_foreach_supported_voices_n",utc_tts_foreach_supported_voices_n,utc_tts_startup,utc_tts_cleanup}, {"utc_tts_foreach_supported_voices_n2",utc_tts_foreach_supported_voices_n2,utc_tts_startup,utc_tts_cleanup}, {"utc_tts_foreach_supported_voices_n3",utc_tts_foreach_supported_voices_n3,utc_tts_startup,utc_tts_cleanup}, - {"utc_tts_foreach_supported_personal_voices_p",utc_tts_foreach_supported_personal_voices_p,utc_tts_startup,utc_tts_cleanup}, - {"utc_tts_foreach_supported_personal_voices_n",utc_tts_foreach_supported_personal_voices_n,utc_tts_startup,utc_tts_cleanup}, - {"utc_tts_foreach_supported_personal_voices_n2",utc_tts_foreach_supported_personal_voices_n2,utc_tts_startup,utc_tts_cleanup}, - {"utc_tts_foreach_supported_personal_voices_n3",utc_tts_foreach_supported_personal_voices_n3,utc_tts_startup,utc_tts_cleanup}, {"utc_tts_get_default_voice_p",utc_tts_get_default_voice_p,utc_tts_startup,utc_tts_cleanup}, {"utc_tts_get_default_voice_n",utc_tts_get_default_voice_n,utc_tts_startup,utc_tts_cleanup}, {"utc_tts_get_default_voice_n2",utc_tts_get_default_voice_n2,utc_tts_startup,utc_tts_cleanup}, @@ -492,10 +480,6 @@ testcase tc_array[] = { {"utc_ttse_set_activated_mode_changed_cb_p",utc_ttse_set_activated_mode_changed_cb_p,utc_ttse_startup,utc_ttse_cleanup}, {"utc_ttse_set_activated_mode_changed_cb_n",utc_ttse_set_activated_mode_changed_cb_n,utc_ttse_startup,utc_ttse_cleanup}, {"utc_ttse_set_activated_mode_changed_cb_n2",utc_ttse_set_activated_mode_changed_cb_n2,utc_ttse_startup,utc_ttse_cleanup}, - {"utc_ttse_send_personal_voice_p",utc_ttse_send_personal_voice_p,utc_ttse_startup,utc_ttse_cleanup}, - {"utc_ttse_set_personal_tts_id_set_cb_p",utc_ttse_set_personal_tts_id_set_cb_p,utc_ttse_startup,utc_ttse_cleanup}, - {"utc_ttse_set_personal_tts_id_set_cb_n",utc_ttse_set_personal_tts_id_set_cb_n,utc_ttse_startup,utc_ttse_cleanup}, - {"utc_ttse_set_personal_tts_id_set_cb_n2",utc_ttse_set_personal_tts_id_set_cb_n2,utc_ttse_startup,utc_ttse_cleanup}, {NULL, NULL} }; diff --git a/src/utc/tts/tct-tts-core_tizeniot.h b/src/utc/tts/tct-tts-core_tizeniot.h index 79552051c..efdab78c3 100755 --- a/src/utc/tts/tct-tts-core_tizeniot.h +++ b/src/utc/tts/tct-tts-core_tizeniot.h @@ -54,10 +54,6 @@ extern int utc_tts_foreach_supported_voices_p(void); extern int utc_tts_foreach_supported_voices_n(void); extern int utc_tts_foreach_supported_voices_n2(void); extern int utc_tts_foreach_supported_voices_n3(void); -extern int utc_tts_foreach_supported_personal_voices_p(void); -extern int utc_tts_foreach_supported_personal_voices_n(void); -extern int utc_tts_foreach_supported_personal_voices_n2(void); -extern int utc_tts_foreach_supported_personal_voices_n3(void); extern int utc_tts_get_default_voice_p(void); extern int utc_tts_get_default_voice_n(void); extern int utc_tts_get_default_voice_n2(void); @@ -255,10 +251,6 @@ extern int utc_ttse_get_activated_mode_n2(void); extern int utc_ttse_set_activated_mode_changed_cb_p(void); extern int utc_ttse_set_activated_mode_changed_cb_n(void); extern int utc_ttse_set_activated_mode_changed_cb_n2(void); -extern int utc_ttse_send_personal_voice_p(void); -extern int utc_ttse_set_personal_tts_id_set_cb_p(void); -extern int utc_ttse_set_personal_tts_id_set_cb_n(void); -extern int utc_ttse_set_personal_tts_id_set_cb_n2(void); testcase tc_array[] = { {"utc_tts_create_p",utc_tts_create_p,utc_tts_startup,utc_tts_cleanup}, @@ -291,10 +283,6 @@ testcase tc_array[] = { {"utc_tts_foreach_supported_voices_n",utc_tts_foreach_supported_voices_n,utc_tts_startup,utc_tts_cleanup}, {"utc_tts_foreach_supported_voices_n2",utc_tts_foreach_supported_voices_n2,utc_tts_startup,utc_tts_cleanup}, {"utc_tts_foreach_supported_voices_n3",utc_tts_foreach_supported_voices_n3,utc_tts_startup,utc_tts_cleanup}, - {"utc_tts_foreach_supported_personal_voices_p",utc_tts_foreach_supported_personal_voices_p,utc_tts_startup,utc_tts_cleanup}, - {"utc_tts_foreach_supported_personal_voices_n",utc_tts_foreach_supported_personal_voices_n,utc_tts_startup,utc_tts_cleanup}, - {"utc_tts_foreach_supported_personal_voices_n2",utc_tts_foreach_supported_personal_voices_n2,utc_tts_startup,utc_tts_cleanup}, - {"utc_tts_foreach_supported_personal_voices_n3",utc_tts_foreach_supported_personal_voices_n3,utc_tts_startup,utc_tts_cleanup}, {"utc_tts_get_default_voice_p",utc_tts_get_default_voice_p,utc_tts_startup,utc_tts_cleanup}, {"utc_tts_get_default_voice_n",utc_tts_get_default_voice_n,utc_tts_startup,utc_tts_cleanup}, {"utc_tts_get_default_voice_n2",utc_tts_get_default_voice_n2,utc_tts_startup,utc_tts_cleanup}, @@ -492,10 +480,6 @@ testcase tc_array[] = { {"utc_ttse_set_activated_mode_changed_cb_p",utc_ttse_set_activated_mode_changed_cb_p,utc_ttse_startup,utc_ttse_cleanup}, {"utc_ttse_set_activated_mode_changed_cb_n",utc_ttse_set_activated_mode_changed_cb_n,utc_ttse_startup,utc_ttse_cleanup}, {"utc_ttse_set_activated_mode_changed_cb_n2",utc_ttse_set_activated_mode_changed_cb_n2,utc_ttse_startup,utc_ttse_cleanup}, - {"utc_ttse_send_personal_voice_p",utc_ttse_send_personal_voice_p,utc_ttse_startup,utc_ttse_cleanup}, - {"utc_ttse_set_personal_tts_id_set_cb_p",utc_ttse_set_personal_tts_id_set_cb_p,utc_ttse_startup,utc_ttse_cleanup}, - {"utc_ttse_set_personal_tts_id_set_cb_n",utc_ttse_set_personal_tts_id_set_cb_n,utc_ttse_startup,utc_ttse_cleanup}, - {"utc_ttse_set_personal_tts_id_set_cb_n2",utc_ttse_set_personal_tts_id_set_cb_n2,utc_ttse_startup,utc_ttse_cleanup}, {NULL, NULL} }; diff --git a/src/utc/tts/tct-tts-core_tv.h b/src/utc/tts/tct-tts-core_tv.h index 26f6ca8f8..fae2b2785 100755 --- a/src/utc/tts/tct-tts-core_tv.h +++ b/src/utc/tts/tct-tts-core_tv.h @@ -54,10 +54,6 @@ extern int utc_tts_foreach_supported_voices_p(void); extern int utc_tts_foreach_supported_voices_n(void); extern int utc_tts_foreach_supported_voices_n2(void); extern int utc_tts_foreach_supported_voices_n3(void); -extern int utc_tts_foreach_supported_personal_voices_p(void); -extern int utc_tts_foreach_supported_personal_voices_n(void); -extern int utc_tts_foreach_supported_personal_voices_n2(void); -extern int utc_tts_foreach_supported_personal_voices_n3(void); extern int utc_tts_get_default_voice_p(void); extern int utc_tts_get_default_voice_n(void); extern int utc_tts_get_default_voice_n2(void); @@ -266,10 +262,6 @@ testcase tc_array[] = { {"utc_tts_foreach_supported_voices_n",utc_tts_foreach_supported_voices_n,utc_tts_startup,utc_tts_cleanup}, {"utc_tts_foreach_supported_voices_n2",utc_tts_foreach_supported_voices_n2,utc_tts_startup,utc_tts_cleanup}, {"utc_tts_foreach_supported_voices_n3",utc_tts_foreach_supported_voices_n3,utc_tts_startup,utc_tts_cleanup}, - {"utc_tts_foreach_supported_personal_voices_p",utc_tts_foreach_supported_personal_voices_p,utc_tts_startup,utc_tts_cleanup}, - {"utc_tts_foreach_supported_personal_voices_n",utc_tts_foreach_supported_personal_voices_n,utc_tts_startup,utc_tts_cleanup}, - {"utc_tts_foreach_supported_personal_voices_n2",utc_tts_foreach_supported_personal_voices_n2,utc_tts_startup,utc_tts_cleanup}, - {"utc_tts_foreach_supported_personal_voices_n3",utc_tts_foreach_supported_personal_voices_n3,utc_tts_startup,utc_tts_cleanup}, {"utc_tts_get_default_voice_p",utc_tts_get_default_voice_p,utc_tts_startup,utc_tts_cleanup}, {"utc_tts_get_default_voice_n",utc_tts_get_default_voice_n,utc_tts_startup,utc_tts_cleanup}, {"utc_tts_get_default_voice_n2",utc_tts_get_default_voice_n2,utc_tts_startup,utc_tts_cleanup}, diff --git a/src/utc/tts/tct-tts-core_wearable.h b/src/utc/tts/tct-tts-core_wearable.h index 7e2325f30..c70538f8a 100755 --- a/src/utc/tts/tct-tts-core_wearable.h +++ b/src/utc/tts/tct-tts-core_wearable.h @@ -54,10 +54,6 @@ extern int utc_tts_foreach_supported_voices_p(void); extern int utc_tts_foreach_supported_voices_n(void); extern int utc_tts_foreach_supported_voices_n2(void); extern int utc_tts_foreach_supported_voices_n3(void); -extern int utc_tts_foreach_supported_personal_voices_p(void); -extern int utc_tts_foreach_supported_personal_voices_n(void); -extern int utc_tts_foreach_supported_personal_voices_n2(void); -extern int utc_tts_foreach_supported_personal_voices_n3(void); extern int utc_tts_get_default_voice_p(void); extern int utc_tts_get_default_voice_n(void); extern int utc_tts_get_default_voice_n2(void); @@ -255,10 +251,6 @@ extern int utc_ttse_get_activated_mode_n2(void); extern int utc_ttse_set_activated_mode_changed_cb_p(void); extern int utc_ttse_set_activated_mode_changed_cb_n(void); extern int utc_ttse_set_activated_mode_changed_cb_n2(void); -extern int utc_ttse_send_personal_voice_p(void); -extern int utc_ttse_set_personal_tts_id_set_cb_p(void); -extern int utc_ttse_set_personal_tts_id_set_cb_n(void); -extern int utc_ttse_set_personal_tts_id_set_cb_n2(void); testcase tc_array[] = { {"utc_tts_create_p",utc_tts_create_p,utc_tts_startup,utc_tts_cleanup}, @@ -291,10 +283,6 @@ testcase tc_array[] = { {"utc_tts_foreach_supported_voices_n",utc_tts_foreach_supported_voices_n,utc_tts_startup,utc_tts_cleanup}, {"utc_tts_foreach_supported_voices_n2",utc_tts_foreach_supported_voices_n2,utc_tts_startup,utc_tts_cleanup}, {"utc_tts_foreach_supported_voices_n3",utc_tts_foreach_supported_voices_n3,utc_tts_startup,utc_tts_cleanup}, - {"utc_tts_foreach_supported_personal_voices_p",utc_tts_foreach_supported_personal_voices_p,utc_tts_startup,utc_tts_cleanup}, - {"utc_tts_foreach_supported_personal_voices_n",utc_tts_foreach_supported_personal_voices_n,utc_tts_startup,utc_tts_cleanup}, - {"utc_tts_foreach_supported_personal_voices_n2",utc_tts_foreach_supported_personal_voices_n2,utc_tts_startup,utc_tts_cleanup}, - {"utc_tts_foreach_supported_personal_voices_n3",utc_tts_foreach_supported_personal_voices_n3,utc_tts_startup,utc_tts_cleanup}, {"utc_tts_get_default_voice_p",utc_tts_get_default_voice_p,utc_tts_startup,utc_tts_cleanup}, {"utc_tts_get_default_voice_n",utc_tts_get_default_voice_n,utc_tts_startup,utc_tts_cleanup}, {"utc_tts_get_default_voice_n2",utc_tts_get_default_voice_n2,utc_tts_startup,utc_tts_cleanup}, @@ -492,10 +480,6 @@ testcase tc_array[] = { {"utc_ttse_set_activated_mode_changed_cb_p",utc_ttse_set_activated_mode_changed_cb_p,utc_ttse_startup,utc_ttse_cleanup}, {"utc_ttse_set_activated_mode_changed_cb_n",utc_ttse_set_activated_mode_changed_cb_n,utc_ttse_startup,utc_ttse_cleanup}, {"utc_ttse_set_activated_mode_changed_cb_n2",utc_ttse_set_activated_mode_changed_cb_n2,utc_ttse_startup,utc_ttse_cleanup}, - {"utc_ttse_send_personal_voice_p",utc_ttse_send_personal_voice_p,utc_ttse_startup,utc_ttse_cleanup}, - {"utc_ttse_set_personal_tts_id_set_cb_p",utc_ttse_set_personal_tts_id_set_cb_p,utc_ttse_startup,utc_ttse_cleanup}, - {"utc_ttse_set_personal_tts_id_set_cb_n",utc_ttse_set_personal_tts_id_set_cb_n,utc_ttse_startup,utc_ttse_cleanup}, - {"utc_ttse_set_personal_tts_id_set_cb_n2",utc_ttse_set_personal_tts_id_set_cb_n2,utc_ttse_startup,utc_ttse_cleanup}, {NULL, NULL} }; diff --git a/src/utc/tts/utc-tts.c b/src/utc/tts/utc-tts.c index d3028ece4..eae6e20d5 100755 --- a/src/utc/tts/utc-tts.c +++ b/src/utc/tts/utc-tts.c @@ -90,10 +90,6 @@ static bool __tts_supported_voice_cb(tts_h tts, const char* language, int voice_ { return true; } -static bool __tts_supported_personal_voice_cb(tts_h tts, const char* language, const char* unique_id, const char* display_name, const char* device_name, void* user_data) -{ - return true; -} static void __tts_state_changed_cb(tts_h tts, tts_state_e previous, tts_state_e current, void* user_data) { g_current_state = current; @@ -922,94 +918,6 @@ int utc_tts_foreach_supported_voices_n3(void) return 0; } -/** - * @testcase utc_tts_foreach_supported_personal_voices_p - * @since_tizen 9.0 - * @description test whether each supported personal voices of the current engine are gotten properly. - */ -int utc_tts_foreach_supported_personal_voices_p(void) -{ - int ret = TTS_ERROR_NONE; - if(g_supported == false){ - ret = tts_foreach_supported_personal_voices(g_tts, __tts_supported_personal_voice_cb, NULL); - assert_eq(ret, TTS_ERROR_NOT_SUPPORTED); - return 0; - } - - assert_eq(is_created_hndl, TTS_ERROR_NONE); - ret = tts_foreach_supported_personal_voices(g_tts, __tts_supported_personal_voice_cb, NULL); - assert_eq(ret, TTS_ERROR_NONE); - - return 0; -} - -/** - * @testcase utc_tts_foreach_supported_personal_voices_n - * @since_tizen 9.0 - * @description test whether function returns error with NULL parameter. - */ -int utc_tts_foreach_supported_personal_voices_n(void) -{ - int ret = TTS_ERROR_NONE; - if(g_supported == false){ - ret = tts_foreach_supported_personal_voices(NULL, __tts_supported_personal_voice_cb, NULL); - assert_eq(ret, TTS_ERROR_NOT_SUPPORTED); - return 0; - } - - ret = tts_foreach_supported_personal_voices(NULL, __tts_supported_personal_voice_cb, NULL); - assert_neq(ret, TTS_ERROR_NONE); - - return 0; -} - -/** - * @testcase utc_tts_foreach_supported_personal_voices_n2 - * @since_tizen 9.0 - * @description test whether function returns error when tts handle is already destroyed. - */ -int utc_tts_foreach_supported_personal_voices_n2(void) -{ - int ret = TTS_ERROR_NONE; - if(g_supported == false){ - ret = tts_foreach_supported_personal_voices(NULL, __tts_supported_personal_voice_cb, NULL); - assert_eq(ret, TTS_ERROR_NOT_SUPPORTED); - return 0; - } - assert_eq(is_created_hndl, TTS_ERROR_NONE); - - ret = tts_destroy(g_tts); - assert_eq(ret, TTS_ERROR_NONE); - - ret = tts_foreach_supported_personal_voices(g_tts, __tts_supported_personal_voice_cb, NULL); - assert_neq(ret, TTS_ERROR_NONE); - - ret = tts_create(&g_tts); - assert_eq(ret, TTS_ERROR_NONE); - - return 0; -} - -/** - * @testcase utc_tts_foreach_supported_personal_voices_n3 - * @since_tizen 9.0 - * @description test whether function returns error when callback is NULL - */ -int utc_tts_foreach_supported_personal_voices_n3(void) -{ - int ret = TTS_ERROR_NONE; - if(g_supported == false){ - ret = tts_foreach_supported_personal_voices(NULL, __tts_supported_personal_voice_cb, NULL); - assert_eq(ret, TTS_ERROR_NOT_SUPPORTED); - return 0; - } - assert_eq(is_created_hndl, TTS_ERROR_NONE); - - ret = tts_foreach_supported_personal_voices(g_tts, NULL, NULL); - assert_neq(ret, TTS_ERROR_NONE); - - return 0; -} /** * @testcase utc_tts_get_default_voice_p diff --git a/src/utc/tts/utc-ttse.c b/src/utc/tts/utc-ttse.c index 6eacb4206..cbdcbefec 100755 --- a/src/utc/tts/utc-ttse.c +++ b/src/utc/tts/utc-ttse.c @@ -118,10 +118,6 @@ static void engine_activated_mode_changed(int activated_mode) { } -static int engine_personal_tts_id_set(const char* ptts_id, void* user_data) -{ -} - /* ================================ */ void utc_ttse_startup(void) @@ -540,77 +536,3 @@ int utc_ttse_set_activated_mode_changed_cb_n2(void) return 0; } - -/** - * @testcase utc_ttse_send_personal_voice_p - * @since_tizen 9.0 - * @description Positive UTC for sending personal voice - */ -int utc_ttse_send_personal_voice_p(void) -{ - int ret = TTSE_ERROR_NONE; - - ret = ttse_main(g_argc, g_argv, &g_engine_callback); - assert_eq(ret, TTSE_ERROR_NONE); - - dlog_print(DLOG_INFO, "NativeTCT", "[utc_ttse_send_personal_voice_p] ttse_main SUCCESS"); - ret = ttse_send_personal_voice("ko_KR", "id", "1234", "5678"); - assert_eq(ret, TTSE_ERROR_NONE); - - return 0; -} - -/** - * @testcase utc_ttse_set_personal_tts_id_set_cb_p - * @since_tizen 9.0 - * @description Positive UTC for setting a callback of personal tts id set - */ -int utc_ttse_set_personal_tts_id_set_cb_p(void) -{ - if(g_is_supported == false){ - assert_eq(ttse_set_personal_tts_id_set_cb(engine_personal_tts_id_set, NULL), TTSE_ERROR_NOT_SUPPORTED); - return 0; - } - - assert_eq(ttse_main(g_argc, g_argv, &g_engine_callback), TTSE_ERROR_NONE); - - assert_eq(ttse_set_personal_tts_id_set_cb(engine_personal_tts_id_set, NULL), TTSE_ERROR_NONE); - - return 0; -} - -/** - * @testcase utc_ttse_set_personal_tts_id_set_cb_n - * @since_tizen 9.0 - * @description Negative UTC for setting a callback of personal tts id set (Invalid parameter) - */ -int utc_ttse_set_personal_tts_id_set_cb_n(void) -{ - if(g_is_supported == false){ - assert_eq(ttse_set_personal_tts_id_set_cb(NULL, NULL), TTSE_ERROR_NOT_SUPPORTED); - return 0; - } - - assert_eq(ttse_main(g_argc, g_argv, &g_engine_callback), TTSE_ERROR_NONE); - - assert_eq(ttse_set_personal_tts_id_set_cb(NULL, NULL), TTSE_ERROR_INVALID_PARAMETER); - - return 0; -} - -/** - * @testcase utc_ttse_set_personal_tts_id_set_cb_n2 - * @since_tizen 9.0 - * @description Negative UTC for setting a callback of personal tts id set (Invalid state) - */ -int utc_ttse_set_personal_tts_id_set_cb_n2(void) -{ - if(g_is_supported == false){ - assert_eq(ttse_set_personal_tts_id_set_cb(engine_personal_tts_id_set, NULL), TTSE_ERROR_NOT_SUPPORTED); - return 0; - } - - assert_eq(ttse_set_personal_tts_id_set_cb(engine_personal_tts_id_set, NULL), TTSE_ERROR_INVALID_STATE); - - return 0; -} \ No newline at end of file