#include "fiko/cam/bom.hpp" #include #include "fiko_test.hpp" using namespace fiko::cam; namespace { int satirSay(const std::string& s) { int n = 0; for (char c : s) if (c == '\n') ++n; return n; } } // namespace FIKO_TEST(bom_tek_yaprak) { BomDugum kok{"vida", "celik", 2.0, 1, {}}; BomSonuc s = bomOlustur(kok); FIKO_KONTROL(s.satirlar.size() == 1); FIKO_KONTROL(s.satirlar[0].ad == "vida"); FIKO_KONTROL(s.satirlar[0].toplamAdet == 1); FIKO_YAKIN(s.satirlar[0].toplamKutle, 2.0, 1e-9); FIKO_KONTROL(s.toplamParca == 1); FIKO_YAKIN(s.toplamKutle, 2.0, 1e-9); } FIKO_TEST(bom_iki_farkli_parca) { BomDugum kok{"montaj", "", 0, 1, {{"vida", "celik", 1.0, 2, {}}, {"somun", "celik", 0.5, 2, {}}}}; BomSonuc s = bomOlustur(kok); FIKO_KONTROL(s.satirlar.size() == 2); FIKO_KONTROL(s.toplamParca == 4); FIKO_YAKIN(s.toplamKutle, 3.0, 1e-9); // 2*1 + 2*0.5 } FIKO_TEST(bom_ayni_parca_toplanir) { BomDugum kok{"montaj", "", 0, 1, {{"vida", "celik", 1.0, 2, {}}, {"vida", "celik", 1.0, 3, {}}}}; BomSonuc s = bomOlustur(kok); FIKO_KONTROL(s.satirlar.size() == 1); // aynı ad → tek satır FIKO_KONTROL(s.satirlar[0].toplamAdet == 5); FIKO_YAKIN(s.satirlar[0].toplamKutle, 5.0, 1e-9); FIKO_KONTROL(s.toplamParca == 5); } FIKO_TEST(bom_cok_seviye_carpan) { // top × [ alt(×3) × [ vida(×2) ] ] → vida = 1*3*2 = 6 BomDugum alt{"alt", "", 0, 3, {{"vida", "celik", 1.0, 2, {}}}}; BomDugum kok{"top", "", 0, 1, {alt}}; BomSonuc s = bomOlustur(kok); FIKO_KONTROL(s.satirlar.size() == 1); FIKO_KONTROL(s.satirlar[0].toplamAdet == 6); FIKO_KONTROL(s.toplamParca == 6); FIKO_YAKIN(s.toplamKutle, 6.0, 1e-9); } FIKO_TEST(bom_alt_montaj_sayilmaz) { // Alt-montaj düğümü BOM'da satır olmaz; yalnız yaprakları toplanır. BomDugum kok{"ana", "", 99, 1, // ana montajın kütlesi sayılmaz {{"govde", "alu", 10.0, 1, {}}}}; BomSonuc s = bomOlustur(kok); FIKO_KONTROL(s.satirlar.size() == 1); FIKO_KONTROL(s.satirlar[0].ad == "govde"); FIKO_YAKIN(s.toplamKutle, 10.0, 1e-9); // 99 dahil değil } FIKO_TEST(bom_ilk_gorulme_sirasi) { BomDugum kok{"m", "", 0, 1, {{"c", "", 1, 1, {}}, {"a", "", 1, 1, {}}, {"c", "", 1, 1, {}}}}; BomSonuc s = bomOlustur(kok); FIKO_KONTROL(s.satirlar.size() == 2); FIKO_KONTROL(s.satirlar[0].ad == "c"); // ilk görülen önce FIKO_KONTROL(s.satirlar[1].ad == "a"); FIKO_KONTROL(s.satirlar[0].toplamAdet == 2); } FIKO_TEST(bom_csv_yapisi) { BomDugum kok{"montaj", "", 0, 1, {{"vida", "celik", 1.0, 2, {}}, {"somun", "celik", 0.5, 3, {}}}}; std::string csv = bomCsvMetin(bomOlustur(kok)); // başlık + 2 satır + TOPLAM = 4 satır FIKO_KONTROL(satirSay(csv) == 4); FIKO_KONTROL(csv.find("Ad,Malzeme,Adet") == 0); // başlık başta FIKO_KONTROL(csv.find("vida,celik,2,1.000,2.000") != std::string::npos); FIKO_KONTROL(csv.find("TOPLAM,,5,,3.500") != std::string::npos); // 2+3, 2+1.5 } FIKO_TEST(bom_csv_kacis) { // Virgüllü ad → tırnaklanmalı. BomDugum kok{"x,y", "malz", 1.0, 1, {}}; std::string csv = bomCsvMetin(bomOlustur(kok)); FIKO_KONTROL(csv.find("\"x,y\"") != std::string::npos); } FIKO_TEST(bom_csv_bos) { BomSonuc s; // boş std::string csv = bomCsvMetin(s); FIKO_KONTROL(satirSay(csv) == 2); // başlık + TOPLAM FIKO_KONTROL(csv.find("TOPLAM,,0,,0.000") != std::string::npos); }