OSDN Git Service

Fix "Assertion failed: dr.begin[0] == dr.begin[file], file c:\dev\winmerge\src\diffwr...
authorTakashi Sawanaka <sdottaka@users.sourceforge.net>
Sat, 12 Jan 2019 05:43:55 +0000 (14:43 +0900)
committerTakashi Sawanaka <sdottaka@users.sourceforge.net>
Sat, 12 Jan 2019 05:43:55 +0000 (14:43 +0900)
Src/DiffWrapper.cpp
Src/MergeDoc.cpp
Src/Test.cpp

index 8543b11..3c83dae 100644 (file)
@@ -958,7 +958,7 @@ void CDiffWrapper::FixLastDiffRange(int nFiles, int bufferLines[], bool bMissing
 {
        DIFFRANGE dr;
        const int count = m_pDiffList->GetSize();
-       if (count > 0 && !bIgnoreBlankLines)
+       if (count > 0)
        {
                m_pDiffList->GetDiff(count - 1, dr);
 
index 2a658a6..cd1db63 100644 (file)
@@ -465,19 +465,15 @@ int CMergeDoc::Rescan(bool &bBinary, IDENTLEVEL &identical,
                m_diffWrapper.SetCreateDiffList(&m_diffList);
        }
 
-       // If comparing whitespaces and
-       // other file has EOL before EOF and other not...
-       if (diffOptions.nIgnoreWhitespace == WHITESPACE_COMPARE_ALL || !diffOptions.bIgnoreBlankLines)
+       // If one file has EOL before EOF and other not...
+       if (std::count(status.bMissingNL, status.bMissingNL + m_nBuffers, status.bMissingNL[0]) < m_nBuffers)
        {
-               if (std::count(status.bMissingNL, status.bMissingNL + m_nBuffers, status.bMissingNL[0]) < m_nBuffers)
-               {
-                       // ..last DIFFRANGE of file which has EOL must be
-                       // fixed to contain last line too
-                       int lineCount[3] = { 0,0,0 };
-                       for (nBuffer = 0; nBuffer < m_nBuffers; nBuffer++)
-                               lineCount[nBuffer] = m_ptBuf[nBuffer]->GetLineCount();
-                       m_diffWrapper.FixLastDiffRange(m_nBuffers, lineCount, status.bMissingNL, diffOptions.bIgnoreBlankLines);
-               }
+               // ..last DIFFRANGE of file which has EOL must be
+               // fixed to contain last line too
+               int lineCount[3] = { 0,0,0 };
+               for (nBuffer = 0; nBuffer < m_nBuffers; nBuffer++)
+                       lineCount[nBuffer] = m_ptBuf[nBuffer]->GetLineCount();
+               m_diffWrapper.FixLastDiffRange(m_nBuffers, lineCount, status.bMissingNL, diffOptions.bIgnoreBlankLines);
        }
 
        // set identical/diff result as recorded by diffutils
index c9b9c76..7eaac73 100644 (file)
@@ -18,6 +18,7 @@
 #include "OptionsDef.h"\r
 #include "SyntaxColors.h"\r
 #include "MergeCmdLineInfo.h"\r
+#include "editcmd.h"\r
 #include "gtest/gtest.h"\r
 \r
 String getProjectRoot()\r
@@ -199,8 +200,6 @@ TEST(FileCompare, LastLineEOL)
                _T("0CRLF.txt"),\r
                _T("1None.txt"),\r
                _T("1CRLF.txt"),\r
-               _T("2None.txt"),\r
-               _T("2CRLF.txt"),\r
                _T("3None.txt"),\r
                _T("3CRLF.txt")\r
        };\r
@@ -208,48 +207,68 @@ TEST(FileCompare, LastLineEOL)
        const int nPrevFormerResult = dlg.SetFormerResult(IDOK);\r
        CMergeDoc *pDoc = nullptr;\r
        CFrameWnd *pFrame = nullptr;\r
-       for (size_t l = 0; l < std::size(filelist); ++l)\r
+       for (bool bIgnoreBlankLines: { true, false })\r
        {\r
-               for (size_t r = 0; r < std::size(filelist); ++r)\r
+               GetOptionsMgr()->SaveOption(OPT_CMP_IGNORE_BLANKLINES, bIgnoreBlankLines);\r
+               for (auto nIgnoreWhitespace: { WHITESPACE_COMPARE_ALL, WHITESPACE_IGNORE_CHANGE, WHITESPACE_IGNORE_ALL})\r
                {\r
-                       PathContext tFiles = {\r
-                               paths::ConcatPath(projectRoot, paths::ConcatPath(_T("Testing/Data/LastLineEOL"), filelist[l])),\r
-                               paths::ConcatPath(projectRoot, paths::ConcatPath(_T("Testing/Data/LastLineEOL"), filelist[r])),\r
-                       };\r
-                       if (l == 0 && r == 0)\r
+                       GetOptionsMgr()->SaveOption(OPT_CMP_IGNORE_WHITESPACE, nIgnoreWhitespace);\r
+                       for (size_t l = 0; l < std::size(filelist); ++l)\r
                        {\r
-                               EXPECT_TRUE(GetMainFrame()->DoFileOpen(&tFiles));\r
-                               pFrame = GetMainFrame()->GetActiveFrame();\r
-                               pDoc = dynamic_cast<CMergeDoc *>(pFrame->GetActiveDocument());\r
-                               EXPECT_NE(nullptr, pDoc);\r
-                               if (pDoc == nullptr)\r
-                                       return;\r
-                       }\r
-                       else if (r == 0)\r
-                       {\r
-                               pDoc->ChangeFile(0, tFiles[0]);\r
-                       }\r
-                       pDoc->ChangeFile(1, tFiles[1]);\r
+                               for (size_t r = 0; r < std::size(filelist); ++r)\r
+                               {\r
+                                       PathContext tFiles = {\r
+                                               paths::ConcatPath(projectRoot, paths::ConcatPath(_T("Testing/Data/LastLineEOL"), filelist[l])),\r
+                                               paths::ConcatPath(projectRoot, paths::ConcatPath(_T("Testing/Data/LastLineEOL"), filelist[r])),\r
+                                       };\r
+                                       if (!pFrame)\r
+                                       {\r
+                                               EXPECT_TRUE(GetMainFrame()->DoFileOpen(&tFiles));\r
+                                               pFrame = GetMainFrame()->GetActiveFrame();\r
+                                               pDoc = dynamic_cast<CMergeDoc *>(pFrame->GetActiveDocument());\r
+                                               EXPECT_NE(nullptr, pDoc);\r
+                                               if (pDoc == nullptr)\r
+                                                       return;\r
+                                       }\r
+                                       if (r == 0)\r
+                                       {\r
+                                               pDoc->ChangeFile(0, tFiles[0]);\r
+                                       }\r
+                                       pDoc->ChangeFile(1, tFiles[1]);\r
 \r
-                       if (tFiles[0] == tFiles[1])\r
-                       {\r
-                               EXPECT_EQ(0, pDoc->m_diffList.GetSize());\r
-                       }\r
-                       else\r
-                       {\r
-                               CMergeEditView *pView = pDoc->GetView(0, 0);\r
-                               // merge\r
-                               EXPECT_EQ(1, pDoc->m_diffList.GetSize());\r
-                               pDoc->CopyAllList(0, 1);\r
-                               EXPECT_EQ(0, pDoc->m_diffList.GetSize());\r
-                               // undo\r
-                               pView->SendMessage(WM_COMMAND, ID_EDIT_UNDO);\r
-                               EXPECT_EQ(1, pDoc->m_diffList.GetSize());\r
-                               // insert a character at the last line\r
-                               pView->GotoLine(pDoc->m_ptBuf[0]->GetLineCount() - 1, false, 0);\r
-                               pView->SendMessage(WM_CHAR, 'a');\r
-                               // undo\r
-                               pView->SendMessage(WM_COMMAND, ID_EDIT_UNDO);\r
+                                       if (tFiles[0] == tFiles[1])\r
+                                       {\r
+                                               EXPECT_EQ(0, pDoc->m_diffList.GetSize());\r
+                                       }\r
+                                       else\r
+                                       {\r
+                                               CMergeEditView *pView = pDoc->GetView(0, 0);\r
+                                               // merge\r
+                                               EXPECT_EQ(1, pDoc->m_diffList.GetSize());\r
+                                               pDoc->CopyAllList(0, 1);\r
+                                               EXPECT_EQ(0, pDoc->m_diffList.GetSize());\r
+                                               // undo\r
+                                               pView->SendMessage(WM_COMMAND, ID_EDIT_UNDO);\r
+                                               EXPECT_EQ(1, pDoc->m_diffList.GetSize());\r
+                                               // insert a character at the last line\r
+                                               pView->GotoLine(pDoc->m_ptBuf[0]->GetLineCount() - 1, false, 0);\r
+                                               pView->SendMessage(WM_CHAR, 'a');\r
+                                               // undo\r
+                                               pView->SendMessage(WM_COMMAND, ID_EDIT_UNDO);\r
+\r
+                                               pView = pDoc->GetView(0, 1);\r
+                                               pView->GotoLine(0, false, 1);\r
+                                               // Select all & Delete\r
+                                               pView->SendMessage(WM_COMMAND, ID_EDIT_SELECT_ALL);\r
+                                               pView->SendMessage(WM_COMMAND, ID_EDIT_DELETE);\r
+                                               // undo\r
+                                               pView->SendMessage(WM_COMMAND, ID_EDIT_UNDO);\r
+                                               // redo\r
+                                               pView->SendMessage(WM_COMMAND, ID_EDIT_REDO);\r
+                                               // undo\r
+                                               pView->SendMessage(WM_COMMAND, ID_EDIT_UNDO);\r
+                                       }\r
+                               }\r
                        }\r
                }\r
        }\r