OSDN Git Service

imporve framework and refactoring YAEditDoc about undo
authorTomohisa Hirami <hirami@users.sourceforge.jp>
Tue, 3 Mar 2009 14:56:57 +0000 (23:56 +0900)
committerTomohisa Hirami <hirami@users.sourceforge.jp>
Tue, 3 Mar 2009 14:56:57 +0000 (23:56 +0900)
* add improved assert method to unit test framework.
* add test case to YAEditDoc.
* add testcase project to Tombo.sln
* expose UndoInfo

Src/YAEdit/YAEditDoc.cpp
Src/YAEdit/YAEditDoc.h
UnitTest/UnitTest/TestRunner.cpp
UnitTest/UnitTest/TestRunner.h
UnitTest/UnitTest/testcase/YAEditDocTest.cpp
Win32/Tombo/Tombo.sln

index 093f486..5b33541 100644 (file)
 // undo info\r
 /////////////////////////////////////////////////////////////////////////////\r
 \r
-class UndoInfo {\r
-public:\r
-       LPTSTR pUndoStr;\r
-       Region rRegion;\r
-\r
-       UndoInfo(LPTSTR pUndoStr);\r
-       ~UndoInfo();\r
-};\r
-\r
-UndoInfo::UndoInfo(LPTSTR p) : pUndoStr(p)\r
+UndoInfo::UndoInfo() : pPrevStr(NULL), pNewStr(NULL)\r
 {\r
 }\r
 \r
+\r
 UndoInfo::~UndoInfo()\r
 {\r
-       delete[] pUndoStr;\r
+       delete[] pPrevStr;\r
 }\r
 \r
-LPCTSTR YAEditDoc::GetUndoStr() { if (pUndo) return pUndo->pUndoStr; else return NULL; }\r
-const Region YAEditDoc::GetUndoRegion()\r
-{\r
-       Region r(0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF);\r
-       if (pUndo) return pUndo->rRegion; \r
-       else return r;\r
+BOOL UndoInfo::SetPrev(const Region *pRegion, LPTSTR p) {\r
+       rPrevRegion = *pRegion;\r
+       pPrevStr = p;\r
+       return TRUE;\r
+}\r
+\r
+BOOL UndoInfo::SetNew(const Region *pRegion, LPTSTR p) {\r
+       rNewRegion = *pRegion;\r
+       pNewStr = p;\r
+       return TRUE;\r
+}\r
+\r
+BOOL UndoInfo::CmdUndo(YAEditDoc *pDoc) {\r
+       return pDoc->ReplaceString(&rNewRegion, pPrevStr);\r
 }\r
 \r
 /////////////////////////////////////////////////////////////////////////////\r
@@ -127,14 +127,16 @@ BOOL YAEditDoc::ReplaceString(const Region *pDelRegion, LPCTSTR pString)
        // if read only mode, ignore editing.\r
        if (bReadOnly) return TRUE;\r
 \r
-       DWORD nPhLinesBefore = pPhLineMgr->MaxLine();\r
+       if (pUndo == NULL) {\r
+               pUndo = new UndoInfo();\r
+               if (pUndo == NULL) { SetLastError(ERROR_NOT_ENOUGH_MEMORY); return FALSE; }\r
+       }\r
 \r
-       // get string which removed by this action.\r
-       LPTSTR pOldTxt = pPhLineMgr->GetRegionString(pDelRegion);\r
+       DWORD nPhLinesBefore = pPhLineMgr->MaxLine();\r
 \r
-       if (pUndo != NULL) {\r
-               delete pUndo;\r
-       }\r
+       // preserve string and region removed by this action.\r
+       LPTSTR pPrevText = pPhLineMgr->GetRegionString(pDelRegion);\r
+       pUndo->SetPrev(pDelRegion, pPrevText);\r
 \r
        // delete region and insert string\r
        Region rNewRegion;\r
@@ -142,14 +144,12 @@ BOOL YAEditDoc::ReplaceString(const Region *pDelRegion, LPCTSTR pString)
        if (!pPhLineMgr->ReplaceRegion(pDelRegion, pString, &nAffLines, &rNewRegion)) {\r
                return FALSE;\r
        }\r
-       DWORD nPhLinesAfter = pPhLineMgr->MaxLine();\r
 \r
-       // remember old string\r
-       pUndo = new UndoInfo(pOldTxt);\r
-       if (pUndo == NULL) { SetLastError(ERROR_NOT_ENOUGH_MEMORY); return FALSE; }\r
-       pUndo->rRegion = rNewRegion;\r
+       // preserve string and region after replaced.\r
+       pUndo->SetNew(&rNewRegion, StringDup(pString));\r
 \r
        // notify to view\r
+       DWORD nPhLinesAfter = pPhLineMgr->MaxLine();\r
        if (pListener && !pListener->UpdateNotify(pPhLineMgr, pDelRegion, &rNewRegion, nPhLinesBefore, nPhLinesAfter, nAffLines)) {\r
                return FALSE;\r
        }\r
@@ -161,13 +161,11 @@ BOOL YAEditDoc::ReplaceString(const Region *pDelRegion, LPCTSTR pString)
 BOOL YAEditDoc::Undo()\r
 {\r
        if (pUndo == NULL) return TRUE;\r
-       UndoInfo *p = pUndo;\r
-       AutoPointer<UndoInfo> ap(p);\r
-       pUndo = NULL;\r
 \r
-       if (!ReplaceString(&(p->rRegion), p->pUndoStr)) return FALSE;\r
-\r
-       return TRUE;\r
+       BOOL bResult = pUndo->CmdUndo(this);\r
+       delete pUndo;\r
+       pUndo = NULL;\r
+       return bResult;\r
 }\r
 \r
 /////////////////////////////////////////////////////////////////////////////\r
@@ -252,12 +250,3 @@ void YAEditDoc::ConvertBytesToCoordinate(DWORD nPos, Coordinate *pPos)
        pPos->row = n - 1;\r
        pPos->col = p->pLine->nUsed;\r
 }\r
