#include #include "fiko/cekirdek/islem.hpp" #include "fiko_test.hpp" // islem.hpp yalniz forward-declare eder; bu TU'da tam tanim vererek // derlemeyi mumkun kilan test-yerel sahte tipler. namespace fiko { class Dunya {}; class OlayGunlugu {}; } // namespace fiko namespace { // Sayaci artan/azaltan sahte islem. Referanslar kullanilmaz (soyut arayuz // sozlesmesi: govde d/o uyelerine erismez). class SayacIslemi : public fiko::Islem { public: SayacIslemi(int& deger, int n) : deger_(deger), n_(n) {} const char* ad() const override { return "SayacIslemi"; } void uygula(fiko::Dunya&, fiko::OlayGunlugu&) override { deger_ += n_; } void geriAl(fiko::Dunya&, fiko::OlayGunlugu&) override { deger_ -= n_; } private: int& deger_; int n_; }; } // namespace FIKO_TEST(calistir_uygula_calistirir) { fiko::Dunya d; fiko::OlayGunlugu o; fiko::KomutYigini yigin; int deger = 0; yigin.calistir(std::make_unique(deger, 5), d, o); FIKO_KONTROL(deger == 5); FIKO_KONTROL(yigin.derinlik() == 1); FIKO_KONTROL(yigin.geriAlinabilir()); FIKO_KONTROL(!yigin.yinelenebilir()); } FIKO_TEST(geriAl_round_trip) { fiko::Dunya d; fiko::OlayGunlugu o; fiko::KomutYigini yigin; int deger = 0; yigin.calistir(std::make_unique(deger, 7), d, o); yigin.calistir(std::make_unique(deger, 3), d, o); FIKO_KONTROL(deger == 10); yigin.geriAl(d, o); FIKO_KONTROL(deger == 7); yigin.geriAl(d, o); FIKO_KONTROL(deger == 0); FIKO_KONTROL(!yigin.geriAlinabilir()); } FIKO_TEST(yinele_tekrar_uygular) { fiko::Dunya d; fiko::OlayGunlugu o; fiko::KomutYigini yigin; int deger = 0; yigin.calistir(std::make_unique(deger, 4), d, o); yigin.geriAl(d, o); FIKO_KONTROL(deger == 0); FIKO_KONTROL(yigin.yinelenebilir()); yigin.yinele(d, o); FIKO_KONTROL(deger == 4); FIKO_KONTROL(!yigin.yinelenebilir()); } FIKO_TEST(calistir_redo_dalini_gecersizler) { fiko::Dunya d; fiko::OlayGunlugu o; fiko::KomutYigini yigin; int deger = 0; yigin.calistir(std::make_unique(deger, 2), d, o); yigin.calistir(std::make_unique(deger, 2), d, o); yigin.geriAl(d, o); // imlec 1'e dustu, redo dali var FIKO_KONTROL(yigin.yinelenebilir()); // Yeni calistir redo dalini atar. yigin.calistir(std::make_unique(deger, 100), d, o); FIKO_KONTROL(!yigin.yinelenebilir()); FIKO_KONTROL(yigin.derinlik() == 2); FIKO_KONTROL(deger == 2 + 100); } FIKO_TEST(bos_yigin_guvenli) { fiko::Dunya d; fiko::OlayGunlugu o; fiko::KomutYigini yigin; FIKO_KONTROL(!yigin.geriAlinabilir()); FIKO_KONTROL(!yigin.yinelenebilir()); yigin.geriAl(d, o); // no-op yigin.yinele(d, o); // no-op FIKO_KONTROL(yigin.derinlik() == 0); } FIKO_TEST(temizle_sifirlar) { fiko::Dunya d; fiko::OlayGunlugu o; fiko::KomutYigini yigin; int deger = 0; yigin.calistir(std::make_unique(deger, 1), d, o); yigin.calistir(std::make_unique(deger, 1), d, o); FIKO_KONTROL(yigin.derinlik() == 2); yigin.temizle(); FIKO_KONTROL(yigin.derinlik() == 0); FIKO_KONTROL(!yigin.geriAlinabilir()); FIKO_KONTROL(!yigin.yinelenebilir()); } FIKO_TEST(ust_sinir_en_eskiyi_atar) { fiko::Dunya d; fiko::OlayGunlugu o; fiko::KomutYigini yigin; int deger = 0; for (size_t i = 0; i < fiko::KomutYigini::UST_SINIR + 20; ++i) yigin.calistir(std::make_unique(deger, 1), d, o); FIKO_KONTROL(yigin.derinlik() == fiko::KomutYigini::UST_SINIR); FIKO_KONTROL(!yigin.yinelenebilir()); FIKO_KONTROL(yigin.geriAlinabilir()); }