4 #include "Environment.h"
\r
7 #include "MergeDoc.h"
\r
8 #include "ccrystaltextview.h"
\r
9 #include "dialogs/cfindtextdlg.h"
\r
10 #include "MergeEditView.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
27 String getProjectRoot()
\r
30 return paths::ConcatPath(env::GetProgPath(), L"../../..");
\r
32 return paths::ConcatPath(env::GetProgPath(), L"../../");
\r
36 void Wait(unsigned ms)
\r
38 unsigned start = GetTickCount();
\r
39 while (GetTickCount() - start < ms)
\r
42 if (::PeekMessage(&msg, nullptr, NULL, NULL, PM_NOREMOVE))
\r
43 AfxGetApp()->PumpMessage();
\r
48 TEST(CodepageTest, UCS2)
\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
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
66 TEST(CodepageTest, UTF8)
\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
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
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
86 TEST(SyntaxHighlight, Verilog)
\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
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
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
113 pFrame->PostMessage(WM_CLOSE);
\r
114 dlg.SetFormerResult(nPrevFormerResult);
\r
117 TEST(FileCompare, FindText)
\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
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
135 CMergeEditView *pView = pDoc->GetView(0, 0);
\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
142 CEPoint pt, ptFound;
\r
144 LastSearchInfos lsi = { 0 };
\r
145 CEPoint ptstart, ptstart2, ptend;
\r
147 for (int direction : { 1, 0 })
\r
149 for (bool useregex : { false, true })
\r
151 for (bool matchcase : { true, false })
\r
153 for (CString text : { _T("a"), _T("abc")})
\r
159 pos = (matchcase ? lines : lineslower).Find(text, pos);
\r
162 pos += text.GetLength();
\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
175 pView->FindText(&lsi);
\r
177 ptstart = pView->GetAnchor();
\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
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
194 pFrame->PostMessage(WM_CLOSE);
\r
195 dlg.SetFormerResult(nPrevFormerResult);
\r
198 TEST(FileCompare, LastLineEOL)
\r
200 String projectRoot = getProjectRoot();
\r
201 const static String filelist[] = {
\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
218 GetOptionsMgr()->Set(OPT_CMP_IGNORE_BLANKLINES, bIgnoreBlankLines);
\r
219 for (auto nIgnoreWhitespace: { WHITESPACE_COMPARE_ALL, WHITESPACE_IGNORE_CHANGE, WHITESPACE_IGNORE_ALL})
\r
221 GetOptionsMgr()->Set(OPT_CMP_IGNORE_WHITESPACE, nIgnoreWhitespace);
\r
223 pDoc->RefreshOptions();
\r
224 for (size_t l = 0; l < std::size(filelist); ++l)
\r
226 for (size_t r = 0; r < std::size(filelist); ++r)
\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
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
243 pDoc->ChangeFile(0, tFiles[0]);
\r
245 pDoc->ChangeFile(1, tFiles[1]);
\r
247 if (tFiles[0] == tFiles[1])
\r
249 EXPECT_EQ(0, pDoc->m_diffList.GetSize());
\r
253 if (pDoc->m_diffList.DiffRangeAt(0)->op == OP_TRIVIAL)
\r
255 EXPECT_EQ(true, bIgnoreBlankLines);
\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
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
270 pView->SendMessage(WM_COMMAND, ID_EDIT_UNDO);
\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
278 pView->SendMessage(WM_COMMAND, ID_EDIT_UNDO);
\r
280 pView->SendMessage(WM_COMMAND, ID_EDIT_REDO);
\r
282 pView->SendMessage(WM_COMMAND, ID_EDIT_UNDO);
\r
289 pFrame->PostMessage(WM_CLOSE);
\r
290 dlg.SetFormerResult(nPrevFormerResult);
\r
291 dlg2.SetFormerResult(nPrevFormerResult2);
\r
294 TEST(FolderCompare, IgnoreEOL)
\r
296 String projectRoot = getProjectRoot();
\r
297 PathContext dirsArray[] = {
\r
299 paths::ConcatPath(projectRoot, L"Testing/selftests/u/"),
\r
300 paths::ConcatPath(projectRoot, L"Testing/selftests/m/")
\r
303 paths::ConcatPath(projectRoot, L"Testing/selftests/w/"),
\r
304 paths::ConcatPath(projectRoot, L"Testing/selftests/u/")
\r
307 paths::ConcatPath(projectRoot, L"Testing/selftests/w/"),
\r
308 paths::ConcatPath(projectRoot, L"Testing/selftests/m/")
\r
312 for (auto& dirs : dirsArray)
\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
322 pFrame->PostMessage(WM_CLOSE);
\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
334 const DIFFITEM& di = ctxt.GetNextDiffPosition(pos);
\r
335 for (int i = 0; i < 2; ++i)
\r
337 if (dirs[i].find(L"/w/") != String::npos)
\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
343 else if (dirs[i].find(L"/u/") != String::npos)
\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
349 else if (dirs[i].find(L"/m/") != String::npos)
\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
358 GetOptionsMgr()->Set(OPT_CMP_METHOD, 0/* Full Contents*/);
\r
359 GetOptionsMgr()->Set(OPT_CMP_IGNORE_EOL, false);
\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
365 GetOptionsMgr()->Set(OPT_CMP_METHOD, 1/* Quick Contents*/);
\r
366 GetOptionsMgr()->Set(OPT_CMP_IGNORE_EOL, true);
\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
372 GetOptionsMgr()->Set(OPT_CMP_METHOD, 1/* Quick Contents*/);
\r
373 GetOptionsMgr()->Set(OPT_CMP_IGNORE_EOL, false);
\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
379 pFrame->PostMessage(WM_CLOSE);
\r
383 TEST(CommandLineTest, Desc)
\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
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
400 TEST(CommandLineTest, Desc2)
\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
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
417 TEST(CommandLineTest, Desc3)
\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
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
434 TEST(CommandLineTest, Desc4)
\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
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
451 TEST(CommandLineTest, WindowType)
\r
453 String progpath = paths::ConcatPath(env::GetProgPath(), _T("WinMergeU.exe"));
\r
454 String projectRoot = getProjectRoot();
\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
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
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
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
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
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
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
509 TEST(CommandLineTest, New)
\r
511 String progpath = paths::ConcatPath(env::GetProgPath(), _T("WinMergeU.exe"));
\r
512 String projectRoot = getProjectRoot();
\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
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
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
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
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
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
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
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
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
583 TEST(ImageCompareTest, Open)
\r
585 EXPECT_TRUE(CImgMergeFrame::IsLoadable());
\r
586 if (!CImgMergeFrame::IsLoadable())
\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
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
601 pFrame->PostMessage(WM_CLOSE);
\r
602 dlg.SetFormerResult(nPrevFormerResult);
\r
605 TEST(FileMenu, New)
\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
616 TEST(FileMenu, OpenConflictFile)
\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
627 TEST(FileMenu, OpenConflictFile3)
\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
638 TEST(FileMenu, OpenProject)
\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
648 TEST(FileMenu, OpenProject3)
\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