-\r
-/////////////////////////////////////////////////////////////////////////////\r
-// \r
-/////////////////////////////////////////////////////////////////////////////\r
-\r
-BOOL YAEditDoc::InsertUndoPoint()\r
-{\r
-       return TRUE;\r
-}
\ No newline at end of file
index aa077b3..b2d32a3 100644 (file)
@@ -9,6 +9,7 @@ class YAEditListener;
 \r
 class UndoInfo;\r
 \r
+\r
 ////////////////////////////////////////////////////\r
 // Document container for YAE\r
 ////////////////////////////////////////////////////\r
@@ -63,14 +64,33 @@ public:
        void ConvertBytesToCoordinate(DWORD nPos, Coordinate *pPos);\r
 \r
        ////////////////////////////////////////////////////\r
-       // set current document status as undo point\r
-       BOOL InsertUndoPoint();\r
-\r
-       ////////////////////////////////////////////////////\r
        // only for testing\r
+#ifdef UNIT_TEST\r
+       UndoInfo *GetUndoInfo() { return pUndo; }\r
+#endif\r
+};\r
+\r
+/////////////////////////////////////////////////////////////////////////////\r
+// undo info\r
+/////////////////////////////////////////////////////////////////////////////\r
+\r
+class UndoInfo {\r
+#ifdef UNIT_TEST\r
+public:\r
+#endif\r
+       LPTSTR pPrevStr;\r
+       Region rPrevRegion;\r
+\r
+       LPTSTR pNewStr;\r
+       Region rNewRegion;\r
+\r
+public:\r
+       UndoInfo();\r
+       ~UndoInfo();\r
 \r
-       LPCTSTR GetUndoStr();\r
-       const Region GetUndoRegion();\r
+       BOOL SetPrev(const Region *pRegion, LPTSTR pPrevStr);\r
+       BOOL SetNew(const Region *pRegion, LPTSTR pNewStr);\r
+       BOOL CmdUndo(YAEditDoc *pDoc);\r
 };\r
 \r
 #endif
