import XCTest @testable import WhisperKey final class TextCleanerTests: XCTestCase { func testGlossaryAndFillers() { let result = TextCleaner.clean( "Эм, проверка CompuSegro, pocketbase и caddy, короче, работает.", removeFillers: true, glossary: "CampusAgro, PocketBase, Caddy" ) XCTAssertEqual(result, "Проверка CampusAgro, PocketBase и Caddy, работает.") } func testPreservesTextWhenFillerRemovalDisabled() { let result = TextCleaner.clean( "Ну вот, PocketBase работает.", removeFillers: false, glossary: "PocketBase" ) XCTAssertEqual(result, "Ну вот, PocketBase работает.") } func testDropsCommonSilenceHallucinations() { XCTAssertEqual( TextCleaner.clean( "Продолжение следует... Продолжение следует...", removeFillers: true, glossary: "" ), "" ) } func testStripsHallucinatedEndingAndAppliesPhoneticAliases() { XCTAssertEqual( TextCleaner.clean( "комп Агро, Покетбейс, Постричь. SQL и Кэдди. Спасибо за просмотр.", removeFillers: true, glossary: "CampusAgro, PocketBase, PostgreSQL, Caddy" ), "CampusAgro, PocketBase, PostgreSQL и Caddy" ) } func testDropsSubtitleCreditHallucination() { XCTAssertEqual( TextCleaner.clean( "Субтитры создавал DimaTorzok", removeFillers: true, glossary: "" ), "" ) } func testRemovesEmbeddedSubtitleCreditsWithoutDroppingSpeech() { XCTAssertEqual( TextCleaner.clean( "Ну запускай похуй. Редактор субтитров А.Семкин Корректор А.Егорова Сбор лидов.", removeFillers: true, glossary: "" ), "Ну запускай похуй. Сбор лидов." ) } func testJoinsTechnicalChunksWithoutArtificialSentenceBoundary() { XCTAssertEqual( TranscriptJoiner.prepare( "Модель понимает.", continuesPrevious: true, continuesNext: true, glossary: "" ), "модель понимает" ) } func testPreservesGlossaryCapitalizationWhenJoiningChunks() { XCTAssertEqual( TranscriptJoiner.prepare( "PocketBase работает.", continuesPrevious: true, continuesNext: false, glossary: "CampusAgro, PocketBase, Caddy" ), "PocketBase работает." ) } func testKeepsSentenceStartAfterRealPause() { XCTAssertEqual( TranscriptJoiner.prepare( "Это новое предложение.", continuesPrevious: false, continuesNext: false, glossary: "" ), "Это новое предложение." ) } }