import unittest from studio import ( LANGUAGE_MAP, MAX_TEXT_LENGTH, SAMPLE_RATE, SPEAKER_MAP, estimate_gpu_duration, result_summary, validate_request, ) class StudioConfigurationTests(unittest.TestCase): def test_all_twelve_languages_are_exposed(self): self.assertEqual(len(LANGUAGE_MAP), 12) self.assertEqual( set(LANGUAGE_MAP.values()), {"ar-MSA", "de", "en", "es", "fr", "hi", "it", "ja", "ko", "pt-BR", "vi", "zh"}, ) def test_all_five_voices_map_to_unique_indices(self): self.assertEqual(set(SPEAKER_MAP), {"Aria", "Jason", "John", "Leo", "Sofia"}) self.assertEqual(set(SPEAKER_MAP.values()), set(range(5))) def test_sample_rate_is_22050_hz(self): self.assertEqual(SAMPLE_RATE, 22_050) class RequestValidationTests(unittest.TestCase): def test_valid_request_is_stripped_and_punctuated(self): request = validate_request(" Hello world ", "English", "Sofia", True) self.assertEqual(request.text, "Hello world.") self.assertEqual(request.language_code, "en") self.assertEqual(request.speaker_index, 4) self.assertTrue(request.apply_text_normalization) def test_supported_non_latin_punctuation_is_preserved(self): request = validate_request("こんにちは。", "Japanese · 日本語", "Aria", False) self.assertEqual(request.text, "こんにちは。") self.assertFalse(request.apply_text_normalization) def test_empty_input_is_rejected(self): for value in (None, "", " "): with self.subTest(value=value), self.assertRaisesRegex(ValueError, "Enter some text"): validate_request(value, "English", "Sofia", True) def test_too_long_input_is_rejected(self): with self.assertRaisesRegex(ValueError, str(MAX_TEXT_LENGTH)): validate_request("x" * (MAX_TEXT_LENGTH + 1), "English", "Sofia", True) def test_unknown_language_is_rejected(self): with self.assertRaisesRegex(ValueError, "supported languages"): validate_request("Hello", "Klingon", "Sofia", True) def test_unknown_speaker_is_rejected(self): with self.assertRaisesRegex(ValueError, "available Magpie voices"): validate_request("Hello", "English", "Unknown", True) class RuntimeHelperTests(unittest.TestCase): def test_duration_estimate_is_bounded_and_scales(self): self.assertEqual(estimate_gpu_duration("short"), 20) self.assertGreater(estimate_gpu_duration("x" * 300), 20) self.assertEqual(estimate_gpu_duration("x" * 10_000), 75) def test_result_summary_contains_generation_metadata(self): summary = result_summary("English", "Sofia", 42, 3.26) self.assertIn("English", summary) self.assertIn("Sofia", summary) self.assertIn("42 chars", summary) self.assertIn("22.05 kHz", summary) self.assertIn("3.3s inference", summary) if __name__ == "__main__": unittest.main()