#include "fiko/pafta/pafta_olcu.hpp" #include #include "fiko_test.hpp" using namespace fiko; using namespace fiko::pafta; namespace { bool icerir(const std::string& s, const char* alt) { return s.find(alt) != std::string::npos; } } // namespace FIKO_TEST(pafta_olcu_deger_olcekten_bagimsiz) { Olcu o; o.tip = OlcuTip::Dogrusal; o.p1 = {0, 0}; o.p2 = {30, 40}; // yerel (ölçekli) 50 mm // 1:1 → 50; 1:2 çizimde aynı yerel uzunluk GERÇEKTE 100 mm'dir. FIKO_KONTROL(std::abs(olcuDegeri(o, Olcek{1, 1}) - 50.0) < 1e-9); FIKO_KONTROL(std::abs(olcuDegeri(o, Olcek{1, 2}) - 100.0) < 1e-9); FIKO_KONTROL(std::abs(olcuDegeri(o, Olcek{2, 1}) - 25.0) < 1e-9); // Yatay/dikey yalnız ilgili bileşeni ölçer. o.tip = OlcuTip::Yatay; FIKO_KONTROL(std::abs(olcuDegeri(o, Olcek{1, 1}) - 30.0) < 1e-9); o.tip = OlcuTip::Dikey; FIKO_KONTROL(std::abs(olcuDegeri(o, Olcek{1, 1}) - 40.0) < 1e-9); // Elle değer ölçekten de geometriden de etkilenmez. o.otoDeger = false; o.elleDeger = 12.5; FIKO_KONTROL(std::abs(olcuDegeri(o, Olcek{1, 5}) - 12.5) < 1e-9); } FIKO_TEST(pafta_olcu_aci_derece) { Olcu o; o.tip = OlcuTip::Aci; o.tepe = {0, 0}; o.p1 = {10, 0}; o.p2 = {0, 10}; FIKO_KONTROL(std::abs(olcuDegeri(o, Olcek{1, 1}) - 90.0) < 1e-9); FIKO_KONTROL(std::abs(olcuDegeri(o, Olcek{1, 4}) - 90.0) < 1e-9); // açı ölçekten bağımsız o.p2 = {-10, 0}; FIKO_KONTROL(std::abs(olcuDegeri(o, Olcek{1, 1}) - 180.0) < 1e-9); o.p2 = {0, 0}; // dejenere → 0 (çökme/NaN yok) FIKO_KONTROL(olcuDegeri(o, Olcek{1, 1}) == 0.0); } FIKO_TEST(pafta_olcu_metni_onek_sonek) { Olcu o; o.tip = OlcuTip::Capsal; o.p1 = {-10, 0}; o.p2 = {10, 0}; const std::string m = olcuMetni(o, Olcek{1, 1}); FIKO_KONTROL(icerir(m, "Ø")); // çapta otomatik ön ek FIKO_KONTROL(icerir(m, "20")); FIKO_KONTROL(!icerir(m, "mm")); // teknik resimde uzunluk soneki yazılmaz o.tip = OlcuTip::Yaricap; FIKO_KONTROL(icerir(olcuMetni(o, Olcek{1, 1}), "R")); o.tip = OlcuTip::Dogrusal; o.sonEk = " ±0,1"; FIKO_KONTROL(icerir(olcuMetni(o, Olcek{1, 1}), "±0,1")); // tolerans metni korunur Olcu a; a.tip = OlcuTip::Aci; a.tepe = {0, 0}; a.p1 = {5, 0}; a.p2 = {0, 5}; FIKO_KONTROL(icerir(olcuMetni(a, Olcek{1, 1}), "°")); // açıda sonek yazılır } FIKO_TEST(pafta_olcu_geometrisi_dogrusal) { Olcu o; o.tip = OlcuTip::Yatay; o.p1 = {0, 0}; o.p2 = {40, 0}; o.ofset = 12.0; const OlcuCizim c = olcuGeometrisi(o); FIKO_KONTROL(c.gecerli); FIKO_KONTROL(c.cizgiler.size() == 3); // iki uzantı + ölçü çizgisi // Ölçü çizgisi ofset kadar YUKARIDA (dayanak yatay → dik yön +y). FIKO_KONTROL(std::abs(c.okA.y - 12.0) < 1e-9 && std::abs(c.okB.y - 12.0) < 1e-9); FIKO_KONTROL(std::abs(c.metinCipa.x - 20.0) < 1e-9); FIKO_KONTROL(std::abs(c.metinCipa.y - 12.0) < 1e-9); // Negatif ofset diğer tarafa taşır. o.ofset = -12.0; FIKO_KONTROL(std::abs(olcuGeometrisi(o).okA.y + 12.0) < 1e-9); // Sıfır uzunluk → geçersiz (çizim atlanır). o.p2 = o.p1; FIKO_KONTROL(!olcuGeometrisi(o).gecerli); } FIKO_TEST(pafta_olcu_metni_bas_asagi_olmaz) { Olcu o; o.tip = OlcuTip::Dogrusal; o.p1 = {40, 0}; o.p2 = {0, 0}; // sağdan sola → ham açı 180° const OlcuCizim c = olcuGeometrisi(o); FIKO_KONTROL(c.gecerli); // ISO 129: metin daima soldan sağa okunur → |açı| ≤ 90°. FIKO_KONTROL(std::abs(c.metinAci) <= 3.14159265358979 / 2 + 1e-9); } FIKO_TEST(pafta_olcu_gorunume_bagli_yasam) { Pafta p; Gorunum g; const u32 gid = p.gorunumEkle(g); Olcu o; o.gorunum = gid; o.p1 = {0, 0}; o.p2 = {10, 0}; const u32 oid = p.olcuEkle(o); Olcu serbest; // görünüme bağlı olmayan ölçü const u32 sid = p.olcuEkle(serbest); FIKO_KONTROL(oid != sid && p.olculer().size() == 2); FIKO_KONTROL(p.olcuBul(oid) != nullptr); FIKO_KONTROL(p.gorunumunOlculeri(gid).size() == 1); // Görünüm silinince ÖLÇÜSÜ de gider, serbest ölçü kalır (yetim ölçü olmaz). p.gorunumSil(gid); FIKO_KONTROL(p.olculer().size() == 1); FIKO_KONTROL(p.olcuBul(oid) == nullptr); FIKO_KONTROL(p.olcuBul(sid) != nullptr); FIKO_KONTROL(p.olcuSil(sid)); FIKO_KONTROL(!p.olcuSil(sid)); FIKO_KONTROL(p.olculer().empty()); } FIKO_TEST(pafta_uc_gorunum_kur_olculeri_temizler) { Pafta p; Olcu o; p.olcuEkle(o); FIKO_KONTROL(p.olculer().size() == 1); p.ucGorunumKur(5, 50, 40, 30); // yeni kurulum → eski ölçüler yetim kalmadan silinir FIKO_KONTROL(p.olculer().empty()); FIKO_KONTROL(p.sayi() == 3); }