#include "fiko/geometri/brep.hpp" #include "fiko/zeka/zeka_motoru.hpp" #include "fiko_test.hpp" using namespace fiko; using namespace fiko::zeka; FIKO_TEST(miras_yuz_kenar_ozellikleri) { ZekaMotoru m; auto b = geometri::kutu(20, 30, 40); m.govdeCoz(b, 1); auto yuzler = m.sorgu().tip("Yuz").govdede(1).bul(); auto kenarlar = m.sorgu().tip("Kenar").govdede(1).bul(); u64 y = yuzler[0], k = kenarlar[0]; const u64 yKid = m.graf.dugum(y)->brep.kid; const u64 kKid = m.graf.dugum(k)->brep.kid; const f64 alanIlk = m.graf.ozSayi(y, "alan"); m.graf.ozAyarla(y, "kullanici_etiket", std::string("taban")); m.graf.ozAyarla(y, "eklenti.boyaci.renk", std::string("kirmizi")); m.graf.ozAyarla(y, "alan", 999.0); // standart anahtar — tazelenmeli, miras ALMAMALI m.graf.ozAyarla(k, "risk", (i64)55); m.govdeCoz(b, 1); u64 y2 = m.graf.brepDugum(1, 1, yKid); u64 k2 = m.graf.brepDugum(1, 2, kKid); FIKO_KONTROL(y2 != 0 && y2 != y); // yeni düğüm, aynı KYA kid FIKO_KONTROL(k2 != 0 && k2 != k); const Deger* et = m.graf.oz(y2, "kullanici_etiket"); FIKO_KONTROL(et && std::get(*et) == "taban"); const Deger* renk = m.graf.oz(y2, "eklenti.boyaci.renk"); FIKO_KONTROL(renk && std::get(*renk) == "kirmizi"); FIKO_YAKIN(m.graf.ozSayi(y2, "alan"), alanIlk, 1e-9); // taze topoloji değeri kazandı FIKO_KONTROL(m.graf.ozSayi(k2, "risk") == 55); // Özelliği olmayan yüzlere miras yükü binmez, davranış aynı kalır FIKO_KONTROL(m.sorgu().tip("Yuz").govdede(1).bul().size() == 6); } namespace { struct MirasDelikDedektor : Dedektor { const char* ad() const override { return "miras_delik"; } void calistir(DedektorBaglam& b) override { for (u64 y : Sorgu(b.graf).tip("Yuz").govdede(b.govdeVarlik) .ozEsit("yuzey_tip", std::string("silindir")).bul()) { u64 delik = b.graf.dugumEkle("Delik"); b.graf.ozAyarla(delik, "cap", b.graf.ozSayi(y, "yaricap") * 2); b.graf.ozAyarla(delik, "uretim_tipi", std::string("delme")); b.graf.iliskiEkle("icerir", b.govdeDugum, delik); b.graf.iliskiEkle("bagli", delik, y); } } }; } // namespace FIKO_TEST(miras_feature_dugumu) { auto b = geometri::cikarma(geometri::kutu(30, 30, 10), geometri::silindir(4, 30)); ZekaMotoru m; m.dedektorEkle(std::make_unique()); m.govdeCoz(b, 5); auto delikler = m.sorgu().tip("Delik").bul(); FIKO_KONTROL(delikler.size() == 1); m.graf.ozAyarla(delikler[0], "risk", (i64)80); m.graf.ozAyarla(delikler[0], "cap", 999.0); // dedektör anahtarı — taze değer kazanmalı m.govdeCoz(b, 5); auto yeni = m.sorgu().tip("Delik").bul(); FIKO_KONTROL(yeni.size() == 1 && yeni[0] != delikler[0]); FIKO_KONTROL(m.graf.ozSayi(yeni[0], "risk") == 80); // miras taşındı FIKO_KONTROL(m.graf.ozSayi(yeni[0], "cap") == 8.0); // dedektör tazeledi, miras ezmedi // Dedektör kapanınca feature kaybolur → miras sessizce düşer (doğru davranış) m.dedektor("miras_delik")->aktif = false; m.govdeCoz(b, 5); FIKO_KONTROL(m.sorgu().tip("Delik").bul().empty()); // Dedektör geri açılır: feature yeniden doğar ama önceki koşumda kaybolduğu // için miras zinciri kopmuştur — risk taşınmaz m.dedektor("miras_delik")->aktif = true; m.govdeCoz(b, 5); auto son = m.sorgu().tip("Delik").bul(); FIKO_KONTROL(son.size() == 1); FIKO_KONTROL(m.graf.oz(son[0], "risk") == nullptr); }