#include "fiko/cam/nesting.hpp" #include #include "fiko_test.hpp" using namespace fiko::cam; namespace { // Alt dize kaç kez geçiyor. int sayac(const std::string& s, const std::string& alt) { int n = 0; for (size_t p = s.find(alt); p != std::string::npos; p = s.find(alt, p + alt.size())) ++n; return n; } } // namespace namespace { // İki yerleşim aynı levhada çakışıyor mu (kenar teması çakışma değil). bool cakisir(const NestYerlesim& a, const NestYerlesim& b) { if (a.levha != b.levha) return false; return a.x < b.x + b.en - 1e-6 && b.x < a.x + a.en - 1e-6 && a.y < b.y + b.boy - 1e-6 && b.y < a.y + a.boy - 1e-6; } // Tüm yerleşimler levha sınırında + çakışmasız mı. bool gecerliMi(const NestSonuc& s, const NestLevha& l) { for (const auto& y : s.yerlesimler) { if (y.x < -1e-6 || y.y < -1e-6) return false; if (y.x + y.en > l.en + 1e-6 || y.y + y.boy > l.boy + 1e-6) return false; } for (size_t i = 0; i < s.yerlesimler.size(); ++i) for (size_t j = i + 1; j < s.yerlesimler.size(); ++j) if (cakisir(s.yerlesimler[i], s.yerlesimler[j])) return false; return true; } } // namespace FIKO_TEST(nest_tek_parca_yerlesir) { NestLevha l{100, 100}; NestSonuc s = nestingYerlestir({{"a", 10, 20, false, 1}}, l); FIKO_KONTROL(s.yerlesimler.size() == 1); FIKO_KONTROL(s.yerlesmeyen.empty()); FIKO_KONTROL(s.levhaSayisi == 1); FIKO_KONTROL(s.yerlesimler[0].x == 0 && s.yerlesimler[0].y == 0); FIKO_KONTROL(gecerliMi(s, l)); } FIKO_TEST(nest_buyuk_parca_yerlesmez) { NestLevha l{100, 100}; NestSonuc s = nestingYerlestir({{"dev", 200, 50, false, 1}}, l); FIKO_KONTROL(s.yerlesimler.empty()); FIKO_KONTROL(s.yerlesmeyen.size() == 1); FIKO_KONTROL(s.levhaSayisi == 0); } FIKO_TEST(nest_cakisma_yok) { NestLevha l{100, 100}; std::vector p = { {"a", 30, 40, false, 1}, {"b", 30, 40, false, 1}, {"c", 50, 20, false, 1}, {"d", 25, 25, false, 1}, {"e", 60, 30, false, 1}}; NestSonuc s = nestingYerlestir(p, l, 1.0); FIKO_KONTROL(s.yerlesimler.size() == 5); FIKO_KONTROL(gecerliMi(s, l)); // sınır içi + çakışmasız } FIKO_TEST(nest_adet_genisletir) { NestLevha l{100, 100}; NestSonuc s = nestingYerlestir({{"x", 10, 10, false, 4}}, l); FIKO_KONTROL(s.yerlesimler.size() == 4); FIKO_KONTROL(gecerliMi(s, l)); } FIKO_TEST(nest_tasma_cok_levha) { NestLevha l{100, 100}; // 6 adet 60×60 → tek levhaya en fazla 1 sığar (yan yana/üst üste sığmaz) → ≥2 levha. NestSonuc s = nestingYerlestir({{"blok", 60, 60, false, 6}}, l); FIKO_KONTROL(s.yerlesimler.size() == 6); FIKO_KONTROL(s.levhaSayisi >= 2); FIKO_KONTROL(gecerliMi(s, l)); } FIKO_TEST(nest_dondurme_ile_sigar) { NestLevha l{15, 100}; // 90×10 düz sığmaz (en 90>15); döndürülünce 10×90 sığar. NestSonuc s = nestingYerlestir({{"cubuk", 90, 10, true, 1}}, l); FIKO_KONTROL(s.yerlesimler.size() == 1); FIKO_KONTROL(s.yerlesimler[0].dondu); FIKO_KONTROL(s.yerlesimler[0].en == 10 && s.yerlesimler[0].boy == 90); FIKO_KONTROL(gecerliMi(s, l)); } FIKO_TEST(nest_dondurulemez_sigmaz) { NestLevha l{15, 100}; NestSonuc s = nestingYerlestir({{"cubuk", 90, 10, false, 1}}, l); FIKO_KONTROL(s.yerlesimler.empty()); FIKO_KONTROL(s.yerlesmeyen.size() == 1); } FIKO_TEST(nest_kullanim_orani) { NestLevha l{100, 100}; NestSonuc s = nestingYerlestir({{"a", 50, 50, false, 1}}, l); // 2500 / 10000 = 0.25 FIKO_YAKIN(s.kullanim, 0.25, 1e-6); } FIKO_TEST(nest_bos_girdi) { NestLevha l{100, 100}; NestSonuc s = nestingYerlestir({}, l); FIKO_KONTROL(s.yerlesimler.empty()); FIKO_KONTROL(s.levhaSayisi == 0); FIKO_KONTROL(s.kullanim == 0); } FIKO_TEST(nest_dxf_entity_sayisi) { NestLevha l{100, 100}; // İki 30×40 parça → 1 levhaya sığar. DXF: 4·levha + 4·parça = 4 + 8 = 12 LINE. NestSonuc s = nestingYerlestir({{"a", 30, 40, false, 1}, {"b", 30, 40, false, 1}}, l); FIKO_KONTROL(s.levhaSayisi == 1 && s.yerlesimler.size() == 2); std::string dxf = nestingDxfMetin(s, l); FIKO_KONTROL(sayac(dxf, "\nLINE\n") == 12); FIKO_KONTROL(dxf.find("SECTION") != std::string::npos); FIKO_KONTROL(dxf.find("ENTITIES") != std::string::npos); FIKO_KONTROL(dxf.find("EOF") != std::string::npos); FIKO_KONTROL(dxf.find("LEVHA") != std::string::npos); FIKO_KONTROL(dxf.find("PARCA") != std::string::npos); } FIKO_TEST(nest_dxf_bos_gecerli) { NestLevha l{100, 100}; std::string dxf = nestingDxfMetin(nestingYerlestir({}, l), l); FIKO_KONTROL(sayac(dxf, "\nLINE\n") == 0); // levha/parça yok FIKO_KONTROL(dxf.find("EOF") != std::string::npos); // yine de geçerli DXF }