OSDN Git Service

Add Expand Different Subfolders menu item (#1964)
[winmerge-jp/winmerge-jp.git] / Src / Test.cpp
1 #include "StdAfx.h"\r
2 #ifdef TEST_WINMERGE\r
3 #include "Merge.h"\r
4 #include "Environment.h"\r
5 #include "paths.h"\r
6 #include "MainFrm.h"\r
7 #include "MergeDoc.h"\r
8 #include "ccrystaltextview.h"\r
9 #include "dialogs/cfindtextdlg.h"\r
10 #include "MergeEditView.h"\r
11 #include "DirDoc.h"\r
12 #include "DirView.h"\r
13 #include "MergeEditFrm.h"\r
14 #include "HexMergeFrm.h"\r
15 #include "ImgMergeFrm.h"\r
16 #include "WebPageDiffFrm.h"\r
17 #include "DiffContext.h"\r
18 #include "CompareStats.h"\r
19 #include "unicoder.h"\r
20 #include "OptionsMgr.h"\r
21 #include "OptionsDef.h"\r
22 #include "SyntaxColors.h"\r
23 #include "MergeCmdLineInfo.h"\r
24 #include "editcmd.h"\r
25 #include "gtest/gtest.h"\r
26 \r
27 String getProjectRoot()\r
28 {\r
29 #ifdef _WIN64\r
30         return paths::ConcatPath(env::GetProgPath(), L"../../..");\r
31 #else\r
32         return paths::ConcatPath(env::GetProgPath(), L"../../");\r
33 #endif\r
34 }\r
35 \r
36 void Wait(unsigned ms)\r
37 {\r
38         unsigned start = GetTickCount();\r
39         while (GetTickCount() - start < ms)\r
40         {\r
41                 MSG msg;\r
42                 if (::PeekMessage(&msg, nullptr, NULL, NULL, PM_NOREMOVE))\r
43                         AfxGetApp()->PumpMessage();\r
44                 Sleep(1);\r
45         }\r
46 }\r
47 \r
48 TEST(CodepageTest, UCS2)\r
49 {\r
50         String projectRoot = getProjectRoot();\r
51         PathContext tFiles = {\r
52                 paths::ConcatPath(projectRoot, L"Testing/Data/Unicode/UCS-2BE/DiffItem.h"),\r
53                 paths::ConcatPath(projectRoot, L"Testing/Data/Unicode/UCS-2LE/DiffItem.h")\r
54         };\r
55         EXPECT_TRUE(GetMainFrame()->DoFileOrFolderOpen(&tFiles));\r
56         CFrameWnd *pFrame = GetMainFrame()->GetActiveFrame();\r
57         CMergeDoc *pDoc = dynamic_cast<CMergeDoc *>(pFrame->GetActiveDocument());\r
58         ASSERT_NE(nullptr, pDoc);\r
59         EXPECT_EQ(ucr::UCS2BE, pDoc->m_ptBuf[0]->getEncoding().m_unicoding);\r
60         EXPECT_TRUE(pDoc->m_ptBuf[0]->getEncoding().m_bom);\r
61         EXPECT_EQ(ucr::UCS2LE, pDoc->m_ptBuf[1]->getEncoding().m_unicoding);\r
62         EXPECT_TRUE(pDoc->m_ptBuf[1]->getEncoding().m_bom);\r
63         pFrame->PostMessage(WM_CLOSE);\r
64 }\r
65 \r
66 TEST(CodepageTest, UTF8)\r
67 {\r
68         String projectRoot = getProjectRoot();\r
69         PathContext tFiles = {\r
70                 paths::ConcatPath(projectRoot, L"Testing/Data/Unicode/UTF-8/DiffItem.h"),\r
71                 paths::ConcatPath(projectRoot, L"Testing/Data/Unicode/UTF-8-NOBOM/DiffItem.h")\r
72         };\r
73         EXPECT_TRUE(GetMainFrame()->DoFileOrFolderOpen(&tFiles));\r
74         CFrameWnd *pFrame = GetMainFrame()->GetActiveFrame();\r
75         CMergeDoc *pDoc = dynamic_cast<CMergeDoc *>(pFrame->GetActiveDocument());\r
76         EXPECT_NE(nullptr, pDoc);\r
77         if (pDoc == nullptr)\r
78                 return;\r
79         EXPECT_EQ(ucr::UTF8, pDoc->m_ptBuf[0]->getEncoding().m_unicoding);\r
80         EXPECT_TRUE(pDoc->m_ptBuf[0]->getEncoding().m_bom);\r
81         EXPECT_EQ(ucr::UTF8, pDoc->m_ptBuf[1]->getEncoding().m_unicoding);\r
82         EXPECT_FALSE(pDoc->m_ptBuf[1]->getEncoding().m_bom);\r
83         pFrame->PostMessage(WM_CLOSE);\r
84 }\r
85 \r
86 TEST(SyntaxHighlight, Verilog)\r
87 {\r
88         String projectRoot = getProjectRoot();\r
89         PathContext tFiles = {\r
90                 paths::ConcatPath(projectRoot, L"Testing/Data/FileFormats/Verilog.v"),\r
91                 paths::ConcatPath(projectRoot, L"Testing/Data/FileFormats/Verilog.v")\r
92         };\r
93         CMessageBoxDialog dlg(nullptr, IDS_FILE_TO_ITSELF, 0U, 0U, IDS_FILE_TO_ITSELF);\r
94         const int nPrevFormerResult = dlg.SetFormerResult(IDOK);\r
95         EXPECT_TRUE(GetMainFrame()->DoFileOrFolderOpen(&tFiles));\r
96         CFrameWnd *pFrame = GetMainFrame()->GetActiveFrame();\r
97         CMergeDoc *pDoc = dynamic_cast<CMergeDoc *>(pFrame->GetActiveDocument());\r
98         EXPECT_NE(nullptr, pDoc);\r
99         if (pDoc == nullptr)\r
100                 return;\r
101 \r
102         std::vector<CrystalLineParser::TEXTBLOCK> blocks;\r
103         blocks = pDoc->GetView(0, 0)->GetTextBlocks(0);\r
104         EXPECT_EQ(COLORINDEX_COMMENT, blocks[0].m_nColorIndex);\r
105         blocks = pDoc->GetView(0, 0)->GetTextBlocks(2);\r
106         EXPECT_EQ(COLORINDEX_KEYWORD, blocks[0].m_nColorIndex);\r
107         blocks = pDoc->GetView(0, 0)->GetTextBlocks(37);\r
108         EXPECT_EQ(COLORINDEX_PREPROCESSOR, blocks[0].m_nColorIndex);\r
109         blocks = pDoc->GetView(0, 0)->GetTextBlocks(38);\r
110         EXPECT_EQ(COLORINDEX_USER1, blocks[1].m_nColorIndex);\r
111         EXPECT_EQ(COLORINDEX_STRING, blocks[3].m_nColorIndex);\r
112 \r
113         pFrame->PostMessage(WM_CLOSE);\r
114         dlg.SetFormerResult(nPrevFormerResult);\r
115 }\r
116 \r
117 TEST(FileCompare, FindText)\r
118 {\r
119         String projectRoot = getProjectRoot();\r
120         CMessageBoxDialog dlg(nullptr, IDS_FILE_TO_ITSELF, 0U, 0U, IDS_FILE_TO_ITSELF);\r
121         const int nPrevFormerResult = dlg.SetFormerResult(IDOK);\r
122         CMergeDoc *pDoc = nullptr;\r
123         CFrameWnd *pFrame = nullptr;\r
124         PathContext tFiles = {\r
125                 paths::ConcatPath(projectRoot, _T("Testing/Data/FindText/test1.txt")),\r
126                 paths::ConcatPath(projectRoot, _T("Testing/Data/FindText/test1.txt")),\r
127         };\r
128         EXPECT_TRUE(GetMainFrame()->DoFileOrFolderOpen(&tFiles));\r
129         pFrame = GetMainFrame()->GetActiveFrame();\r
130         pDoc = dynamic_cast<CMergeDoc *>(pFrame->GetActiveDocument());\r
131         EXPECT_NE(nullptr, pDoc);\r
132         if (pDoc == nullptr)\r
133                 return;\r
134 \r
135         CMergeEditView *pView = pDoc->GetView(0, 0);\r
136 \r
137         CString lines, lineslower;\r
138         pView->GetTextWithoutEmptys(0, 0, pView->GetLineCount() - 1, pView->GetLineLength(pView->GetLineCount() - 1), lines);\r
139         lineslower = lines;\r
140         lineslower.MakeLower();\r
141 \r
142         CEPoint pt, ptFound;\r
143         DWORD dwFlags = 0;\r
144         LastSearchInfos lsi = { 0 };\r
145         CEPoint ptstart, ptstart2, ptend;\r
146 \r
147         for (int direction : { 1, 0 })\r
148         {\r
149                 for (bool useregex : { false, true })\r
150                 {\r
151                         for (bool matchcase : { true, false })\r
152                         {\r
153                                 for (CString text : { _T("a"), _T("abc")})\r
154                                 {\r
155                                         size_t count = 0;\r
156                                         int pos = 0;\r
157                                         while (true)\r
158                                         {\r
159                                                 pos = (matchcase ? lines : lineslower).Find(text, pos);\r
160                                                 if (pos < 0)\r
161                                                         break;\r
162                                                 pos += text.GetLength();\r
163                                                 count++;\r
164                                         }\r
165                                         pView->SetCursorPos({ 0, 0 });\r
166                                         pView->SetNewAnchor({ 0, 0 });\r
167                                         pView->SetNewSelection({ 0, 0 }, { 0, 0 });\r
168                                         lsi.m_sText = text;\r
169                                         lsi.m_bNoWrap = false;\r
170                                         lsi.m_bMatchCase = matchcase;\r
171                                         lsi.m_nDirection = direction;\r
172                                         lsi.m_bRegExp = useregex;\r
173                                         for (size_t i = 0; i < count; ++i)\r
174                                         {\r
175                                                 pView->FindText(&lsi);\r
176                                                 if (i == 0)\r
177                                                         ptstart = pView->GetAnchor();\r
178                                                 Wait(1);\r
179                                         }\r
180                                         ptend = pView->GetAnchor();\r
181                                         pView->FindText(&lsi);\r
182                                         ptstart2 = pView->GetAnchor();\r
183                                         if (direction == 0)\r
184                                                 EXPECT_LT(ptend.y, ptstart2.y);\r
185                                         else\r
186                                                 EXPECT_GT(ptend.y, ptstart2.y);\r
187                                         EXPECT_EQ(ptstart.y, ptstart2.y);\r
188                                         EXPECT_EQ(text.MakeLower(), pView->GetSelectedText().MakeLower());\r
189                                 }\r
190                         }\r
191                 }\r
192         }\r
193 \r
194         pFrame->PostMessage(WM_CLOSE);\r
195         dlg.SetFormerResult(nPrevFormerResult);\r
196 }\r
197 \r
198 TEST(FileCompare, LastLineEOL)\r
199 {\r
200         String projectRoot = getProjectRoot();\r
201         const static String filelist[] = {\r
202                 _T("0None.txt"),\r
203                 _T("0CRLF.txt"),\r
204                 _T("1None.txt"),\r
205                 _T("1CRLF.txt"),\r
206                 _T("3None.txt"),\r
207                 _T("3CRLF.txt"),\r
208                 _T("2-3CRLF.txt")\r
209         };\r
210         CMessageBoxDialog dlg(nullptr, IDS_FILESSAME, 0U, 0U, IDS_FILESSAME);\r
211         CMessageBoxDialog dlg2(nullptr, IDS_FILE_TO_ITSELF, 0U, 0U, IDS_FILE_TO_ITSELF);\r
212         const int nPrevFormerResult = dlg.SetFormerResult(IDOK);\r
213         const int nPrevFormerResult2 = dlg2.SetFormerResult(IDOK);\r
214         CMergeDoc *pDoc = nullptr;\r
215         CFrameWnd *pFrame = nullptr;\r
216         for (bool bIgnoreBlankLines: { true, false })\r
217         {\r
218                 GetOptionsMgr()->Set(OPT_CMP_IGNORE_BLANKLINES, bIgnoreBlankLines);\r
219                 for (auto nIgnoreWhitespace: { WHITESPACE_COMPARE_ALL, WHITESPACE_IGNORE_CHANGE, WHITESPACE_IGNORE_ALL})\r
220                 {\r
221                         GetOptionsMgr()->Set(OPT_CMP_IGNORE_WHITESPACE, nIgnoreWhitespace);\r
222                         if (pDoc)\r
223                                 pDoc->RefreshOptions();\r
224                         for (size_t l = 0; l < std::size(filelist); ++l)\r
225                         {\r
226                                 for (size_t r = 0; r < std::size(filelist); ++r)\r
227                                 {\r
228                                         PathContext tFiles = {\r
229                                                 paths::ConcatPath(projectRoot, paths::ConcatPath(_T("Testing/Data/LastLineEOL"), filelist[l])),\r
230                                                 paths::ConcatPath(projectRoot, paths::ConcatPath(_T("Testing/Data/LastLineEOL"), filelist[r])),\r
231                                         };\r
232                                         if (!pFrame)\r
233                                         {\r
234                                                 EXPECT_TRUE(GetMainFrame()->DoFileOrFolderOpen(&tFiles));\r
235                                                 pFrame = GetMainFrame()->GetActiveFrame();\r
236                                                 pDoc = dynamic_cast<CMergeDoc *>(pFrame->GetActiveDocument());\r
237                                                 EXPECT_NE(nullptr, pDoc);\r
238                                                 if (pDoc == nullptr)\r
239                                                         return;\r
240                                         }\r
241                                         if (r == 0)\r
242                                         {\r
243                                                 pDoc->ChangeFile(0, tFiles[0]);\r
244                                         }\r
245                                         pDoc->ChangeFile(1, tFiles[1]);\r
246 \r
247                                         if (tFiles[0] == tFiles[1])\r
248                                         {\r
249                                                 EXPECT_EQ(0, pDoc->m_diffList.GetSize());\r
250                                         }\r
251                                         else\r
252                                         {\r
253                                                 if (pDoc->m_diffList.DiffRangeAt(0)->op == OP_TRIVIAL)\r
254                                                 {\r
255                                                         EXPECT_EQ(true, bIgnoreBlankLines);\r
256                                                 }\r
257                                                 else\r
258                                                 {\r
259                                                         CMergeEditView *pView = pDoc->GetView(0, 0); // merge\r
260                                                         EXPECT_LE(1, pDoc->m_diffList.GetSize());\r
261                                                         pDoc->CopyAllList(0, 1);\r
262                                                         EXPECT_EQ(0, pDoc->m_diffList.GetSize());\r
263                                                         // undo\r
264                                                         pView->SendMessage(WM_COMMAND, ID_EDIT_UNDO);\r
265                                                         EXPECT_LE(1, pDoc->m_diffList.GetSize());\r
266                                                         // insert a character at the last line\r
267                                                         pView->GotoLine(pDoc->m_ptBuf[0]->GetLineCount() - 1, false, 0);\r
268                                                         pView->SendMessage(WM_CHAR, 'a');\r
269                                                         // undo\r
270                                                         pView->SendMessage(WM_COMMAND, ID_EDIT_UNDO);\r
271 \r
272                                                         pView = pDoc->GetView(0, 1);\r
273                                                         pView->GotoLine(0, false, 1);\r
274                                                         // Select all & Delete\r
275                                                         pView->SendMessage(WM_COMMAND, ID_EDIT_SELECT_ALL);\r
276                                                         pView->SendMessage(WM_COMMAND, ID_EDIT_DELETE);\r
277                                                         // undo\r
278                                                         pView->SendMessage(WM_COMMAND, ID_EDIT_UNDO);\r
279                                                         // redo\r
280                                                         pView->SendMessage(WM_COMMAND, ID_EDIT_REDO);\r
281                                                         // undo\r
282                                                         pView->SendMessage(WM_COMMAND, ID_EDIT_UNDO);\r
283                                                 }\r
284                                         }\r
285                                 }\r
286                         }\r
287                 }\r
288         }\r
289         pFrame->PostMessage(WM_CLOSE);\r
290         dlg.SetFormerResult(nPrevFormerResult);\r
291         dlg2.SetFormerResult(nPrevFormerResult2);\r
292 }\r
293 \r
294 TEST(FolderCompare, IgnoreEOL)\r
295 {\r
296         String projectRoot = getProjectRoot();\r
297         PathContext dirsArray[] = {\r
298                 {\r
299                         paths::ConcatPath(projectRoot, L"Testing/selftests/u/"),\r
300                         paths::ConcatPath(projectRoot, L"Testing/selftests/m/")\r
301                 },\r
302                 {\r
303                         paths::ConcatPath(projectRoot, L"Testing/selftests/w/"),\r
304                         paths::ConcatPath(projectRoot, L"Testing/selftests/u/")\r
305                 },\r
306                 {\r
307                         paths::ConcatPath(projectRoot, L"Testing/selftests/w/"),\r
308                         paths::ConcatPath(projectRoot, L"Testing/selftests/m/")\r
309                 }\r
310         };\r
311 \r
312         for (auto& dirs : dirsArray)\r
313         {\r
314                 GetOptionsMgr()->Set(OPT_CMP_METHOD, 0/* Full Contents*/);\r
315                 GetOptionsMgr()->Set(OPT_CMP_IGNORE_EOL, true);\r
316                 EXPECT_TRUE(GetMainFrame()->DoFileOrFolderOpen(&dirs));\r
317                 CFrameWnd *pFrame = GetMainFrame()->GetActiveFrame();\r
318                 CDirDoc *pDoc = dynamic_cast<CDirDoc *>(pFrame->GetActiveDocument());\r
319                 EXPECT_NE(nullptr, pDoc);\r
320                 if (pDoc == nullptr)\r
321                 {\r
322                         pFrame->PostMessage(WM_CLOSE);\r
323                         continue;\r
324                 }\r
325                 CDirView *pView = pDoc->GetMainView();\r
326                 const CDiffContext& ctxt = pDoc->GetDiffContext();\r
327                 const CompareStats *pStats = ctxt.m_pCompareStats;\r
328                 do { Sleep(100); } while (!pStats->IsCompareDone());\r
329                 EXPECT_EQ(10, pStats->GetTotalItems());\r
330                 EXPECT_EQ(10, pStats->GetCount(CompareStats::RESULT::RESULT_SAME));\r
331                 DIFFITEM *pos = ctxt.GetFirstDiffPosition();\r
332                 while (pos != nullptr)\r
333                 {\r
334                         const DIFFITEM& di = ctxt.GetNextDiffPosition(pos);\r
335                         for (int i = 0; i < 2; ++i)\r
336                         {\r
337                                 if (dirs[i].find(L"/w/") != String::npos)\r
338                                 {\r
339                                         EXPECT_LT(0, di.diffFileInfo[i].m_textStats.ncrlfs);\r
340                                         EXPECT_EQ(0, di.diffFileInfo[i].m_textStats.nlfs);\r
341                                         EXPECT_EQ(0, di.diffFileInfo[i].m_textStats.ncrs);\r
342                                 }\r
343                                 else if (dirs[i].find(L"/u/") != String::npos)\r
344                                 {\r
345                                         EXPECT_LT(0, di.diffFileInfo[i].m_textStats.nlfs);\r
346                                         EXPECT_EQ(0, di.diffFileInfo[i].m_textStats.ncrlfs);\r
347                                         EXPECT_EQ(0, di.diffFileInfo[i].m_textStats.ncrs);\r
348                                 }\r
349                                 else if (dirs[i].find(L"/m/") != String::npos)\r
350                                 {\r
351                                         EXPECT_LT(0, di.diffFileInfo[i].m_textStats.ncrs);\r
352                                         EXPECT_EQ(0, di.diffFileInfo[i].m_textStats.nlfs);\r
353                                         EXPECT_EQ(0, di.diffFileInfo[i].m_textStats.ncrlfs);\r
354                                 }\r
355                         }\r
356                 }\r
357 \r
358                 GetOptionsMgr()->Set(OPT_CMP_METHOD, 0/* Full Contents*/);\r
359                 GetOptionsMgr()->Set(OPT_CMP_IGNORE_EOL, false);\r
360                 pDoc->Rescan();\r
361                 do { Sleep(100); } while (!pStats->IsCompareDone());\r
362                 EXPECT_EQ(10, pStats->GetTotalItems());\r
363                 EXPECT_EQ(10, pStats->GetCount(CompareStats::RESULT::RESULT_DIFF));\r
364 \r
365                 GetOptionsMgr()->Set(OPT_CMP_METHOD, 1/* Quick Contents*/);\r
366                 GetOptionsMgr()->Set(OPT_CMP_IGNORE_EOL, true);\r
367                 pDoc->Rescan();\r
368                 do { Sleep(100); } while (!pStats->IsCompareDone());\r
369                 EXPECT_EQ(10, pStats->GetTotalItems());\r
370                 EXPECT_EQ(10, pStats->GetCount(CompareStats::RESULT::RESULT_SAME));\r
371 \r
372                 GetOptionsMgr()->Set(OPT_CMP_METHOD, 1/* Quick Contents*/);\r
373                 GetOptionsMgr()->Set(OPT_CMP_IGNORE_EOL, false);\r
374                 pDoc->Rescan();\r
375                 do { Sleep(100); } while (!pStats->IsCompareDone());\r
376                 EXPECT_EQ(10, pStats->GetTotalItems());\r
377                 EXPECT_EQ(10, pStats->GetCount(CompareStats::RESULT::RESULT_DIFF));\r
378 \r
379                 pFrame->PostMessage(WM_CLOSE);\r
380         }\r
381 }\r
382 \r
383 TEST(CommandLineTest, Desc)\r
384 {\r
385         String progpath = paths::ConcatPath(env::GetProgPath(), _T("WinMergeU.exe"));\r
386         String projectRoot = getProjectRoot();\r
387         MergeCmdLineInfo cmdInfo((progpath + L" /dl TestL /dr TestR " + \r
388                 paths::ConcatPath(projectRoot, L"Testing/Data/Unicode/UCS-2BE/DiffItem.h") + L" " + \r
389                 paths::ConcatPath(projectRoot, L"Testing/Data/Unicode/UCS-2LE/DiffItem.h")).c_str()\r
390         );\r
391         theApp.ParseArgsAndDoOpen(cmdInfo, GetMainFrame());\r
392         CFrameWnd *pFrame = GetMainFrame()->GetActiveFrame();\r
393         CMergeDoc *pDoc = dynamic_cast<CMergeDoc *>(pFrame->GetActiveDocument());\r
394         ASSERT_NE(nullptr, pDoc);\r
395         EXPECT_EQ(L"TestL", pDoc->GetDescription(0));\r
396         EXPECT_EQ(L"TestR", pDoc->GetDescription(1));\r
397         pFrame->PostMessage(WM_CLOSE);\r
398 }\r
399 \r
400 TEST(CommandLineTest, Desc2)\r
401 {\r
402         String progpath = paths::ConcatPath(env::GetProgPath(), _T("WinMergeU.exe"));\r
403         String projectRoot = getProjectRoot();\r
404         MergeCmdLineInfo cmdInfo((progpath + L" /dl TestL /dr TestR " + \r
405                 paths::ConcatPath(projectRoot, L"Testing/Data/big_file.conflict")).c_str()\r
406         );\r
407         theApp.ParseArgsAndDoOpen(cmdInfo, GetMainFrame());\r
408         CFrameWnd *pFrame = GetMainFrame()->GetActiveFrame();\r
409         CMergeDoc *pDoc = dynamic_cast<CMergeDoc *>(pFrame->GetActiveDocument());\r
410         ASSERT_NE(nullptr, pDoc);\r
411         EXPECT_EQ(L"TestL", pDoc->GetDescription(0));\r
412         EXPECT_EQ(L"TestR", pDoc->GetDescription(1));\r
413         pDoc->m_ptBuf[1]->SetModified(false);\r
414         pFrame->PostMessage(WM_CLOSE);\r
415 }\r
416 \r
417 TEST(CommandLineTest, Desc3)\r
418 {\r
419         String progpath = paths::ConcatPath(env::GetProgPath(), _T("WinMergeU.exe"));\r
420         String projectRoot = getProjectRoot();\r
421         MergeCmdLineInfo cmdInfo((progpath + L" /dr TestR " + \r
422                 paths::ConcatPath(projectRoot, L"Testing/Data/big_file.conflict")).c_str()\r
423         );\r
424         theApp.ParseArgsAndDoOpen(cmdInfo, GetMainFrame());\r
425         CFrameWnd *pFrame = GetMainFrame()->GetActiveFrame();\r
426         CMergeDoc *pDoc = dynamic_cast<CMergeDoc *>(pFrame->GetActiveDocument());\r
427         ASSERT_NE(nullptr, pDoc);\r
428         EXPECT_EQ(L"Theirs File", pDoc->GetDescription(0));\r
429         EXPECT_EQ(L"TestR", pDoc->GetDescription(1));\r
430         pDoc->m_ptBuf[1]->SetModified(false);\r
431         pFrame->PostMessage(WM_CLOSE);\r
432 }\r
433 \r
434 TEST(CommandLineTest, Desc4)\r
435 {\r
436         String progpath = paths::ConcatPath(env::GetProgPath(), _T("WinMergeU.exe"));\r
437         String projectRoot = getProjectRoot();\r
438         MergeCmdLineInfo cmdInfo((progpath + L" /dl TestL " + \r
439                 paths::ConcatPath(projectRoot, L"Testing/Data/big_file.conflict")).c_str()\r
440         );\r
441         theApp.ParseArgsAndDoOpen(cmdInfo, GetMainFrame());\r
442         CFrameWnd *pFrame = GetMainFrame()->GetActiveFrame();\r
443         CMergeDoc *pDoc = dynamic_cast<CMergeDoc *>(pFrame->GetActiveDocument());\r
444         ASSERT_NE(nullptr, pDoc);\r
445         EXPECT_EQ(L"TestL", pDoc->GetDescription(0));\r
446         EXPECT_EQ(L"Mine File", pDoc->GetDescription(1));\r
447         pDoc->m_ptBuf[1]->SetModified(false);\r
448         pFrame->PostMessage(WM_CLOSE);\r
449 }\r
450 \r
451 TEST(CommandLineTest, WindowType)\r
452 {\r
453         String progpath = paths::ConcatPath(env::GetProgPath(), _T("WinMergeU.exe"));\r
454         String projectRoot = getProjectRoot();\r
455         String paths =\r
456                 paths::ConcatPath(projectRoot, L"Testing/Data/Unicode/UCS-2BE/DiffItem.h") + L" " +\r
457                 paths::ConcatPath(projectRoot, L"Testing/Data/Unicode/UCS-2LE/DiffItem.h");\r
458         String pathsTable =\r
459                 paths::ConcatPath(projectRoot, L"Externals/crystaledit/test/test.csv") + L" " +\r
460                 paths::ConcatPath(projectRoot, L"Externals/crystaledit/test/test2.csv");\r
461         String pathsImage =\r
462                 paths::ConcatPath(projectRoot, L"Src/res/aborted.ico") + L" " +\r
463                 paths::ConcatPath(projectRoot, L"Src/res/binarydiff.ico");\r
464         String pathsWebpage =\r
465                 paths::ConcatPath(projectRoot, L"Docs/Users/ReleaseNotes.html") + L" " +\r
466                 paths::ConcatPath(projectRoot, L"Docs/Users/ChangeLog.html");\r
467 \r
468         MergeCmdLineInfo cmdInfo((progpath + L" /t text " + pathsTable).c_str());\r
469         theApp.ParseArgsAndDoOpen(cmdInfo, GetMainFrame());\r
470         CFrameWnd *pFrame = GetMainFrame()->GetActiveFrame();\r
471         EXPECT_TRUE(pFrame->IsKindOf(RUNTIME_CLASS(CMergeEditFrame)));\r
472         auto* pDoc = static_cast<CMergeDoc*>(pFrame->GetActiveDocument());\r
473         EXPECT_FALSE(pDoc->GetEnableTableEditing().value_or(true));\r
474         pFrame->PostMessage(WM_CLOSE);\r
475 \r
476         MergeCmdLineInfo cmdInfo2((progpath + L" /t Table " + pathsTable).c_str());\r
477         theApp.ParseArgsAndDoOpen(cmdInfo2, GetMainFrame());\r
478         pFrame = GetMainFrame()->GetActiveFrame();\r
479         EXPECT_TRUE(pFrame->IsKindOf(RUNTIME_CLASS(CMergeEditFrame)));\r
480         pDoc = static_cast<CMergeDoc*>(pFrame->GetActiveDocument());\r
481         EXPECT_TRUE(pDoc->GetEnableTableEditing().value_or(false));\r
482         pFrame->PostMessage(WM_CLOSE);\r
483 \r
484         MergeCmdLineInfo cmdInfo3((progpath + L" /t BINARY " + paths).c_str());\r
485         theApp.ParseArgsAndDoOpen(cmdInfo3, GetMainFrame());\r
486         pFrame = GetMainFrame()->GetActiveFrame();\r
487         EXPECT_TRUE(pFrame->IsKindOf(RUNTIME_CLASS(CHexMergeFrame)));\r
488         pFrame->PostMessage(WM_CLOSE);\r
489 \r
490         MergeCmdLineInfo cmdInfo4((progpath + L" /t image " + pathsImage).c_str());\r
491         theApp.ParseArgsAndDoOpen(cmdInfo4, GetMainFrame());\r
492         pFrame = GetMainFrame()->GetActiveFrame();\r
493         EXPECT_TRUE(pFrame->IsKindOf(RUNTIME_CLASS(CImgMergeFrame)));\r
494         pFrame->PostMessage(WM_CLOSE);\r
495 \r
496         MergeCmdLineInfo cmdInfo5((progpath + L" /t webpage " + pathsWebpage).c_str());\r
497         theApp.ParseArgsAndDoOpen(cmdInfo5, GetMainFrame());\r
498         pFrame = GetMainFrame()->GetActiveFrame();\r
499         EXPECT_TRUE(pFrame->IsKindOf(RUNTIME_CLASS(CWebPageDiffFrame)));\r
500         pFrame->PostMessage(WM_CLOSE);\r
501 \r
502         MergeCmdLineInfo cmdInfo6((progpath + L" /t automatic " + pathsImage).c_str());\r
503         theApp.ParseArgsAndDoOpen(cmdInfo6, GetMainFrame());\r
504         pFrame = GetMainFrame()->GetActiveFrame();\r
505         EXPECT_TRUE(pFrame->IsKindOf(RUNTIME_CLASS(CImgMergeFrame)));\r
506         pFrame->PostMessage(WM_CLOSE);\r
507 }\r
508 \r
509 TEST(CommandLineTest, New)\r
510 {\r
511         String progpath = paths::ConcatPath(env::GetProgPath(), _T("WinMergeU.exe"));\r
512         String projectRoot = getProjectRoot();\r
513 \r
514         MergeCmdLineInfo cmdInfo((progpath + L" /t text /new").c_str());\r
515         theApp.ParseArgsAndDoOpen(cmdInfo, GetMainFrame());\r
516         CFrameWnd *pFrame = GetMainFrame()->GetActiveFrame();\r
517         EXPECT_TRUE(pFrame->IsKindOf(RUNTIME_CLASS(CMergeEditFrame)));\r
518         auto* pDoc = static_cast<CMergeDoc*>(pFrame->GetActiveDocument());\r
519         EXPECT_FALSE(pDoc->GetEnableTableEditing().value_or(true));\r
520         pFrame->PostMessage(WM_CLOSE);\r
521 \r
522         MergeCmdLineInfo cmdInfo2((progpath + L" /t Table /FileExt csv /new").c_str());\r
523         theApp.ParseArgsAndDoOpen(cmdInfo2, GetMainFrame());\r
524         pFrame = GetMainFrame()->GetActiveFrame();\r
525         EXPECT_TRUE(pFrame->IsKindOf(RUNTIME_CLASS(CMergeEditFrame)));\r
526         pDoc = static_cast<CMergeDoc*>(pFrame->GetActiveDocument());\r
527         EXPECT_TRUE(pDoc->m_ptBuf[0]->GetTableEditing());\r
528         EXPECT_EQ(',', pDoc->m_ptBuf[0]->GetFieldDelimiter());\r
529         pFrame->PostMessage(WM_CLOSE);\r
530 \r
531         MergeCmdLineInfo cmdInfo3((progpath + L" /t Table /Table-Delimiter , /new").c_str());\r
532         theApp.ParseArgsAndDoOpen(cmdInfo3, GetMainFrame());\r
533         pFrame = GetMainFrame()->GetActiveFrame();\r
534         EXPECT_TRUE(pFrame->IsKindOf(RUNTIME_CLASS(CMergeEditFrame)));\r
535         pDoc = static_cast<CMergeDoc*>(pFrame->GetActiveDocument());\r
536         EXPECT_TRUE(pDoc->m_ptBuf[0]->GetTableEditing());\r
537         EXPECT_EQ(',', pDoc->m_ptBuf[0]->GetFieldDelimiter());\r
538         pFrame->PostMessage(WM_CLOSE);\r
539 \r
540         MergeCmdLineInfo cmdInfo4((progpath + L" /t Table /FileExt tsv /new").c_str());\r
541         theApp.ParseArgsAndDoOpen(cmdInfo4, GetMainFrame());\r
542         pFrame = GetMainFrame()->GetActiveFrame();\r
543         EXPECT_TRUE(pFrame->IsKindOf(RUNTIME_CLASS(CMergeEditFrame)));\r
544         pDoc = static_cast<CMergeDoc*>(pFrame->GetActiveDocument());\r
545         EXPECT_TRUE(pDoc->m_ptBuf[0]->GetTableEditing());\r
546         EXPECT_EQ('\t', pDoc->m_ptBuf[0]->GetFieldDelimiter());\r
547         pFrame->PostMessage(WM_CLOSE);\r
548 \r
549         MergeCmdLineInfo cmdInfo5((progpath + L" /t Table /table-delimiter tab /new").c_str());\r
550         theApp.ParseArgsAndDoOpen(cmdInfo5, GetMainFrame());\r
551         pFrame = GetMainFrame()->GetActiveFrame();\r
552         EXPECT_TRUE(pFrame->IsKindOf(RUNTIME_CLASS(CMergeEditFrame)));\r
553         pDoc = static_cast<CMergeDoc*>(pFrame->GetActiveDocument());\r
554         EXPECT_TRUE(pDoc->m_ptBuf[0]->GetTableEditing());\r
555         EXPECT_EQ('\t', pDoc->m_ptBuf[0]->GetFieldDelimiter());\r
556         pFrame->PostMessage(WM_CLOSE);\r
557 \r
558         MergeCmdLineInfo cmdInfo6((progpath + L" /t BINARY /new").c_str());\r
559         theApp.ParseArgsAndDoOpen(cmdInfo6, GetMainFrame());\r
560         pFrame = GetMainFrame()->GetActiveFrame();\r
561         EXPECT_TRUE(pFrame->IsKindOf(RUNTIME_CLASS(CHexMergeFrame)));\r
562         pFrame->PostMessage(WM_CLOSE);\r
563 \r
564         MergeCmdLineInfo cmdInfo7((progpath + L" /t image /new").c_str());\r
565         theApp.ParseArgsAndDoOpen(cmdInfo7, GetMainFrame());\r
566         pFrame = GetMainFrame()->GetActiveFrame();\r
567         EXPECT_TRUE(pFrame->IsKindOf(RUNTIME_CLASS(CImgMergeFrame)));\r
568         pFrame->PostMessage(WM_CLOSE);\r
569 \r
570         MergeCmdLineInfo cmdInfo8((progpath + L" /t webpage /new").c_str());\r
571         theApp.ParseArgsAndDoOpen(cmdInfo8, GetMainFrame());\r
572         pFrame = GetMainFrame()->GetActiveFrame();\r
573         EXPECT_TRUE(pFrame->IsKindOf(RUNTIME_CLASS(CWebPageDiffFrame)));\r
574         pFrame->PostMessage(WM_CLOSE);\r
575 \r
576         MergeCmdLineInfo cmdInfo9((progpath + L" /t automatic /new").c_str());\r
577         theApp.ParseArgsAndDoOpen(cmdInfo9, GetMainFrame());\r
578         pFrame = GetMainFrame()->GetActiveFrame();\r
579         EXPECT_TRUE(pFrame->IsKindOf(RUNTIME_CLASS(CMergeEditFrame)));\r
580         pFrame->PostMessage(WM_CLOSE);\r
581 }\r
582 \r
583 TEST(ImageCompareTest, Open)\r
584 {\r
585         EXPECT_TRUE(CImgMergeFrame::IsLoadable());\r
586         if (!CImgMergeFrame::IsLoadable())\r
587                 return;\r
588 \r
589         String projectRoot = getProjectRoot();\r
590         PathContext tFiles = {\r
591                 paths::ConcatPath(projectRoot, L"Src/res/copy_right_to_middle.bmp"),\r
592                 paths::ConcatPath(projectRoot, L"Src/res/copy_right_to_left.bmp")\r
593         };\r
594         CMessageBoxDialog dlg(nullptr, IDS_FILESSAME, 0U, 0U, IDS_FILESSAME);\r
595         const int nPrevFormerResult = dlg.SetFormerResult(IDOK);\r
596         EXPECT_TRUE(GetMainFrame()->DoFileOrFolderOpen(&tFiles));\r
597         CFrameWnd *pFrame = GetMainFrame()->GetActiveFrame();\r
598         CImgMergeFrame *pDoc = dynamic_cast<CImgMergeFrame *>(pFrame);\r
599         EXPECT_NE(nullptr, pDoc);\r
600 \r
601         pFrame->PostMessage(WM_CLOSE);\r
602         dlg.SetFormerResult(nPrevFormerResult);\r
603 }\r
604 \r
605 TEST(FileMenu, New)\r
606 {\r
607         CFrameWnd *pFrame;\r
608         GetMainFrame()->DoFileNew(ID_MERGE_COMPARE_TEXT, 2);\r
609         pFrame = GetMainFrame()->GetActiveFrame();\r
610         pFrame->PostMessage(WM_CLOSE);\r
611         GetMainFrame()->DoFileNew(ID_MERGE_COMPARE_TEXT, 3);\r
612         pFrame = GetMainFrame()->GetActiveFrame();\r
613         pFrame->PostMessage(WM_CLOSE);\r
614 }\r
615 \r
616 TEST(FileMenu, OpenConflictFile)\r
617 {\r
618         String conflictFile = paths::ConcatPath(getProjectRoot(), L"Testing/Data/big_file.conflict");\r
619         GetMainFrame()->DoOpenConflict(conflictFile);\r
620         CFrameWnd *pFrame = GetMainFrame()->GetActiveFrame();\r
621         CMergeDoc *pDoc = dynamic_cast<CMergeDoc *>(pFrame->GetActiveDocument());\r
622         ASSERT_NE(nullptr, pDoc);\r
623         pDoc->m_ptBuf[1]->SetModified(false);\r
624         pFrame->PostMessage(WM_CLOSE);\r
625 }\r
626 \r
627 TEST(FileMenu, OpenConflictFile3)\r
628 {\r
629         String conflictFile = paths::ConcatPath(getProjectRoot(), L"Testing/Data/dif3.conflict");\r
630         GetMainFrame()->DoOpenConflict(conflictFile);\r
631         CFrameWnd *pFrame = GetMainFrame()->GetActiveFrame();\r
632         CMergeDoc *pDoc = dynamic_cast<CMergeDoc *>(pFrame->GetActiveDocument());\r
633         ASSERT_NE(nullptr, pDoc);\r
634         pDoc->m_ptBuf[2]->SetModified(false);\r
635         pFrame->PostMessage(WM_CLOSE);\r
636 }\r
637 \r
638 TEST(FileMenu, OpenProject)\r
639 {\r
640         String projectFile = paths::ConcatPath(getProjectRoot(), L"Testing/Data/Dir2.WinMerge");\r
641         theApp.LoadAndOpenProjectFile(projectFile);\r
642         CFrameWnd *pFrame = GetMainFrame()->GetActiveFrame();\r
643         EXPECT_NE(nullptr, pFrame);\r
644         if (pFrame != nullptr)\r
645                 pFrame->PostMessage(WM_CLOSE);\r
646 }\r
647 \r
648 TEST(FileMenu, OpenProject3)\r
649 {\r
650         String projectFile = paths::ConcatPath(getProjectRoot(), L"Testing/Data/Dir3.WinMerge");\r
651         theApp.LoadAndOpenProjectFile(projectFile);\r
652         CFrameWnd *pFrame = GetMainFrame()->GetActiveFrame();\r
653         EXPECT_NE(nullptr, pFrame);\r
654         if (pFrame != nullptr)\r
655                 pFrame->PostMessage(WM_CLOSE);\r
656 }\r
657 \r
658 #endif