import 'package:flutter_test/flutter_test.dart'; import 'package:fikoyt_studyo/muzik/sihirbaz_secimleri.dart'; import 'package:fikoyt_studyo/muzik/muzik_kataloglari.dart'; import 'package:fikoyt_studyo/muzik/muzik_form_state.dart'; import 'package:fikoyt_studyo/comfy/workflow/muzik_workflow.dart'; void main() { test('seçimler İngilizce tags stringine derlenir', () { final s = SihirbazSecimleri( vokalModu: 'kadin', kulturler: {'tr'}, turler: {'pop'}, moodlar: {'energetic'}, enstrumanlar: {'acoustic_guitar'}, bpm: 128, enerji: 80, ekstraNot: 'catchy chorus', ); final p = s.promptDerle(); expect(p, contains('female vocals')); expect(p, contains('Turkish language vocals')); expect(p, contains('pop')); expect(p, contains('energetic')); expect(p, contains('acoustic guitar')); expect(p, contains('catchy chorus')); }); test('enstrümantal modda vokal/kültür katkıları atlanır', () { final s = SihirbazSecimleri( vokalModu: 'enstrumantal', kulturler: {'tr'}, vokalKarakterleri: {'smooth'}, turler: {'lofi'}, ); final p = s.promptDerle(); expect(p, contains('instrumental')); expect(p, isNot(contains('Turkish language vocals'))); expect(s.sozTaslagi(), isEmpty); }); test('yaratıcılık → temperature, enerji → cfg türetme', () { expect(SihirbazSecimleri(yaraticilik: 0).lmTemperature, 0.4); expect(SihirbazSecimleri(yaraticilik: 1.5).lmTemperature, 1.6); expect(SihirbazSecimleri(enerji: 0).cfg, 3.0); expect(SihirbazSecimleri(enerji: 100).cfg, 9.5); expect(SihirbazSecimleri(enerji: 60).cfg, closeTo(6.9, 0.01)); }); test('sanatçı referansı isim değil betimleyici prompt verir', () { final s = SihirbazSecimleri( sanatcilar: {'sertab'}, stilReferanslari: {'mehter_martial'}, turler: {'pop'}, ); final p = s.promptDerle(); // İsim ("Sertab") prompta GİTMEMELİ, betimleyici imza gitmeli. expect(p.toLowerCase(), isNot(contains('sertab'))); expect(p, contains('powerful female turkish pop vocals')); expect(p, contains('ottoman mehter martial')); }); test('egzotik türler katalogda mevcut (gırtlak/şaman/mehter)', () { final idler = MuzikKataloglari.turler.map((e) => e.id).toList(); expect(idler, containsAll(['throat', 'shaman', 'mehter', 'tasavvuf'])); }); test('json round-trip', () { final s = SihirbazSecimleri( turler: {'rock', 'metal'}, vokalModu: 'erkek', bpm: 140, ); final geri = SihirbazSecimleri.fromJson(s.toJson()); expect(geri.turler, {'rock', 'metal'}); expect(geri.vokalModu, 'erkek'); expect(geri.bpm, 140); }); test('açılış "giriş yok" intro atlar, kapanış "yok" outro atlar', () { final s = SihirbazSecimleri( vokalModu: 'kadin', acilis: 'no_intro', kapanis: 'no_outro', enstrumantalAra: true, nakaratTekrari: 'cok', ); final taslak = s.sozTaslagi(); expect(taslak, isNot(contains('[intro]'))); expect(taslak, isNot(contains('[outro]'))); expect(taslak, contains('[instrumental break]')); expect('[chorus]'.allMatches(taslak).length, greaterThanOrEqualTo(5)); // Açılış tag'ı prompta girer expect(s.promptDerle(), contains('no intro')); }); test('enstrümantal açılış [intro - instrumental] üretir', () { final s = SihirbazSecimleri(vokalModu: 'kadin', acilis: 'piano_intro'); expect(s.sozTaslagi(), contains('[intro - instrumental]')); expect(s.promptDerle(), contains('piano intro only')); }); test('vokal tempo + enerji eğrisi prompta girer', () { final s = SihirbazSecimleri( vokalModu: 'erkek', vokalPace: 'machinegun', enerjiEgrisi: 'build_climax', ); final p = s.promptDerle(); expect(p, contains('machine-gun rap flow')); expect(p, contains('gradual build to climax')); }); test('negatif: oto mood bazlı + kullanıcı metni birleşir', () { final s = SihirbazSecimleri( moodlar: {'energetic'}, otoNegatif: true, negatifPrompt: 'off-key', ); final n = s.negatifDerle(); expect(n, contains('low quality')); expect(n, contains('boring')); // energetic → boring/sleepy reddi expect(n, contains('off-key')); }); test('prodüksiyon + miks + vokal detayı prompta girer', () { final s = SihirbazSecimleri( prodKalitesi: 'vintage', miksSecenekleri: {'vinyl'}, vokalDetaylari: {'harmoni'}, vokalModu: 'kadin', ); final p = s.promptDerle(); expect(p, contains('vintage analog production')); expect(p, contains('vinyl crackle')); expect(p, contains('layered vocal harmonies')); }); test('form durumu round-trip (otomatik kaydet/yükle)', () { final durum = MuzikFormDurumu( parametreler: MuzikParametreleri( model: 'acestep_v1.5_xl_sft_bf16.safetensors', tags: 'neo-soul', seed: 99, steps: 50, cfg: 7.0), sihirbaz: SihirbazSecimleri( sanatcilar: {'sertab'}, turler: {'pop'}, vokalModu: 'kadin'), rastgeleSeed: false, gelismisGorunum: true, sihirbazAcik: false, ); final geri = MuzikFormDurumu.fromJson( Map.from(durum.toJson())); expect(geri.parametreler.model, 'acestep_v1.5_xl_sft_bf16.safetensors'); expect(geri.parametreler.seed, 99); expect(geri.parametreler.steps, 50); expect(geri.sihirbaz.sanatcilar, {'sertab'}); expect(geri.sihirbaz.vokalModu, 'kadin'); expect(geri.rastgeleSeed, false); expect(geri.gelismisGorunum, true); expect(geri.sihirbazAcik, false); }); }