#include "fiko/ui/komut.hpp" #include "fiko/ui/fiko_universal_arama.hpp" #include "fiko_test.hpp" using namespace fiko; FIKO_TEST(bulanik_altdizi_eslesir) { // Tum sorgu karakterleri sirayla hedefte gecince skor >= 0. FIKO_KONTROL(bulanikSkor("kutu", "Kutu Ekle") >= 0); // tam onek FIKO_KONTROL(bulanikSkor("ke", "Kutu Ekle") >= 0); // k...e alt-dizi FIKO_KONTROL(bulanikSkor("kle", "Kutu Ekle") >= 0); // dagitik alt-dizi } FIKO_TEST(bulanik_eslesmezse_negatif) { FIKO_KONTROL(bulanikSkor("xyz", "Kutu Ekle") == -1); FIKO_KONTROL(bulanikSkor("kk", "Kutu") == -1); // ikinci k yok FIKO_KONTROL(bulanikSkor("abc", "") == -1); // bos hedef } FIKO_TEST(bos_sorgu_notr) { FIKO_KONTROL(bulanikSkor("", "herhangi") == 0); } FIKO_TEST(buyuk_kucuk_duyarsiz) { FIKO_KONTROL(bulanikSkor("KUTU", "kutu ekle") >= 0); FIKO_KONTROL(bulanikSkor("kutu", "KUTU EKLE") >= 0); } FIKO_TEST(onek_dagitiktan_yuksek_skorlu) { // Ardisik onek eslesmesi, ayni harflerin dagitik gectigi hedeften daha yuksek. const int onek = bulanikSkor("kut", "Kutu"); const int dagitik = bulanikSkor("kut", "Karambol Ustu Trafo"); FIKO_KONTROL(onek > 0); FIKO_KONTROL(dagitik > 0); FIKO_KONTROL(onek > dagitik); } FIKO_TEST(kelime_siniri_bonuslu) { // "e" kelime basinda (Ekle) → orta-kelime eslesmesinden yuksek skorlu. const int sinir = bulanikSkor("e", "Kutu Ekle"); const int orta = bulanikSkor("e", "Kule"); // 'e' sonda, sinir degil FIKO_KONTROL(sinir > orta); } FIKO_TEST(bulanik_eslesme_pozisyonlari) { // "kt" → "Kutu": K@0, t@2 (VS Code tarzı vurgu için). auto p = bulanikEslesmePozisyonlari("kt", "Kutu"); FIKO_KONTROL(p.size() == 2); FIKO_KONTROL(p[0] == 0 && p[1] == 2); // Tam önek "kutu" → [0,1,2,3] auto q = bulanikEslesmePozisyonlari("kutu", "Kutu Ekle"); FIKO_KONTROL(q.size() == 4); FIKO_KONTROL(q[0] == 0 && q[3] == 3); // Eşleşme yok → boş FIKO_KONTROL(bulanikEslesmePozisyonlari("xyz", "Kutu").empty()); FIKO_KONTROL(bulanikEslesmePozisyonlari("", "Kutu").empty()); } FIKO_TEST(kayit_bulanik_siralar) { KomutKaydi kayit; kayit.ekle({"Kutu Ekle", "Geometri", "K", nullptr}); kayit.ekle({"Kure Ekle", "Geometri", "", nullptr}); kayit.ekle({"Kamera Sifirla", "Gorunum", "", nullptr}); auto sonuc = kayit.ara("kutu"); FIKO_KONTROL(sonuc.size() >= 1); FIKO_KONTROL(sonuc[0]->ad == "Kutu Ekle"); // en iyi eslesme basta } FIKO_TEST(kayit_eslesmeyeni_eler) { KomutKaydi kayit; kayit.ekle({"Kutu Ekle", "Geometri", "", nullptr}); kayit.ekle({"Kamera Sifirla", "Gorunum", "", nullptr}); auto sonuc = kayit.ara("zzz"); FIKO_KONTROL(sonuc.empty()); } FIKO_TEST(kayit_bos_sorgu_hepsi) { KomutKaydi kayit; kayit.ekle({"A", "X", "", nullptr}); kayit.ekle({"B", "Y", "", nullptr}); auto sonuc = kayit.ara(""); FIKO_KONTROL(sonuc.size() == 2); FIKO_KONTROL(sonuc[0]->ad == "A"); // bos sorgu kayit sirasini korur } FIKO_TEST(kategori_de_eslesir) { KomutKaydi kayit; kayit.ekle({"Kutu Ekle", "Geometri", "", nullptr}); auto sonuc = kayit.ara("geometri"); FIKO_KONTROL(sonuc.size() == 1); // ada gecmese de kategoriden bulur } // ── MRU (son kullanılanlar) ─────────────────────────────────────────────────── FIKO_TEST(mru_calistirinca_guncellenir) { KomutKaydi kayit; kayit.ekle({"A", "X", "", nullptr}); kayit.ekle({"B", "X", "", nullptr}); kayit.ekle({"C", "X", "", nullptr}); kayit.calistir(kayit.hepsi()[1]); // B kayit.calistir(kayit.hepsi()[2]); // C FIKO_KONTROL(kayit.sonKullanilan() == "C"); FIKO_KONTROL(kayit.mruSira("C") == 0); FIKO_KONTROL(kayit.mruSira("B") == 1); FIKO_KONTROL(kayit.mruSira("A") == -1); // hiç çalıştırılmadı } FIKO_TEST(mru_tekrar_dedup_basa_alir) { KomutKaydi kayit; kayit.ekle({"A", "X", "", nullptr}); kayit.ekle({"B", "X", "", nullptr}); kayit.calistir(kayit.hepsi()[0]); // A kayit.calistir(kayit.hepsi()[1]); // B kayit.calistir(kayit.hepsi()[0]); // A tekrar → başa, mükerrer yok FIKO_KONTROL(kayit.sonKullanilanlar().size() == 2); FIKO_KONTROL(kayit.mruSira("A") == 0); FIKO_KONTROL(kayit.mruSira("B") == 1); } FIKO_TEST(mru_bos_sorgu_one_gecer) { KomutKaydi kayit; kayit.ekle({"Alfa", "X", "", nullptr}); kayit.ekle({"Beta", "X", "", nullptr}); kayit.ekle({"Gama", "X", "", nullptr}); kayit.calistir(kayit.hepsi()[2]); // Gama auto sonuc = kayit.ara(""); FIKO_KONTROL(sonuc.size() == 3); FIKO_KONTROL(sonuc[0]->ad == "Gama"); // son kullanılan başta FIKO_KONTROL(sonuc[1]->ad == "Alfa"); // kalanlar kayıt sırasında } FIKO_TEST(mru_temizle_gecmisi_korur) { KomutKaydi kayit; kayit.ekle({"A", "X", "", nullptr}); kayit.calistir(kayit.hepsi()[0]); kayit.komutlariTemizle(); FIKO_KONTROL(kayit.hepsi().empty()); FIKO_KONTROL(kayit.mruSira("A") == 0); // MRU korunur (registry rebuild) } // ── KomutPaleti durum makinesi ──────────────────────────────────────────────── namespace { KomutKaydi ucKomut() { KomutKaydi k; k.ekle({"Kutu Ekle", "Geometri", "", nullptr}); k.ekle({"Kure Ekle", "Geometri", "", nullptr}); k.ekle({"Kamera Sifirla", "Gorunum", "", nullptr}); return k; } } FIKO_TEST(palet_ac_kapat_degistir) { KomutKaydi kayit = ucKomut(); KomutPaleti p; p.bagla(&kayit); FIKO_KONTROL(!p.acikMi()); p.ac(); FIKO_KONTROL(p.acikMi()); FIKO_KONTROL(p.sorgu().empty()); FIKO_KONTROL(p.sonuclar().size() == 3); // bos sorgu = hepsi p.degistir(); FIKO_KONTROL(!p.acikMi()); p.degistir(); FIKO_KONTROL(p.acikMi()); } FIKO_TEST(palet_asagi_yukari_sarmali) { KomutKaydi kayit = ucKomut(); KomutPaleti p; p.bagla(&kayit); p.ac(); FIKO_KONTROL(p.seciliIndeks() == 0); p.asagi(); FIKO_KONTROL(p.seciliIndeks() == 1); p.asagi(); p.asagi(); FIKO_KONTROL(p.seciliIndeks() == 0); // 2 → sarmali → 0 p.yukari(); FIKO_KONTROL(p.seciliIndeks() == 2); // 0 → sarmali → son } FIKO_TEST(palet_sorgu_secimi_sifirlar) { KomutKaydi kayit = ucKomut(); KomutPaleti p; p.bagla(&kayit); p.ac(); p.asagi(); p.asagi(); FIKO_KONTROL(p.seciliIndeks() == 2); p.sorguAyarla("kamera"); FIKO_KONTROL(p.seciliIndeks() == 0); FIKO_KONTROL(p.sonuclar().size() == 1); FIKO_KONTROL(p.seciliKomut()->ad == "Kamera Sifirla"); } FIKO_TEST(palet_bos_sonuc_guvenli) { KomutKaydi kayit = ucKomut(); KomutPaleti p; p.bagla(&kayit); p.ac(); p.sorguAyarla("zzzz"); FIKO_KONTROL(p.sonuclar().empty()); FIKO_KONTROL(p.seciliKomut() == nullptr); p.asagi(); // cokmemeli FIKO_KONTROL(p.seciliIndeks() == 0); FIKO_KONTROL(!p.onayla()); // eslesme yok → false } FIKO_TEST(palet_secili_ayarla_klamplar) { KomutKaydi kayit = ucKomut(); KomutPaleti p; p.bagla(&kayit); p.ac(); p.seciliAyarla(1); FIKO_KONTROL(p.seciliIndeks() == 1); p.seciliAyarla(99); FIKO_KONTROL(p.seciliIndeks() == 2); // son ogeye klamp p.seciliAyarla(-5); FIKO_KONTROL(p.seciliIndeks() == 0); // basa klamp } FIKO_TEST(palet_onayla_calistirir_ve_kapar) { KomutKaydi kayit = ucKomut(); int sayac = 0; kayit.ekle({"Sayac Artir", "Test", "", [&] { ++sayac; }}); KomutPaleti p; p.bagla(&kayit); p.ac(); p.sorguAyarla("sayac artir"); FIKO_KONTROL(p.seciliKomut()->ad == "Sayac Artir"); FIKO_KONTROL(p.onayla()); FIKO_KONTROL(sayac == 1); FIKO_KONTROL(!p.acikMi()); // onay sonrasi kapanir FIKO_KONTROL(kayit.sonKullanilan() == "Sayac Artir"); } FIKO_TEST(palet_gozlemci) { // Mimari ilke: öğe onaylanınca gözlemci (makro/plugin/olay) ad ile bildirilir. KomutKaydi kayit = ucKomut(); KomutPaleti p; std::string sonAd; int bildirim = 0; p.ogeCalisti = [&](const std::string& ad) { sonAd = ad; ++bildirim; }; p.bagla(&kayit); p.ac(); p.sorguAyarla("kamera"); FIKO_KONTROL(p.onayla()); FIKO_KONTROL(bildirim == 1 && sonAd == "Kamera Sifirla"); } // ── Universal palet modu (opt-in): komut + nesne tek fuzzy aramada ──────────── FIKO_TEST(palet_universal_iki_kaynak) { ui::FikoUniversalArama arama; arama.kaynakEkle({"Komut", [] { return std::vector{ {"Kutu Ekle", "Komut", nullptr}}; }}); arama.kaynakEkle({"Nesne", [] { return std::vector{ {"Govde 1", "Nesne", nullptr}}; }}); KomutPaleti p; p.baglaUniversal(&arama); p.ac(); FIKO_KONTROL(p.universalMi()); FIKO_KONTROL(p.sonucSayisi() == 2); // bos sorgu = komut+nesne FIKO_KONTROL(p.universalSonuclar().size() == 2); p.sorguAyarla("govde"); FIKO_KONTROL(p.sonucSayisi() == 1); FIKO_KONTROL(p.universalSonuclar()[0].kategori == "Nesne"); } FIKO_TEST(palet_universal_onayla_calistirir) { int sec = 0; ui::FikoUniversalArama arama; arama.kaynakEkle({"Nesne", [&sec] { return std::vector{ {"Kutu.001", "Nesne", [&sec] { ++sec; }}}; }}); KomutPaleti p; p.baglaUniversal(&arama); p.ac(); p.sorguAyarla("kutu"); FIKO_KONTROL(p.onayla()); // universal ogesi.calistir cagirilir FIKO_KONTROL(sec == 1); FIKO_KONTROL(!p.acikMi()); } // Universal moddan klasik komut moduna geri donus (bagla) — durum makinesi ayni. FIKO_TEST(palet_universal_klasige_donus) { KomutKaydi kayit = ucKomut(); ui::FikoUniversalArama arama; arama.kaynakEkle({"X", [] { return std::vector{{"A", "Nesne", nullptr}}; }}); KomutPaleti p; p.baglaUniversal(&arama); FIKO_KONTROL(p.universalMi()); p.bagla(&kayit); FIKO_KONTROL(!p.universalMi()); // klasik moda dondu p.ac(); FIKO_KONTROL(p.sonuclar().size() == 3); // KomutKaydi yolu BIREBIR }