// KNMT (kinematik mekanizma) chunk round-trip testleri — v1.17. // Mekanizma .fikocad'e YAZILMAZSA kaydet/aç sonrası kaybolur; bu testler onu kilitler. #include #include "fiko/io/fiko_format.hpp" #include "fiko_test.hpp" using namespace fiko; using namespace fiko::io; namespace { FikoBelge ornekBelge() { FikoBelge b; FikoUzuv g{.ad = "Gövde"}; FikoUzuv k{.ad = "Kol", .sahne = 42}; k.tabanKonum[0] = 1.5; k.tabanKonum[2] = -3.25; k.tabanYon[2] = 0.7071067811865476; k.tabanYon[3] = 0.7071067811865476; b.uzuvlar = {g, k}; FikoMafsal m{.ad = "Döner", .tip = 1, .ana = 0, .cocuk = 1}; m.capaKonum[0] = 60.0; m.capaCocukKonum[0] = 12.5; // v1.18 çift taraflı çapa m.capaCocukKonum[2] = -4.0; m.capaCocukYon[2] = 0.7071067811865476; m.capaCocukYon[3] = 0.7071067811865476; m.q = 0.5; m.q2 = -2.0; m.q3 = 0.125; m.vidaAdim = 3.5; m.altSinir = -1.0; m.ustSinir = 2.0; b.mafsallar = {m}; FikoYasa y{.mafsal = 0, .tip = 3, .degisken = 1}; y.deger = 7.0; y.hiz = 2.0; y.genlik = 4.0; y.periyot = 6.0; y.faz = 0.25; y.anahtarlar = {{0.0, 0.0}, {2.0, 40.0}, {4.0, 0.0}}; b.yasalar = {y}; return b; } } // namespace FIKO_TEST(io_knmt_gidis_donus) { const FikoBelge ilk = ornekBelge(); std::string veri, hata; FIKO_KONTROL(fikoYaz(ilk, veri, hata)); FIKO_KONTROL(hata.empty()); FikoBelge geri; FIKO_KONTROL(fikoOku(veri, geri, hata)); FIKO_KONTROL(hata.empty()); FIKO_KONTROL(geri.uzuvlar.size() == 2); FIKO_KONTROL(geri.uzuvlar[0].ad == "Gövde"); FIKO_KONTROL(geri.uzuvlar[1].ad == "Kol"); FIKO_KONTROL(geri.uzuvlar[1].sahne == 42); FIKO_YAKIN(geri.uzuvlar[1].tabanKonum[0], 1.5, 1e-12); FIKO_YAKIN(geri.uzuvlar[1].tabanKonum[2], -3.25, 1e-12); FIKO_YAKIN(geri.uzuvlar[1].tabanYon[3], 0.7071067811865476, 1e-12); FIKO_YAKIN(geri.uzuvlar[1].tabanOlcek[0], 1.0, 1e-12); FIKO_KONTROL(geri.mafsallar.size() == 1); const FikoMafsal& m = geri.mafsallar[0]; FIKO_KONTROL(m.ad == "Döner"); FIKO_KONTROL(m.tip == 1); FIKO_KONTROL(m.ana == 0 && m.cocuk == 1); FIKO_YAKIN(m.capaKonum[0], 60.0, 1e-12); FIKO_YAKIN(m.capaCocukKonum[0], 12.5, 1e-12); // v1.18 çift taraflı çapa korunuyor FIKO_YAKIN(m.capaCocukKonum[2], -4.0, 1e-12); FIKO_YAKIN(m.capaCocukYon[3], 0.7071067811865476, 1e-12); FIKO_YAKIN(m.q, 0.5, 1e-12); FIKO_YAKIN(m.q2, -2.0, 1e-12); FIKO_YAKIN(m.q3, 0.125, 1e-12); FIKO_YAKIN(m.vidaAdim, 3.5, 1e-12); FIKO_YAKIN(m.altSinir, -1.0, 1e-12); FIKO_YAKIN(m.ustSinir, 2.0, 1e-12); FIKO_KONTROL(geri.yasalar.size() == 1); const FikoYasa& y = geri.yasalar[0]; FIKO_KONTROL(y.tip == 3); FIKO_KONTROL(y.degisken == 1); FIKO_YAKIN(y.periyot, 6.0, 1e-12); FIKO_YAKIN(y.faz, 0.25, 1e-12); FIKO_KONTROL(y.anahtarlar.size() == 3); FIKO_YAKIN(y.anahtarlar[1].first, 2.0, 1e-12); FIKO_YAKIN(y.anahtarlar[1].second, 40.0, 1e-12); FIKO_YAKIN(y.anahtarlar[2].second, 0.0, 1e-12); } FIKO_TEST(io_knmt_bos_mekanizma_chunk_yazmaz) { // Geriye-uyum: mekanizma yoksa KNMT chunk'ı HİÇ yazılmamalı (eski okuyucu bozulmaz) // ve okuma sonrası listeler boş kalmalı. FikoBelge bos; std::string veri, hata; FIKO_KONTROL(fikoYaz(bos, veri, hata)); FIKO_KONTROL(veri.find("KNMT") == std::string::npos); FikoBelge geri; FIKO_KONTROL(fikoOku(veri, geri, hata)); FIKO_KONTROL(geri.uzuvlar.empty()); FIKO_KONTROL(geri.mafsallar.empty()); FIKO_KONTROL(geri.yasalar.empty()); } FIKO_TEST(io_knmt_capa_cocuk_varsayilan_birim) { // Çocuk çapası VERİLMEZSE birim kalmalı (eski davranış = çocuk mafsal çerçevesine oturur). FikoBelge b; b.mafsallar.push_back({.ad = "M", .tip = 1, .ana = 0, .cocuk = 1}); std::string veri, hata; FIKO_KONTROL(fikoYaz(b, veri, hata)); FikoBelge geri; FIKO_KONTROL(fikoOku(veri, geri, hata)); FIKO_KONTROL(geri.mafsallar.size() == 1); FIKO_YAKIN(geri.mafsallar[0].capaCocukKonum[0], 0.0, 1e-12); FIKO_YAKIN(geri.mafsallar[0].capaCocukKonum[1], 0.0, 1e-12); FIKO_YAKIN(geri.mafsallar[0].capaCocukKonum[2], 0.0, 1e-12); FIKO_YAKIN(geri.mafsallar[0].capaCocukYon[3], 1.0, 1e-12); // birim kuaterniyon } FIKO_TEST(io_knmt_bos_yasa_anahtari_ve_cok_uzuv) { FikoBelge b; for (int i = 0; i < 5; ++i) b.uzuvlar.push_back({.ad = "U" + std::to_string(i)}); b.yasalar.push_back({.mafsal = 0, .tip = 1}); // anahtar listesi BOŞ std::string veri, hata; FIKO_KONTROL(fikoYaz(b, veri, hata)); FikoBelge geri; FIKO_KONTROL(fikoOku(veri, geri, hata)); FIKO_KONTROL(geri.uzuvlar.size() == 5); FIKO_KONTROL(geri.uzuvlar[4].ad == "U4"); FIKO_KONTROL(geri.yasalar.size() == 1); FIKO_KONTROL(geri.yasalar[0].anahtarlar.empty()); }