#include "fiko_test.hpp" #include #include "fiko/girdi/dokunma_jest.hpp" using namespace fiko; using namespace fiko::girdi; namespace { // Kolaylik kosumu: sistemi kur, kare kare besle, ciktiyi topla. struct Kosum { DokunmaJestSistemi sis; // Bir kare ilerlet + ciktiyi al (uygulama dongusunun birebir kalibi). DokunmaCikti kare(f32 dt = 0.016f) { sis.guncelle(dt); return sis.tuket(); } void parmakBas(u32 k, f32 x, f32 y) { sis.basildi(k, {x, y}, IsaretciTur::Dokunma, false); } void parmakTasi(u32 k, f32 x, f32 y) { sis.hareket(k, {x, y}, false); } void kalemBas(u32 k, f32 x, f32 y, bool govde) { sis.basildi(k, {x, y}, IsaretciTur::Kalem, govde); } void kalemTasi(u32 k, f32 x, f32 y, bool govde) { sis.hareket(k, {x, y}, govde); } }; } // namespace // --- Sema tablosu --- FIKO_TEST(dokunma_sema_gidis_donus) { // semaEsleme → semaCoz birebir kapanmali (iki tablo kaymasi = "Ozel"e dusme bugu). for (u8 s = 0; s < (u8)DokunmaSema::Ozel; ++s) { const DokunmaEsleme e = DokunmaEsleme::semaEsleme((DokunmaSema)s); FIKO_KONTROL(e.semaCoz() == (DokunmaSema)s); } } FIKO_TEST(dokunma_sema_elle_degisim_ozele_duser) { DokunmaEsleme e = DokunmaEsleme::semaEsleme(DokunmaSema::FikoYT); e.ata(DokunmaJest::UcParmakSurukle, DokunmaEylem::Zoom); FIKO_KONTROL(e.semaCoz() == DokunmaSema::Ozel); } FIKO_TEST(dokunma_varsayilan_fikoyt_semasi) { DokunmaJestSistemi sis; FIKO_KONTROL(sis.esleme.al(DokunmaJest::TekParmakSurukle) == DokunmaEylem::Dondur); FIKO_KONTROL(sis.esleme.al(DokunmaJest::IkiParmakPinch) == DokunmaEylem::Zoom); FIKO_KONTROL(sis.esleme.al(DokunmaJest::KalemUcSurukle) == DokunmaEylem::Isaretci); } // --- Tek parmak --- FIKO_TEST(dokunma_tek_parmak_surukle_dondurur) { Kosum k; k.parmakBas(1, 100, 100); k.kare(); k.parmakTasi(1, 140, 100); // esik (8px) asildi const DokunmaCikti c = k.kare(); FIKO_YAKIN(c.dondurX, 40.0f, 1e-3f); FIKO_YAKIN(c.dondurY, 0.0f, 1e-3f); FIKO_KONTROL(c.panX == 0.0f && c.zoomLogOran == 0.0f); FIKO_KONTROL(k.sis.navSuruyor()); } FIKO_TEST(dokunma_esik_altinda_dondurmez) { Kosum k; k.parmakBas(1, 100, 100); k.kare(); k.parmakTasi(1, 103, 100); // 3px < 8px esik const DokunmaCikti c = k.kare(); FIKO_KONTROL(!c.navVarMi()); } FIKO_TEST(dokunma_kisa_dokunus_tik_yayar) { Kosum k; k.parmakBas(1, 200, 150); k.kare(0.05f); k.sis.birakildi(1); const DokunmaCikti c = k.kare(); FIKO_KONTROL(c.tik); FIKO_YAKIN(c.olayNokta.x, 200.0f, 1e-3f); FIKO_KONTROL(!c.uzunBas); } FIKO_TEST(dokunma_surukleyen_parmak_tik_yaymaz) { // Orbit'ten sonra parmak kalkinca yanlislikla secim OLMAMALI. Kosum k; k.parmakBas(1, 100, 100); k.kare(); k.parmakTasi(1, 150, 100); k.kare(); k.sis.birakildi(1); const DokunmaCikti c = k.kare(); FIKO_KONTROL(!c.tik && !c.ciftTik); } FIKO_TEST(dokunma_uzun_bas_baglam_yayar) { Kosum k; k.parmakBas(1, 300, 300); DokunmaCikti c{}; for (int i = 0; i < 40 && !c.uzunBas; ++i) c = k.kare(0.016f); // ~0.64s > 0.50s FIKO_KONTROL(c.uzunBas); FIKO_YAKIN(c.olayNokta.x, 300.0f, 1e-3f); // Bir kez yayilir (menu her karede yeniden acilmasin). const DokunmaCikti c2 = k.kare(); FIKO_KONTROL(!c2.uzunBas); } FIKO_TEST(dokunma_uzun_bas_sonrasi_surukleme_dondurmez) { // Baglam menusu acildi → parmak kaysa bile model firlamamali. Kosum k; k.parmakBas(1, 300, 300); DokunmaCikti c{}; for (int i = 0; i < 40 && !c.uzunBas; ++i) c = k.kare(0.016f); FIKO_KONTROL(c.uzunBas); k.parmakTasi(1, 400, 300); const DokunmaCikti c2 = k.kare(); FIKO_KONTROL(!c2.navVarMi()); } FIKO_TEST(dokunma_uzun_bas_sonrasi_tik_yayilmaz) { Kosum k; k.parmakBas(1, 300, 300); DokunmaCikti c{}; for (int i = 0; i < 40 && !c.uzunBas; ++i) c = k.kare(0.016f); k.sis.birakildi(1); const DokunmaCikti c2 = k.kare(); FIKO_KONTROL(!c2.tik); } // --- Iki parmak --- FIKO_TEST(dokunma_iki_parmak_pan) { Kosum k; k.parmakBas(1, 100, 100); k.parmakBas(2, 200, 100); k.kare(); // Ikisi de +30 saga → merkez +30, yayilim SABIT → yalniz pan. k.parmakTasi(1, 130, 100); k.parmakTasi(2, 230, 100); const DokunmaCikti c = k.kare(); FIKO_YAKIN(c.panX, 30.0f, 1e-3f); FIKO_YAKIN(c.zoomLogOran, 0.0f, 1e-6f); FIKO_KONTROL(c.dondurX == 0.0f); // iki parmak dondurmez (FikoYT semasi) } FIKO_TEST(dokunma_pinch_zoom_isareti) { Kosum k; k.parmakBas(1, 100, 100); k.parmakBas(2, 200, 100); k.kare(); // Parmaklar acildi (100px → 200px) → yakinlasma yonu: log(oran) > 0. k.parmakTasi(1, 50, 100); k.parmakTasi(2, 250, 100); const DokunmaCikti c = k.kare(); FIKO_KONTROL(c.zoomLogOran > 0.0f); FIKO_YAKIN(c.zoomLogOran, std::log(2.0f), 1e-3f); FIKO_YAKIN(c.zoomMerkez.x, 150.0f, 1e-3f); // Merkez kaymadi → pan yok (pinch pan'a sizmamali). FIKO_YAKIN(c.panX, 0.0f, 1e-3f); } FIKO_TEST(dokunma_pinch_kapanma_negatif) { Kosum k; k.parmakBas(1, 50, 100); k.parmakBas(2, 250, 100); k.kare(); k.parmakTasi(1, 100, 100); k.parmakTasi(2, 200, 100); const DokunmaCikti c = k.kare(); FIKO_KONTROL(c.zoomLogOran < 0.0f); } FIKO_TEST(dokunma_ikinci_parmak_sicrama_yapmaz) { // KRITIK: ikinci parmak indigi kare merkez/yayilim temeli YENIDEN kurulmali, // yoksa tek-parmak merkezinden iki-parmak merkezine sicrama = model firlar. Kosum k; k.parmakBas(1, 100, 100); k.kare(); k.parmakTasi(1, 120, 100); k.kare(); k.parmakBas(2, 400, 100); // uzaga ikinci parmak → merkez aniden 260'a atlar const DokunmaCikti c = k.kare(); FIKO_YAKIN(c.panX, 0.0f, 1e-3f); FIKO_YAKIN(c.panY, 0.0f, 1e-3f); FIKO_YAKIN(c.zoomLogOran, 0.0f, 1e-6f); } FIKO_TEST(dokunma_parmak_kalkinca_sicrama_yapmaz) { // Iki parmak pan'inda biri kalkinca kalan parmak merkez olur → sicrama olmamali. Kosum k; k.parmakBas(1, 100, 100); k.parmakBas(2, 300, 100); k.kare(); k.sis.birakildi(2); const DokunmaCikti c = k.kare(); FIKO_KONTROL(!c.navVarMi()); } FIKO_TEST(dokunma_cok_parmak_sonrasi_tik_yayilmaz) { // Iki parmak pan → parmaklardan biri kalkti, sonra otekini kaldirdik: son // parmagin kalkisi TIK sayilmamali (yanlislikla secim). Kosum k; k.parmakBas(1, 100, 100); k.parmakBas(2, 300, 100); k.kare(0.05f); k.sis.birakildi(2); k.kare(0.05f); k.sis.birakildi(1); const DokunmaCikti c = k.kare(); FIKO_KONTROL(!c.tik); } FIKO_TEST(dokunma_uc_parmak_semaya_bagli) { Kosum k; k.sis.esleme.ata(DokunmaJest::UcParmakSurukle, DokunmaEylem::Pan); k.parmakBas(1, 100, 100); k.parmakBas(2, 200, 100); k.parmakBas(3, 300, 100); k.kare(); k.parmakTasi(1, 110, 100); k.parmakTasi(2, 210, 100); k.parmakTasi(3, 310, 100); const DokunmaCikti c = k.kare(); FIKO_YAKIN(c.panX, 10.0f, 1e-3f); } // --- Kalem --- FIKO_TEST(kalem_uc_isaretci_dokunur_dokunmaz_basili) { // Kalem ucu sol-tus esdegeri: esik BEKLEMEDEN basili olmali (sketch cizimi ilk // pikselleri kaybetmesin). Kosum k; k.kalemBas(1, 100, 100, false); const DokunmaCikti c = k.kare(); FIKO_KONTROL(c.isaretciBasili); FIKO_YAKIN(c.isaretciNokta.x, 100.0f, 1e-3f); FIKO_KONTROL(!c.navVarMi()); } FIKO_TEST(kalem_govde_tusu_dondurur) { Kosum k; k.kalemBas(1, 100, 100, true); k.kare(); k.kalemTasi(1, 150, 120, true); const DokunmaCikti c = k.kare(); FIKO_YAKIN(c.dondurX, 50.0f, 1e-3f); FIKO_YAKIN(c.dondurY, 20.0f, 1e-3f); FIKO_KONTROL(!c.isaretciBasili); } FIKO_TEST(kalem_govde_tusu_surukleme_ortasinda_degisir) { // Govde tusu MOVE mesajlarinda gelir; ortada birakilirsa jest isaretciye doner. Kosum k; k.kalemBas(1, 100, 100, true); k.kare(); k.kalemTasi(1, 150, 100, true); FIKO_KONTROL(k.kare().dondurX > 0.0f); k.kalemTasi(1, 160, 100, false); // govde tusu birakildi const DokunmaCikti c = k.kare(); FIKO_KONTROL(c.isaretciBasili && c.dondurX == 0.0f); } FIKO_TEST(kalem_isaretci_jestinde_tik_yayilmaz) { // Isaretci eylemine bagli jest zaten sol-tus gibi surulur → secimi uygulama yapar, // ayrica tik yayilirsa CIFT secim olur. Kosum k; k.kalemBas(1, 100, 100, false); k.kare(0.05f); k.sis.birakildi(1); const DokunmaCikti c = k.kare(); FIKO_KONTROL(!c.tik); } FIKO_TEST(kalem_govde_dokunusu_sag_tik_bayragi) { // Kalem govde (barrel) tusuyla DOKUNUŞ = sag-tik (baglam menusu). Uygulama bu // bayraga bakip sentetik SAG tik uretir; bayrak yoksa sol tik = yanlis. Kosum k; k.kalemBas(1, 120, 90, true); k.kare(0.05f); k.sis.birakildi(1); const DokunmaCikti c = k.kare(); FIKO_KONTROL(c.tik); FIKO_KONTROL(c.olayGovdeTusu); } FIKO_TEST(parmak_dokunusu_govde_bayragi_vermez) { Kosum k; k.parmakBas(1, 120, 90); k.kare(0.05f); k.sis.birakildi(1); const DokunmaCikti c = k.kare(); FIKO_KONTROL(c.tik && !c.olayGovdeTusu); // parmak → sol tik (secim) } FIKO_TEST(kalem_govde_uzun_bas_bayragi) { Kosum k; k.kalemBas(1, 200, 200, true); DokunmaCikti c{}; for (int i = 0; i < 40 && !c.uzunBas; ++i) c = k.kare(0.016f); FIKO_KONTROL(c.uzunBas && c.olayGovdeTusu); } // --- Eslem / ayar --- FIKO_TEST(dokunma_eslem_yok_hicbir_sey_yapmaz) { Kosum k; k.sis.esleme.ata(DokunmaJest::TekParmakSurukle, DokunmaEylem::Yok); k.parmakBas(1, 100, 100); k.kare(); k.parmakTasi(1, 200, 100); const DokunmaCikti c = k.kare(); FIKO_KONTROL(!c.navVarMi() && !c.isaretciBasili); } FIKO_TEST(dokunma_hassasiyet_carpani) { Kosum k; k.sis.ayar.dondurHassasiyet = 2.0f; k.parmakBas(1, 100, 100); k.kare(); k.parmakTasi(1, 150, 100); FIKO_YAKIN(k.kare().dondurX, 100.0f, 1e-3f); } FIKO_TEST(dokunma_iptal_temizler) { Kosum k; k.parmakBas(1, 100, 100); k.parmakBas(2, 200, 100); k.kare(); k.sis.iptal(); FIKO_KONTROL(k.sis.aktifSayi() == 0); FIKO_KONTROL(!k.sis.navSuruyor()); k.parmakTasi(1, 500, 500); // olu isaretci → yoksayilir FIKO_KONTROL(!k.kare().navVarMi()); } FIKO_TEST(dokunma_tek_isaretci_konum_pick_icin) { // Uygulama bununla imleci parmagin altina tasir (tik → secim dogru nesneyi bulsun). Kosum k; Vec2f p{}; FIKO_KONTROL(!k.sis.tekIsaretciKonum(p)); // parmak yok k.parmakBas(1, 250, 175); k.kare(); FIKO_KONTROL(k.sis.tekIsaretciKonum(p)); FIKO_YAKIN(p.x, 250.0f, 1e-3f); FIKO_YAKIN(p.y, 175.0f, 1e-3f); } FIKO_TEST(dokunma_surukleyince_konum_verilmez) { // Orbit sirasinda pick parmagi KOVALAMAMALI (bosa is + hover titremesi). Kosum k; k.parmakBas(1, 100, 100); k.kare(); k.parmakTasi(1, 200, 100); k.kare(); Vec2f p{}; FIKO_KONTROL(!k.sis.tekIsaretciKonum(p)); } FIKO_TEST(dokunma_ham_konum_suruklerken_de_gelir) { // Tutamac (R/C gizmo) surukleme yolu: parmak kaydiktan SONRA da konum lazim — // tekIsaretciKonum surukleyince susar, tekIsaretciHam susmaz. Kosum k; k.parmakBas(1, 100, 100); k.kare(); k.parmakTasi(1, 200, 140); k.kare(); Vec2f p{}; bool sur = false; FIKO_KONTROL(k.sis.tekIsaretciHam(p, sur)); FIKO_KONTROL(sur); FIKO_YAKIN(p.x, 200.0f, 1e-3f); FIKO_YAKIN(p.y, 140.0f, 1e-3f); Vec2f p2{}; FIKO_KONTROL(!k.sis.tekIsaretciKonum(p2)); // nav yolu susar (pick kovalamasin) } FIKO_TEST(dokunma_ham_konum_durgunken_suruklendi_false) { Kosum k; k.parmakBas(1, 100, 100); k.kare(); Vec2f p{}; bool sur = true; FIKO_KONTROL(k.sis.tekIsaretciHam(p, sur)); FIKO_KONTROL(!sur); // esik asilmadi → "aday" penceresi (tutamac testi burada yapilir) } FIKO_TEST(dokunma_iki_parmakta_konum_verilmez) { Kosum k; k.parmakBas(1, 100, 100); k.parmakBas(2, 200, 100); k.kare(); Vec2f p{}; FIKO_KONTROL(!k.sis.tekIsaretciKonum(p)); } FIKO_TEST(dokunma_cift_dokunus_cifttik_yayar) { // Iki hizli dokunuş → tik, sonra ciftTik (uygulama ikisini de sentetik tika cevirir). Kosum k; k.parmakBas(1, 200, 200); k.kare(0.05f); k.sis.birakildi(1); FIKO_KONTROL(k.kare().tik); k.parmakBas(2, 202, 201); // ayni yere, esik icinde k.kare(0.05f); k.sis.birakildi(2); const DokunmaCikti c = k.kare(); FIKO_KONTROL(c.ciftTik && !c.tik); } FIKO_TEST(dokunma_tuket_sifirlar) { Kosum k; k.parmakBas(1, 100, 100); k.kare(); k.parmakTasi(1, 150, 100); FIKO_KONTROL(k.kare().dondurX > 0.0f); // Ayni delta ikinci kez UYGULANMAMALI (birikme = kaçan model). FIKO_KONTROL(k.kare().dondurX == 0.0f); }