17#define DISABLE_THIS_TESTCASE
21#define NEW_DELIVERY_ONLY
57#define TEST_FILE L"_TEST_.txt"
58#define TEST_FILE_KAI L"_TEST_KAI_.txt"
59#define TEST_DIR L"_TESTDIR_"
60#define TEST_DIR_KAI L"_TESTDIR_KAI_"
61#define MOVE_FILE(from, to) MoveFileW((from), (to))
76 ok(
MOVE_FILE(pszPath1, pszPath2),
"Line %d: MOVE_FILE(%ls, %ls) failed (%ld)\n",
86 ok(
MOVE_FILE(pszPath1, pszPath2),
"Line %d: MOVE_FILE(%ls, %ls) failed (%ld)\n",
95 ok(
DeleteFileW(pszPath),
"Line %d: DeleteFileW(%ls) failed (%ld)\n",
114 ok(
MOVE_FILE(pszPath1, pszPath2),
"Line %d: MOVE_FILE(%ls, %ls) failed (%ld)\n",
124 ok(
MOVE_FILE(pszPath1, pszPath2),
"Line %d: MOVE_FILE(%ls, %ls) failed (%ld)\n",
170#define WRITEDIR_0 DIRTYPE_DESKTOP
177#define WRITEDIR_1 DIRTYPE_MYDOCUMENTS
462 s_buf[
i] = (
char)(
'0' + !!(
flags & (1 <<
i)));
470 pszPath1[0] = pszPath2[0] = 0;
477 fread(szText, 1,
sizeof(szText), fp);
506 UINT cTry = ((iEntry == 0) ? 100 : 60);
507 for (
UINT iTry = 0; iTry < cTry; ++iTry)
529 szPath1[0] = szPath2[0] = 0;
532 static UINT s_cCalmDown = 0;
536 trace(
"Line %d: SHCNE_UPDATEDIR: Calm down (%u)...\n",
entry->line, s_cCalmDown);
538 if (++s_cCalmDown < 3)
554 "Line %d: pattern mismatch '%s', tick=0x%08lX\n",
559 "Line %d: path1 mismatch '%S' (%d)\n",
entry->line, szPath1, bOK);
562 "Line %d: path2 mismatch '%S' (%d)\n",
entry->line, szPath2, bOK);
570 DWORD dwTick = dwNewTick - dwOldTick;
571 trace(
"DoTestEntry: Line %d: tick=%lu.%lu sec\n",
entry->line,
572 (dwTick / 1000), (dwTick / 100 % 10));
594 skip(
"Aborting the thread...\n");
663 trace(
"Closing Explorer windows...\n");
690#define SRC_01 SHCNRF_ShellLevel
691#define SRC_02 (SHCNRF_NewDelivery)
692#define SRC_03 (SHCNRF_NewDelivery | SHCNRF_ShellLevel)
693#define SRC_04 SHCNRF_InterruptLevel
694#define SRC_05 (SHCNRF_InterruptLevel | SHCNRF_ShellLevel)
695#define SRC_06 (SHCNRF_InterruptLevel | SHCNRF_NewDelivery)
696#define SRC_07 (SHCNRF_InterruptLevel | SHCNRF_NewDelivery | SHCNRF_ShellLevel)
697#define SRC_08 (SHCNRF_RecursiveInterrupt | SHCNRF_InterruptLevel)
698#define SRC_09 (SHCNRF_RecursiveInterrupt | SHCNRF_InterruptLevel | SHCNRF_ShellLevel)
699#define SRC_10 (SHCNRF_RecursiveInterrupt | SHCNRF_InterruptLevel | SHCNRF_NewDelivery)
700#define SRC_11 (SHCNRF_RecursiveInterrupt | SHCNRF_InterruptLevel | SHCNRF_NewDelivery | SHCNRF_ShellLevel)
702#define WATCHDIR_0 DIRTYPE_NULL
703#define WATCHDIR_1 DIRTYPE_DESKTOP
704#define WATCHDIR_2 DIRTYPE_MYCOMPUTER
705#define WATCHDIR_3 DIRTYPE_MYDOCUMENTS
711#ifdef NO_INTERRUPT_LEVEL
719#ifdef NEW_DELIVERY_ONLY
727 if ((
rand() & 3) == 0)
729#elif defined(RANDOM_HALF)
734 trace(
"DoTestGroup: Line %d: fRecursive:%u, iWatchDir:%u, nSources:0x%X\n",
735 line, fRecursive, iWatchDir, nSources);
750 skip(
"Unable to run shell32_apitest_sub.exe.\n");
757 skip(
"Unable to find window.\n");
777 DWORD dwTick = dwNewTick - dwOldTick;
778 trace(
"DoTestGroup: Line %d: %lu.%lu sec\n",
line, (dwTick / 1000), (dwTick / 100 % 10));
786 skip(
"RANDOM_QUARTER\n");
787#elif defined(RANDOM_HALF)
788 skip(
"RANDOM_HALF\n");
807#define SWITCH(x, y) (bTarget ? (x) : (y))
911#ifdef DISABLE_THIS_TESTCASE
912 skip(
"This testcase is disabled by DISABLE_THIS_TESTCASE macro.\n");
916 trace(
"Please don't operate your PC while testing...\n");
920 skip(
"shell32_apitest_sub.exe not found\n");
926 skip(
"Unable to initialize.\n");
937 DWORD dwTick = dwNewTick - dwOldTick;
938 trace(
"SHChangeNotify: Total %lu.%lu sec\n", (dwTick / 1000), (dwTick / 100 % 10));
static WCHAR s_szDesktop[MAX_PATH]
static const TEST_ENTRY s_group_07[]
static const TEST_ENTRY s_group_02[]
static BOOL DoAction12(const TEST_ENTRY *entry)
static BOOL DoAction2(const TEST_ENTRY *entry)
static BOOL DoCreateEmptyFile(LPCWSTR pszFileName)
static WCHAR s_szTestDir1[MAX_PATH]
static WCHAR s_szDocuments[MAX_PATH]
static BOOL DoAction3(const TEST_ENTRY *entry)
static const TEST_ENTRY s_group_00[]
static BOOL DoInitTest(void)
static BOOL DoAction11(const TEST_ENTRY *entry)
static BOOL DoAction6(const TEST_ENTRY *entry)
static void DoQuitTest(BOOL bForce)
static BOOL DoAction9(const TEST_ENTRY *entry)
static WCHAR s_szTestFile1Kai[MAX_PATH]
static BOOL DoAction8(const TEST_ENTRY *entry)
static BOOL DoAction4(const TEST_ENTRY *entry)
static BOOL DoAction10(const TEST_ENTRY *entry)
static void DoTestEntry(INT iEntry, const TEST_ENTRY *entry, INT nSources)
static WCHAR s_szTestFile1[MAX_PATH]
static void DoAbortThread(void)
static BOOL DoAction1(const TEST_ENTRY *entry)
static BOOL DoAction7(const TEST_ENTRY *entry)
static const TEST_ENTRY s_group_06[]
static BOOL DoAction5(const TEST_ENTRY *entry)
static WCHAR s_szTestDir0[MAX_PATH]
static void DoDeleteFilesAndDirs(void)
#define MOVE_FILE(from, to)
static WCHAR s_szSubProgram[MAX_PATH]
struct TEST_ENTRY TEST_ENTRY
static LPCSTR PatternFromFlags(DWORD flags)
static const TEST_ENTRY s_group_08[]
static const TEST_ENTRY s_group_05[]
BOOL(* ACTION)(const struct TEST_ENTRY *entry)
static unsigned __stdcall TestThreadProc(void *)
static const TEST_ENTRY s_group_03[]
static void DoTestGroup(INT line, UINT cEntries, const TEST_ENTRY *pEntries, BOOL fRecursive, INT nSources, DIRTYPE iWatchDir)
static WCHAR s_szTestDir1Kai[MAX_PATH]
static WCHAR s_szTestDir0Kai[MAX_PATH]
static WCHAR s_szTestFile0Kai[MAX_PATH]
static BOOL DoGetPaths(LPWSTR pszPath1, LPWSTR pszPath2)
static const TEST_ENTRY s_group_01[]
static WCHAR s_szTestFile0[MAX_PATH]
static BOOL GetSubProgramPath(void)
static BOOL CALLBACK HandlerRoutine(DWORD dwCtrlType)
static const TEST_ENTRY s_group_04[]
int strcmp(const char *String1, const char *String2)
EXTERN_C void WINAPI SHChangeNotify(LONG wEventId, UINT uFlags, LPCVOID dwItem1, LPCVOID dwItem2)
BOOL WINAPI DECLSPEC_HOTPATCH SetConsoleCtrlHandler(PHANDLER_ROUTINE HandlerRoutine, BOOL Add)
BOOL WINAPI DeleteFileW(IN LPCWSTR lpFileName)
BOOL WINAPI CreateDirectoryW(IN LPCWSTR lpPathName, IN LPSECURITY_ATTRIBUTES lpSecurityAttributes)
BOOL WINAPI RemoveDirectoryW(IN LPCWSTR lpPathName)
DWORD WINAPI GetModuleFileNameW(HINSTANCE hModule, LPWSTR lpFilename, DWORD nSize)
BOOL WINAPI TerminateThread(IN HANDLE hThread, IN DWORD dwExitCode)
DWORD WINAPI GetTickCount(VOID)
BOOL WINAPI PathRemoveFileSpecW(LPWSTR lpszPath)
BOOL WINAPI PathAppendW(LPWSTR lpszPath, LPCWSTR lpszAppend)
BOOL WINAPI PathFileExistsW(LPCWSTR lpszPath)
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint i
_Check_return_ _CRTIMP FILE *__cdecl _wfopen(_In_z_ const wchar_t *_Filename, _In_z_ const wchar_t *_Mode)
_Check_return_opt_ _CRTIMP size_t __cdecl fread(_Out_writes_bytes_(_ElementSize *_Count) void *_DstBuf, _In_ size_t _ElementSize, _In_ size_t _Count, _Inout_ FILE *_File)
_Check_return_opt_ _CRTIMP int __cdecl fclose(_Inout_ FILE *_File)
void __cdecl srand(_In_ unsigned int _Seed)
_Check_return_ int __cdecl rand(void)
int WINAPI lstrcmpiW(LPCWSTR lpString1, LPCWSTR lpString2)
_CRTIMP uintptr_t __cdecl _beginthreadex(_In_opt_ void *_Security, _In_ unsigned _StackSize, _In_ unsigned(__stdcall *_StartAddress)(void *), _In_opt_ void *_ArgList, _In_ unsigned _InitFlag, _Out_opt_ unsigned *_ThrdAddr)
static HWND DoWaitForWindow(LPCWSTR clsname, LPCWSTR text, BOOL bClosing, BOOL bForce)
static LPWSTR DoGetDir(DIRTYPE iDir)
#define WM_GET_NOTIFY_FLAGS
HINSTANCE WINAPI ShellExecuteW(HWND hwnd, LPCWSTR lpVerb, LPCWSTR lpFile, LPCWSTR lpParameters, LPCWSTR lpDirectory, INT nShowCmd)
#define SHCNRF_NewDelivery
#define SHCNRF_ShellLevel
#define SHCNRF_InterruptLevel
STRSAFEAPI StringCchPrintfW(STRSAFE_LPWSTR pszDest, size_t cchDest, STRSAFE_LPCWSTR pszFormat,...)
STRSAFEAPI StringCchCopyW(STRSAFE_LPWSTR pszDest, size_t cchDest, STRSAFE_LPCWSTR pszSrc)
DWORD WINAPI WaitForSingleObject(IN HANDLE hHandle, IN DWORD dwMilliseconds)
VOID WINAPI DECLSPEC_HOTPATCH Sleep(IN DWORD dwMilliseconds)
HANDLE WINAPI DECLSPEC_HOTPATCH CreateEventW(IN LPSECURITY_ATTRIBUTES lpEventAttributes OPTIONAL, IN BOOL bManualReset, IN BOOL bInitialState, IN LPCWSTR lpName OPTIONAL)
BOOL WINAPI DECLSPEC_HOTPATCH ResetEvent(IN HANDLE hEvent)
WORD WORD PSZ PSZ pszFileName
VERSIONHELPERAPI IsWindowsVistaOrGreater()
VERSIONHELPERAPI IsWindowsXPOrGreater()
DWORD WINAPI GetLastError(void)
_In_ UINT _In_ UINT cEntries
BOOL WINAPI IsWindow(_In_opt_ HWND)
BOOL WINAPI PostMessageW(_In_opt_ HWND, _In_ UINT, _In_ WPARAM, _In_ LPARAM)
LRESULT WINAPI SendMessageW(_In_ HWND, _In_ UINT, _In_ WPARAM, _In_ LPARAM)