OSDN Git Service

f769c34b0ca00eedf4229a07bb55127772524add
[winmerge-jp/winmerge-jp.git] / Testing / GoogleTest / GUITests / GUITestUtils.h
1 #include <Windows.h>\r
2 #include <filesystem>\r
3 #include <set>\r
4 \r
5 namespace GUITestUtils\r
6 {\r
7         time_t getStartTime();\r
8         bool saveWindowImageAsPNG(HWND hwnd, const std::filesystem::path& filename);\r
9         DWORD waitForInputIdleByHWND(HWND hwnd, DWORD dwMilliseconds = WAIT_TIMEOUT);\r
10         HWND findForegroundDialog();\r
11         void typeText(const wchar_t *text);\r
12         void typeAltPlusKey(char key);\r
13         void typeKey(unsigned char vk);\r
14         void nextControl();\r
15         void prevControl();\r
16         void setFocusDlgItem(HWND hwnd, int id);\r
17         std::filesystem::path getModuleFileName();\r
18         std::filesystem::path getModuleFolder();\r
19         bool isMenuItemChecked(HWND hwnd, int id);\r
20         void waitUntilClose(HWND hwnd);\r
21         void waitUntilFocus(HWND hwnd);\r
22         void waitUntilProcessExit(HWND hwnd);\r
23         void selectMenu(HWND hwnd, unsigned id, bool async = false);\r
24         inline void selectMenuAsync(HWND hwnd, unsigned id) { selectMenu(hwnd, id, true); };\r
25         HWND execWinMerge(const std::string& args = "/noprefs /maxmize");\r
26         HWND execInstaller(const std::string& args = "");\r
27         const std::set<int> languages();\r
28         const char * languageIdToName(int id);\r
29 }\r
30 \r
31 #define selectMenuAndSaveWindowImage(id) selectMenuAndSaveWindowImageHelper(id, #id)\r
32 #define selectOpenDialogMenuAndSaveDialogImage(id) selectOpenDialogMenuAndSaveDialogImageHelper(id, #id)\r
33 \r
34 class CommonTest : public testing::TestWithParam<int>\r
35 {\r
36 public:\r
37         void selectMenu(UINT id)\r
38         {\r
39                 GUITestUtils::selectMenu(m_hwndWinMerge, id);\r
40         }\r
41 \r
42         void selectMenuAsync(UINT id)\r
43         {\r
44                 GUITestUtils::selectMenu(m_hwndWinMerge, id, true);\r
45         }\r
46 \r
47         void selectYesOnFileNavConfirmationMessageBox()\r
48         {\r
49                 HWND foreground = GetForegroundWindow();\r
50                 if (foreground)\r
51                 {\r
52                         int cTxtLen = GetWindowTextLength(foreground);\r
53                         // Expecting message box title "WinMerge" in File navigation confirmations\r
54                         // for Tests not run in English, tbd, needed?\r
55                         if (cTxtLen > 0)\r
56                         {\r
57                                 LPWSTR pszMem = (LPWSTR)VirtualAlloc((LPVOID)NULL, (DWORD)(cTxtLen + 1), MEM_COMMIT, PAGE_READWRITE);\r
58                                 GetWindowText(foreground, pszMem, cTxtLen + 1);\r
59                                 if (wcscmp(pszMem, L"WinMerge") == 0)\r
60                                 {\r
61                                         GUITestUtils::typeKey(VK_RETURN);\r
62                                 }\r
63                                 VirtualFree(pszMem, 0, MEM_RELEASE);\r
64                         }\r
65                 }\r
66         }\r
67 \r
68         void selectMenuAndSaveWindowImageHelper(UINT id, const char *str)\r
69         {\r
70                 selectMenu(id);\r
71                 Sleep(500);\r
72                 if (GUITestUtils::isMenuItemChecked(m_hwndWinMerge, id))\r
73                         saveImage((std::string(str) + ".Checked").c_str());\r
74                 else\r
75                         saveImage(str);\r
76         }\r
77 \r
78         HWND selectOpenDialogMenu(UINT id)\r
79         {\r
80                 GUITestUtils::selectMenuAsync(m_hwndWinMerge, id);\r
81                 HWND hwndDlg = GUITestUtils::findForegroundDialog();\r
82                 return hwndDlg;\r
83         }\r
84 \r
85         HWND selectOpenDialogMenuAndSaveDialogImageHelper(UINT id, const char *str)\r
86         {\r
87                 HWND hwnd = selectOpenDialogMenu(id);\r
88                 Sleep(500);\r
89                 saveForegroundDialogImage(str);\r
90                 return hwnd;\r
91         }\r
92 \r
93         std::filesystem::path getScreenshotFolderPath()\r
94         {\r
95                 std::filesystem::path screenshotFolder;\r
96                 char buf[256];\r
97                 struct tm tm;\r
98                 time_t t = GUITestUtils::getStartTime();\r
99                 localtime_s(&tm, &t);\r
100                 strftime(buf, sizeof buf, "%FT%H%M%S", &tm);\r
101                 screenshotFolder = GUITestUtils::getModuleFolder() / "..\\..\\..\\Build\\GUITests\\Screenshots" / buf / GUITestUtils::languageIdToName(GetParam());\r
102                 std::error_code ec;\r
103                 std::filesystem::create_directories(screenshotFolder, ec);\r
104                 return screenshotFolder;\r
105         }\r
106 \r
107         std::filesystem::path getScreenshotFilePath(const char *id = nullptr)\r
108         {\r
109                 std::string basename = GUITestUtils::languageIdToName(GetParam());\r
110                 basename.append(".");\r
111                 basename.append(::testing::UnitTest::GetInstance()->current_test_info()->test_case_name());\r
112                 basename.append(".");\r
113                 basename.append(::testing::UnitTest::GetInstance()->current_test_info()->name());\r
114                 if (id && id[0])\r
115                 {\r
116                         basename.append(".");\r
117                         basename.append(id);\r
118                 }\r
119                 for (auto& c : basename)\r
120                 {\r
121                         if (c == '/')\r
122                                 c = '_';\r
123                 }\r
124                 std::filesystem::path path = getScreenshotFolderPath() / (basename + ".png");\r
125                 int i = 2;\r
126                 while (std::filesystem::exists(path))\r
127                 {\r
128                         path = getScreenshotFolderPath() / (basename + "(" + std::to_string(i) + ").png");\r
129                         ++i;\r
130                 }\r
131                 return path;\r
132         }\r
133 \r
134         void saveImage(const char *id = nullptr)\r
135         {\r
136                 ASSERT_TRUE(GUITestUtils::saveWindowImageAsPNG(m_hwndWinMerge, getScreenshotFilePath(id)));\r
137         }\r
138 \r
139         void saveForegroundDialogImage(const char *id = "")\r
140         {\r
141                 HWND hwndDlg = GUITestUtils::findForegroundDialog();\r
142                 ASSERT_TRUE(hwndDlg != nullptr);\r
143                 if (hwndDlg)\r
144                         ASSERT_TRUE(GUITestUtils::saveWindowImageAsPNG(hwndDlg, getScreenshotFilePath(id)));\r
145         }\r
146 \r
147         void saveForegroundWindowImage(const char *id = "")\r
148         {\r
149                 HWND hwnd = GetForegroundWindow();\r
150                 ASSERT_TRUE(hwnd != nullptr);\r
151                 if (hwnd)\r
152                         ASSERT_TRUE(GUITestUtils::saveWindowImageAsPNG(hwnd, getScreenshotFilePath(id)));\r
153         }\r
154 \r
155 protected:\r
156         HWND m_hwndWinMerge = nullptr;\r
157 };\r