\ No newline at end of file
index 32bc69c..85dc6cb 100644 (file)
@@ -49,6 +49,16 @@ void TestRunner::TestFail(LPCTSTR pTestCase) {
        nFail++;\r
 }\r
 \r
+void TestRunner::assert(BOOL b, LPCTSTR pFile, long lLine) {\r
+       if (b) {\r
+               TestSuccess();\r
+       } else {\r
+               TCHAR buf[1024];\r
+               sprintf(buf, " %s : %ld", pFile, lLine);\r
+               TestFail(buf);\r
+       }\r
+}\r
+\r
 void TestRunner::assert(BOOL b) {\r
        if (b) {\r
                TestSuccess();\r
index 0713010..97cfcf8 100644 (file)
@@ -25,4 +25,8 @@ public:
        void TestFail(LPCTSTR pTestCaseName);\r
 \r
        void assert(BOOL b);\r
+       void assert(BOOL b, LPCTSTR pFile, long lLine);\r
 };\r
+\r
+#define ASSERT(b) runner->assert(b, __FILE__, __LINE__)\r
+#define TESTCASE runner->WriteMsg(__FUNCTION__)
\ No newline at end of file
index 099873b..c2bc21f 100644 (file)
@@ -23,6 +23,7 @@ static void ConvertBytesToCoordinateTest2();
 static void UndoTest1();\r
 static void UndoTest2();\r
 static void UndoTest3();\r
+static void UndoTest4();\r
 \r
 void YAEditDocTest(TestRunner *r) {\r
        runner = r;\r
@@ -41,7 +42,7 @@ void YAEditDocTest(TestRunner *r) {
        UndoTest1();\r
        UndoTest2();\r
        UndoTest3();\r
-\r
+       UndoTest4();\r
 }\r
 \r
 ////////////////////////////////////////////////\r
@@ -50,65 +51,65 @@ void YAEditDocTest(TestRunner *r) {
 void LoadTest1() {\r
        YAEditDoc *pDoc = new YAEditDoc();\r
        BOOL bResult = pDoc->Init(TEXT(""), NULL, NULL);\r
-       runner->assert(bResult);\r
+       ASSERT(bResult);\r
        PhysicalLineManager *pLM = pDoc->GetPhMgr();\r
 \r
-       runner->assert(pLM->MaxLine() == 1);\r
+       ASSERT(pLM->MaxLine() == 1);\r
        LineInfo *pLi = pLM->GetLineInfo(0);\r
 \r
-       runner->assert(pLi->pLine->nUsed == 0);\r
+       ASSERT(pLi->pLine->nUsed == 0);\r
 }\r
 \r
 // 1 line string without CRLF\r
 void LoadTest2() {\r
        YAEditDoc *pDoc = new YAEditDoc();\r
        BOOL bResult = pDoc->Init(TEXT("Hello world"), NULL, NULL);\r
-       runner->assert(bResult);\r
+       ASSERT(bResult);\r
        PhysicalLineManager *pLM = pDoc->GetPhMgr();\r
 \r
-       runner->assert(pLM->MaxLine() == 1);\r
+       ASSERT(pLM->MaxLine() == 1);\r
        LineInfo *pLi = pLM->GetLineInfo(0);\r
 \r
-       runner->assert(pLi->pLine->nUsed == 11);\r
+       ASSERT(pLi->pLine->nUsed == 11);\r
 }\r
 \r
 // 2 line string\r
 void LoadTest3() {\r
        YAEditDoc *pDoc = new YAEditDoc();\r
        BOOL bResult = pDoc->Init(TEXT("Hellow\r\nworld"), NULL, NULL);\r
-       runner->assert(bResult);\r
+       ASSERT(bResult);\r
        PhysicalLineManager *pLM = pDoc->GetPhMgr();\r
 \r
-       runner->assert(pLM->MaxLine() == 2);\r
+       ASSERT(pLM->MaxLine() == 2);\r
        LineInfo *pLi0 = pLM->GetLineInfo(0);\r
-       runner->assert(pLi0->pLine->nUsed == 6);\r
+       ASSERT(pLi0->pLine->nUsed == 6);\r
 \r
        LPCTSTR p0 = pLM->GetLine(0);\r
-       runner->assert(_tcsncmp(p0, TEXT("Hellow"), 6) == 0);\r
+       ASSERT(_tcsncmp(p0, TEXT("Hellow"), 6) == 0);\r
 \r
        LineInfo *pLi1 = pLM->GetLineInfo(1);\r
-       runner->assert(pLi1->pLine->nUsed == 5);\r
+       ASSERT(pLi1->pLine->nUsed == 5);\r
        LPCTSTR p1 = pLM->GetLine(1);\r
-       runner->assert(_tcsncmp(p1, TEXT("world"), 5) == 0);    \r
+       ASSERT(_tcsncmp(p1, TEXT("world"), 5) == 0);    \r
 }\r
 \r
 // 2 line string end with CRLF\r
 void LoadTest4() {\r
        YAEditDoc *pDoc = new YAEditDoc();\r
        BOOL bResult = pDoc->Init(TEXT("Hello\r\n"), NULL, NULL);\r
-       runner->assert(bResult);\r
+       ASSERT(bResult);\r
        PhysicalLineManager *pLM = pDoc->GetPhMgr();\r
 \r
-       runner->assert(pLM->MaxLine() == 2);\r
+       ASSERT(pLM->MaxLine() == 2);\r
 \r
        LineInfo *pLi0 = pLM->GetLineInfo(0);\r
-       runner->assert(pLi0->pLine->nUsed == 5);\r
+       ASSERT(pLi0->pLine->nUsed == 5);\r
 \r
        LPCTSTR p0 = pLM->GetLine(0);\r
-       runner->assert(_tcsncmp(p0, TEXT("Hello"), 5) == 0);\r
+       ASSERT(_tcsncmp(p0, TEXT("Hello"), 5) == 0);\r
 \r
        LineInfo *pLi1 = pLM->GetLineInfo(1);\r
-       runner->assert(pLi1->pLine->nUsed == 0);\r
+       ASSERT(pLi1->pLine->nUsed == 0);\r
 }\r
 \r
 // 2 line string start with CRLF\r
@@ -116,19 +117,19 @@ void LoadTest5() {
        YAEditDoc *pDoc = new YAEditDoc();\r
        BOOL bResult = pDoc->Init(TEXT("\r\nHello"), NULL, NULL);\r
 \r
-       runner->assert(bResult);\r
+       ASSERT(bResult);\r
        PhysicalLineManager *pLM = pDoc->GetPhMgr();\r
 \r
-       runner->assert(pLM->MaxLine() == 2);\r
+       ASSERT(pLM->MaxLine() == 2);\r
 \r
        LineInfo *pLi0 = pLM->GetLineInfo(0);\r
-       runner->assert(pLi0->pLine->nUsed == 0);\r
+       ASSERT(pLi0->pLine->nUsed == 0);\r
 \r
        LineInfo *pLi1 = pLM->GetLineInfo(1);\r
-       runner->assert(pLi1->pLine->nUsed == 5);\r
+       ASSERT(pLi1->pLine->nUsed == 5);\r
 \r
        LPCTSTR p1 = pLM->GetLine(1);\r
-       runner->assert(_tcsncmp(p1, TEXT("Hello"), 5) == 0);\r
+       ASSERT(_tcsncmp(p1, TEXT("Hello"), 5) == 0);\r
 \r
 }\r
 \r
@@ -140,22 +141,22 @@ void LoadTest6() {
        YAEditDoc *pDoc = new YAEditDoc();\r
        BOOL bResult = pDoc->Init(TEXT("\r\n\r\n\r\n"), NULL, NULL);\r
 \r
-       runner->assert(bResult);\r
+       ASSERT(bResult);\r
        PhysicalLineManager *pLM = pDoc->GetPhMgr();\r
 \r
-       runner->assert(pLM->MaxLine() == 4);\r
+       ASSERT(pLM->MaxLine() == 4);\r
 \r
        LineInfo *pLi0 = pLM->GetLineInfo(0);\r
-       runner->assert(pLi0->pLine->nUsed == 0);\r
+       ASSERT(pLi0->pLine->nUsed == 0);\r
 \r
        LineInfo *pLi1 = pLM->GetLineInfo(1);\r
-       runner->assert(pLi1->pLine->nUsed == 0);\r
+       ASSERT(pLi1->pLine->nUsed == 0);\r
 \r
        LineInfo *pLi2 = pLM->GetLineInfo(2);\r
-       runner->assert(pLi2->pLine->nUsed == 0);\r
+       ASSERT(pLi2->pLine->nUsed == 0);\r
 \r
        LineInfo *pLi3 = pLM->GetLineInfo(3);\r
-       runner->assert(pLi3->pLine->nUsed == 0);\r
+       ASSERT(pLi3->pLine->nUsed == 0);\r
 \r
 }\r
 \r
@@ -169,31 +170,31 @@ void LoadTest7() {
        YAEditDoc *pDoc = new YAEditDoc();\r
        BOOL bResult = pDoc->Init(TEXT("\r\n\r\nabc\r\n\r\n\r\n"), NULL, NULL);\r
 \r
-       runner->assert(bResult);\r
+       ASSERT(bResult);\r
        PhysicalLineManager *pLM = pDoc->GetPhMgr();\r
 \r
-       runner->assert(pLM->MaxLine() == 6);\r
+       ASSERT(pLM->MaxLine() == 6);\r
 \r
        LineInfo *pLi0 = pLM->GetLineInfo(0);\r
-       runner->assert(pLi0->pLine->nUsed == 0);\r
+       ASSERT(pLi0->pLine->nUsed == 0);\r
 \r
        LineInfo *pLi1 = pLM->GetLineInfo(1);\r
-       runner->assert(pLi1->pLine->nUsed == 0);\r
+       ASSERT(pLi1->pLine->nUsed == 0);\r
 \r
        LineInfo *pLi2 = pLM->GetLineInfo(2);\r
-       runner->assert(pLi2->pLine->nUsed == 3);\r
+       ASSERT(pLi2->pLine->nUsed == 3);\r
        LPCTSTR p2 = pLM->GetLine(2);\r
-       runner->assert(_tcsncmp(p2, TEXT("abc"), 3) == 0);\r
+       ASSERT(_tcsncmp(p2, TEXT("abc"), 3) == 0);\r
 \r
 \r
        LineInfo *pLi3 = pLM->GetLineInfo(3);\r
-       runner->assert(pLi3->pLine->nUsed == 0);\r
+       ASSERT(pLi3->pLine->nUsed == 0);\r
 \r
        LineInfo *pLi4 = pLM->GetLineInfo(4);\r
-       runner->assert(pLi4->pLine->nUsed == 0);\r
+       ASSERT(pLi4->pLine->nUsed == 0);\r
 \r
        LineInfo *pLi5 = pLM->GetLineInfo(5);\r
-       runner->assert(pLi5->pLine->nUsed == 0);\r
+       ASSERT(pLi5->pLine->nUsed == 0);\r
 \r
 }\r
 \r
@@ -204,25 +205,25 @@ void LoadTest8() {
        YAEditDoc *pDoc = new YAEditDoc();\r
        BOOL bResult = pDoc->Init(TEXT("abc\r\ndef\r\nghi"), NULL, NULL);\r
 \r
-       runner->assert(bResult);\r
+       ASSERT(bResult);\r
        PhysicalLineManager *pLM = pDoc->GetPhMgr();\r
 \r
-       runner->assert(pLM->MaxLine() == 3);\r
+       ASSERT(pLM->MaxLine() == 3);\r
 \r
        LineInfo *pLi0 = pLM->GetLineInfo(0);\r
-       runner->assert(pLi0->pLine->nUsed == 3);\r
+       ASSERT(pLi0->pLine->nUsed == 3);\r
        LPCTSTR p0 = pLM->GetLine(0);\r
-       runner->assert(_tcsncmp(p0, TEXT("abc"), 3) == 0);\r
+       ASSERT(_tcsncmp(p0, TEXT("abc"), 3) == 0);\r
 \r
        LineInfo *pLi1 = pLM->GetLineInfo(1);\r
-       runner->assert(pLi1->pLine->nUsed == 3);\r
+       ASSERT(pLi1->pLine->nUsed == 3);\r
        LPCTSTR p1 = pLM->GetLine(1);\r
-       runner->assert(_tcsncmp(p1, TEXT("def"), 3) == 0);\r
+       ASSERT(_tcsncmp(p1, TEXT("def"), 3) == 0);\r
 \r
        LineInfo *pLi2 = pLM->GetLineInfo(2);\r
-       runner->assert(pLi2->pLine->nUsed == 3);\r
+       ASSERT(pLi2->pLine->nUsed == 3);\r
        LPCTSTR p2 = pLM->GetLine(2);\r
-       runner->assert(_tcsncmp(p2, TEXT("ghi"), 3) == 0);\r
+       ASSERT(_tcsncmp(p2, TEXT("ghi"), 3) == 0);\r
 }\r
 \r
 // abcCRLF\r
@@ -235,28 +236,28 @@ void ConvertBytesToCoordinateTest1()
 \r
        Coordinate pos;\r
        pDoc->ConvertBytesToCoordinate(0, &pos);\r
-       runner->assert(pos.row == 0 && pos.col == 0);\r
+       ASSERT(pos.row == 0 && pos.col == 0);\r
 \r
        pDoc->ConvertBytesToCoordinate(2, &pos);\r
-       runner->assert(pos.row == 0 && pos.col == 2);\r
+       ASSERT(pos.row == 0 && pos.col == 2);\r
 \r
        pDoc->ConvertBytesToCoordinate(5, &pos);\r
-       runner->assert(pos.row == 1 && pos.col == 0);\r
+       ASSERT(pos.row == 1 && pos.col == 0);\r
 \r
        pDoc->ConvertBytesToCoordinate(6, &pos);\r
-       runner->assert(pos.row == 1 && pos.col == 1);\r
+       ASSERT(pos.row == 1 && pos.col == 1);\r
 \r
        pDoc->ConvertBytesToCoordinate(9, &pos);\r
-       runner->assert(pos.row == 1 && pos.col == 4);\r
+       ASSERT(pos.row == 1 && pos.col == 4);\r
 \r
        pDoc->ConvertBytesToCoordinate(11, &pos);\r
-       runner->assert(pos.row == 2 && pos.col == 0);\r
+       ASSERT(pos.row == 2 && pos.col == 0);\r
 \r
        pDoc->ConvertBytesToCoordinate(16, &pos);\r
-       runner->assert(pos.row == 2 && pos.col == 5);\r
+       ASSERT(pos.row == 2 && pos.col == 5);\r
 \r
        pDoc->ConvertBytesToCoordinate(100, &pos);\r
-       runner->assert(pos.row == 2 && pos.col == 5);\r
+       ASSERT(pos.row == 2 && pos.col == 5);\r
 }\r
 \r
 void ConvertBytesToCoordinateTest2()\r
@@ -268,7 +269,7 @@ void ConvertBytesToCoordinateTest2()
        BOOL bResult = pDoc->Init(TEXT("TOMBO 1.16\r\n"), NULL, NULL);\r
        pDoc->ConvertBytesToCoordinate(11, &pos);\r
 \r
-       runner->assert(pos.row == 1 && pos.col == 0);\r
+       ASSERT(pos.row == 1 && pos.col == 0);\r
 }\r
 \r
 // initial state\r
@@ -277,14 +278,13 @@ void UndoTest1()
        YAEditDoc *pDoc = new YAEditDoc();\r
 \r
        BOOL bResult = pDoc->Init(TEXT("a"), NULL, NULL);\r
-       runner->assert(bResult);\r
+       ASSERT(bResult);\r
 \r
        Region r0(0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF);\r
 \r
-       Region r = pDoc->GetUndoRegion();\r
-       LPCTSTR p = pDoc->GetUndoStr();\r
+       UndoInfo *pUndo = pDoc->GetUndoInfo();\r
+       ASSERT(pUndo == NULL);\r
 \r
-       runner->assert(r0 == r && p == NULL);\r
 }\r
 \r
 void UndoTest2()\r
