#include "fiko/cekirdek/fiko_nesne.hpp" #include "fiko/cekirdek/yetenek.hpp" #include "fiko_test.hpp" #include #include using namespace fiko; namespace { // Somut örnek: nokta hem FikoNesne hem yetenekleri karıştırır (mixin). struct TestNokta : FikoNesne, FikoSecilebilir, FikoTiklanabilir { bool secili_ = false; int tikSayi_ = 0; explicit TestNokta(Varlik v) : FikoNesne(v) {} const char* turAdi() const override { return "FikoNokta"; } void secildi(bool s) override { secili_ = s; } bool seciliMi() const override { return secili_; } void tiklandi() override { ++tikSayi_; } }; // Yeteneksiz nesne (sadece FikoNesne — seçilemez/tıklanamaz). struct TestEtiket : FikoNesne { explicit TestEtiket(Varlik v) : FikoNesne(v) {} const char* turAdi() const override { return "FikoEtiket"; } }; } // namespace FIKO_TEST(fikonesne_temel) { TestNokta n(42); FIKO_KONTROL(n.varlik() == 42); FIKO_KONTROL(std::string(n.turAdi()) == "FikoNokta"); FIKO_KONTROL(n.arayuz.agactaGorunur); // varsayılan görünür } FIKO_TEST(fikonesne_yetenek_polimorfik) { TestNokta n(1); FikoNesne* base = &n; // Seçilebilir yeteneği TİP bilmeden dynamic_cast ile bulunur. auto* sec = dynamic_cast(base); FIKO_KONTROL(sec != nullptr); FIKO_KONTROL(!sec->seciliMi()); sec->secildi(true); FIKO_KONTROL(sec->seciliMi()); // Tıklanabilir yeteneği. auto* tik = dynamic_cast(base); FIKO_KONTROL(tik != nullptr); tik->tiklandi(); tik->tiklandi(); FIKO_KONTROL(n.tikSayi_ == 2); } FIKO_TEST(fikonesne_yeteneksiz_null) { TestEtiket e(2); FikoNesne* base = &e; FIKO_KONTROL(dynamic_cast(base) == nullptr); // yeteneği yok FIKO_KONTROL(dynamic_cast(base) == nullptr); } FIKO_TEST(sistem_yetenege_gore_calisir) { // "Seçim sistemi" simülasyonu: 3B yüz de UI buton da fark etmez — Secilebilir // olan HER ŞEYİ tip bilmeden seçer. Kullanıcının vizyonunun çekirdek kanıtı. TestNokta a(1), b(2); TestEtiket c(3); std::vector sahne = {&a, &b, &c}; int secilen = 0; for (FikoNesne* n : sahne) if (auto* s = dynamic_cast(n)) { s->secildi(true); ++secilen; } FIKO_KONTROL(secilen == 2); // yalnız 2 nokta (etiket seçilemez) FIKO_KONTROL(a.seciliMi() && b.seciliMi()); } FIKO_TEST(fikonesne_per_nesne_menu) { TestNokta n(1); MenuOge o; o.grup = "Geometri"; o.ad = "Sil"; o.simge = "🗑"; n.sagMenu.push_back(std::move(o)); // aggregate-init YOK (MSVC gotcha'dan kaçış) FIKO_KONTROL(n.sagMenu.size() == 1); FIKO_KONTROL(n.sagMenu[0].ad == "Sil"); }