#include "fiko/cekirdek/cekirdek.hpp" #include "fiko_test.hpp" using namespace fiko; namespace { // Test verisi ECS bileşeninde tutulur (ince kök ilkesi). struct SayiBilesen { f64 deger = 0.0; }; // Görünür olmayan kök örneği: bir sayı özelliği bileşene bağlar. struct SahteNesne : DokumanNesnesi { Dunya* d; SahteNesne(Varlik k, Dunya* dunya) : DokumanNesnesi(k), d(dunya) {} const char* turAdi() const override { return "Sahte"; } std::string ad() const override { return "Sahte." + std::to_string(kimlik_); } OzellikSeti ozellikler(Dunya& dunya) override { OzellikSeti s; const Varlik k = kimlik_; s.push_back(Ozellik::sayi( "Deger", [&dunya, k] { auto* b = dunya.bul(k); return b ? b->deger : 0.0; }, [&dunya, k](f64 v) { if (auto* b = dunya.bul(k)) b->deger = v; })); return s; } }; // Görünür kök örneği. struct SahteGorunum : GorunumSaglayici { explicit SahteGorunum(Varlik k) : GorunumSaglayici(k) {} const char* agacSimgesi() const override { return "◆"; } }; } // namespace FIKO_TEST(nesne_ekle_bul_tur) { Cekirdek c; const Varlik v = c.dunya().olustur(); c.dunya().ekle(v, {3.5}); c.nesneEkle(std::make_unique(v, &c.dunya())); DokumanNesnesi* n = c.nesne(v); FIKO_KONTROL(n != nullptr); FIKO_KONTROL(std::string(n->turAdi()) == "Sahte"); FIKO_KONTROL(n->kimlik() == v); FIKO_KONTROL(c.nesne(999) == nullptr); } FIKO_TEST(nesne_ozellik_get_set_bilesene_yazar) { Cekirdek c; const Varlik v = c.dunya().olustur(); c.dunya().ekle(v, {1.0}); c.nesneEkle(std::make_unique(v, &c.dunya())); OzellikSeti s = c.nesne(v)->ozellikler(c.dunya()); FIKO_KONTROL(s.size() == 1); FIKO_KONTROL(s[0].ad == "Deger"); FIKO_KONTROL(s[0].tur == Ozellik::Tur::Sayi); FIKO_YAKIN(s[0].sayiOku(), 1.0, 1e-9); s[0].sayiYaz(7.25); // özellik üstünden yaz → ECS bileşeni değişmeli FIKO_YAKIN(c.dunya().bul(v)->deger, 7.25, 1e-9); FIKO_YAKIN(s[0].sayiOku(), 7.25, 1e-9); } FIKO_TEST(gorunum_ata_sorgula) { Cekirdek c; const Varlik v = c.dunya().olustur(); c.nesneEkle(std::make_unique(v, &c.dunya())); // Görünür olmayan: henüz görünüm yok FIKO_KONTROL(c.gorunum(v) == nullptr); c.gorunumAta(std::make_unique(v)); FIKO_KONTROL(c.gorunum(v) != nullptr); FIKO_KONTROL(std::string(c.gorunum(v)->agacSimgesi()) == "◆"); FIKO_KONTROL(c.gorunum(v)->gorunur() == true); } FIKO_TEST(nesne_yoket_kokleri_temizler) { Cekirdek c; const Varlik v = c.dunya().olustur(); c.nesneEkle(std::make_unique(v, &c.dunya())); c.gorunumAta(std::make_unique(v)); FIKO_KONTROL(c.nesne(v) != nullptr && c.gorunum(v) != nullptr); c.dunya().yokEt(v); // varlık silinince kökleri de gitmeli (tür-erased silme) FIKO_KONTROL(c.nesne(v) == nullptr); FIKO_KONTROL(c.gorunum(v) == nullptr); } FIKO_TEST(nesneler_iterasyon) { Cekirdek c; for (int i = 0; i < 3; ++i) { const Varlik v = c.dunya().olustur(); c.nesneEkle(std::make_unique(v, &c.dunya())); } FIKO_KONTROL(c.nesneler().boyut() == 3); int say = 0; for (auto [v, kok] : c.nesneler()) { (void)v; if (kok) ++say; } FIKO_KONTROL(say == 3); }