@@ -292,28 +292,29 @@ void UndoTest2()
        YAEditDoc *pDoc = new YAEditDoc();\r
 \r
        BOOL bResult = pDoc->Init(TEXT("a"), NULL, NULL);\r
-       runner->assert(bResult);\r
+       ASSERT(bResult);\r
+       // a I\r
 \r
        Region rReplace(1, 0, 1, 0);\r
        bResult = pDoc->ReplaceString(&rReplace, TEXT("bcd"));\r
-       runner->assert(bResult);\r
+       ASSERT(bResult);\r
        // abcd I\r
 \r
-       Region r = pDoc->GetUndoRegion();\r
-       LPCTSTR p = pDoc->GetUndoStr();\r
-\r
-       Region rExpected(1, 0, 4, 0);\r
-       LPCTSTR pExpected = TEXT("");\r
-       runner->assert(r == rExpected);\r
-       runner->assert(_tcscmp(p, pExpected) == 0);\r
+       UndoInfo *pUndo = pDoc->GetUndoInfo();\r
+       Region rExpectedPrev(1, 0, 1, 0);\r
+       Region rExpectedNew(1, 0, 4, 0);\r
+       ASSERT(pUndo->rPrevRegion == rExpectedPrev);\r
+       ASSERT(pUndo->rNewRegion == rExpectedNew);\r
+       ASSERT(_tcscmp(pUndo->pPrevStr, TEXT("")) == 0);\r
+       ASSERT(_tcscmp(pUndo->pNewStr, TEXT("bcd")) == 0);\r
 \r
        // Undo\r
        bResult = pDoc->Undo();\r
