#include "fiko/pmi/pmi.hpp" #include "fiko_test.hpp" using namespace fiko; using namespace fiko::pmi; namespace { bool icerir(const std::string& s, const char* alt) { return s.find(alt) != std::string::npos; } } // namespace FIKO_TEST(pmi_defter_ekle_sil_bul) { PmiDefteri d; PmiOge o; o.tip = PmiTip::Gdt; o.hedefler.push_back({42, 3, 1, 777}); const u32 a = d.ekle(o); const u32 b = d.ekle(PmiOge{}); FIKO_KONTROL(a != 0 && b != 0 && a != b && d.sayi() == 2); FIKO_KONTROL(d.bul(a)->hedefler[0].kid == 777); FIKO_KONTROL(d.govdeninOgeleri(42).size() == 1); FIKO_KONTROL(d.govdeninOgeleri(999).empty()); FIKO_KONTROL(d.sil(a)); FIKO_KONTROL(!d.sil(a)); FIKO_KONTROL(d.bul(a) == nullptr && d.sayi() == 1); } FIKO_TEST(pmi_datum_harfi_otomatik) { PmiDefteri d; FIKO_KONTROL(d.sonrakiDatumHarfi() == 'A'); PmiOge da; da.tip = PmiTip::Datum; da.datumHarf = 'A'; d.ekle(da); FIKO_KONTROL(d.sonrakiDatumHarfi() == 'B'); PmiOge gdt; // Gdt tipi datum alfabesini TÜKETMEZ gdt.tip = PmiTip::Gdt; gdt.datumHarf = 'B'; d.ekle(gdt); FIKO_KONTROL(d.sonrakiDatumHarfi() == 'B'); } FIKO_TEST(pmi_gdt_metin_bicimi) { GdtSatir s; s.karakter = GdtKarakteristik::Diklik; s.tolerans = 0.05; s.datum[0] = 'A'; const std::string m = gdtMetin(s); FIKO_KONTROL(icerir(m, "⊥")); FIKO_KONTROL(icerir(m, "0,05") || icerir(m, "0.05")); // yerel ayara göre hane FIKO_KONTROL(icerir(m, "| A")); FIKO_KONTROL(!icerir(m, "Ø")); // capsal kapalı GdtSatir konum; konum.karakter = GdtKarakteristik::Konum; konum.tolerans = 0.2; konum.capsal = true; konum.kosul = MalzemeKosulu::MMC; konum.datum[0] = 'A'; konum.datum[1] = 'B'; konum.datumKosul[1] = MalzemeKosulu::MMC; const std::string k = gdtMetin(konum); FIKO_KONTROL(icerir(k, "⌖")); FIKO_KONTROL(icerir(k, "Ø")); FIKO_KONTROL(icerir(k, "Ⓜ")); FIKO_KONTROL(icerir(k, "| A") && icerir(k, "| BⓂ")); } FIKO_TEST(pmi_oge_metni_tiplere_gore) { PmiOge g; g.tip = PmiTip::Gdt; g.gdt[0].karakter = GdtKarakteristik::Duzlemsellik; g.gdt[1].karakter = GdtKarakteristik::Paralellik; g.gdt[1].datum[0] = 'A'; g.gdtSatirSayi = 2; const std::string m = ogeMetni(g); FIKO_KONTROL(icerir(m, "⏥") && icerir(m, "∥") && icerir(m, "\n")); // kompozit 2 satır PmiOge datum; datum.tip = PmiTip::Datum; datum.datumHarf = 'C'; FIKO_KONTROL(ogeMetni(datum) == "C"); PmiOge not_; not_.tip = PmiTip::Not; not_.metin = "Keskin kenarları kır 0,3×45°"; FIKO_KONTROL(icerir(ogeMetni(not_), "Keskin")); } FIKO_TEST(pmi_semboller_esiz_ve_adli) { // 14 karakteristik: her glif dolu, adlar Türkçe ve boş değil. for (int i = 0; i < 14; ++i) { const auto k = (GdtKarakteristik)i; FIKO_KONTROL(std::string(karakterGlif(k)).size() > 0); FIKO_KONTROL(std::string(karakterAdi(k)).size() > 2); } FIKO_KONTROL(std::string(kosulGlif(MalzemeKosulu::MMC)) == "Ⓜ"); FIKO_KONTROL(std::string(kosulGlif(MalzemeKosulu::Yok)).empty()); } FIKO_TEST(pmi_niyet_onerileri) { bool datumOner = false; // Düz yüz + datum yok: yönelim toleransları (⊥/∥/∠) ÖNERİLMEZ (referans ister). auto o = niyetOnerileri(true, false, 0, datumOner); FIKO_KONTROL(datumOner); bool diklikVar = false; for (const auto& n : o) if (n.karakter == GdtKarakteristik::Diklik) diklikVar = true; FIKO_KONTROL(!diklikVar); FIKO_KONTROL(o[0].karakter == GdtKarakteristik::Duzlemsellik); // Düz yüz + datum var: yönelimler gelir. o = niyetOnerileri(true, false, 1, datumOner); diklikVar = false; for (const auto& n : o) if (n.karakter == GdtKarakteristik::Diklik) { diklikVar = true; FIKO_KONTROL(n.datumIster); } FIKO_KONTROL(diklikVar); // Silindir + datum: Konum Ø bölgeli. o = niyetOnerileri(false, true, 2, datumOner); bool konumVar = false; for (const auto& n : o) if (n.karakter == GdtKarakteristik::Konum) { konumVar = true; FIKO_KONTROL(n.capsal && n.datumIster); } FIKO_KONTROL(konumVar); // Kenar (ne düzlem ne silindir): datum önerilmez, doğrusallık gelir. o = niyetOnerileri(false, false, 0, datumOner); FIKO_KONTROL(!datumOner); FIKO_KONTROL(o[0].karakter == GdtKarakteristik::Dogrusallik); } FIKO_TEST(pmi_duzlem_koseleri) { PmiOge o; o.capa = {10, 0, 0}; o.duzlemNormal = {0, 0, 1}; o.duzlemSag = {1, 0, 0}; o.ofsetYerel = {5, 3, 0}; Vec3f k[4], m; duzlemKoseleri(o, 8, 4, 1.0, k, m); // Merkez: capa + sag*5 + yukari*3 (yukari = z×x = +y). FIKO_KONTROL(std::abs(m.x - 15) < 1e-6 && std::abs(m.y - 3) < 1e-6 && std::abs(m.z) < 1e-6); // Köşeler düzlem İÇİNDE (z=0) ve 8×4 kutu. for (int i = 0; i < 4; ++i) FIKO_KONTROL(std::abs(k[i].z) < 1e-6); FIKO_KONTROL(std::abs(k[0].x - 11) < 1e-6 && std::abs(k[0].y - 1) < 1e-6); // sol-alt FIKO_KONTROL(std::abs(k[2].x - 19) < 1e-6 && std::abs(k[2].y - 5) < 1e-6); // sağ-üst // Ölçek 2× (DuzlemSabitBoy): kutu VE ofset birlikte büyür (pivot = capa). duzlemKoseleri(o, 8, 4, 2.0, k, m); FIKO_KONTROL(std::abs(m.x - 20) < 1e-6 && std::abs(m.y - 6) < 1e-6); FIKO_KONTROL(std::abs(k[2].x - m.x - 8) < 1e-6); // yarı genişlik 4×2 } FIKO_TEST(pmi_gdt_metin_sinir_durumlari) { GdtSatir s; s.karakter = GdtKarakteristik::Duzlemsellik; s.tolerans = 0.0; // sıfır tolerans → yine de yazılır (yasak değil) FIKO_KONTROL(!gdtMetin(s).empty()); s.tolerans = 0.05; s.projeksiyonlu = true; // Ⓟ uzunluksuz FIKO_KONTROL(icerir(gdtMetin(s), "Ⓟ")); s.projeksiyonUzunluk = 25.0; // Ⓟ + uzunluk FIKO_KONTROL(icerir(gdtMetin(s), "25")); // Datum boşluğu: ilk slot boşsa sonrakiler YAZILMAZ (kırık "| | C" olmaz). s.datum[0] = 0; s.datum[1] = 'B'; s.datum[2] = 'C'; const std::string m = gdtMetin(s); FIKO_KONTROL(!icerir(m, "B") && !icerir(m, "C")); // Üç datum + koşullar sırayla. s.datum[0] = 'A'; s.datum[1] = 'B'; s.datum[2] = 'C'; s.datumKosul[2] = MalzemeKosulu::LMC; const std::string t = gdtMetin(s); FIKO_KONTROL(icerir(t, "| A") && icerir(t, "| B") && icerir(t, "| CⓁ")); } FIKO_TEST(pmi_defter_kimlik_carpismaz) { // Yükleme yolu: kimlikli öğe ekle → sonraki otomatik kimlik ÇAKIŞMAZ (PmiSilIslem // geri alışında aynı kimlikle geri koyma buna dayanır). PmiDefteri d; PmiOge o; o.kimlik = 50; FIKO_KONTROL(d.ekle(o) == 50); PmiOge y; const u32 yeni = d.ekle(y); FIKO_KONTROL(yeni > 50); FIKO_KONTROL(d.bul(50) != nullptr && d.bul(yeni) != nullptr); // Silinen kimlik yeniden kullanılmaz (bayat referans yanlış öğeyi göstermesin). d.sil(yeni); PmiOge z; FIKO_KONTROL(d.ekle(z) > yeni); }