source: molecuilder/src/unittests/ActionSequenceTest.cpp@ 91b18cd

Last change on this file since 91b18cd was abd4a1, checked in by Tillmann Crueger <crueger@…>, 16 years ago

Added detailed documentation for the Action class

  • Property mode set to 100644
File size: 5.9 KB
RevLine 
[93df03f]1/*
2 * ActionSequenzTest.cpp
3 *
4 * Created on: Dec 17, 2009
5 * Author: crueger
6 */
7
8#include <cppunit/CompilerOutputter.h>
9#include <cppunit/extensions/TestFactoryRegistry.h>
10#include <cppunit/ui/text/TestRunner.h>
11
12#include "unittests/ActionSequenceTest.hpp"
13#include "Actions/Action.hpp"
14#include "Actions/ActionSequence.hpp"
[abd4a1]15#include "Actions/MakroAction.hpp"
16#include "Actions/ActionHistory.hpp"
17#include "Actions/ActionRegistry.hpp"
[93df03f]18
[44becc]19#ifdef HAVE_TESTRUNNER
20#include "UnitTestMain.hpp"
21#endif /*HAVE_TESTRUNNER*/
22
23/********************************************** Test classes **************************************/
24
[93df03f]25// Registers the fixture into the 'registry'
26CPPUNIT_TEST_SUITE_REGISTRATION( ActionSequenceTest );
27
28/* some neccessary stubs for tests */
29class canUndoActionStub : public Action
30{
31public:
[3e8325]32 canUndoActionStub(): Action("canUndoActionStub",false){}
[93df03f]33 virtual ~canUndoActionStub(){}
34
[521e29]35 virtual Action::state_ptr performCall(){
[0012e6]36 return Action::success;
37 }
[521e29]38 virtual Action::state_ptr performUndo(Action::state_ptr){
[0012e6]39 return Action::success;
40 }
[521e29]41 virtual Action::state_ptr performRedo(Action::state_ptr){
[0012e6]42 return Action::success;
43 }
[93df03f]44 virtual bool canUndo(){
45 return true;
46 }
[0012e6]47 virtual bool shouldUndo(){
48 return true;
49 }
[93df03f]50};
51
52class cannotUndoActionStub : public Action
53{
54public:
[3e8325]55 cannotUndoActionStub() : Action("cannotUndoActionStub",false){}
[93df03f]56 virtual ~cannotUndoActionStub(){}
57
[521e29]58 virtual Action::state_ptr performCall(){
[0012e6]59 return Action::success;
60 }
[521e29]61 virtual Action::state_ptr performUndo(Action::state_ptr){
[0012e6]62 return Action::success;
63 }
[521e29]64 virtual Action::state_ptr performRedo(Action::state_ptr){
[0012e6]65 return Action::success;
66 }
[93df03f]67 virtual bool canUndo(){
68 return false;
69 }
[0012e6]70 virtual bool shouldUndo(){
71 return true;
72 }
[93df03f]73};
74
[8d24e2]75class wasCalledActionStub : public Action
76{
77public:
78 wasCalledActionStub() :
[3e8325]79 Action("wasCalledActionStub",false),
[8d24e2]80 called(false)
81 {}
82 virtual ~wasCalledActionStub(){}
[93df03f]83
[521e29]84 virtual Action::state_ptr performCall(){
[8d24e2]85 called = true;
[0012e6]86 return Action::success;
[8d24e2]87 }
[521e29]88 virtual Action::state_ptr performUndo(Action::state_ptr){
[8d24e2]89 called = false;
[0012e6]90 return Action::success;
91 }
[521e29]92 virtual Action::state_ptr performRedo(Action::state_ptr){
[0012e6]93 called = true;
94 return Action::success;
[8d24e2]95 }
96 virtual bool canUndo(){
97 return true;
98 }
[0012e6]99 virtual bool shouldUndo(){
100 return true;
101 }
[8d24e2]102 bool wasCalled(){
103 return called;
104 }
105private:
106 bool called;
107};
[93df03f]108
[8d24e2]109void ActionSequenceTest::setUp(){
[abd4a1]110 ActionHistory::init();
[93df03f]111 // create some necessary stubs used in this test
[8d24e2]112 positive1 = new canUndoActionStub();
113 positive2 = new canUndoActionStub();
114 negative1 = new cannotUndoActionStub();
115 negative2 = new cannotUndoActionStub();
116
117 shouldCall1 = new wasCalledActionStub();
118 shouldCall2 = new wasCalledActionStub();
119 shouldNotCall1 = new wasCalledActionStub();
120 shouldNotCall2 = new wasCalledActionStub();
121
122}
123
124void ActionSequenceTest::tearDown(){
125 delete positive1;
126 delete positive2;
127 delete negative1;
128 delete negative2;
[93df03f]129
[8d24e2]130 delete shouldCall1;
131 delete shouldCall2;
132 delete shouldNotCall1;
133 delete shouldNotCall2;
134
[abd4a1]135 ActionHistory::purgeInstance();
136 ActionRegistry::purgeInstance();
[8d24e2]137}
138
139void ActionSequenceTest::canUndoTest(){
[93df03f]140 // first section:
141 {
142 // test some combinations
143 {
144 ActionSequence *sequence = new ActionSequence();
145 sequence->addAction(positive1);
146 sequence->addAction(positive2);
147 CPPUNIT_ASSERT_EQUAL( true, sequence->canUndo() );
148 delete sequence;
149 }
150 {
151 ActionSequence *sequence = new ActionSequence();
152 sequence->addAction(positive1);
153 sequence->addAction(negative2);
154 CPPUNIT_ASSERT_EQUAL( false, sequence->canUndo() );
155 delete sequence;
156 }
157 {
158 ActionSequence *sequence = new ActionSequence();
159 sequence->addAction(negative1);
160 sequence->addAction(positive2);
161 CPPUNIT_ASSERT_EQUAL( false, sequence->canUndo() );
162 delete sequence;
163 }
164 {
165 ActionSequence *sequence = new ActionSequence();
166 sequence->addAction(negative1);
167 sequence->addAction(negative2);
168 CPPUNIT_ASSERT_EQUAL( false, sequence->canUndo() );
169 delete sequence;
170 }
171 }
172
173 // second section:
174 {
175 // empty sequence can be undone
176 ActionSequence *sequence = new ActionSequence();
177 CPPUNIT_ASSERT_EQUAL( true, sequence->canUndo() );
178 // if only a positive action is contained it can be undone
179 sequence->addAction(positive1);
180 CPPUNIT_ASSERT_EQUAL( true, sequence->canUndo() );
181 // the single negative action should block the process
182 sequence->addAction(negative1);
183 CPPUNIT_ASSERT_EQUAL( false, sequence->canUndo() );
184 // after removing the negative action all is well again
185 sequence->removeLastAction();
186 CPPUNIT_ASSERT_EQUAL( true, sequence->canUndo() );
187 delete sequence;
188 }
[8d24e2]189}
[93df03f]190
[8d24e2]191void ActionSequenceTest::doesCallTest(){
192 ActionSequence *sequence = new ActionSequence();
193 sequence->addAction(shouldCall1);
194 sequence->addAction(shouldCall2);
195 sequence->addAction(shouldNotCall1);
196 sequence->addAction(shouldNotCall2);
197 sequence->removeLastAction();
198 sequence->removeLastAction();
199
200 sequence->callAll();
201
202 CPPUNIT_ASSERT_EQUAL(true,shouldCall1->wasCalled());
203 CPPUNIT_ASSERT_EQUAL(true,shouldCall2->wasCalled());
204 CPPUNIT_ASSERT_EQUAL(false,shouldNotCall1->wasCalled());
205 CPPUNIT_ASSERT_EQUAL(false,shouldNotCall2->wasCalled());
206
[d06198]207 delete sequence;
[8d24e2]208}
209
210void ActionSequenceTest::doesUndoTest(){
211 ActionSequence *sequence = new ActionSequence();
[abd4a1]212 wasCalledActionStub *wasCalled1 = new wasCalledActionStub();
213 wasCalledActionStub *wasCalled2 = new wasCalledActionStub();
214 sequence->addAction(wasCalled1);
215 sequence->addAction(wasCalled2);
[8d24e2]216
[abd4a1]217 MakroAction act("Test MakroAction",sequence,false);
[8d24e2]218
[abd4a1]219 act.call();
[8d24e2]220
[abd4a1]221 CPPUNIT_ASSERT_EQUAL(true,wasCalled1->wasCalled());
222 CPPUNIT_ASSERT_EQUAL(true,wasCalled1->wasCalled());
[8d24e2]223
[abd4a1]224 ActionHistory::getInstance().undoLast();
225
226 CPPUNIT_ASSERT_EQUAL(false,wasCalled1->wasCalled());
227 CPPUNIT_ASSERT_EQUAL(false,wasCalled1->wasCalled());
[93df03f]228
229}
230
231
Note: See TracBrowser for help on using the repository browser.