mirror of https://github.com/aseprite/aseprite.git
				
				
				
			Fix deleting UndoCommand instances from stack in undo_tests
This bug was introduced in e730b90958
to fix memory leaks in "app". Now a new UndoCommand::dispose() member
function was added to fix this problem.
Also std::function<> and std::tr1::function<> was removed from the test.
We're in the middle of a transition between OS X SDK 10.4 to 10.9/10
and this brings some problems.
			
			
This commit is contained in:
		
							parent
							
								
									217a3c51c6
								
							
						
					
					
						commit
						8adbae888f
					
				| 
						 | 
				
			
			@ -62,6 +62,11 @@ void Cmd::redo()
 | 
			
		|||
#endif
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void Cmd::dispose()
 | 
			
		||||
{
 | 
			
		||||
  delete this;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
std::string Cmd::label() const
 | 
			
		||||
{
 | 
			
		||||
  return onLabel();
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -24,8 +24,12 @@ namespace app {
 | 
			
		|||
    virtual ~Cmd();
 | 
			
		||||
 | 
			
		||||
    void execute(Context* ctx);
 | 
			
		||||
 | 
			
		||||
    // undo::UndoCommand impl
 | 
			
		||||
    void undo() override;
 | 
			
		||||
    void redo() override;
 | 
			
		||||
    void dispose() override;
 | 
			
		||||
 | 
			
		||||
    std::string label() const;
 | 
			
		||||
    size_t memSize() const;
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -15,6 +15,7 @@ namespace undo {
 | 
			
		|||
    virtual ~UndoCommand() { }
 | 
			
		||||
    virtual void undo() = 0;
 | 
			
		||||
    virtual void redo() = 0;
 | 
			
		||||
    virtual void dispose() = 0;
 | 
			
		||||
  };
 | 
			
		||||
 | 
			
		||||
} // namespace undo
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -27,7 +27,8 @@ namespace undo {
 | 
			
		|||
      , m_cmd(cmd) {
 | 
			
		||||
    }
 | 
			
		||||
    ~UndoState() {
 | 
			
		||||
      delete m_cmd;
 | 
			
		||||
      if (m_cmd)
 | 
			
		||||
        m_cmd->dispose();
 | 
			
		||||
    }
 | 
			
		||||
    UndoState* prev() const { return m_prev; }
 | 
			
		||||
    UndoState* next() const { return m_next; }
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -13,42 +13,29 @@
 | 
			
		|||
#include "undo/undo_command.h"
 | 
			
		||||
#include "undo/undo_history.h"
 | 
			
		||||
 | 
			
		||||
#ifdef _WIN32
 | 
			
		||||
  #include <functional>
 | 
			
		||||
  using namespace std;
 | 
			
		||||
#else
 | 
			
		||||
  #include <tr1/functional>
 | 
			
		||||
  using namespace std::tr1;
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
using namespace undo;
 | 
			
		||||
 | 
			
		||||
class Cmd : public UndoCommand {
 | 
			
		||||
public:
 | 
			
		||||
  template<typename UndoT, typename RedoT>
 | 
			
		||||
  Cmd(RedoT redoFunc, UndoT undoFunc)
 | 
			
		||||
    : m_redo(redoFunc), m_undo(undoFunc) {
 | 
			
		||||
  Cmd(int& model, int redo_value, int undo_value)
 | 
			
		||||
    : m_model(model)
 | 
			
		||||
    , m_redo_value(redo_value)
 | 
			
		||||
    , m_undo_value(undo_value) {
 | 
			
		||||
  }
 | 
			
		||||
  void redo() override { m_redo(); }
 | 
			
		||||
  void undo() override { m_undo(); }
 | 
			
		||||
  void redo() override { m_model = m_redo_value; }
 | 
			
		||||
  void undo() override { m_model = m_undo_value; }
 | 
			
		||||
  void dispose() override { }
 | 
			
		||||
private:
 | 
			
		||||
  function<void()> m_redo;
 | 
			
		||||
  function<void()> m_undo;
 | 
			
		||||
  int& m_model;
 | 
			
		||||
  int m_redo_value;
 | 
			
		||||
  int m_undo_value;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
TEST(Undo, Basics)
 | 
			
		||||
{
 | 
			
		||||
  UndoHistory history;
 | 
			
		||||
 | 
			
		||||
  int model = 0;
 | 
			
		||||
  EXPECT_EQ(0, model);
 | 
			
		||||
 | 
			
		||||
  Cmd cmd1(
 | 
			
		||||
    [&]{ model = 1; },          // redo
 | 
			
		||||
    [&]{ model = 0; });         // undo
 | 
			
		||||
  Cmd cmd2(
 | 
			
		||||
    [&]{ model = 2; },          // redo
 | 
			
		||||
    [&]{ model = 1; });         // undo
 | 
			
		||||
  Cmd cmd1(model, 1, 0);
 | 
			
		||||
  Cmd cmd2(model, 2, 1);
 | 
			
		||||
 | 
			
		||||
  EXPECT_EQ(0, model);
 | 
			
		||||
  cmd1.redo();
 | 
			
		||||
| 
						 | 
				
			
			@ -56,6 +43,7 @@ TEST(Undo, Basics)
 | 
			
		|||
  cmd2.redo();
 | 
			
		||||
  EXPECT_EQ(2, model);
 | 
			
		||||
 | 
			
		||||
  UndoHistory history;
 | 
			
		||||
  EXPECT_FALSE(history.canUndo());
 | 
			
		||||
  EXPECT_FALSE(history.canRedo());
 | 
			
		||||
  history.add(&cmd1);
 | 
			
		||||
| 
						 | 
				
			
			@ -86,17 +74,16 @@ TEST(Undo, Basics)
 | 
			
		|||
 | 
			
		||||
TEST(Undo, Tree)
 | 
			
		||||
{
 | 
			
		||||
  UndoHistory history;
 | 
			
		||||
  int model = 0;
 | 
			
		||||
 | 
			
		||||
  // 1 --- 2
 | 
			
		||||
  //  \
 | 
			
		||||
  //   ------ 3 --- 4
 | 
			
		||||
  Cmd cmd1([&]{ model = 1; }, [&]{ model = 0; });
 | 
			
		||||
  Cmd cmd2([&]{ model = 2; }, [&]{ model = 1; });
 | 
			
		||||
  Cmd cmd3([&]{ model = 3; }, [&]{ model = 1; });
 | 
			
		||||
  Cmd cmd4([&]{ model = 4; }, [&]{ model = 3; });
 | 
			
		||||
  int model = 0;
 | 
			
		||||
  Cmd cmd1(model, 1, 0);
 | 
			
		||||
  Cmd cmd2(model, 2, 1);
 | 
			
		||||
  Cmd cmd3(model, 3, 1);
 | 
			
		||||
  Cmd cmd4(model, 4, 3);
 | 
			
		||||
 | 
			
		||||
  UndoHistory history;
 | 
			
		||||
  cmd1.redo(); history.add(&cmd1);
 | 
			
		||||
  cmd2.redo(); history.add(&cmd2);
 | 
			
		||||
  history.undo();
 | 
			
		||||
| 
						 | 
				
			
			@ -126,21 +113,20 @@ TEST(Undo, Tree)
 | 
			
		|||
 | 
			
		||||
TEST(Undo, ComplexTree)
 | 
			
		||||
{
 | 
			
		||||
  UndoHistory history;
 | 
			
		||||
  int model = 0;
 | 
			
		||||
 | 
			
		||||
  // 1 --- 2 --- 3 --- 4      ------ 7 --- 8
 | 
			
		||||
  //        \                /
 | 
			
		||||
  //         ------------- 5 --- 6
 | 
			
		||||
  Cmd cmd1([&]{ model = 1; }, [&]{ model = 0; });
 | 
			
		||||
  Cmd cmd2([&]{ model = 2; }, [&]{ model = 1; });
 | 
			
		||||
  Cmd cmd3([&]{ model = 3; }, [&]{ model = 2; });
 | 
			
		||||
  Cmd cmd4([&]{ model = 4; }, [&]{ model = 3; });
 | 
			
		||||
  Cmd cmd5([&]{ model = 5; }, [&]{ model = 2; });
 | 
			
		||||
  Cmd cmd6([&]{ model = 6; }, [&]{ model = 5; });
 | 
			
		||||
  Cmd cmd7([&]{ model = 7; }, [&]{ model = 5; });
 | 
			
		||||
  Cmd cmd8([&]{ model = 8; }, [&]{ model = 7; });
 | 
			
		||||
  int model = 0;
 | 
			
		||||
  Cmd cmd1(model, 1, 0);
 | 
			
		||||
  Cmd cmd2(model, 2, 1);
 | 
			
		||||
  Cmd cmd3(model, 3, 2);
 | 
			
		||||
  Cmd cmd4(model, 4, 3);
 | 
			
		||||
  Cmd cmd5(model, 5, 2);
 | 
			
		||||
  Cmd cmd6(model, 6, 5);
 | 
			
		||||
  Cmd cmd7(model, 7, 5);
 | 
			
		||||
  Cmd cmd8(model, 8, 7);
 | 
			
		||||
 | 
			
		||||
  UndoHistory history;
 | 
			
		||||
  cmd1.redo(); history.add(&cmd1);
 | 
			
		||||
  cmd2.redo(); history.add(&cmd2);
 | 
			
		||||
  cmd3.redo(); history.add(&cmd3);
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue