#include "fiko_test.hpp" #include "fiko/baglam/baglam_hedef.hpp" #include "fiko/baglam/baglam_kural.hpp" #include "fiko/cekirdek/cekirdek.hpp" #include "fiko/sahne/sahne.hpp" // DugumTip + eksensis:: ordinaller using namespace fiko; using namespace fiko::baglam; using girdi::HedefTur; namespace { // Önerilerde belirli bir komutKimlik var mı? bool iceriyor(const std::vector& v, const std::string& kimlik) { for (const auto& o : v) if (o.komutKimlik == kimlik) return true; return false; } } // namespace namespace { // Kısaltma: geo ipucusuz kategori (datum/tel/yüzey/sketch — brep gerekmez). HedefKategori kat(DugumTip tip, HedefTur topo, u32 alt = 0, bool sketch = false) { return kategoriBelirle(tip, topo, alt, sketch, GeoOzet{}); } } // namespace // ---- EksenSistemi alt-ordinal ayrımı (eksen / düzlem / orijin) ---- FIKO_TEST(eksensistemi_ordinal) { const DugumTip es = DugumTip::EksenSistemi; FIKO_KONTROL(kat(es, HedefTur::Nokta, eksensis::ORIJIN) == HedefKategori::Orijin); FIKO_KONTROL(kat(es, HedefTur::Kenar, eksensis::EKSEN_X) == HedefKategori::RefEksen); FIKO_KONTROL(kat(es, HedefTur::Kenar, eksensis::EKSEN_Z) == HedefKategori::RefEksen); FIKO_KONTROL(kat(es, HedefTur::Kenar, eksensis::DUZLEM_XY) == HedefKategori::RefDuzlem); FIKO_KONTROL(kat(es, HedefTur::Kenar, eksensis::DUZLEM_ZX) == HedefKategori::RefDuzlem); // Ordinalsiz gövde-vurgu → datum kümesi (düzlem varsayılanı). FIKO_KONTROL(kat(es, HedefTur::Govde, 0) == HedefKategori::RefDuzlem); } // ---- Tekil referans + CAM + GSD düğüm tipleri ---- FIKO_TEST(dugum_tipi_kategorileri) { FIKO_KONTROL(kat(DugumTip::Duzlem, HedefTur::Yuz) == HedefKategori::RefDuzlem); FIKO_KONTROL(kat(DugumTip::Eksen, HedefTur::Kenar) == HedefKategori::RefEksen); FIKO_KONTROL(kat(DugumTip::TakimYolu, HedefTur::Kenar) == HedefKategori::TakimYolu); FIKO_KONTROL(kat(DugumTip::Tel, HedefTur::Kenar) == HedefKategori::GsdTel); FIKO_KONTROL(kat(DugumTip::Yuzey, HedefTur::Yuz) == HedefKategori::GsdYuzey); } // ---- Sketch entity: Sketch düğümü VEYA aktif sketch + 2B alt-eleman ---- FIKO_TEST(sketch_entity) { FIKO_KONTROL(kat(DugumTip::Sketch, HedefTur::Kenar) == HedefKategori::SketchEntity); FIKO_KONTROL(kat(DugumTip::Sketch, HedefTur::Nokta) == HedefKategori::SketchEntity); // Aktif sketch: katı gövde tipinde bile kenar/nokta → SketchEntity. FIKO_KONTROL(kat(DugumTip::Kutu, HedefTur::Kenar, 1, /*sketch*/ true) == HedefKategori::SketchEntity); // Aktif sketch ama YÜZ hover → sketch entity değil (2B yalnız kenar/nokta). FIKO_KONTROL(kat(DugumTip::Kutu, HedefTur::Yuz, 1, /*sketch*/ true) != HedefKategori::SketchEntity); } // ---- Katı gövde brep alt-tipleri (yüz) ---- FIKO_TEST(yuz_alt_tipleri) { GeoOzet g; g = GeoOzet{}; g.duzlem = true; FIKO_KONTROL(kategoriBelirle(DugumTip::Kutu, HedefTur::Yuz, 1, false, g) == HedefKategori::YuzDuz); g = GeoOzet{}; g.silindir = true; FIKO_KONTROL(kategoriBelirle(DugumTip::Silindir, HedefTur::Yuz, 1, false, g) == HedefKategori::YuzSilindir); g = GeoOzet{}; g.kure = true; FIKO_KONTROL(kategoriBelirle(DugumTip::Kure, HedefTur::Yuz, 1, false, g) == HedefKategori::YuzKure); g = GeoOzet{}; g.konik = true; FIKO_KONTROL(kategoriBelirle(DugumTip::Koni, HedefTur::Yuz, 1, false, g) == HedefKategori::YuzKonik); // İpucu yok → serbest/eğri yüz. FIKO_KONTROL(kategoriBelirle(DugumTip::Ithal, HedefTur::Yuz, 1, false, GeoOzet{}) == HedefKategori::YuzEgri); } // ---- Katı gövde brep alt-tipleri (kenar) + vertex/gövde ---- FIKO_TEST(kenar_vertex_govde) { GeoOzet g; g = GeoOzet{}; g.dogru = true; FIKO_KONTROL(kategoriBelirle(DugumTip::Kutu, HedefTur::Kenar, 1, false, g) == HedefKategori::KenarCizgi); g = GeoOzet{}; g.cember = true; FIKO_KONTROL(kategoriBelirle(DugumTip::Silindir, HedefTur::Kenar, 1, false, g) == HedefKategori::KenarCember); g = GeoOzet{}; g.spline = true; FIKO_KONTROL(kategoriBelirle(DugumTip::Ithal, HedefTur::Kenar, 1, false, g) == HedefKategori::KenarSpline); // İpucu yok → çizgi varsayılanı. FIKO_KONTROL(kategoriBelirle(DugumTip::Kutu, HedefTur::Kenar, 1, false, GeoOzet{}) == HedefKategori::KenarCizgi); FIKO_KONTROL(kat(DugumTip::Kutu, HedefTur::Nokta, 1) == HedefKategori::Vertex); FIKO_KONTROL(kat(DugumTip::Kutu, HedefTur::Govde, 0) == HedefKategori::Govde); } // ---- Boşluk / GUI → Bos ---- FIKO_TEST(bosluk_gui) { FIKO_KONTROL(kat(DugumTip::Kutu, HedefTur::Hic) == HedefKategori::Bos); FIKO_KONTROL(kat(DugumTip::Kutu, HedefTur::Gui) == HedefKategori::Bos); } // ---- BaglamDurum imza alanları default (durum hesaplama sözleşmesi) ---- FIKO_TEST(durum_varsayilan) { BaglamDurum d; FIKO_KONTROL(d.arac == BaglamDurum::Arac::Yok); FIKO_KONTROL(d.secimSayi == 0); FIKO_KONTROL(!d.sketchAktif); FIKO_KONTROL(d.secimTuru == HedefTur::Hic); } // ---- Maske yardımcıları (registry meta bit kümesi) ---- FIKO_TEST(maske_bit) { const u32 m = maske(HedefKategori::YuzDuz, HedefKategori::KenarCizgi); FIKO_KONTROL(m & kategoriBit(HedefKategori::YuzDuz)); FIKO_KONTROL(m & kategoriBit(HedefKategori::KenarCizgi)); FIKO_KONTROL(!(m & kategoriBit(HedefKategori::Govde))); // geometriHepsi: Bos hariç hepsi. const u32 g = geometriHepsi(); FIKO_KONTROL(g & kategoriBit(HedefKategori::Govde)); FIKO_KONTROL(g & kategoriBit(HedefKategori::TakimYolu)); FIKO_KONTROL(!(g & kategoriBit(HedefKategori::Bos))); } // ---- Registry-kimliği kod/çöz ---- FIKO_TEST(reg_kimlik_yuvarlak) { const std::string k = regKimlik("Feature", "Pad (Kabartma)"); std::string grup, ad; FIKO_KONTROL(regAyristir(k, grup, ad)); FIKO_KONTROL(grup == "Feature"); FIKO_KONTROL(ad == "Pad (Kabartma)"); FIKO_KONTROL(!regAyristir("inline_kimlik", grup, ad)); // ayraçsız → registry değil } // ---- registriOner: hedefMaske & kategori + workbench + seçim kapısı süzgeci ---- FIKO_TEST(registri_saglayici) { Cekirdek c; // Pad: yalnız düz yüz bağlamı, part workbench. MenuOge pad; pad.grup = "Feature"; pad.ad = "Pad"; pad.hedefMaske = maske(HedefKategori::YuzDuz); pad.workbench = "part"; c.menuler().ekle(pad); // Global komut (maske 0) → bağlam halkasına ASLA girmez. MenuOge glob; glob.grup = "Dosya"; glob.ad = "Kaydet"; glob.hedefMaske = 0; c.menuler().ekle(glob); // İki-seçim gerektiren komut (Boolean). MenuOge birlestir; birlestir.grup = "Boolean"; birlestir.ad = "Birleştir"; birlestir.hedefMaske = maske(HedefKategori::Govde); birlestir.minSecim = 2; birlestir.maxSecim = 2; c.menuler().ekle(birlestir); BaglamHedef h; h.kategori = HedefKategori::YuzDuz; BaglamDurum d; d.workbench = "part"; d.secimSayi = 0; std::vector out; registriOner(c, h, d, out); FIKO_KONTROL(iceriyor(out, regKimlik("Feature", "Pad"))); // yüz + part → var FIKO_KONTROL(!iceriyor(out, regKimlik("Dosya", "Kaydet"))); // global → yok // Yanlış workbench → Pad görünmez. out.clear(); d.workbench = "gsd"; registriOner(c, h, d, out); FIKO_KONTROL(!iceriyor(out, regKimlik("Feature", "Pad"))); // Gövde + 2 seçim → Boolean uygun; 0 seçim → değil. out.clear(); h.kategori = HedefKategori::Govde; d.workbench = "part"; d.secimSayi = 2; registriOner(c, h, d, out); FIKO_KONTROL(iceriyor(out, regKimlik("Boolean", "Birleştir"))); out.clear(); d.secimSayi = 0; registriOner(c, h, d, out); FIKO_KONTROL(!iceriyor(out, regKimlik("Boolean", "Birleştir"))); } // ---- tipOner: kategori-özel inline öğeler (per-nesne köprü tip yolu) ---- FIKO_TEST(tip_saglayici) { BaglamDurum d; // Gövde → seç/ağırlık/yakınlaş/sil/gizle inline kimlikleri. BaglamHedef h; h.kategori = HedefKategori::Govde; std::vector out; tipOner(h, d, out); FIKO_KONTROL(iceriyor(out, "sec")); FIKO_KONTROL(iceriyor(out, "sil")); FIKO_KONTROL(iceriyor(out, "gizle")); // Boşluk (part) → nested "Ekle" ara-öğe (kimlik boş, çocuklu). out.clear(); h.kategori = HedefKategori::Bos; d.workbench = "part"; tipOner(h, d, out); bool eklenVar = false; for (const auto& o : out) if (o.komutKimlik.empty() && !o.cocuklar.empty()) eklenVar = true; FIKO_KONTROL(eklenVar); // Boşluk (sketcher) → Çizim nested + kısıt. out.clear(); d.workbench = "sketcher"; tipOner(h, d, out); FIKO_KONTROL(iceriyor(out, "kisit")); }