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: "" ), "Это новое предложение." ) } func testStableTranscriptWaitsForSecondMatchingPass() { var transcript = StableTranscript() XCTAssertNil(transcript.ingest("Давай попробуем новый режим.")) XCTAssertEqual( transcript.ingest("Давай попробуем новый режим быстрее."), StableTranscriptUpdate( text: "Давай попробуем новый режим", continuesPrevious: false ) ) } func testStableTranscriptUsesCommittedAnchorWithoutDuplication() { var transcript = StableTranscript() _ = transcript.ingest("Давай попробуем новый режим.") _ = transcript.ingest("Давай попробуем новый режим быстрее.") XCTAssertEqual( transcript.ingest("Новый режим быстрее без задержки."), StableTranscriptUpdate( text: "быстрее", continuesPrevious: true ) ) XCTAssertEqual( transcript.ingest( "Давай попробуем новый режим быстрее без задержки.", final: true ), StableTranscriptUpdate( text: "без задержки.", continuesPrevious: true ) ) } func testStableTranscriptDoesNotCommitChangedTail() { var transcript = StableTranscript() XCTAssertNil(transcript.ingest("Мы запускаем сбор лидов.")) XCTAssertEqual( transcript.ingest("Мы запускаем редактор субтитров."), StableTranscriptUpdate( text: "Мы запускаем", continuesPrevious: false ) ) XCTAssertNil(transcript.ingest("Мы запускаем сбор лидов сейчас.")) XCTAssertEqual( transcript.ingest("Мы запускаем сбор лидов сейчас.", final: true), StableTranscriptUpdate( text: "сбор лидов сейчас.", continuesPrevious: true ) ) } func testStableTranscriptFallsBackToPendingTailWhenFinalPassIsEmpty() { var transcript = StableTranscript() XCTAssertNil(transcript.ingest("Проверяем последний фрагмент.")) XCTAssertEqual( transcript.ingest("", final: true), StableTranscriptUpdate( text: "Проверяем последний фрагмент.", continuesPrevious: false ) ) } }