#include "fiko_test.hpp" #include #include "fiko/girdi/baglam_politika.hpp" #include "fiko/girdi/fare_jest.hpp" #include "fiko/girdi/hover_probu.hpp" using namespace fiko; using namespace fiko::girdi; namespace { // Jest sistemini kur + tum yayilan jestleri yakalayan yardimci. struct Kosum { FareJestSistemi sis; std::vector jestler; Kosum() { sis.dinle([this](const FareJesti& j) { jestler.push_back(j); }); } // Tek kare besle (kolaylik kurucu). void kare(bool sol, bool orta, bool sag, Vec2f konum, f32 dt = 0.016f, f32 tekerlek = 0.0f, bool gui = false, HoverBilgi hover = {}) { FareKare k; k.sol = sol; k.orta = orta; k.sag = sag; k.konum = konum; k.dt = dt; k.tekerlek = tekerlek; k.guiUstunde = gui; k.hover = hover; sis.guncelle(k); } int say(JestTur t) const { int n = 0; for (auto& j : jestler) if (j.tur == t) ++n; return n; } const FareJesti* ilk(JestTur t) const { for (auto& j : jestler) if (j.tur == t) return &j; return nullptr; } }; } // namespace FIKO_TEST(sol_tik) { Kosum k; k.kare(false, false, false, {100, 100}); k.kare(true, false, false, {100, 100}); // bas k.kare(false, false, false, {101, 100}); // birak (esik alti) FIKO_KONTROL(k.say(JestTur::Tik) == 1); FIKO_KONTROL(k.ilk(JestTur::Tik)->dugme == Dugme::Sol); FIKO_KONTROL(k.say(JestTur::SurukleBasla) == 0); } FIKO_TEST(sol_surukle) { Kosum k; k.kare(true, false, false, {100, 100}); // bas k.kare(true, false, false, {120, 100}); // 20px kayma → surukle basla k.kare(true, false, false, {140, 100}); k.kare(false, false, false, {140, 100}); // birak → surukle bitti FIKO_KONTROL(k.say(JestTur::SurukleBasla) == 1); FIKO_KONTROL(k.say(JestTur::SurukleBitti) == 1); FIKO_KONTROL(k.say(JestTur::Tik) == 0); // surukle → tik degil } FIKO_TEST(uzun_bas) { Kosum k; k.kare(true, false, false, {50, 50}); // bas // 0.45s uzun-bas esigini asana kadar hareketsiz besle. for (int i = 0; i < 40; ++i) k.kare(true, false, false, {50, 50}, 0.016f); FIKO_KONTROL(k.say(JestTur::UzunBas) == 1); FIKO_KONTROL(k.ilk(JestTur::UzunBas)->dugme == Dugme::Sol); // Birakinca Tik'e DONUSMEZ (uzun-bas zaten yayildi). k.kare(false, false, false, {50, 50}); FIKO_KONTROL(k.say(JestTur::Tik) == 0); } FIKO_TEST(cift_tik) { Kosum k; // 1. tik k.kare(true, false, false, {200, 200}); k.kare(false, false, false, {200, 200}); // kisa bekleme (< ciftTikSure) sonra 2. tik k.kare(false, false, false, {200, 200}, 0.05f); k.kare(true, false, false, {201, 200}); k.kare(false, false, false, {201, 200}); FIKO_KONTROL(k.say(JestTur::CiftTik) == 1); FIKO_KONTROL(k.say(JestTur::Tik) == 1); // ilk tik + ikinci cift olarak } FIKO_TEST(akor_tik) { Kosum k; // Sol basildi, ~40ms icinde Sag basildi → akor. k.kare(true, false, false, {80, 80}, 0.016f); k.kare(true, false, true, {80, 80}, 0.016f); // akor olustu k.kare(false, false, true, {80, 80}, 0.016f); // sol birakildi → akor tik FIKO_KONTROL(k.say(JestTur::AkorTik) == 1); const FareJesti* a = k.ilk(JestTur::AkorTik); FIKO_KONTROL(a && a->dugme == Dugme::Sol && a->akorDugme == Dugme::Sag); // Akor tekil Tik uretmemeli. FIKO_KONTROL(k.say(JestTur::Tik) == 0); } FIKO_TEST(akor_uzun_bas) { Kosum k; k.kare(true, false, false, {80, 80}, 0.016f); k.kare(true, false, true, {80, 80}, 0.016f); // akor for (int i = 0; i < 40; ++i) k.kare(true, false, true, {80, 80}, 0.016f); FIKO_KONTROL(k.say(JestTur::AkorUzunBas) == 1); } FIKO_TEST(ardisik_coklu_tus_tik_uretmez) { // CATIA kamera kombinasyonu (orta+sag) ardisik basisla kurulur → akor penceresi // (~40ms) kacar ama sag-tik tekil Tik/menu URETMEMELI (radyal menu bug'i). Kosum k; k.kare(false, true, false, {60, 60}, 0.016f); // orta bas // Akor penceresini gecir (>40ms hareketsiz), sonra sag bas → coklu-tus (akor DEGIL). for (int i = 0; i < 4; ++i) k.kare(false, true, false, {60, 60}, 0.016f); k.kare(false, true, true, {60, 60}, 0.016f); // sag bas (coklu-tus baglami) k.kare(false, true, false, {60, 60}, 0.016f); // sag birak (esik alti, hareketsiz) k.kare(false, false, false, {60, 60}, 0.016f); // orta birak FIKO_KONTROL(k.say(JestTur::Tik) == 0); // hicbir tekil Tik FIKO_KONTROL(k.say(JestTur::AkorTik) == 0); // akor da degil (pencere kacti) } FIKO_TEST(coklu_tus_uzun_bas_bastirir) { // Sol+sag ardisik basiliyken sol uzun kalirsa "Hizli 3D" (UzunBas) ACILMAMALI. Kosum k; k.kare(true, false, false, {70, 70}, 0.016f); // sol bas for (int i = 0; i < 4; ++i) k.kare(true, false, false, {70, 70}, 0.016f); k.kare(true, false, true, {70, 70}, 0.016f); // sag bas → coklu-tus for (int i = 0; i < 40; ++i) k.kare(true, false, true, {70, 70}, 0.016f); FIKO_KONTROL(k.say(JestTur::UzunBas) == 0); } FIKO_TEST(tekerlek) { Kosum k; k.kare(false, false, false, {10, 10}, 0.016f, 1.0f); k.kare(false, false, false, {10, 10}, 0.016f, -2.0f); FIKO_KONTROL(k.say(JestTur::Tekerlek) == 2); FIKO_KONTROL(k.jestler[0].tekerlek > 0.0f); FIKO_KONTROL(k.jestler[1].tekerlek < 0.0f); } FIKO_TEST(gui_ustunde_bastirir) { Kosum k; // GUI uzerindeyken sahne jesti yok. k.kare(true, false, false, {5, 5}, 0.016f, 0.0f, true); k.kare(false, false, false, {5, 5}, 0.016f, 0.0f, true); FIKO_KONTROL(k.jestler.empty()); } FIKO_TEST(hedef_baglam_tasinir) { Kosum k; HoverBilgi h; h.tur = HedefTur::Yuz; h.govdeId = 7; h.altId = 3; k.kare(false, false, false, {40, 40}, 0.016f, 0.0f, false, h); k.kare(false, false, true, {40, 40}, 0.016f, 0.0f, false, h); // sag bas (hover=yuz) k.kare(false, false, false, {40, 40}, 0.016f, 0.0f, false, h); // sag birak → tik const FareJesti* t = k.ilk(JestTur::Tik); FIKO_KONTROL(t && t->dugme == Dugme::Sag); FIKO_KONTROL(t && t->hedef.tur == HedefTur::Yuz && t->hedef.govdeId == 7); } FIKO_TEST(hover_probu_degisim) { SahneHoverProbu probu; int degisim = 0; probu.dinle([&](const HoverBilgi&, const HoverBilgi&) { ++degisim; }); HoverBilgi a; a.tur = HedefTur::Govde; a.govdeId = 1; probu.besle(a); probu.besle(a); // ayni → tetiklenmez HoverBilgi b; b.tur = HedefTur::Yuz; b.govdeId = 1; b.altId = 2; probu.besle(b); // degisti → tetiklenir FIKO_KONTROL(degisim == 2); // (bos→a) + (a→b) FIKO_KONTROL(probu.simdiki().tur == HedefTur::Yuz); } FIKO_TEST(hover_tur_cevir) { FIKO_KONTROL(SahneHoverProbu::turCevir(1, 5) == HedefTur::Yuz); FIKO_KONTROL(SahneHoverProbu::turCevir(2, 5) == HedefTur::Kenar); FIKO_KONTROL(SahneHoverProbu::turCevir(3, 5) == HedefTur::Nokta); FIKO_KONTROL(SahneHoverProbu::turCevir(0, 5) == HedefTur::Govde); FIKO_KONTROL(SahneHoverProbu::turCevir(1, 0) == HedefTur::Hic); // govde yok } FIKO_TEST(politika_yuz_arac_halkasi) { BaglamPolitika pol; FareJesti j; j.tur = JestTur::Tik; j.dugme = Dugme::Sag; j.hedef.tur = HedefTur::Yuz; j.hedef.govdeId = 1; PolitikaKarar r = pol.karar(j, "part"); FIKO_KONTROL(r.gecerli()); FIKO_KONTROL(r.menu == MenuTur::AracHalkasi); FIKO_KONTROL(r.radyal); FIKO_KONTROL(r.ogeler.size() >= 4); } FIKO_TEST(politika_bosluk_arac_halkasi) { BaglamPolitika pol; FareJesti j; j.tur = JestTur::Tik; j.dugme = Dugme::Sag; j.hedef.tur = HedefTur::Hic; PolitikaKarar r = pol.karar(j, "part"); FIKO_KONTROL(r.menu == MenuTur::AracHalkasi); // işaret → radyal (nested) araç halkası FIKO_KONTROL(r.radyal); FIKO_KONTROL(!r.ogeler.empty()); // "Ekle" ara-öğesi alt-halka içerir (nested radial). bool nested = false; for (const auto& o : r.ogeler) nested = nested || !o.cocuklar.empty(); FIKO_KONTROL(nested); } FIKO_TEST(politika_sol_tik_menu_acmaz) { BaglamPolitika pol; FareJesti j; j.tur = JestTur::Tik; j.dugme = Dugme::Sol; // sol tik = secim, menu degil j.hedef.tur = HedefTur::Yuz; j.hedef.govdeId = 1; PolitikaKarar r = pol.karar(j, "part"); FIKO_KONTROL(!r.gecerli()); } FIKO_TEST(politika_gui_bastirir) { BaglamPolitika pol; FareJesti j; j.tur = JestTur::Tik; j.dugme = Dugme::Sag; j.guiUstunde = true; j.hedef.tur = HedefTur::Yuz; PolitikaKarar r = pol.karar(j, "part"); FIKO_KONTROL(!r.gecerli()); }