-       runner->assert(bResult);\r
+       ASSERT(bResult);\r
 \r
        DWORD nLen;\r
        LPTSTR pUndo1 = pDoc->GetDocumentData(&nLen);\r
-       runner->assert(_tcsncmp(pUndo1, TEXT("a"), nLen) == 0);\r
+       ASSERT(_tcsncmp(pUndo1, TEXT("a"), nLen) == 0);\r
 \r
 }\r
 \r
@@ -322,29 +323,61 @@ void UndoTest3()
        YAEditDoc *pDoc = new YAEditDoc();\r
 \r
        BOOL bResult = pDoc->Init(TEXT("abcde"), NULL, NULL);\r
-       runner->assert(bResult);\r
+       ASSERT(bResult);\r
 \r
        Region rReplace(2, 0, 4, 0);\r
        bResult = pDoc->ReplaceString(&rReplace, TEXT("fgh"));\r
-       runner->assert(bResult);\r
+       ASSERT(bResult);\r
        // abcd I\r
 \r
-       Region r = pDoc->GetUndoRegion();\r
-       LPCTSTR p = pDoc->GetUndoStr();\r
+       UndoInfo *pUndo = pDoc->GetUndoInfo();\r
+\r
+       Region rExpectedPrev(2, 0, 4, 0);\r
+       Region rExpectedNew(2, 0, 5, 0);\r
+       ASSERT(pUndo->rPrevRegion == rExpectedPrev);\r
+       ASSERT(pUndo->rNewRegion == rExpectedNew);\r
 \r
