// GrupIslem — kompozit undo/redo (çoklu-seçim taşı/döndür tek Ctrl+Z). Sıra + ters-sıra // + tek-birim davranışını gerçek KomutYigini üzerinden doğrular (sahte SeqIslem ile). #include #include #include #include "fiko/cekirdek/islem.hpp" #include "fiko/cekirdek/olay.hpp" #include "fiko/sahne/sahne_islem.hpp" #include "fiko_test.hpp" using namespace fiko; namespace { // uygula → u_ ekler, geriAl → g_ ekler; sıralamayı gözlemlemek için harf biriktirir. class SeqIslem : public Islem { public: SeqIslem(std::string& s, char u, char g) : s_(s), u_(u), g_(g) {} const char* ad() const override { return "Seq"; } void uygula(Dunya&, OlayGunlugu&) override { s_ += u_; } void geriAl(Dunya&, OlayGunlugu&) override { s_ += g_; } private: std::string& s_; char u_, g_; }; } // namespace FIKO_TEST(sahne_grup_islem_sira_ve_undo) { Dunya d; OlayGunlugu o; KomutYigini yigin; std::string seq; std::vector> alt; alt.push_back(std::make_unique(seq, 'A', 'a')); alt.push_back(std::make_unique(seq, 'B', 'b')); yigin.calistir(std::make_unique(std::move(alt)), d, o); FIKO_KONTROL(seq == "AB"); // uygula SIRAYLA (A sonra B) FIKO_KONTROL(yigin.derinlik() == 1); // grup TEK undo birimi FIKO_KONTROL(yigin.geriAlinabilir()); yigin.geriAl(d, o); FIKO_KONTROL(seq == "ABba"); // geriAl TERS sıra (B→b, sonra A→a) yigin.yinele(d, o); FIKO_KONTROL(seq == "ABbaAB"); // redo yine sırayla FIKO_KONTROL(yigin.derinlik() == 1); } FIKO_TEST(sahne_grup_islem_bos) { Dunya d; OlayGunlugu o; std::vector> yok; GrupIslem g(std::move(yok)); FIKO_KONTROL(g.adet() == 0); g.uygula(d, o); // boş grup → çökme yok g.geriAl(d, o); FIKO_KONTROL(g.adet() == 0); }