From 9a0dd452bd447d3d4f46c2d1e3e079b18bf8c4c3 Mon Sep 17 00:00:00 2001 From: diyaa Date: Sun, 13 Sep 2026 23:22:49 +0200 Subject: [PATCH] Add Arabic dialect test fixtures --- .../ArabicLyricsFixtures.swift | 65 +++++++++++++++++++ .../ArabicPronunciationProcessorTests.swift | 22 +++++++ docs/TASKS.md | 2 +- 3 files changed, 88 insertions(+), 1 deletion(-) create mode 100644 Tests/MusicAssistantCoreTests/ArabicLyricsFixtures.swift diff --git a/Tests/MusicAssistantCoreTests/ArabicLyricsFixtures.swift b/Tests/MusicAssistantCoreTests/ArabicLyricsFixtures.swift new file mode 100644 index 0000000..0d766d8 --- /dev/null +++ b/Tests/MusicAssistantCoreTests/ArabicLyricsFixtures.swift @@ -0,0 +1,65 @@ +import MusicAssistantCore + +struct ArabicLyricsFixture { + let dialectName: String + let lyrics: String + let settings: ArabicPronunciationSettings + let expectedLyrics: String + let expectedNotes: [ArabicPronunciationProcessingNote] +} + +enum ArabicLyricsFixtures { + static let all: [ArabicLyricsFixture] = [ + levantine, + egyptian, + gulf, + maghrebi + ] + + private static let levantine = ArabicLyricsFixture( + dialectName: "Levantine Arabic", + lyrics: "\u{0634}\u{064F}\u{0648} \u{0628}\u{064E}\u{062F}\u{0651}\u{064E}\u{0643}", + settings: ArabicPronunciationSettings( + isEnabled: true, + diacritizationPolicy: .pronunciationTargeted, + tanweenPolicy: .preserveUserInput, + preservedSpellings: ["\u{0634}\u{064F}\u{0648}"] + ), + expectedLyrics: "\u{0634}\u{064F}\u{0648} \u{0628}\u{064E}\u{062F}\u{064E}\u{0651}\u{0643}", + expectedNotes: [.preservedSpellingsProtected(count: 1)] + ) + + private static let egyptian = ArabicLyricsFixture( + dialectName: "Egyptian Arabic", + lyrics: "\u{0625}\u{0650}\u{0632}\u{0651}\u{064E}\u{0627}\u{064A}\u{064E}\u{0643}", + settings: ArabicPronunciationSettings( + isEnabled: true, + diacritizationPolicy: .pronunciationTargeted + ), + expectedLyrics: "\u{0625}\u{0650}\u{0632}\u{064E}\u{0651}\u{0627}\u{064A}\u{064E}\u{0643}", + expectedNotes: [] + ) + + private static let gulf = ArabicLyricsFixture( + dialectName: "Gulf Arabic", + lyrics: "\u{0648}\u{064E}\u{064A}\u{0652}\u{0646}\u{064E}\u{0643} \u{0634}\u{064F}\u{0643}\u{0652}\u{0631}\u{064B}\u{0627}", + settings: ArabicPronunciationSettings( + isEnabled: true, + diacritizationPolicy: .pronunciationTargeted, + tanweenPolicy: .removeWhenUnwanted + ), + expectedLyrics: "\u{0648}\u{064E}\u{064A}\u{0652}\u{0646}\u{064E}\u{0643} \u{0634}\u{064F}\u{0643}\u{0652}\u{0631}\u{0627}", + expectedNotes: [] + ) + + private static let maghrebi = ArabicLyricsFixture( + dialectName: "Maghrebi Arabic", + lyrics: "\u{0634}\u{0646}\u{0648} \u{0628}\u{063A}\u{064A}\u{062A}\u{064A}", + settings: ArabicPronunciationSettings( + isEnabled: true, + diacritizationPolicy: .fullTashkeel + ), + expectedLyrics: "\u{0634}\u{0646}\u{0648} \u{0628}\u{063A}\u{064A}\u{062A}\u{064A}", + expectedNotes: [.fullTashkeelNeedsReview] + ) +} diff --git a/Tests/MusicAssistantCoreTests/ArabicPronunciationProcessorTests.swift b/Tests/MusicAssistantCoreTests/ArabicPronunciationProcessorTests.swift index 258ba6b..5ca463d 100644 --- a/Tests/MusicAssistantCoreTests/ArabicPronunciationProcessorTests.swift +++ b/Tests/MusicAssistantCoreTests/ArabicPronunciationProcessorTests.swift @@ -103,4 +103,26 @@ final class ArabicPronunciationProcessorTests: XCTestCase { XCTAssertEqual(result.text, "\(preservedSpelling) \u{0628}\u{064E}\u{0651}") XCTAssertEqual(result.notes, [.preservedSpellingsProtected(count: 1)]) } + + func testArabicDialectFixturesCoverExpectedProcessingBehavior() { + XCTAssertEqual(ArabicLyricsFixtures.all.count, 4) + XCTAssertEqual( + Set(ArabicLyricsFixtures.all.map(\.dialectName)).count, + ArabicLyricsFixtures.all.count + ) + + for fixture in ArabicLyricsFixtures.all { + let result = processor.process( + lyrics: fixture.lyrics, + settings: fixture.settings + ) + + XCTAssertEqual( + result.text.unicodeScalars.map(\.value), + fixture.expectedLyrics.unicodeScalars.map(\.value), + fixture.dialectName + ) + XCTAssertEqual(result.notes, fixture.expectedNotes, fixture.dialectName) + } + } } diff --git a/docs/TASKS.md b/docs/TASKS.md index 33a87cc..f4727a1 100644 --- a/docs/TASKS.md +++ b/docs/TASKS.md @@ -71,7 +71,7 @@ requirement is missing and blocks implementation, record it in - [x] Support diacritics/harakat/tanween processing. - [x] Preserve intentional spelling/dialect choices where possible. - [x] Allow user to compare/edit processed Arabic before Suno handoff. -- [ ] Add Arabic test fixtures covering multiple dialects. +- [x] Add Arabic test fixtures covering multiple dialects. ## Phase 6 --- Instrument Selector & Catalog