-       Region rExpected(2, 0, 5, 0);\r
-       LPCTSTR pExpected = TEXT("cd");\r
-       runner->assert(r == rExpected);\r
-       runner->assert(_tcscmp(p, pExpected) == 0);\r
+       ASSERT(_tcscmp(pUndo->pPrevStr, TEXT("cd")) == 0);\r
+       ASSERT(_tcscmp(pUndo->pNewStr, TEXT("fgh")) == 0);\r
 \r
 \r
        // Undo\r
        bResult = pDoc->Undo();\r
-       runner->assert(bResult);\r
+       ASSERT(bResult);\r
 \r
        DWORD nLen;\r
        LPTSTR pUndo1 = pDoc->GetDocumentData(&nLen);\r
-       runner->assert(_tcsncmp(pUndo1, TEXT("abcde"), nLen) == 0);\r
+       ASSERT(_tcsncmp(pUndo1, TEXT("abcde"), nLen) == 0);\r
 \r
 }\r
 \r
+void UndoTest4() {\r
+\r
+       YAEditDoc *pDoc = new YAEditDoc();\r
+       ASSERT(pDoc->Init(TEXT("-----"), NULL, NULL));\r
+\r
+       // -----\r
+       Region rReplace(2, 0, 2, 0);\r
+       ASSERT(pDoc->ReplaceString(&rReplace, TEXT("a")));\r
+       // --a---\r
+       Region rReplace2(3, 0, 3, 0);\r
+       ASSERT(pDoc->ReplaceString(&rReplace2, TEXT("b")));\r
+       // --ab---\r
+\r
+       DWORD nLen;\r
+       LPTSTR pResult;\r
+\r
+       pResult = pDoc->GetDocumentData(&nLen);\r
+       ASSERT(pResult != NULL);\r
+       ASSERT(_tcsncmp(pResult, TEXT("--ab---"), nLen) == 0);\r
+       ASSERT(nLen == 7);\r
+\r
+       // Undo!\r
+       ASSERT(pDoc->Undo());\r
+\r
+       pResult = pDoc->GetDocumentData(&nLen);\r
+       ASSERT(pResult != NULL);\r
+       ASSERT(_tcsncmp(pResult, TEXT("-----"), nLen) == 0);\r
+       ASSERT(nLen == 5);\r
+\r
+}
\ No newline at end of file
index fae9bd8..2c57877 100644 (file)
@@ -3,6 +3,8 @@ Microsoft Visual Studio Solution File, Format Version 9.00
 # Visual Studio 2005\r
 Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Tombo", "Tombo\Tombo.vcproj", "{BD1B7E25-9555-4F73-B3F9-4AD2C559F235}"\r
 EndProject\r
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "UnitTest", "..\..\UnitTest\UnitTest\UnitTest.vcproj", "{AA7FA4D1-39CD-42D3-BAA5-A4E590786134}"\r
+EndProject\r
 Global\r
        GlobalSection(SolutionConfigurationPlatforms) = preSolution\r
                Debug|Win32 = Debug|Win32\r
@@ -13,6 +15,10 @@ Global
                {BD1B7E25-9555-4F73-B3F9-4AD2C559F235}.Debug|Win32.Build.0 = Debug|Win32\r
                {BD1B7E25-9555-4F73-B3F9-4AD2C559F235}.Release|Win32.ActiveCfg = Release|Win32\r
                {BD1B7E25-9555-4F73-B3F9-4AD2C559F235}.Release|Win32.Build.0 = Release|Win32\r
+               {AA7FA4D1-39CD-42D3-BAA5-A4E590786134}.Debug|Win32.ActiveCfg = Debug|Win32\r
+               {AA7FA4D1-39CD-42D3-BAA5-A4E590786134}.Debug|Win32.Build.0 = Debug|Win32\r
+               {AA7FA4D1-39CD-42D3-BAA5-A4E590786134}.Release|Win32.ActiveCfg = Release|Win32\r
+               {AA7FA4D1-39CD-42D3-BAA5-A4E590786134}.Release|Win32.Build.0 = Release|Win32\r
        EndGlobalSection\r
        GlobalSection(SolutionProperties) = preSolution\r
                HideSolutionNode = FALSE\r