#include "fiko/cekirdek/arac_kipi.hpp" #include "fiko_test.hpp" using namespace fiko; namespace { AracSistemi kurulu(int* sayacDiag = nullptr, int* sayacOzmo = nullptr) { AracSistemi s; s.kaydet({"arac.diagonal_kafa", "FikoYT Diagonal Kafa", "🔧", [sayacDiag] { if (sayacDiag) ++*sayacDiag; }}); s.kaydet({"arac.ozmo_kafa", "FikoYT Ozmo Kafa", "🔩", [sayacOzmo] { if (sayacOzmo) ++*sayacOzmo; }}); return s; } } // namespace FIKO_TEST(arac_kayit_ve_cift_kayit_guncellenir) { AracSistemi s = kurulu(); FIKO_KONTROL(s.hepsi().size() == 2); s.kaydet({"arac.ozmo_kafa", "Ozmo v2", "🔩", nullptr}); FIKO_KONTROL(s.hepsi().size() == 2); // çift kayıt DEĞİL, güncelleme FIKO_KONTROL(s.bul("arac.ozmo_kafa")->ad == std::string("Ozmo v2")); FIKO_KONTROL(s.bul("yok") == nullptr); } FIKO_TEST(arac_cozumle_kisa_ad_tam_kimlik_ve_gorunen_ad) { AracSistemi s = kurulu(); FIKO_KONTROL(s.cozumle("arac.diagonal_kafa") == "arac.diagonal_kafa"); FIKO_KONTROL(s.cozumle("diagonal_kafa") == "arac.diagonal_kafa"); FIKO_KONTROL(s.cozumle("diagonal") == "arac.diagonal_kafa"); FIKO_KONTROL(s.cozumle("DIAGONAL") == "arac.diagonal_kafa"); // harf duyarsız FIKO_KONTROL(s.cozumle("ozmo") == "arac.ozmo_kafa"); FIKO_KONTROL(s.cozumle("FikoYT Ozmo Kafa") == "arac.ozmo_kafa"); FIKO_KONTROL(s.cozumle("kalip").empty()); FIKO_KONTROL(s.cozumle("").empty()); } FIKO_TEST(arac_komut_satiri_tum_bicimler) { using A = AracSistemi; FIKO_KONTROL(A::komutSatirindanArac("--arac=diagonal") == "diagonal"); FIKO_KONTROL(A::komutSatirindanArac("--arac diagonal") == "diagonal"); FIKO_KONTROL(A::komutSatirindanArac("-arac:ozmo") == "ozmo"); FIKO_KONTROL(A::komutSatirindanArac("/arac:ozmo") == "ozmo"); FIKO_KONTROL(A::komutSatirindanArac("--oto-test --arac=diagonal x.fikocad") == "diagonal"); FIKO_KONTROL(A::komutSatirindanArac("--arac=\"FikoYT Ozmo\"") == "FikoYT Ozmo"); // Bayrak yoksa / değeri yoksa boş — normal (tam CAD) açılış. FIKO_KONTROL(A::komutSatirindanArac("").empty()); FIKO_KONTROL(A::komutSatirindanArac("dosya.fikocad").empty()); FIKO_KONTROL(A::komutSatirindanArac("--arac --oto-test").empty()); FIKO_KONTROL(A::komutSatirindanArac("arac=diagonal").empty()); // bayrak öneki şart } FIKO_TEST(arac_baslat_kanca_cagirir_ve_kip_acilir) { int diag = 0, ozmo = 0; AracSistemi s = kurulu(&diag, &ozmo); FIKO_KONTROL(!s.aracKipiMi()); FIKO_KONTROL(s.baslat("diagonal") == AracSistemi::Sonuc::Tamam); FIKO_KONTROL(s.aracKipiMi()); FIKO_KONTROL(diag == 1 && ozmo == 0); FIKO_KONTROL(s.aktifKimlik() == "arac.diagonal_kafa"); FIKO_KONTROL(s.aktif() && s.aktif()->ad == std::string("FikoYT Diagonal Kafa")); s.kapat(); FIKO_KONTROL(!s.aracKipiMi() && s.aktif() == nullptr); FIKO_KONTROL(s.baslat("yokboyle") == AracSistemi::Sonuc::Bulunamadi); FIKO_KONTROL(!s.aracKipiMi()); // bulunamayan araç kipi AÇMAZ } FIKO_TEST(arac_baslat_sonrasi_kayit_aktifi_bozmaz) { AracSistemi s = kurulu(); FIKO_KONTROL(s.baslat("diagonal") == AracSistemi::Sonuc::Tamam); for (int i = 0; i < 32; ++i) // vektör yeniden tahsis olsun (sarkan işaretçi tuzağı) s.kaydet({"arac.dolgu" + std::to_string(i), "Dolgu", "", nullptr}); FIKO_KONTROL(s.aktif() != nullptr); FIKO_KONTROL(s.aktif()->kimlik == "arac.diagonal_kafa"); } FIKO_TEST(arac_lisans_kapisi_reddeder) { AracSistemi s = kurulu(); s.lisansKapisiAyarla([](const std::string& k) { return k == "arac.ozmo_kafa"; }); FIKO_KONTROL(!s.lisansli("arac.diagonal_kafa")); FIKO_KONTROL(s.baslat("diagonal") == AracSistemi::Sonuc::Lisanssiz); FIKO_KONTROL(!s.aracKipiMi()); // red → kip DEĞİŞMEZ FIKO_KONTROL(s.baslat("ozmo") == AracSistemi::Sonuc::Tamam); } FIKO_TEST(arac_tek_lisansli_otomatik_secilir) { AracSistemi s = kurulu(); FIKO_KONTROL(s.tekLisansliArac().empty()); // kapı yok = hepsi izinli → otomatik YOK s.lisansKapisiAyarla([](const std::string& k) { return k == "arac.diagonal_kafa"; }); FIKO_KONTROL(s.tekLisansliArac() == "arac.diagonal_kafa"); s.lisansKapisiAyarla([](const std::string&) { return false; }); FIKO_KONTROL(s.tekLisansliArac().empty()); } FIKO_TEST(arac_otomatik_baslat_oncelik_sirasi) { // 1) Komut satırı her şeyi yener. { AracSistemi s = kurulu(); FIKO_KONTROL(s.otomatikBaslat("--arac=ozmo", "arac.diagonal_kafa") == AracSistemi::Sonuc::Tamam); FIKO_KONTROL(s.aktifKimlik() == "arac.ozmo_kafa"); } // 2) Komut satırı yoksa ortam değişkeni. { AracSistemi s = kurulu(); FIKO_KONTROL(s.otomatikBaslat("", "diagonal") == AracSistemi::Sonuc::Tamam); FIKO_KONTROL(s.aktifKimlik() == "arac.diagonal_kafa"); } // 3) İkisi de yoksa tek-lisanslı araç. { AracSistemi s = kurulu(); s.lisansKapisiAyarla([](const std::string& k) { return k == "arac.ozmo_kafa"; }); FIKO_KONTROL(s.otomatikBaslat("", "") == AracSistemi::Sonuc::Tamam); FIKO_KONTROL(s.aktifKimlik() == "arac.ozmo_kafa"); } // 4) Hiçbiri yok → normal (tam CAD) açılış; kip kapalı kalır. { AracSistemi s = kurulu(); FIKO_KONTROL(s.otomatikBaslat("dosya.fikocad", "") != AracSistemi::Sonuc::Tamam); FIKO_KONTROL(!s.aracKipiMi()); } // 5) Lisanstan otomatik KAPALI iken tek-lisanslı araç kipi açmaz. { AracSistemi s = kurulu(); s.lisansKapisiAyarla([](const std::string& k) { return k == "arac.ozmo_kafa"; }); FIKO_KONTROL(s.otomatikBaslat("", "", false) != AracSistemi::Sonuc::Tamam); FIKO_KONTROL(!s.aracKipiMi()); } } FIKO_TEST(arac_olay_yayinlanir) { Cekirdek c; AracSistemi s = kurulu(); s.bagla(c); int girdi = 0, cikti = 0; c.olaylar().abone([&](const AracKipiGirildi&) { ++girdi; }); c.olaylar().abone([&](const AracKipiCikildi&) { ++cikti; }); s.baslat("diagonal"); s.kapat(); s.kapat(); // ikinci kapat olay yayınlamaz FIKO_KONTROL(girdi == 1 && cikti == 1); }