#include "fiko/zeka/graf.hpp" #include "fiko/zeka/sorgu.hpp" #include "fiko_test.hpp" using namespace fiko; using namespace fiko::zeka; FIKO_TEST(graf_dugum_crud) { GrafDeposu g; u64 a = g.dugumEkle("Delik"); u64 b = g.dugumEkle("Cep"); FIKO_KONTROL(a == 1 && b == 2); FIKO_KONTROL(g.dugumSayisi() == 2); FIKO_KONTROL(g.dugum(a)->tip == g.adBul("Delik")); FIKO_KONTROL(g.tipteki("Delik").size() == 1); g.ozAyarla(a, "cap", 8.5); g.ozAyarla(a, "kor_mu", true); g.ozAyarla(a, "uretim_tipi", std::string("delme")); FIKO_KONTROL(g.ozSayi(a, "cap") == 8.5); const Deger* v = g.oz(a, "uretim_tipi"); FIKO_KONTROL(v && std::get(*v) == "delme"); FIKO_KONTROL(g.oz(a, "olmayan") == nullptr); u64 surumOnce = g.surum(); FIKO_KONTROL(g.dugumSil(a)); FIKO_KONTROL(g.dugum(a) == nullptr); FIKO_KONTROL(g.dugumSayisi() == 1); FIKO_KONTROL(g.tipteki("Delik").empty()); FIKO_KONTROL(g.surum() > surumOnce); // Kimlik yeniden kullanılmaz (kalıcı ID sözleşmesi) u64 c = g.dugumEkle("Delik"); FIKO_KONTROL(c == 3); } FIKO_TEST(graf_iliski_ve_komsular) { GrafDeposu g; u64 cep = g.dugumEkle("Cep"); u64 f1 = g.dugumEkle("Fillet"); u64 f2 = g.dugumEkle("Fillet"); u64 yuz = g.dugumEkle("Yuz"); u64 i1 = g.iliskiEkle("bagli", cep, f1); g.iliskiEkle("bagli", cep, f2); g.iliskiEkle("icerir", cep, yuz); FIKO_KONTROL(i1 != 0); FIKO_KONTROL(g.iliskiSayisi() == 3); FIKO_KONTROL(g.komsular(cep, "bagli", +1).size() == 2); FIKO_KONTROL(g.komsular(cep).size() == 3); FIKO_KONTROL(g.komsular(f1, "bagli", -1).size() == 1); FIKO_KONTROL(g.komsular(f1, "bagli", +1).empty()); FIKO_KONTROL(g.komsular(cep, "olmayan_tip").empty()); // Düğüm silinince ilişkileri düşer g.dugumSil(f1); FIKO_KONTROL(g.komsular(cep, "bagli", +1).size() == 1); FIKO_KONTROL(g.iliskiSayisi() == 2); FIKO_KONTROL(g.iliski(i1) == nullptr); } FIKO_TEST(graf_brep_indeksi) { GrafDeposu g; u64 d = g.dugumEkle("Yuz"); g.brepBagla(d, {42, 1, 1001, 7}); FIKO_KONTROL(g.brepDugum(42, 1, 1001) == d); FIKO_KONTROL(g.brepDugum(42, 1, 9999) == 0); FIKO_KONTROL(g.govdeDugumleri(42).size() == 1); // Yeniden bağlama eski kaydı düşürür g.brepBagla(d, {42, 1, 2002, 8}); FIKO_KONTROL(g.brepDugum(42, 1, 1001) == 0); FIKO_KONTROL(g.brepDugum(42, 1, 2002) == d); FIKO_KONTROL(g.govdeDugumleri(42).size() == 1); g.dugumSil(d); FIKO_KONTROL(g.brepDugum(42, 1, 2002) == 0); FIKO_KONTROL(g.govdeDugumleri(42).empty()); } FIKO_TEST(graf_sorgu) { GrafDeposu g; u64 c1 = g.dugumEkle("Cep"); g.ozAyarla(c1, "derinlik", 25.0); u64 c2 = g.dugumEkle("Cep"); g.ozAyarla(c2, "derinlik", 5.0); u64 f = g.dugumEkle("Fillet"); g.ozAyarla(f, "yaricap", 3.0); g.iliskiEkle("bagli", c1, f); // "Derin cepler ve bağlı filletleri" — yeniden analiz yok, hazır graf auto derin = Sorgu(g).tip("Cep").ozAralik("derinlik", 20, 1e9).bul(); FIKO_KONTROL(derin.size() == 1 && derin[0] == c1); auto bagliFilletli = Sorgu(g).tip("Cep").iliskili("bagli", "Fillet").bul(); FIKO_KONTROL(bagliFilletli.size() == 1 && bagliFilletli[0] == c1); auto esit = Sorgu(g).ozEsit("derinlik", 5.0).bul(); FIKO_KONTROL(esit.size() == 1 && esit[0] == c2); FIKO_KONTROL(Sorgu(g).tip("Delik").bul().empty()); FIKO_KONTROL(Sorgu(g).ozVar("yaricap").bul().size() == 1); // Tip koşulsuz tam tarama da çalışır FIKO_KONTROL(Sorgu(g).ozAralik("derinlik", 0, 100).bul().size() == 2); } FIKO_TEST(graf_json) { GrafDeposu g; u64 d = g.dugumEkle("Delik"); g.ozAyarla(d, "cap", 8.0); g.ozAyarla(d, "ai_aciklama", std::string("M8 \"kör\" delik")); g.brepBagla(d, {5, 1, 77, 3}); u64 y = g.dugumEkle("Yuz"); g.iliskiEkle("icerir", d, y); std::string j = g.dugumJson(d); FIKO_KONTROL(j.find("\"tip\":\"Delik\"") != std::string::npos); FIKO_KONTROL(j.find("\"kid\":77") != std::string::npos); FIKO_KONTROL(j.find("\\\"kör\\\"") != std::string::npos); // kaçış FIKO_KONTROL(j.find("\"icerir\"") != std::string::npos); FIKO_KONTROL(g.dugumJson(999).empty()); }