// Ürün ağacı zengin satır — sağlayıcı polimorfizm testi (Dalga 0+1). // Vulkan gerektirmez: yalnız Dunya + Dugum/NesneKok bileşenleriyle GorunumSaglayici // arketip/durum/mini-bilgi/rozet PULL'unu doğrular (salt-çizim kısmı test dışı). #include #include #include "fiko/cekirdek/nesne.hpp" #include "fiko/sahne/geometri_nesne.hpp" #include "fiko/sahne/sketch_nesne.hpp" #include "fiko_test.hpp" using namespace fiko; namespace { bool icerir(const std::string& s, const char* alt) { return s.find(alt) != std::string::npos; } // Verilen tipte bir Dugum ekle, kimliğini döner. Varlik dugumEkle(Dunya& d, DugumTip tip, f64 hacim = 0.0) { const Varlik v = d.olustur(); Dugum dg; dg.kimlik = static_cast(v); dg.tip = tip; dg.hacim = hacim; d.ekle(v, std::move(dg)); return v; } } // namespace // (1) GeometriGorunum arketip dispatch: Dugum tipine göre Govde/Tel/Yuzey/Datum. FIKO_TEST(agac_geometri_arketip) { Dunya d; const Varlik kutu = dugumEkle(d, DugumTip::Kutu); const Varlik tel = dugumEkle(d, DugumTip::Tel); const Varlik yuzey = dugumEkle(d, DugumTip::Yuzey); const Varlik duzlem = dugumEkle(d, DugumTip::Duzlem); GeometriGorunum gKutu(kutu, &d); GeometriGorunum gTel(tel, &d); GeometriGorunum gYuzey(yuzey, &d); GeometriGorunum gDuzlem(duzlem, &d); FIKO_KONTROL(gKutu.agacArketip() == Arketip::Govde); FIKO_KONTROL(gTel.agacArketip() == Arketip::Tel); FIKO_KONTROL(gYuzey.agacArketip() == Arketip::Yuzey); FIKO_KONTROL(gDuzlem.agacArketip() == Arketip::Datum); // Durum varsayılan Normal (davranış korunur). FIKO_KONTROL(gKutu.agacDurum() == Durum::Normal); } // (2) GeometriGorunum mini-bilgi: precomputed hacim → cm³/mm³ (BRep walk YOK). FIKO_TEST(agac_geometri_minibilgi) { Dunya d; const Varlik buyuk = dugumEkle(d, DugumTip::Kutu, 2500.0); // >=1000 → cm³ const Varlik kucuk = dugumEkle(d, DugumTip::Kutu, 250.0); // <1000 → mm³ const Varlik bos = dugumEkle(d, DugumTip::Kutu, 0.0); // hacim yok → boş GeometriGorunum gBuyuk(buyuk, &d), gKucuk(kucuk, &d), gBos(bos, &d); FIKO_KONTROL(icerir(gBuyuk.agacMiniBilgi(d), "cm")); FIKO_KONTROL(icerir(gKucuk.agacMiniBilgi(d), "mm")); FIKO_KONTROL(gBos.agacMiniBilgi(d).empty()); } // (3) SketchGorunum: arketip sabit + mini-bilgi (geo·kısıt) + DOF rozeti. FIKO_TEST(agac_sketch_zengin) { Dunya d; const Varlik duzlem = dugumEkle(d, DugumTip::Duzlem); const Varlik sk = d.olustur(); // Sketch düğümü + görünür-olmayan kök (eskiz verisi burada yaşar). Dugum skDg; skDg.kimlik = static_cast(sk); skDg.tip = DugumTip::Sketch; d.ekle(sk, std::move(skDg)); auto sn = std::make_unique(sk, &d, duzlem); sn->eskiz().cizgiEkle(0, 0, 10, 0); sn->eskiz().cizgiEkle(10, 0, 10, 10); d.ekle(sk, std::move(sn)); SketchGorunum gv(sk, &d); FIKO_KONTROL(gv.agacArketip() == Arketip::Sketch); const std::string mini = gv.agacMiniBilgi(d); FIKO_KONTROL(icerir(mini, "geo")); FIKO_KONTROL(icerir(mini, "kısıt")); std::vector rozetler; gv.agacRozetleri(d, rozetler); FIKO_KONTROL(rozetler.size() == 1); // serbest eskiz → tek DOF/çözüm rozeti } // (4) Boş eskiz: mini-bilgi + rozet üretilmez (çakışma/gürültü olmasın). FIKO_TEST(agac_sketch_bos) { Dunya d; const Varlik duzlem = dugumEkle(d, DugumTip::Duzlem); const Varlik sk = d.olustur(); auto sn = std::make_unique(sk, &d, duzlem); d.ekle(sk, std::move(sn)); SketchGorunum gv(sk, &d); FIKO_KONTROL(gv.agacMiniBilgi(d).empty()); std::vector rozetler; gv.agacRozetleri(d, rozetler); FIKO_KONTROL(rozetler.empty()); }