diff --git a/config/Makefile.in b/config/Makefile.in index 182cffb97a88..41b86541a72d 100644 --- a/config/Makefile.in +++ b/config/Makefile.in @@ -19,11 +19,8 @@ VISIBILITY_FLAGS = # libstdc++-compat is not built yet. STDCXX_COMPAT = +ifneq (WINNT,$(HOST_OS_ARCH)) HOST_PROGRAM = nsinstall$(HOST_BIN_SUFFIX) - -ifeq (WINNT,$(HOST_OS_ARCH)) -HOST_CSRCS = nsinstall_win.c -else HOST_CSRCS = nsinstall.c pathsub.c endif diff --git a/config/config.mk b/config/config.mk index 4457f50a1bd1..c46b3b123f33 100644 --- a/config/config.mk +++ b/config/config.mk @@ -633,19 +633,25 @@ endif PWD := $(CURDIR) endif +NSINSTALL_PY := $(PYTHON) $(call core_abspath,$(topsrcdir)/config/nsinstall.py) + ifdef NSINSTALL_BIN NSINSTALL = $(NSINSTALL_BIN) else ifeq (OS2,$(CROSS_COMPILE)$(OS_ARCH)) NSINSTALL = $(MOZ_TOOLS_DIR)/nsinstall else +ifeq ($(HOST_OS_ARCH),WINNT) +NSINSTALL = $(NSINSTALL_PY) +else NSINSTALL = $(CONFIG_TOOLS)/nsinstall$(HOST_BIN_SUFFIX) +endif # WINNT endif # OS2 endif # NSINSTALL_BIN ifeq (,$(CROSS_COMPILE)$(filter-out WINNT OS2, $(OS_ARCH))) -INSTALL = $(NSINSTALL) +INSTALL = $(NSINSTALL) -t else # This isn't laid out as conditional directives so that NSDISTMODE can be @@ -657,13 +663,8 @@ endif # WINNT/OS2 # Use nsinstall in copy mode to install files on the system SYSINSTALL = $(NSINSTALL) -t -# Directory nsinstall. Windows and OS/2 nsinstall can't recursively copy -# directories. -ifneq (,$(filter WINNT os2-emx,$(HOST_OS_ARCH))) -DIR_INSTALL = $(PYTHON) $(topsrcdir)/config/nsinstall.py -else +# Directory nsinstall. DIR_INSTALL = $(INSTALL) -endif # WINNT/OS2 # # Localization build automation diff --git a/config/nsinstall.py b/config/nsinstall.py index 4cb34b0a4327..42f920feb634 100755 --- a/config/nsinstall.py +++ b/config/nsinstall.py @@ -15,6 +15,7 @@ import os import os.path import sys import shutil +import stat def nsinstall(argv): usage = "usage: %prog [options] arg1 [arg2 ...] target-directory" @@ -51,6 +52,13 @@ def nsinstall(argv): help="Set group (NOT SUPPORTED)", metavar="group") (options, args) = p.parse_args(argv) + # Switching to Unicode strings makes python use the wide Windows APIs, which is + # what we want here since the wide APIs normally do a better job at handling long + # paths and such. + if sys.stdin.encoding is None: + args = [unicode(arg) for arg in args] + else: + args = [unicode(arg, sys.stdin.encoding) for arg in args] if options.m: # mode is specified @@ -61,36 +69,47 @@ def nsinstall(argv): return 1 # just create one directory? - if options.D: - if len(args) != 1: + def maybe_create_dir(dir, mode, try_again): + if os.path.exists(dir): + if not os.path.isdir(dir): + print >> sys.stderr, ('nsinstall: %s is not a directory' % dir) + return 1 + if mode: + os.chmod(dir, mode) + return 0 + + try: + if mode: + os.makedirs(dir, mode) + else: + os.makedirs(dir) + except Exception, e: + # We might have hit EEXIST due to a race condition (see bug 463411) -- try again once + if try_again: + return maybe_create_dir(dir, mode, False) + print >> sys.stderr, ("nsinstall: failed to create directory %s: %s" % (dir, e)) return 1 - if os.path.exists(args[0]): - if not os.path.isdir(args[0]): - sys.stderr.write('nsinstall: ' + args[0] + ' is not a directory\n') - sys.exit(1) - if options.m: - os.chmod(args[0], options.m) - sys.exit() - if options.m: - os.makedirs(args[0], options.m) else: - os.makedirs(args[0]) - return 0 + return 0 if options.X: options.X = [os.path.abspath(p) for p in options.X] + if options.D: + return maybe_create_dir(args[0], options.m, True) + # nsinstall arg1 [...] directory if len(args) < 2: p.error('not enough arguments') def copy_all_entries(entries, target): for e in entries: - if options.X and os.path.abspath(e) in options.X: + e = os.path.abspath(e) + if options.X and e in options.X: continue - dest = os.path.join(target, - os.path.basename(os.path.normpath(e))) + dest = os.path.join(target, os.path.basename(e)) + dest = os.path.abspath(dest) handleTarget(e, dest) if options.m: os.chmod(dest, options.m) @@ -112,19 +131,46 @@ def nsinstall(argv): # options.t is not relevant for directories if options.m: os.chmod(targetpath, options.m) - elif options.t: - shutil.copy2(srcpath, targetpath) else: - shutil.copy(srcpath, targetpath) + if os.path.exists(targetpath): + # On Windows, read-only files can't be deleted + os.chmod(targetpath, stat.S_IWUSR) + os.remove(targetpath) + if options.t: + shutil.copy2(srcpath, targetpath) + else: + shutil.copy(srcpath, targetpath) # the last argument is the target directory target = args.pop() - # ensure target directory - if not os.path.isdir(target): - os.makedirs(target) + # ensure target directory (importantly, we do not apply a mode to the directory + # because we want to copy files into it and the mode might be read-only) + rv = maybe_create_dir(target, None, True) + if rv != 0: + return rv copy_all_entries(args, target) return 0 if __name__ == '__main__': - sys.exit(nsinstall(sys.argv[1:])) + # sys.argv corrupts characters outside the system code page on Windows + # . Use ctypes instead. + if sys.platform == "win32": + import ctypes + from ctypes import wintypes + GetCommandLine = ctypes.windll.kernel32.GetCommandLineW + GetCommandLine.argtypes = [] + GetCommandLine.restype = wintypes.LPWSTR + + CommandLineToArgv = ctypes.windll.shell32.CommandLineToArgvW + CommandLineToArgv.argtypes = [wintypes.LPWSTR, ctypes.POINTER(ctypes.c_int)] + CommandLineToArgv.restype = ctypes.POINTER(wintypes.LPWSTR) + + argc = ctypes.c_int(0) + argv_arr = CommandLineToArgv(GetCommandLine(), ctypes.byref(argc)) + # The first argument will be "python", the second will be the .py file + argv = argv_arr[1:argc.value] + else: + argv = sys.argv + + sys.exit(nsinstall(argv[1:])) diff --git a/config/nsinstall_win.c b/config/nsinstall_win.c deleted file mode 100644 index 0f72c5d4a465..000000000000 --- a/config/nsinstall_win.c +++ /dev/null @@ -1,747 +0,0 @@ -/* This Source Code Form is subject to the terms of the Mozilla Public - * License, v. 2.0. If a copy of the MPL was not distributed with this - * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ - -/* - * The nsinstall command for Win32 - * - * Our gmake makefiles use the nsinstall command to create the - * object directories or installing headers and libs. This code was originally - * taken from shmsdos.c - */ - -#include -#include -#include -#include -#include -#pragma hdrstop - -/* - * sh_FileFcn -- - * - * A function that operates on a file. The pathname is either - * absolute or relative to the current directory, and contains - * no wildcard characters such as * and ?. Additional arguments - * can be passed to the function via the arg pointer. - */ - -typedef BOOL (*sh_FileFcn)( - wchar_t *pathName, - WIN32_FIND_DATA *fileData, - void *arg); - -static int shellCp (wchar_t **pArgv); -static int shellNsinstall (wchar_t **pArgv); -static int shellMkdir (wchar_t **pArgv); -static BOOL sh_EnumerateFiles(const wchar_t *pattern, const wchar_t *where, - sh_FileFcn fileFcn, void *arg, int *nFiles); -static const char *sh_GetLastErrorMessage(void); -static BOOL sh_DoCopy(wchar_t *srcFileName, DWORD srcFileAttributes, - wchar_t *dstFileName, DWORD dstFileAttributes, - int force, int recursive); - -#define LONGPATH_PREFIX L"\\\\?\\" -#define ARRAY_LEN(a) (sizeof(a) / sizeof(a[0])) -#define STR_LEN(a) (ARRAY_LEN(a) - 1) - -#ifdef __MINGW32__ - -/* MingW currently does not implement a wide version of the - startup routines. Workaround is to implement something like - it ourselves. */ - -#include - -int wmain(int argc, WCHAR **argv); - -int main(int argc, char **argv) -{ - int result; - wchar_t *commandLine = GetCommandLineW(); - int argcw = 0; - wchar_t **_argvw = CommandLineToArgvW( commandLine, &argcw ); - wchar_t *argvw[argcw + 1]; - int i; - if (!_argvw) - return 127; - /* CommandLineToArgvW doesn't output the ending NULL so - we have to manually add it on */ - for ( i = 0; i < argcw; i++ ) - argvw[i] = _argvw[i]; - argvw[argcw] = NULL; - - result = wmain(argcw, argvw); - LocalFree(_argvw); - return result; -} -#endif /* __MINGW32__ */ - -/* changes all forward slashes in token to backslashes */ -void changeForwardSlashesToBackSlashes ( wchar_t *arg ) -{ - if ( arg == NULL ) - return; - - while ( *arg ) { - if ( *arg == '/' ) - *arg = '\\'; - arg++; - } -} - -int wmain(int argc, wchar_t *argv[ ]) -{ - return shellNsinstall ( argv + 1 ); -} - -static int -shellNsinstall (wchar_t **pArgv) -{ - int retVal = 0; /* exit status */ - int dirOnly = 0; /* 1 if and only if -D is specified */ - wchar_t **pSrc; - wchar_t **pDst; - - /* - * Process the command-line options. We ignore the - * options except for -D. Some options, such as -m, - * are followed by an argument. We need to skip the - * argument too. - */ - while ( *pArgv && **pArgv == '-' ) { - wchar_t c = (*pArgv)[1]; /* The char after '-' */ - - if ( c == 'D' ) { - dirOnly = 1; - } else if ( c == 'm' ) { - pArgv++; /* skip the next argument */ - } - pArgv++; - } - - if ( !dirOnly ) { - /* There are files to install. Get source files */ - if ( *pArgv ) { - pSrc = pArgv++; - } else { - fprintf( stderr, "nsinstall: not enough arguments\n"); - return 3; - } - } - - /* Get to last token to find destination directory */ - if ( *pArgv ) { - pDst = pArgv++; - if ( dirOnly && *pArgv ) { - fprintf( stderr, "nsinstall: too many arguments with -D\n"); - return 3; - } - } else { - fprintf( stderr, "nsinstall: not enough arguments\n"); - return 3; - } - while ( *pArgv ) - pDst = pArgv++; - - retVal = shellMkdir ( pDst ); - if ( retVal ) - return retVal; - if ( !dirOnly ) - retVal = shellCp ( pSrc ); - return retVal; -} - -static int -shellMkdir (wchar_t **pArgv) -{ - int retVal = 0; /* assume valid return */ - wchar_t *arg; - wchar_t *pArg; - wchar_t path[_MAX_PATH]; - wchar_t tmpPath[_MAX_PATH]; - wchar_t *pTmpPath = tmpPath; - - /* All the options are simply ignored in this implementation */ - while ( *pArgv && **pArgv == '-' ) { - if ( (*pArgv)[1] == 'm' ) { - pArgv++; /* skip the next argument (mode) */ - } - pArgv++; - } - - while ( *pArgv ) { - arg = *pArgv; - changeForwardSlashesToBackSlashes ( arg ); - pArg = arg; - pTmpPath = tmpPath; - while ( 1 ) { - /* create part of path */ - while ( *pArg ) { - *pTmpPath++ = *pArg++; - if ( *pArg == '\\' ) - break; - } - *pTmpPath = '\0'; - - /* check if directory already exists */ - _wgetcwd ( path, _MAX_PATH ); - if ( _wchdir ( tmpPath ) == -1 && - _wmkdir ( tmpPath ) == -1 && // might have hit EEXIST - _wchdir ( tmpPath ) == -1) { // so try again - char buf[2048]; - _snprintf(buf, 2048, "Could not create the directory: %S", - tmpPath); - perror ( buf ); - retVal = 3; - break; - } else { - // get back to the cwd - _wchdir ( path ); - } - if ( *pArg == '\0' ) /* complete path? */ - break; - /* loop for next directory */ - } - - pArgv++; - } - return retVal; -} - -static const char * -sh_GetLastErrorMessage() -{ - static char buf[128]; - - FormatMessageA( - FORMAT_MESSAGE_FROM_SYSTEM, - NULL, - GetLastError(), - MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), /* default language */ - buf, - sizeof(buf), - NULL - ); - return buf; -} - -/* - * struct sh_FileData -- - * - * A pointer to the sh_FileData structure is passed into sh_RecordFileData, - * which will fill in the fields. - */ - -struct sh_FileData { - wchar_t pathName[_MAX_PATH]; - DWORD dwFileAttributes; -}; - -/* - * sh_RecordFileData -- - * - * Record the pathname and attributes of the file in - * the sh_FileData structure pointed to by arg. - * - * Always return TRUE (successful completion). - * - * This function is intended to be passed into sh_EnumerateFiles - * to see if a certain pattern expands to exactly one file/directory, - * and if so, record its pathname and attributes. - */ - -static BOOL -sh_RecordFileData(wchar_t *pathName, WIN32_FIND_DATA *findData, void *arg) -{ - struct sh_FileData *fData = (struct sh_FileData *) arg; - - wcscpy(fData->pathName, pathName); - fData->dwFileAttributes = findData->dwFileAttributes; - return TRUE; -} - -static BOOL -sh_DoCopy(wchar_t *srcFileName, - DWORD srcFileAttributes, - wchar_t *dstFileName, - DWORD dstFileAttributes, - int force, - int recursive -) -{ - if (dstFileAttributes != 0xFFFFFFFF) { - if ((dstFileAttributes & FILE_ATTRIBUTE_READONLY) && force) { - dstFileAttributes &= ~FILE_ATTRIBUTE_READONLY; - SetFileAttributes(dstFileName, dstFileAttributes); - } - } - - if (srcFileAttributes & FILE_ATTRIBUTE_DIRECTORY) { - fprintf(stderr, "nsinstall: %ls is a directory\n", - srcFileName); - return FALSE; - } else { - DWORD r; - wchar_t longSrc[1004] = LONGPATH_PREFIX; - wchar_t longDst[1004] = LONGPATH_PREFIX; - r = GetFullPathName(srcFileName, 1000, longSrc + STR_LEN(LONGPATH_PREFIX), NULL); - if (!r) { - fprintf(stderr, "nsinstall: couldn't get full path of %ls: %s\n", - srcFileName, sh_GetLastErrorMessage()); - return FALSE; - } - r = GetFullPathName(dstFileName, 1000, longDst + ARRAY_LEN(LONGPATH_PREFIX) - 1, NULL); - if (!r) { - fprintf(stderr, "nsinstall: couldn't get full path of %ls: %s\n", - dstFileName, sh_GetLastErrorMessage()); - return FALSE; - } - - if (!CopyFile(longSrc, longDst, FALSE)) { - fprintf(stderr, "nsinstall: cannot copy %ls to %ls: %s\n", - srcFileName, dstFileName, sh_GetLastErrorMessage()); - return FALSE; - } - } - return TRUE; -} - -/* - * struct sh_CpCmdArg -- - * - * A pointer to the sh_CpCmdArg structure is passed into sh_CpFileCmd. - * The sh_CpCmdArg contains information about the cp command, and - * provide a buffer for constructing the destination file name. - */ - -struct sh_CpCmdArg { - int force; /* -f option, ok to overwrite an existing - * read-only destination file */ - int recursive; /* -r or -R option, recursively copy - * directories. Note: this field is not used - * by nsinstall and should always be 0. */ - wchar_t *dstFileName; /* a buffer for constructing the destination - * file name */ - wchar_t *dstFileNameMarker; /* points to where in the dstFileName buffer - * we should write the file component of the - * destination file */ -}; - -/* - * sh_CpFileCmd -- - * - * Copy a file to the destination directory - * - * This function is intended to be passed into sh_EnumerateFiles to - * copy all the files specified by the pattern to the destination - * directory. - * - * Return TRUE if the file is successfully copied, and FALSE otherwise. - */ - -static BOOL -sh_CpFileCmd(wchar_t *pathName, WIN32_FIND_DATA *findData, void *cpArg) -{ - BOOL retVal = TRUE; - struct sh_CpCmdArg *arg = (struct sh_CpCmdArg *) cpArg; - - wcscpy(arg->dstFileNameMarker, findData->cFileName); - return sh_DoCopy(pathName, findData->dwFileAttributes, - arg->dstFileName, GetFileAttributes(arg->dstFileName), - arg->force, arg->recursive); -} - -static int -shellCp (wchar_t **pArgv) -{ - int retVal = 0; - wchar_t **pSrc; - wchar_t **pDst; - struct sh_CpCmdArg arg; - struct sh_FileData dstData; - int dstIsDir = 0; - int n; - - arg.force = 0; - arg.recursive = 0; - arg.dstFileName = dstData.pathName; - arg.dstFileNameMarker = 0; - - while (*pArgv && **pArgv == '-') { - wchar_t *p = *pArgv; - - while (*(++p)) { - if (*p == 'f') { - arg.force = 1; - } - } - pArgv++; - } - - /* the first source file */ - if (*pArgv) { - pSrc = pArgv++; - } else { - fprintf(stderr, "nsinstall: not enough arguments\n"); - return 3; - } - - /* get to the last token to find destination */ - if (*pArgv) { - pDst = pArgv++; - } else { - fprintf(stderr, "nsinstall: not enough arguments\n"); - return 3; - } - while (*pArgv) { - pDst = pArgv++; - } - - /* - * The destination pattern must unambiguously expand to exactly - * one file or directory. - */ - - changeForwardSlashesToBackSlashes(*pDst); - sh_EnumerateFiles(*pDst, *pDst, sh_RecordFileData, &dstData, &n); - assert(n >= 0); - if (n == 1) { - /* - * Is the destination a file or directory? - */ - - if (dstData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) { - dstIsDir = 1; - } - } else if (n > 1) { - fprintf(stderr, "nsinstall: %ls: ambiguous destination file " - "or directory\n", *pDst); - return 3; - } else { - /* - * n == 0, meaning that destination file or directory does - * not exist. In this case the destination file directory - * name must be fully specified. - */ - - wchar_t *p; - - for (p = *pDst; *p; p++) { - if (*p == '*' || *p == '?') { - fprintf(stderr, "nsinstall: %ls: No such file or directory\n", - *pDst); - return 3; - } - } - - /* - * Do not include the trailing \, if any, unless it is a root - * directory (\ or X:\). - */ - - if (p > *pDst && p[-1] == '\\' && p != *pDst + 1 && p[-2] != ':') { - p[-1] = '\0'; - } - wcscpy(dstData.pathName, *pDst); - dstData.dwFileAttributes = 0xFFFFFFFF; - } - - /* - * If there are two or more source files, the destination has - * to be a directory. - */ - - if (pDst - pSrc > 1 && !dstIsDir) { - fprintf(stderr, "nsinstall: cannot copy more than" - " one file to the same destination file\n"); - return 3; - } - - if (dstIsDir) { - arg.dstFileNameMarker = arg.dstFileName + wcslen(arg.dstFileName); - - /* - * Now arg.dstFileNameMarker is pointing to the null byte at the - * end of string. We want to make sure that there is a \ at the - * end of string, and arg.dstFileNameMarker should point right - * after that \. - */ - - if (arg.dstFileNameMarker[-1] != '\\') { - *(arg.dstFileNameMarker++) = '\\'; - } - } - - if (!dstIsDir) { - struct sh_FileData srcData; - - assert(pDst - pSrc == 1); - changeForwardSlashesToBackSlashes(*pSrc); - sh_EnumerateFiles(*pSrc, *pSrc, sh_RecordFileData, &srcData, &n); - if (n == 0) { - fprintf(stderr, "nsinstall: %ls: No such file or directory\n", - *pSrc); - retVal = 3; - } else if (n > 1) { - fprintf(stderr, "nsinstall: cannot copy more than one file or " - "directory to the same destination\n"); - retVal = 3; - } else { - assert(n == 1); - if (sh_DoCopy(srcData.pathName, srcData.dwFileAttributes, - dstData.pathName, dstData.dwFileAttributes, - arg.force, arg.recursive) == FALSE) { - retVal = 3; - } - } - return retVal; - } - - for ( ; *pSrc != *pDst; pSrc++) { - BOOL rv; - - changeForwardSlashesToBackSlashes(*pSrc); - rv = sh_EnumerateFiles(*pSrc, *pSrc, sh_CpFileCmd, &arg, &n); - if (rv == FALSE) { - retVal = 3; - } else { - if (n == 0) { - fprintf(stderr, "nsinstall: %ls: No such file or directory\n", - *pSrc); - retVal = 3; - } - } - } - - return retVal; -} - -/* - * sh_EnumerateFiles -- - * - * Enumerate all the files in the specified pattern, which is a pathname - * containing possibly wildcard characters such as * and ?. fileFcn - * is called on each file, passing the expanded file name, a pointer - * to the file's WIN32_FILE_DATA, and the arg pointer. - * - * It is assumed that there are no wildcard characters before the - * character pointed to by 'where'. - * - * On return, *nFiles stores the number of files enumerated. *nFiles is - * set to this number whether sh_EnumerateFiles or 'fileFcn' succeeds - * or not. - * - * Return TRUE if the files are successfully enumerated and all - * 'fileFcn' invocations succeeded. Return FALSE if something went - * wrong. - */ - -static BOOL sh_EnumerateFiles( - const wchar_t *pattern, - const wchar_t *where, - sh_FileFcn fileFcn, - void *arg, - int *nFiles - ) -{ - WIN32_FIND_DATA fileData; - HANDLE hSearch; - const wchar_t *src; - wchar_t *dst; - wchar_t fileName[_MAX_PATH]; - wchar_t *fileNameMarker = fileName; - wchar_t *oldFileNameMarker; - BOOL hasWildcard = FALSE; - BOOL retVal = TRUE; - BOOL patternEndsInDotStar = FALSE; - BOOL patternEndsInDot = FALSE; /* a special case of - * patternEndsInDotStar */ - int numDotsInPattern; - int len; - - /* - * Windows expands patterns ending in ".", ".*", ".**", etc. - * differently from the glob expansion on Unix. For example, - * both "foo." and "foo.*" match "foo", and "*.*" matches - * everything, including filenames with no dots. So we need - * to throw away extra files returned by the FindNextFile() - * function. We require that a matched filename have at least - * the number of dots in the pattern. - */ - len = wcslen(pattern); - if (len >= 2) { - /* Start from the end of pattern and go backward */ - const wchar_t *p = &pattern[len - 1]; - - /* We can have zero or more *'s */ - while (p >= pattern && *p == '*') { - p--; - } - if (p >= pattern && *p == '.') { - patternEndsInDotStar = TRUE; - if (p == &pattern[len - 1]) { - patternEndsInDot = TRUE; - } - p--; - numDotsInPattern = 1; - while (p >= pattern && *p != '\\') { - if (*p == '.') { - numDotsInPattern++; - } - p--; - } - } - } - - *nFiles = 0; - - /* - * Copy pattern to fileName, but only up to and not including - * the first \ after the first wildcard letter. - * - * Make fileNameMarker point to one of the following: - * - the start of fileName, if fileName does not contain any \. - * - right after the \ before the first wildcard letter, if there is - * a wildcard character. - * - right after the last \, if there is no wildcard character. - */ - - dst = fileName; - src = pattern; - while (src < where) { - if (*src == '\\') { - oldFileNameMarker = fileNameMarker; - fileNameMarker = dst + 1; - } - *(dst++) = *(src++); - } - - while (*src && *src != '*' && *src != '?') { - if (*src == '\\') { - oldFileNameMarker = fileNameMarker; - fileNameMarker = dst + 1; - } - *(dst++) = *(src++); - } - - if (*src) { - /* - * Must have seen the first wildcard letter - */ - - hasWildcard = TRUE; - while (*src && *src != '\\') { - *(dst++) = *(src++); - } - } - - /* Now src points to either null or \ */ - - assert(*src == '\0' || *src == '\\'); - assert(hasWildcard || *src == '\0'); - *dst = '\0'; - - /* - * If the pattern does not contain any wildcard characters, then - * we don't need to go the FindFirstFile route. - */ - - if (!hasWildcard) { - /* - * See if it is the root directory, \, or X:\. - */ - - assert(!wcscmp(fileName, pattern)); - assert(wcslen(fileName) >= 1); - if (dst[-1] == '\\' && (dst == fileName + 1 || dst[-2] == ':')) { - fileData.cFileName[0] = '\0'; - } else { - /* - * Do not include the trailing \, if any - */ - - if (dst[-1] == '\\') { - assert(*fileNameMarker == '\0'); - dst[-1] = '\0'; - fileNameMarker = oldFileNameMarker; - } - wcscpy(fileData.cFileName, fileNameMarker); - } - fileData.dwFileAttributes = GetFileAttributes(fileName); - if (fileData.dwFileAttributes == 0xFFFFFFFF) { - return TRUE; - } - *nFiles = 1; - return (*fileFcn)(fileName, &fileData, arg); - } - - hSearch = FindFirstFile(fileName, &fileData); - if (hSearch == INVALID_HANDLE_VALUE) { - return retVal; - } - - do { - if (!wcscmp(fileData.cFileName, L".") - || !wcscmp(fileData.cFileName, L"..")) { - /* - * Skip over . and .. - */ - - continue; - } - - if (patternEndsInDotStar) { - int nDots = 0; - wchar_t *p = fileData.cFileName; - while (*p) { - if (*p == '.') { - nDots++; - } - p++; - } - /* Now p points to the null byte at the end of file name */ - if (patternEndsInDot && (p == fileData.cFileName - || p[-1] != '.')) { - /* - * File name does not end in dot. Skip this file. - * Note: windows file name probably cannot end in dot, - * but we do this check anyway. - */ - continue; - } - if (nDots < numDotsInPattern) { - /* - * Not enough dots in file name. Must be an extra - * file in matching .* pattern. Skip this file. - */ - continue; - } - } - - wcscpy(fileNameMarker, fileData.cFileName); - if (*src && *(src + 1)) { - /* - * More to go. Recurse. - */ - - int n; - - assert(*src == '\\'); - where = fileName + wcslen(fileName); - wcscat(fileName, src); - sh_EnumerateFiles(fileName, where, fileFcn, arg, &n); - *nFiles += n; - } else { - assert(wcschr(fileName, '*') == NULL); - assert(wcschr(fileName, '?') == NULL); - (*nFiles)++; - if ((*fileFcn)(fileName, &fileData, arg) == FALSE) { - retVal = FALSE; - } - } - } while (FindNextFile(hSearch, &fileData)); - - FindClose(hSearch); - return retVal; -} diff --git a/config/tests/unit-nsinstall.py b/config/tests/unit-nsinstall.py index c5f395d94893..3b24eab062eb 100644 --- a/config/tests/unit-nsinstall.py +++ b/config/tests/unit-nsinstall.py @@ -4,8 +4,18 @@ import os, sys, os.path, time from tempfile import mkdtemp from shutil import rmtree sys.path.append(os.path.join(os.path.dirname(__file__), '..')) +from mozprocess import processhandler from nsinstall import nsinstall +import nsinstall as nsinstall_module +NSINSTALL_PATH = nsinstall_module.__file__ + +# Run the non-ASCII tests on (a) Windows, or (b) any platform with +# sys.stdin.encoding set to UTF-8 +import codecs +RUN_NON_ASCII_TESTS = (sys.platform == "win32" or + (sys.stdin.encoding is not None and + codecs.lookup(sys.stdin.encoding) == codecs.lookup("utf-8"))) class TestNsinstall(unittest.TestCase): """ @@ -15,7 +25,13 @@ class TestNsinstall(unittest.TestCase): self.tmpdir = mkdtemp() def tearDown(self): - rmtree(self.tmpdir) + # Unicode strings means non-ASCII children can be deleted properly on + # Windows + if sys.stdin.encoding is None: + tmpdir = unicode(self.tmpdir) + else: + tmpdir = unicode(self.tmpdir, sys.stdin.encoding) + rmtree(tmpdir) # utility methods for tests def touch(self, file, dir=None): @@ -121,6 +137,38 @@ class TestNsinstall(unittest.TestCase): self.assertEqual(nsinstall(["-d", testfile, destdir]), 0) self.assert_(os.path.isdir(os.path.join(destdir, "testfile"))) + # Disable this temporarily on Windows (will be re-enabled by bug 680636) + if RUN_NON_ASCII_TESTS and sys.platform != "win32": + def test_nsinstall_non_ascii(self): + "Test that nsinstall handles non-ASCII files" + filename = u"\u2325\u3452\u2415\u5081" + testfile = self.touch(filename) + testdir = self.mkdirs(u"\u4241\u1D04\u1414") + self.assertEqual(nsinstall([testfile.encode("utf-8"), + testdir.encode("utf-8")]), 0) + + destfile = os.path.join(testdir, filename) + self.assert_(os.path.isfile(destfile)) + + if RUN_NON_ASCII_TESTS: + def test_nsinstall_non_ascii_subprocess(self): + "Test that nsinstall as a subprocess handles non-ASCII files" + filename = u"\u2325\u3452\u2415\u5081" + testfile = self.touch(filename) + testdir = self.mkdirs(u"\u4241\u1D04\u1414") + # We don't use subprocess because it can't handle Unicode on + # Windows . mozprocess calls + # CreateProcessW directly so it's perfect. + p = processhandler.ProcessHandlerMixin([sys.executable, + NSINSTALL_PATH, + testfile, testdir]) + p.run() + rv = p.waitForFinish() + + self.assertEqual(rv, 0) + destfile = os.path.join(testdir, filename) + self.assert_(os.path.isfile(destfile)) + #TODO: implement -R, -l, -L and test them! if __name__ == '__main__': diff --git a/extensions/spellcheck/hunspell/Makefile.in b/extensions/spellcheck/hunspell/Makefile.in index 76e0d978cb92..f74c7814ea3a 100644 --- a/extensions/spellcheck/hunspell/Makefile.in +++ b/extensions/spellcheck/hunspell/Makefile.in @@ -15,12 +15,6 @@ DIRS = src ifdef ENABLE_TESTS XPCSHELL_TESTS = tests/unit -ABS_topsrcdir = $(call core_abspath,$(topsrcdir)) -libs:: - $(NSINSTALL) -D $(DEPTH)/_tests/xpcshell/$(relativesrcdir)/tests/unit/data - cd $(srcdir)/tests; $(PYTHON) $(ABS_topsrcdir)/config/nsinstall.py \ - ./ \ - $(call core_abspath,$(DEPTH)/_tests/xpcshell/$(relativesrcdir)/tests/unit/data/) endif include $(topsrcdir)/config/rules.mk diff --git a/extensions/spellcheck/hunspell/tests/1463589.aff b/extensions/spellcheck/hunspell/tests/unit/data/1463589.aff similarity index 100% rename from extensions/spellcheck/hunspell/tests/1463589.aff rename to extensions/spellcheck/hunspell/tests/unit/data/1463589.aff diff --git a/extensions/spellcheck/hunspell/tests/1463589.dic b/extensions/spellcheck/hunspell/tests/unit/data/1463589.dic similarity index 100% rename from extensions/spellcheck/hunspell/tests/1463589.dic rename to extensions/spellcheck/hunspell/tests/unit/data/1463589.dic diff --git a/extensions/spellcheck/hunspell/tests/1463589.sug b/extensions/spellcheck/hunspell/tests/unit/data/1463589.sug similarity index 100% rename from extensions/spellcheck/hunspell/tests/1463589.sug rename to extensions/spellcheck/hunspell/tests/unit/data/1463589.sug diff --git a/extensions/spellcheck/hunspell/tests/1463589.test b/extensions/spellcheck/hunspell/tests/unit/data/1463589.test similarity index 100% rename from extensions/spellcheck/hunspell/tests/1463589.test rename to extensions/spellcheck/hunspell/tests/unit/data/1463589.test diff --git a/extensions/spellcheck/hunspell/tests/1463589.wrong b/extensions/spellcheck/hunspell/tests/unit/data/1463589.wrong similarity index 100% rename from extensions/spellcheck/hunspell/tests/1463589.wrong rename to extensions/spellcheck/hunspell/tests/unit/data/1463589.wrong diff --git a/extensions/spellcheck/hunspell/tests/1463589_utf.aff b/extensions/spellcheck/hunspell/tests/unit/data/1463589_utf.aff similarity index 100% rename from extensions/spellcheck/hunspell/tests/1463589_utf.aff rename to extensions/spellcheck/hunspell/tests/unit/data/1463589_utf.aff diff --git a/extensions/spellcheck/hunspell/tests/1463589_utf.dic b/extensions/spellcheck/hunspell/tests/unit/data/1463589_utf.dic similarity index 100% rename from extensions/spellcheck/hunspell/tests/1463589_utf.dic rename to extensions/spellcheck/hunspell/tests/unit/data/1463589_utf.dic diff --git a/extensions/spellcheck/hunspell/tests/1463589_utf.sug b/extensions/spellcheck/hunspell/tests/unit/data/1463589_utf.sug similarity index 100% rename from extensions/spellcheck/hunspell/tests/1463589_utf.sug rename to extensions/spellcheck/hunspell/tests/unit/data/1463589_utf.sug diff --git a/extensions/spellcheck/hunspell/tests/1463589_utf.test b/extensions/spellcheck/hunspell/tests/unit/data/1463589_utf.test similarity index 100% rename from extensions/spellcheck/hunspell/tests/1463589_utf.test rename to extensions/spellcheck/hunspell/tests/unit/data/1463589_utf.test diff --git a/extensions/spellcheck/hunspell/tests/1463589_utf.wrong b/extensions/spellcheck/hunspell/tests/unit/data/1463589_utf.wrong similarity index 100% rename from extensions/spellcheck/hunspell/tests/1463589_utf.wrong rename to extensions/spellcheck/hunspell/tests/unit/data/1463589_utf.wrong diff --git a/extensions/spellcheck/hunspell/tests/1592880.aff b/extensions/spellcheck/hunspell/tests/unit/data/1592880.aff similarity index 100% rename from extensions/spellcheck/hunspell/tests/1592880.aff rename to extensions/spellcheck/hunspell/tests/unit/data/1592880.aff diff --git a/extensions/spellcheck/hunspell/tests/1592880.dic b/extensions/spellcheck/hunspell/tests/unit/data/1592880.dic similarity index 100% rename from extensions/spellcheck/hunspell/tests/1592880.dic rename to extensions/spellcheck/hunspell/tests/unit/data/1592880.dic diff --git a/extensions/spellcheck/hunspell/tests/1592880.good b/extensions/spellcheck/hunspell/tests/unit/data/1592880.good similarity index 100% rename from extensions/spellcheck/hunspell/tests/1592880.good rename to extensions/spellcheck/hunspell/tests/unit/data/1592880.good diff --git a/extensions/spellcheck/hunspell/tests/1592880.test b/extensions/spellcheck/hunspell/tests/unit/data/1592880.test similarity index 100% rename from extensions/spellcheck/hunspell/tests/1592880.test rename to extensions/spellcheck/hunspell/tests/unit/data/1592880.test diff --git a/extensions/spellcheck/hunspell/tests/1695964.aff b/extensions/spellcheck/hunspell/tests/unit/data/1695964.aff similarity index 100% rename from extensions/spellcheck/hunspell/tests/1695964.aff rename to extensions/spellcheck/hunspell/tests/unit/data/1695964.aff diff --git a/extensions/spellcheck/hunspell/tests/1695964.dic b/extensions/spellcheck/hunspell/tests/unit/data/1695964.dic similarity index 100% rename from extensions/spellcheck/hunspell/tests/1695964.dic rename to extensions/spellcheck/hunspell/tests/unit/data/1695964.dic diff --git a/extensions/spellcheck/hunspell/tests/1695964.sug b/extensions/spellcheck/hunspell/tests/unit/data/1695964.sug similarity index 100% rename from extensions/spellcheck/hunspell/tests/1695964.sug rename to extensions/spellcheck/hunspell/tests/unit/data/1695964.sug diff --git a/extensions/spellcheck/hunspell/tests/1695964.test b/extensions/spellcheck/hunspell/tests/unit/data/1695964.test similarity index 100% rename from extensions/spellcheck/hunspell/tests/1695964.test rename to extensions/spellcheck/hunspell/tests/unit/data/1695964.test diff --git a/extensions/spellcheck/hunspell/tests/1695964.wrong b/extensions/spellcheck/hunspell/tests/unit/data/1695964.wrong similarity index 100% rename from extensions/spellcheck/hunspell/tests/1695964.wrong rename to extensions/spellcheck/hunspell/tests/unit/data/1695964.wrong diff --git a/extensions/spellcheck/hunspell/tests/1706659.aff b/extensions/spellcheck/hunspell/tests/unit/data/1706659.aff similarity index 100% rename from extensions/spellcheck/hunspell/tests/1706659.aff rename to extensions/spellcheck/hunspell/tests/unit/data/1706659.aff diff --git a/extensions/spellcheck/hunspell/tests/1706659.dic b/extensions/spellcheck/hunspell/tests/unit/data/1706659.dic similarity index 100% rename from extensions/spellcheck/hunspell/tests/1706659.dic rename to extensions/spellcheck/hunspell/tests/unit/data/1706659.dic diff --git a/extensions/spellcheck/hunspell/tests/1706659.test b/extensions/spellcheck/hunspell/tests/unit/data/1706659.test similarity index 100% rename from extensions/spellcheck/hunspell/tests/1706659.test rename to extensions/spellcheck/hunspell/tests/unit/data/1706659.test diff --git a/extensions/spellcheck/hunspell/tests/1706659.wrong b/extensions/spellcheck/hunspell/tests/unit/data/1706659.wrong similarity index 100% rename from extensions/spellcheck/hunspell/tests/1706659.wrong rename to extensions/spellcheck/hunspell/tests/unit/data/1706659.wrong diff --git a/extensions/spellcheck/hunspell/tests/1975530.aff b/extensions/spellcheck/hunspell/tests/unit/data/1975530.aff similarity index 100% rename from extensions/spellcheck/hunspell/tests/1975530.aff rename to extensions/spellcheck/hunspell/tests/unit/data/1975530.aff diff --git a/extensions/spellcheck/hunspell/tests/1975530.dic b/extensions/spellcheck/hunspell/tests/unit/data/1975530.dic similarity index 100% rename from extensions/spellcheck/hunspell/tests/1975530.dic rename to extensions/spellcheck/hunspell/tests/unit/data/1975530.dic diff --git a/extensions/spellcheck/hunspell/tests/1975530.good b/extensions/spellcheck/hunspell/tests/unit/data/1975530.good similarity index 100% rename from extensions/spellcheck/hunspell/tests/1975530.good rename to extensions/spellcheck/hunspell/tests/unit/data/1975530.good diff --git a/extensions/spellcheck/hunspell/tests/1975530.test b/extensions/spellcheck/hunspell/tests/unit/data/1975530.test similarity index 100% rename from extensions/spellcheck/hunspell/tests/1975530.test rename to extensions/spellcheck/hunspell/tests/unit/data/1975530.test diff --git a/extensions/spellcheck/hunspell/tests/1975530.wrong b/extensions/spellcheck/hunspell/tests/unit/data/1975530.wrong similarity index 100% rename from extensions/spellcheck/hunspell/tests/1975530.wrong rename to extensions/spellcheck/hunspell/tests/unit/data/1975530.wrong diff --git a/extensions/spellcheck/hunspell/tests/2970240.aff b/extensions/spellcheck/hunspell/tests/unit/data/2970240.aff similarity index 100% rename from extensions/spellcheck/hunspell/tests/2970240.aff rename to extensions/spellcheck/hunspell/tests/unit/data/2970240.aff diff --git a/extensions/spellcheck/hunspell/tests/2970240.dic b/extensions/spellcheck/hunspell/tests/unit/data/2970240.dic similarity index 100% rename from extensions/spellcheck/hunspell/tests/2970240.dic rename to extensions/spellcheck/hunspell/tests/unit/data/2970240.dic diff --git a/extensions/spellcheck/hunspell/tests/2970240.good b/extensions/spellcheck/hunspell/tests/unit/data/2970240.good similarity index 100% rename from extensions/spellcheck/hunspell/tests/2970240.good rename to extensions/spellcheck/hunspell/tests/unit/data/2970240.good diff --git a/extensions/spellcheck/hunspell/tests/2970240.test b/extensions/spellcheck/hunspell/tests/unit/data/2970240.test similarity index 100% rename from extensions/spellcheck/hunspell/tests/2970240.test rename to extensions/spellcheck/hunspell/tests/unit/data/2970240.test diff --git a/extensions/spellcheck/hunspell/tests/2970240.wrong b/extensions/spellcheck/hunspell/tests/unit/data/2970240.wrong similarity index 100% rename from extensions/spellcheck/hunspell/tests/2970240.wrong rename to extensions/spellcheck/hunspell/tests/unit/data/2970240.wrong diff --git a/extensions/spellcheck/hunspell/tests/2970242.aff b/extensions/spellcheck/hunspell/tests/unit/data/2970242.aff similarity index 100% rename from extensions/spellcheck/hunspell/tests/2970242.aff rename to extensions/spellcheck/hunspell/tests/unit/data/2970242.aff diff --git a/extensions/spellcheck/hunspell/tests/2970242.dic b/extensions/spellcheck/hunspell/tests/unit/data/2970242.dic similarity index 100% rename from extensions/spellcheck/hunspell/tests/2970242.dic rename to extensions/spellcheck/hunspell/tests/unit/data/2970242.dic diff --git a/extensions/spellcheck/hunspell/tests/2970242.good b/extensions/spellcheck/hunspell/tests/unit/data/2970242.good similarity index 100% rename from extensions/spellcheck/hunspell/tests/2970242.good rename to extensions/spellcheck/hunspell/tests/unit/data/2970242.good diff --git a/extensions/spellcheck/hunspell/tests/2970242.test b/extensions/spellcheck/hunspell/tests/unit/data/2970242.test similarity index 100% rename from extensions/spellcheck/hunspell/tests/2970242.test rename to extensions/spellcheck/hunspell/tests/unit/data/2970242.test diff --git a/extensions/spellcheck/hunspell/tests/2970242.wrong b/extensions/spellcheck/hunspell/tests/unit/data/2970242.wrong similarity index 100% rename from extensions/spellcheck/hunspell/tests/2970242.wrong rename to extensions/spellcheck/hunspell/tests/unit/data/2970242.wrong diff --git a/extensions/spellcheck/hunspell/tests/2999225.aff b/extensions/spellcheck/hunspell/tests/unit/data/2999225.aff similarity index 100% rename from extensions/spellcheck/hunspell/tests/2999225.aff rename to extensions/spellcheck/hunspell/tests/unit/data/2999225.aff diff --git a/extensions/spellcheck/hunspell/tests/2999225.dic b/extensions/spellcheck/hunspell/tests/unit/data/2999225.dic similarity index 100% rename from extensions/spellcheck/hunspell/tests/2999225.dic rename to extensions/spellcheck/hunspell/tests/unit/data/2999225.dic diff --git a/extensions/spellcheck/hunspell/tests/2999225.good b/extensions/spellcheck/hunspell/tests/unit/data/2999225.good similarity index 100% rename from extensions/spellcheck/hunspell/tests/2999225.good rename to extensions/spellcheck/hunspell/tests/unit/data/2999225.good diff --git a/extensions/spellcheck/hunspell/tests/2999225.test b/extensions/spellcheck/hunspell/tests/unit/data/2999225.test similarity index 100% rename from extensions/spellcheck/hunspell/tests/2999225.test rename to extensions/spellcheck/hunspell/tests/unit/data/2999225.test diff --git a/extensions/spellcheck/hunspell/tests/IJ.aff b/extensions/spellcheck/hunspell/tests/unit/data/IJ.aff similarity index 100% rename from extensions/spellcheck/hunspell/tests/IJ.aff rename to extensions/spellcheck/hunspell/tests/unit/data/IJ.aff diff --git a/extensions/spellcheck/hunspell/tests/IJ.dic b/extensions/spellcheck/hunspell/tests/unit/data/IJ.dic similarity index 100% rename from extensions/spellcheck/hunspell/tests/IJ.dic rename to extensions/spellcheck/hunspell/tests/unit/data/IJ.dic diff --git a/extensions/spellcheck/hunspell/tests/IJ.good b/extensions/spellcheck/hunspell/tests/unit/data/IJ.good similarity index 100% rename from extensions/spellcheck/hunspell/tests/IJ.good rename to extensions/spellcheck/hunspell/tests/unit/data/IJ.good diff --git a/extensions/spellcheck/hunspell/tests/IJ.sug b/extensions/spellcheck/hunspell/tests/unit/data/IJ.sug similarity index 100% rename from extensions/spellcheck/hunspell/tests/IJ.sug rename to extensions/spellcheck/hunspell/tests/unit/data/IJ.sug diff --git a/extensions/spellcheck/hunspell/tests/IJ.test b/extensions/spellcheck/hunspell/tests/unit/data/IJ.test similarity index 100% rename from extensions/spellcheck/hunspell/tests/IJ.test rename to extensions/spellcheck/hunspell/tests/unit/data/IJ.test diff --git a/extensions/spellcheck/hunspell/tests/IJ.wrong b/extensions/spellcheck/hunspell/tests/unit/data/IJ.wrong similarity index 100% rename from extensions/spellcheck/hunspell/tests/IJ.wrong rename to extensions/spellcheck/hunspell/tests/unit/data/IJ.wrong diff --git a/extensions/spellcheck/hunspell/tests/Makefile.am b/extensions/spellcheck/hunspell/tests/unit/data/Makefile.am similarity index 100% rename from extensions/spellcheck/hunspell/tests/Makefile.am rename to extensions/spellcheck/hunspell/tests/unit/data/Makefile.am diff --git a/extensions/spellcheck/hunspell/tests/Makefile.in b/extensions/spellcheck/hunspell/tests/unit/data/Makefile.in similarity index 100% rename from extensions/spellcheck/hunspell/tests/Makefile.in rename to extensions/spellcheck/hunspell/tests/unit/data/Makefile.in diff --git a/extensions/spellcheck/hunspell/tests/affixes.aff b/extensions/spellcheck/hunspell/tests/unit/data/affixes.aff similarity index 100% rename from extensions/spellcheck/hunspell/tests/affixes.aff rename to extensions/spellcheck/hunspell/tests/unit/data/affixes.aff diff --git a/extensions/spellcheck/hunspell/tests/affixes.dic b/extensions/spellcheck/hunspell/tests/unit/data/affixes.dic similarity index 100% rename from extensions/spellcheck/hunspell/tests/affixes.dic rename to extensions/spellcheck/hunspell/tests/unit/data/affixes.dic diff --git a/extensions/spellcheck/hunspell/tests/affixes.good b/extensions/spellcheck/hunspell/tests/unit/data/affixes.good similarity index 100% rename from extensions/spellcheck/hunspell/tests/affixes.good rename to extensions/spellcheck/hunspell/tests/unit/data/affixes.good diff --git a/extensions/spellcheck/hunspell/tests/affixes.test b/extensions/spellcheck/hunspell/tests/unit/data/affixes.test similarity index 100% rename from extensions/spellcheck/hunspell/tests/affixes.test rename to extensions/spellcheck/hunspell/tests/unit/data/affixes.test diff --git a/extensions/spellcheck/hunspell/tests/alias.aff b/extensions/spellcheck/hunspell/tests/unit/data/alias.aff similarity index 100% rename from extensions/spellcheck/hunspell/tests/alias.aff rename to extensions/spellcheck/hunspell/tests/unit/data/alias.aff diff --git a/extensions/spellcheck/hunspell/tests/alias.dic b/extensions/spellcheck/hunspell/tests/unit/data/alias.dic similarity index 100% rename from extensions/spellcheck/hunspell/tests/alias.dic rename to extensions/spellcheck/hunspell/tests/unit/data/alias.dic diff --git a/extensions/spellcheck/hunspell/tests/alias.good b/extensions/spellcheck/hunspell/tests/unit/data/alias.good similarity index 100% rename from extensions/spellcheck/hunspell/tests/alias.good rename to extensions/spellcheck/hunspell/tests/unit/data/alias.good diff --git a/extensions/spellcheck/hunspell/tests/alias.test b/extensions/spellcheck/hunspell/tests/unit/data/alias.test similarity index 100% rename from extensions/spellcheck/hunspell/tests/alias.test rename to extensions/spellcheck/hunspell/tests/unit/data/alias.test diff --git a/extensions/spellcheck/hunspell/tests/alias2.aff b/extensions/spellcheck/hunspell/tests/unit/data/alias2.aff similarity index 100% rename from extensions/spellcheck/hunspell/tests/alias2.aff rename to extensions/spellcheck/hunspell/tests/unit/data/alias2.aff diff --git a/extensions/spellcheck/hunspell/tests/alias2.dic b/extensions/spellcheck/hunspell/tests/unit/data/alias2.dic similarity index 100% rename from extensions/spellcheck/hunspell/tests/alias2.dic rename to extensions/spellcheck/hunspell/tests/unit/data/alias2.dic diff --git a/extensions/spellcheck/hunspell/tests/alias2.good b/extensions/spellcheck/hunspell/tests/unit/data/alias2.good similarity index 100% rename from extensions/spellcheck/hunspell/tests/alias2.good rename to extensions/spellcheck/hunspell/tests/unit/data/alias2.good diff --git a/extensions/spellcheck/hunspell/tests/alias2.morph b/extensions/spellcheck/hunspell/tests/unit/data/alias2.morph similarity index 100% rename from extensions/spellcheck/hunspell/tests/alias2.morph rename to extensions/spellcheck/hunspell/tests/unit/data/alias2.morph diff --git a/extensions/spellcheck/hunspell/tests/alias2.test b/extensions/spellcheck/hunspell/tests/unit/data/alias2.test similarity index 100% rename from extensions/spellcheck/hunspell/tests/alias2.test rename to extensions/spellcheck/hunspell/tests/unit/data/alias2.test diff --git a/extensions/spellcheck/hunspell/tests/alias3.aff b/extensions/spellcheck/hunspell/tests/unit/data/alias3.aff similarity index 100% rename from extensions/spellcheck/hunspell/tests/alias3.aff rename to extensions/spellcheck/hunspell/tests/unit/data/alias3.aff diff --git a/extensions/spellcheck/hunspell/tests/alias3.dic b/extensions/spellcheck/hunspell/tests/unit/data/alias3.dic similarity index 100% rename from extensions/spellcheck/hunspell/tests/alias3.dic rename to extensions/spellcheck/hunspell/tests/unit/data/alias3.dic diff --git a/extensions/spellcheck/hunspell/tests/alias3.good b/extensions/spellcheck/hunspell/tests/unit/data/alias3.good similarity index 100% rename from extensions/spellcheck/hunspell/tests/alias3.good rename to extensions/spellcheck/hunspell/tests/unit/data/alias3.good diff --git a/extensions/spellcheck/hunspell/tests/alias3.morph b/extensions/spellcheck/hunspell/tests/unit/data/alias3.morph similarity index 100% rename from extensions/spellcheck/hunspell/tests/alias3.morph rename to extensions/spellcheck/hunspell/tests/unit/data/alias3.morph diff --git a/extensions/spellcheck/hunspell/tests/alias3.test b/extensions/spellcheck/hunspell/tests/unit/data/alias3.test similarity index 100% rename from extensions/spellcheck/hunspell/tests/alias3.test rename to extensions/spellcheck/hunspell/tests/unit/data/alias3.test diff --git a/extensions/spellcheck/hunspell/tests/allcaps.aff b/extensions/spellcheck/hunspell/tests/unit/data/allcaps.aff similarity index 100% rename from extensions/spellcheck/hunspell/tests/allcaps.aff rename to extensions/spellcheck/hunspell/tests/unit/data/allcaps.aff diff --git a/extensions/spellcheck/hunspell/tests/allcaps.dic b/extensions/spellcheck/hunspell/tests/unit/data/allcaps.dic similarity index 100% rename from extensions/spellcheck/hunspell/tests/allcaps.dic rename to extensions/spellcheck/hunspell/tests/unit/data/allcaps.dic diff --git a/extensions/spellcheck/hunspell/tests/allcaps.good b/extensions/spellcheck/hunspell/tests/unit/data/allcaps.good similarity index 100% rename from extensions/spellcheck/hunspell/tests/allcaps.good rename to extensions/spellcheck/hunspell/tests/unit/data/allcaps.good diff --git a/extensions/spellcheck/hunspell/tests/allcaps.sug b/extensions/spellcheck/hunspell/tests/unit/data/allcaps.sug similarity index 100% rename from extensions/spellcheck/hunspell/tests/allcaps.sug rename to extensions/spellcheck/hunspell/tests/unit/data/allcaps.sug diff --git a/extensions/spellcheck/hunspell/tests/allcaps.test b/extensions/spellcheck/hunspell/tests/unit/data/allcaps.test similarity index 100% rename from extensions/spellcheck/hunspell/tests/allcaps.test rename to extensions/spellcheck/hunspell/tests/unit/data/allcaps.test diff --git a/extensions/spellcheck/hunspell/tests/allcaps.wrong b/extensions/spellcheck/hunspell/tests/unit/data/allcaps.wrong similarity index 100% rename from extensions/spellcheck/hunspell/tests/allcaps.wrong rename to extensions/spellcheck/hunspell/tests/unit/data/allcaps.wrong diff --git a/extensions/spellcheck/hunspell/tests/allcaps2.aff b/extensions/spellcheck/hunspell/tests/unit/data/allcaps2.aff similarity index 100% rename from extensions/spellcheck/hunspell/tests/allcaps2.aff rename to extensions/spellcheck/hunspell/tests/unit/data/allcaps2.aff diff --git a/extensions/spellcheck/hunspell/tests/allcaps2.dic b/extensions/spellcheck/hunspell/tests/unit/data/allcaps2.dic similarity index 100% rename from extensions/spellcheck/hunspell/tests/allcaps2.dic rename to extensions/spellcheck/hunspell/tests/unit/data/allcaps2.dic diff --git a/extensions/spellcheck/hunspell/tests/allcaps2.good b/extensions/spellcheck/hunspell/tests/unit/data/allcaps2.good similarity index 100% rename from extensions/spellcheck/hunspell/tests/allcaps2.good rename to extensions/spellcheck/hunspell/tests/unit/data/allcaps2.good diff --git a/extensions/spellcheck/hunspell/tests/allcaps2.sug b/extensions/spellcheck/hunspell/tests/unit/data/allcaps2.sug similarity index 100% rename from extensions/spellcheck/hunspell/tests/allcaps2.sug rename to extensions/spellcheck/hunspell/tests/unit/data/allcaps2.sug diff --git a/extensions/spellcheck/hunspell/tests/allcaps2.test b/extensions/spellcheck/hunspell/tests/unit/data/allcaps2.test similarity index 100% rename from extensions/spellcheck/hunspell/tests/allcaps2.test rename to extensions/spellcheck/hunspell/tests/unit/data/allcaps2.test diff --git a/extensions/spellcheck/hunspell/tests/allcaps2.wrong b/extensions/spellcheck/hunspell/tests/unit/data/allcaps2.wrong similarity index 100% rename from extensions/spellcheck/hunspell/tests/allcaps2.wrong rename to extensions/spellcheck/hunspell/tests/unit/data/allcaps2.wrong diff --git a/extensions/spellcheck/hunspell/tests/allcaps3.aff b/extensions/spellcheck/hunspell/tests/unit/data/allcaps3.aff similarity index 100% rename from extensions/spellcheck/hunspell/tests/allcaps3.aff rename to extensions/spellcheck/hunspell/tests/unit/data/allcaps3.aff diff --git a/extensions/spellcheck/hunspell/tests/allcaps3.dic b/extensions/spellcheck/hunspell/tests/unit/data/allcaps3.dic similarity index 100% rename from extensions/spellcheck/hunspell/tests/allcaps3.dic rename to extensions/spellcheck/hunspell/tests/unit/data/allcaps3.dic diff --git a/extensions/spellcheck/hunspell/tests/allcaps3.good b/extensions/spellcheck/hunspell/tests/unit/data/allcaps3.good similarity index 100% rename from extensions/spellcheck/hunspell/tests/allcaps3.good rename to extensions/spellcheck/hunspell/tests/unit/data/allcaps3.good diff --git a/extensions/spellcheck/hunspell/tests/allcaps3.test b/extensions/spellcheck/hunspell/tests/unit/data/allcaps3.test similarity index 100% rename from extensions/spellcheck/hunspell/tests/allcaps3.test rename to extensions/spellcheck/hunspell/tests/unit/data/allcaps3.test diff --git a/extensions/spellcheck/hunspell/tests/allcaps3.wrong b/extensions/spellcheck/hunspell/tests/unit/data/allcaps3.wrong similarity index 100% rename from extensions/spellcheck/hunspell/tests/allcaps3.wrong rename to extensions/spellcheck/hunspell/tests/unit/data/allcaps3.wrong diff --git a/extensions/spellcheck/hunspell/tests/allcaps_utf.aff b/extensions/spellcheck/hunspell/tests/unit/data/allcaps_utf.aff similarity index 100% rename from extensions/spellcheck/hunspell/tests/allcaps_utf.aff rename to extensions/spellcheck/hunspell/tests/unit/data/allcaps_utf.aff diff --git a/extensions/spellcheck/hunspell/tests/allcaps_utf.dic b/extensions/spellcheck/hunspell/tests/unit/data/allcaps_utf.dic similarity index 100% rename from extensions/spellcheck/hunspell/tests/allcaps_utf.dic rename to extensions/spellcheck/hunspell/tests/unit/data/allcaps_utf.dic diff --git a/extensions/spellcheck/hunspell/tests/allcaps_utf.good b/extensions/spellcheck/hunspell/tests/unit/data/allcaps_utf.good similarity index 100% rename from extensions/spellcheck/hunspell/tests/allcaps_utf.good rename to extensions/spellcheck/hunspell/tests/unit/data/allcaps_utf.good diff --git a/extensions/spellcheck/hunspell/tests/allcaps_utf.sug b/extensions/spellcheck/hunspell/tests/unit/data/allcaps_utf.sug similarity index 100% rename from extensions/spellcheck/hunspell/tests/allcaps_utf.sug rename to extensions/spellcheck/hunspell/tests/unit/data/allcaps_utf.sug diff --git a/extensions/spellcheck/hunspell/tests/allcaps_utf.test b/extensions/spellcheck/hunspell/tests/unit/data/allcaps_utf.test similarity index 100% rename from extensions/spellcheck/hunspell/tests/allcaps_utf.test rename to extensions/spellcheck/hunspell/tests/unit/data/allcaps_utf.test diff --git a/extensions/spellcheck/hunspell/tests/allcaps_utf.wrong b/extensions/spellcheck/hunspell/tests/unit/data/allcaps_utf.wrong similarity index 100% rename from extensions/spellcheck/hunspell/tests/allcaps_utf.wrong rename to extensions/spellcheck/hunspell/tests/unit/data/allcaps_utf.wrong diff --git a/extensions/spellcheck/hunspell/tests/arabic.aff b/extensions/spellcheck/hunspell/tests/unit/data/arabic.aff similarity index 100% rename from extensions/spellcheck/hunspell/tests/arabic.aff rename to extensions/spellcheck/hunspell/tests/unit/data/arabic.aff diff --git a/extensions/spellcheck/hunspell/tests/arabic.dic b/extensions/spellcheck/hunspell/tests/unit/data/arabic.dic similarity index 100% rename from extensions/spellcheck/hunspell/tests/arabic.dic rename to extensions/spellcheck/hunspell/tests/unit/data/arabic.dic diff --git a/extensions/spellcheck/hunspell/tests/arabic.test b/extensions/spellcheck/hunspell/tests/unit/data/arabic.test similarity index 100% rename from extensions/spellcheck/hunspell/tests/arabic.test rename to extensions/spellcheck/hunspell/tests/unit/data/arabic.test diff --git a/extensions/spellcheck/hunspell/tests/arabic.wrong b/extensions/spellcheck/hunspell/tests/unit/data/arabic.wrong similarity index 100% rename from extensions/spellcheck/hunspell/tests/arabic.wrong rename to extensions/spellcheck/hunspell/tests/unit/data/arabic.wrong diff --git a/extensions/spellcheck/hunspell/tests/base.aff b/extensions/spellcheck/hunspell/tests/unit/data/base.aff similarity index 100% rename from extensions/spellcheck/hunspell/tests/base.aff rename to extensions/spellcheck/hunspell/tests/unit/data/base.aff diff --git a/extensions/spellcheck/hunspell/tests/base.dic b/extensions/spellcheck/hunspell/tests/unit/data/base.dic similarity index 100% rename from extensions/spellcheck/hunspell/tests/base.dic rename to extensions/spellcheck/hunspell/tests/unit/data/base.dic diff --git a/extensions/spellcheck/hunspell/tests/base.good b/extensions/spellcheck/hunspell/tests/unit/data/base.good similarity index 100% rename from extensions/spellcheck/hunspell/tests/base.good rename to extensions/spellcheck/hunspell/tests/unit/data/base.good diff --git a/extensions/spellcheck/hunspell/tests/base.sug b/extensions/spellcheck/hunspell/tests/unit/data/base.sug similarity index 100% rename from extensions/spellcheck/hunspell/tests/base.sug rename to extensions/spellcheck/hunspell/tests/unit/data/base.sug diff --git a/extensions/spellcheck/hunspell/tests/base.test b/extensions/spellcheck/hunspell/tests/unit/data/base.test similarity index 100% rename from extensions/spellcheck/hunspell/tests/base.test rename to extensions/spellcheck/hunspell/tests/unit/data/base.test diff --git a/extensions/spellcheck/hunspell/tests/base.wrong b/extensions/spellcheck/hunspell/tests/unit/data/base.wrong similarity index 100% rename from extensions/spellcheck/hunspell/tests/base.wrong rename to extensions/spellcheck/hunspell/tests/unit/data/base.wrong diff --git a/extensions/spellcheck/hunspell/tests/base_utf.aff b/extensions/spellcheck/hunspell/tests/unit/data/base_utf.aff similarity index 100% rename from extensions/spellcheck/hunspell/tests/base_utf.aff rename to extensions/spellcheck/hunspell/tests/unit/data/base_utf.aff diff --git a/extensions/spellcheck/hunspell/tests/base_utf.dic b/extensions/spellcheck/hunspell/tests/unit/data/base_utf.dic similarity index 100% rename from extensions/spellcheck/hunspell/tests/base_utf.dic rename to extensions/spellcheck/hunspell/tests/unit/data/base_utf.dic diff --git a/extensions/spellcheck/hunspell/tests/base_utf.good b/extensions/spellcheck/hunspell/tests/unit/data/base_utf.good similarity index 100% rename from extensions/spellcheck/hunspell/tests/base_utf.good rename to extensions/spellcheck/hunspell/tests/unit/data/base_utf.good diff --git a/extensions/spellcheck/hunspell/tests/base_utf.sug b/extensions/spellcheck/hunspell/tests/unit/data/base_utf.sug similarity index 100% rename from extensions/spellcheck/hunspell/tests/base_utf.sug rename to extensions/spellcheck/hunspell/tests/unit/data/base_utf.sug diff --git a/extensions/spellcheck/hunspell/tests/base_utf.test b/extensions/spellcheck/hunspell/tests/unit/data/base_utf.test similarity index 100% rename from extensions/spellcheck/hunspell/tests/base_utf.test rename to extensions/spellcheck/hunspell/tests/unit/data/base_utf.test diff --git a/extensions/spellcheck/hunspell/tests/base_utf.wrong b/extensions/spellcheck/hunspell/tests/unit/data/base_utf.wrong similarity index 100% rename from extensions/spellcheck/hunspell/tests/base_utf.wrong rename to extensions/spellcheck/hunspell/tests/unit/data/base_utf.wrong diff --git a/extensions/spellcheck/hunspell/tests/break.aff b/extensions/spellcheck/hunspell/tests/unit/data/break.aff similarity index 100% rename from extensions/spellcheck/hunspell/tests/break.aff rename to extensions/spellcheck/hunspell/tests/unit/data/break.aff diff --git a/extensions/spellcheck/hunspell/tests/break.dic b/extensions/spellcheck/hunspell/tests/unit/data/break.dic similarity index 100% rename from extensions/spellcheck/hunspell/tests/break.dic rename to extensions/spellcheck/hunspell/tests/unit/data/break.dic diff --git a/extensions/spellcheck/hunspell/tests/break.good b/extensions/spellcheck/hunspell/tests/unit/data/break.good similarity index 100% rename from extensions/spellcheck/hunspell/tests/break.good rename to extensions/spellcheck/hunspell/tests/unit/data/break.good diff --git a/extensions/spellcheck/hunspell/tests/break.test b/extensions/spellcheck/hunspell/tests/unit/data/break.test similarity index 100% rename from extensions/spellcheck/hunspell/tests/break.test rename to extensions/spellcheck/hunspell/tests/unit/data/break.test diff --git a/extensions/spellcheck/hunspell/tests/break.wrong b/extensions/spellcheck/hunspell/tests/unit/data/break.wrong similarity index 100% rename from extensions/spellcheck/hunspell/tests/break.wrong rename to extensions/spellcheck/hunspell/tests/unit/data/break.wrong diff --git a/extensions/spellcheck/hunspell/tests/breakdefault.aff b/extensions/spellcheck/hunspell/tests/unit/data/breakdefault.aff similarity index 100% rename from extensions/spellcheck/hunspell/tests/breakdefault.aff rename to extensions/spellcheck/hunspell/tests/unit/data/breakdefault.aff diff --git a/extensions/spellcheck/hunspell/tests/breakdefault.dic b/extensions/spellcheck/hunspell/tests/unit/data/breakdefault.dic similarity index 100% rename from extensions/spellcheck/hunspell/tests/breakdefault.dic rename to extensions/spellcheck/hunspell/tests/unit/data/breakdefault.dic diff --git a/extensions/spellcheck/hunspell/tests/breakdefault.good b/extensions/spellcheck/hunspell/tests/unit/data/breakdefault.good similarity index 100% rename from extensions/spellcheck/hunspell/tests/breakdefault.good rename to extensions/spellcheck/hunspell/tests/unit/data/breakdefault.good diff --git a/extensions/spellcheck/hunspell/tests/breakdefault.sug b/extensions/spellcheck/hunspell/tests/unit/data/breakdefault.sug similarity index 100% rename from extensions/spellcheck/hunspell/tests/breakdefault.sug rename to extensions/spellcheck/hunspell/tests/unit/data/breakdefault.sug diff --git a/extensions/spellcheck/hunspell/tests/breakdefault.test b/extensions/spellcheck/hunspell/tests/unit/data/breakdefault.test similarity index 100% rename from extensions/spellcheck/hunspell/tests/breakdefault.test rename to extensions/spellcheck/hunspell/tests/unit/data/breakdefault.test diff --git a/extensions/spellcheck/hunspell/tests/breakdefault.wrong b/extensions/spellcheck/hunspell/tests/unit/data/breakdefault.wrong similarity index 100% rename from extensions/spellcheck/hunspell/tests/breakdefault.wrong rename to extensions/spellcheck/hunspell/tests/unit/data/breakdefault.wrong diff --git a/extensions/spellcheck/hunspell/tests/breakoff.aff b/extensions/spellcheck/hunspell/tests/unit/data/breakoff.aff similarity index 100% rename from extensions/spellcheck/hunspell/tests/breakoff.aff rename to extensions/spellcheck/hunspell/tests/unit/data/breakoff.aff diff --git a/extensions/spellcheck/hunspell/tests/breakoff.dic b/extensions/spellcheck/hunspell/tests/unit/data/breakoff.dic similarity index 100% rename from extensions/spellcheck/hunspell/tests/breakoff.dic rename to extensions/spellcheck/hunspell/tests/unit/data/breakoff.dic diff --git a/extensions/spellcheck/hunspell/tests/breakoff.good b/extensions/spellcheck/hunspell/tests/unit/data/breakoff.good similarity index 100% rename from extensions/spellcheck/hunspell/tests/breakoff.good rename to extensions/spellcheck/hunspell/tests/unit/data/breakoff.good diff --git a/extensions/spellcheck/hunspell/tests/breakoff.test b/extensions/spellcheck/hunspell/tests/unit/data/breakoff.test similarity index 100% rename from extensions/spellcheck/hunspell/tests/breakoff.test rename to extensions/spellcheck/hunspell/tests/unit/data/breakoff.test diff --git a/extensions/spellcheck/hunspell/tests/breakoff.wrong b/extensions/spellcheck/hunspell/tests/unit/data/breakoff.wrong similarity index 100% rename from extensions/spellcheck/hunspell/tests/breakoff.wrong rename to extensions/spellcheck/hunspell/tests/unit/data/breakoff.wrong diff --git a/extensions/spellcheck/hunspell/tests/checkcompoundcase.aff b/extensions/spellcheck/hunspell/tests/unit/data/checkcompoundcase.aff similarity index 100% rename from extensions/spellcheck/hunspell/tests/checkcompoundcase.aff rename to extensions/spellcheck/hunspell/tests/unit/data/checkcompoundcase.aff diff --git a/extensions/spellcheck/hunspell/tests/checkcompoundcase.dic b/extensions/spellcheck/hunspell/tests/unit/data/checkcompoundcase.dic similarity index 100% rename from extensions/spellcheck/hunspell/tests/checkcompoundcase.dic rename to extensions/spellcheck/hunspell/tests/unit/data/checkcompoundcase.dic diff --git a/extensions/spellcheck/hunspell/tests/checkcompoundcase.good b/extensions/spellcheck/hunspell/tests/unit/data/checkcompoundcase.good similarity index 100% rename from extensions/spellcheck/hunspell/tests/checkcompoundcase.good rename to extensions/spellcheck/hunspell/tests/unit/data/checkcompoundcase.good diff --git a/extensions/spellcheck/hunspell/tests/checkcompoundcase.test b/extensions/spellcheck/hunspell/tests/unit/data/checkcompoundcase.test similarity index 100% rename from extensions/spellcheck/hunspell/tests/checkcompoundcase.test rename to extensions/spellcheck/hunspell/tests/unit/data/checkcompoundcase.test diff --git a/extensions/spellcheck/hunspell/tests/checkcompoundcase.wrong b/extensions/spellcheck/hunspell/tests/unit/data/checkcompoundcase.wrong similarity index 100% rename from extensions/spellcheck/hunspell/tests/checkcompoundcase.wrong rename to extensions/spellcheck/hunspell/tests/unit/data/checkcompoundcase.wrong diff --git a/extensions/spellcheck/hunspell/tests/checkcompoundcase2.aff b/extensions/spellcheck/hunspell/tests/unit/data/checkcompoundcase2.aff similarity index 100% rename from extensions/spellcheck/hunspell/tests/checkcompoundcase2.aff rename to extensions/spellcheck/hunspell/tests/unit/data/checkcompoundcase2.aff diff --git a/extensions/spellcheck/hunspell/tests/checkcompoundcase2.dic b/extensions/spellcheck/hunspell/tests/unit/data/checkcompoundcase2.dic similarity index 100% rename from extensions/spellcheck/hunspell/tests/checkcompoundcase2.dic rename to extensions/spellcheck/hunspell/tests/unit/data/checkcompoundcase2.dic diff --git a/extensions/spellcheck/hunspell/tests/checkcompoundcase2.good b/extensions/spellcheck/hunspell/tests/unit/data/checkcompoundcase2.good similarity index 100% rename from extensions/spellcheck/hunspell/tests/checkcompoundcase2.good rename to extensions/spellcheck/hunspell/tests/unit/data/checkcompoundcase2.good diff --git a/extensions/spellcheck/hunspell/tests/checkcompoundcase2.test b/extensions/spellcheck/hunspell/tests/unit/data/checkcompoundcase2.test similarity index 100% rename from extensions/spellcheck/hunspell/tests/checkcompoundcase2.test rename to extensions/spellcheck/hunspell/tests/unit/data/checkcompoundcase2.test diff --git a/extensions/spellcheck/hunspell/tests/checkcompoundcase2.wrong b/extensions/spellcheck/hunspell/tests/unit/data/checkcompoundcase2.wrong similarity index 100% rename from extensions/spellcheck/hunspell/tests/checkcompoundcase2.wrong rename to extensions/spellcheck/hunspell/tests/unit/data/checkcompoundcase2.wrong diff --git a/extensions/spellcheck/hunspell/tests/checkcompoundcaseutf.aff b/extensions/spellcheck/hunspell/tests/unit/data/checkcompoundcaseutf.aff similarity index 100% rename from extensions/spellcheck/hunspell/tests/checkcompoundcaseutf.aff rename to extensions/spellcheck/hunspell/tests/unit/data/checkcompoundcaseutf.aff diff --git a/extensions/spellcheck/hunspell/tests/checkcompoundcaseutf.dic b/extensions/spellcheck/hunspell/tests/unit/data/checkcompoundcaseutf.dic similarity index 100% rename from extensions/spellcheck/hunspell/tests/checkcompoundcaseutf.dic rename to extensions/spellcheck/hunspell/tests/unit/data/checkcompoundcaseutf.dic diff --git a/extensions/spellcheck/hunspell/tests/checkcompoundcaseutf.good b/extensions/spellcheck/hunspell/tests/unit/data/checkcompoundcaseutf.good similarity index 100% rename from extensions/spellcheck/hunspell/tests/checkcompoundcaseutf.good rename to extensions/spellcheck/hunspell/tests/unit/data/checkcompoundcaseutf.good diff --git a/extensions/spellcheck/hunspell/tests/checkcompoundcaseutf.test b/extensions/spellcheck/hunspell/tests/unit/data/checkcompoundcaseutf.test similarity index 100% rename from extensions/spellcheck/hunspell/tests/checkcompoundcaseutf.test rename to extensions/spellcheck/hunspell/tests/unit/data/checkcompoundcaseutf.test diff --git a/extensions/spellcheck/hunspell/tests/checkcompoundcaseutf.wrong b/extensions/spellcheck/hunspell/tests/unit/data/checkcompoundcaseutf.wrong similarity index 100% rename from extensions/spellcheck/hunspell/tests/checkcompoundcaseutf.wrong rename to extensions/spellcheck/hunspell/tests/unit/data/checkcompoundcaseutf.wrong diff --git a/extensions/spellcheck/hunspell/tests/checkcompounddup.aff b/extensions/spellcheck/hunspell/tests/unit/data/checkcompounddup.aff similarity index 100% rename from extensions/spellcheck/hunspell/tests/checkcompounddup.aff rename to extensions/spellcheck/hunspell/tests/unit/data/checkcompounddup.aff diff --git a/extensions/spellcheck/hunspell/tests/checkcompounddup.dic b/extensions/spellcheck/hunspell/tests/unit/data/checkcompounddup.dic similarity index 100% rename from extensions/spellcheck/hunspell/tests/checkcompounddup.dic rename to extensions/spellcheck/hunspell/tests/unit/data/checkcompounddup.dic diff --git a/extensions/spellcheck/hunspell/tests/checkcompounddup.good b/extensions/spellcheck/hunspell/tests/unit/data/checkcompounddup.good similarity index 100% rename from extensions/spellcheck/hunspell/tests/checkcompounddup.good rename to extensions/spellcheck/hunspell/tests/unit/data/checkcompounddup.good diff --git a/extensions/spellcheck/hunspell/tests/checkcompounddup.test b/extensions/spellcheck/hunspell/tests/unit/data/checkcompounddup.test similarity index 100% rename from extensions/spellcheck/hunspell/tests/checkcompounddup.test rename to extensions/spellcheck/hunspell/tests/unit/data/checkcompounddup.test diff --git a/extensions/spellcheck/hunspell/tests/checkcompounddup.wrong b/extensions/spellcheck/hunspell/tests/unit/data/checkcompounddup.wrong similarity index 100% rename from extensions/spellcheck/hunspell/tests/checkcompounddup.wrong rename to extensions/spellcheck/hunspell/tests/unit/data/checkcompounddup.wrong diff --git a/extensions/spellcheck/hunspell/tests/checkcompoundpattern.aff b/extensions/spellcheck/hunspell/tests/unit/data/checkcompoundpattern.aff similarity index 100% rename from extensions/spellcheck/hunspell/tests/checkcompoundpattern.aff rename to extensions/spellcheck/hunspell/tests/unit/data/checkcompoundpattern.aff diff --git a/extensions/spellcheck/hunspell/tests/checkcompoundpattern.dic b/extensions/spellcheck/hunspell/tests/unit/data/checkcompoundpattern.dic similarity index 100% rename from extensions/spellcheck/hunspell/tests/checkcompoundpattern.dic rename to extensions/spellcheck/hunspell/tests/unit/data/checkcompoundpattern.dic diff --git a/extensions/spellcheck/hunspell/tests/checkcompoundpattern.good b/extensions/spellcheck/hunspell/tests/unit/data/checkcompoundpattern.good similarity index 100% rename from extensions/spellcheck/hunspell/tests/checkcompoundpattern.good rename to extensions/spellcheck/hunspell/tests/unit/data/checkcompoundpattern.good diff --git a/extensions/spellcheck/hunspell/tests/checkcompoundpattern.test b/extensions/spellcheck/hunspell/tests/unit/data/checkcompoundpattern.test similarity index 100% rename from extensions/spellcheck/hunspell/tests/checkcompoundpattern.test rename to extensions/spellcheck/hunspell/tests/unit/data/checkcompoundpattern.test diff --git a/extensions/spellcheck/hunspell/tests/checkcompoundpattern.wrong b/extensions/spellcheck/hunspell/tests/unit/data/checkcompoundpattern.wrong similarity index 100% rename from extensions/spellcheck/hunspell/tests/checkcompoundpattern.wrong rename to extensions/spellcheck/hunspell/tests/unit/data/checkcompoundpattern.wrong diff --git a/extensions/spellcheck/hunspell/tests/checkcompoundpattern2.aff b/extensions/spellcheck/hunspell/tests/unit/data/checkcompoundpattern2.aff similarity index 100% rename from extensions/spellcheck/hunspell/tests/checkcompoundpattern2.aff rename to extensions/spellcheck/hunspell/tests/unit/data/checkcompoundpattern2.aff diff --git a/extensions/spellcheck/hunspell/tests/checkcompoundpattern2.dic b/extensions/spellcheck/hunspell/tests/unit/data/checkcompoundpattern2.dic similarity index 100% rename from extensions/spellcheck/hunspell/tests/checkcompoundpattern2.dic rename to extensions/spellcheck/hunspell/tests/unit/data/checkcompoundpattern2.dic diff --git a/extensions/spellcheck/hunspell/tests/checkcompoundpattern2.good b/extensions/spellcheck/hunspell/tests/unit/data/checkcompoundpattern2.good similarity index 100% rename from extensions/spellcheck/hunspell/tests/checkcompoundpattern2.good rename to extensions/spellcheck/hunspell/tests/unit/data/checkcompoundpattern2.good diff --git a/extensions/spellcheck/hunspell/tests/checkcompoundpattern2.test b/extensions/spellcheck/hunspell/tests/unit/data/checkcompoundpattern2.test similarity index 100% rename from extensions/spellcheck/hunspell/tests/checkcompoundpattern2.test rename to extensions/spellcheck/hunspell/tests/unit/data/checkcompoundpattern2.test diff --git a/extensions/spellcheck/hunspell/tests/checkcompoundpattern2.wrong b/extensions/spellcheck/hunspell/tests/unit/data/checkcompoundpattern2.wrong similarity index 100% rename from extensions/spellcheck/hunspell/tests/checkcompoundpattern2.wrong rename to extensions/spellcheck/hunspell/tests/unit/data/checkcompoundpattern2.wrong diff --git a/extensions/spellcheck/hunspell/tests/checkcompoundpattern3.aff b/extensions/spellcheck/hunspell/tests/unit/data/checkcompoundpattern3.aff similarity index 100% rename from extensions/spellcheck/hunspell/tests/checkcompoundpattern3.aff rename to extensions/spellcheck/hunspell/tests/unit/data/checkcompoundpattern3.aff diff --git a/extensions/spellcheck/hunspell/tests/checkcompoundpattern3.dic b/extensions/spellcheck/hunspell/tests/unit/data/checkcompoundpattern3.dic similarity index 100% rename from extensions/spellcheck/hunspell/tests/checkcompoundpattern3.dic rename to extensions/spellcheck/hunspell/tests/unit/data/checkcompoundpattern3.dic diff --git a/extensions/spellcheck/hunspell/tests/checkcompoundpattern3.good b/extensions/spellcheck/hunspell/tests/unit/data/checkcompoundpattern3.good similarity index 100% rename from extensions/spellcheck/hunspell/tests/checkcompoundpattern3.good rename to extensions/spellcheck/hunspell/tests/unit/data/checkcompoundpattern3.good diff --git a/extensions/spellcheck/hunspell/tests/checkcompoundpattern3.test b/extensions/spellcheck/hunspell/tests/unit/data/checkcompoundpattern3.test similarity index 100% rename from extensions/spellcheck/hunspell/tests/checkcompoundpattern3.test rename to extensions/spellcheck/hunspell/tests/unit/data/checkcompoundpattern3.test diff --git a/extensions/spellcheck/hunspell/tests/checkcompoundpattern3.wrong b/extensions/spellcheck/hunspell/tests/unit/data/checkcompoundpattern3.wrong similarity index 100% rename from extensions/spellcheck/hunspell/tests/checkcompoundpattern3.wrong rename to extensions/spellcheck/hunspell/tests/unit/data/checkcompoundpattern3.wrong diff --git a/extensions/spellcheck/hunspell/tests/checkcompoundpattern4.aff b/extensions/spellcheck/hunspell/tests/unit/data/checkcompoundpattern4.aff similarity index 100% rename from extensions/spellcheck/hunspell/tests/checkcompoundpattern4.aff rename to extensions/spellcheck/hunspell/tests/unit/data/checkcompoundpattern4.aff diff --git a/extensions/spellcheck/hunspell/tests/checkcompoundpattern4.dic b/extensions/spellcheck/hunspell/tests/unit/data/checkcompoundpattern4.dic similarity index 100% rename from extensions/spellcheck/hunspell/tests/checkcompoundpattern4.dic rename to extensions/spellcheck/hunspell/tests/unit/data/checkcompoundpattern4.dic diff --git a/extensions/spellcheck/hunspell/tests/checkcompoundpattern4.good b/extensions/spellcheck/hunspell/tests/unit/data/checkcompoundpattern4.good similarity index 100% rename from extensions/spellcheck/hunspell/tests/checkcompoundpattern4.good rename to extensions/spellcheck/hunspell/tests/unit/data/checkcompoundpattern4.good diff --git a/extensions/spellcheck/hunspell/tests/checkcompoundpattern4.test b/extensions/spellcheck/hunspell/tests/unit/data/checkcompoundpattern4.test similarity index 100% rename from extensions/spellcheck/hunspell/tests/checkcompoundpattern4.test rename to extensions/spellcheck/hunspell/tests/unit/data/checkcompoundpattern4.test diff --git a/extensions/spellcheck/hunspell/tests/checkcompoundpattern4.wrong b/extensions/spellcheck/hunspell/tests/unit/data/checkcompoundpattern4.wrong similarity index 100% rename from extensions/spellcheck/hunspell/tests/checkcompoundpattern4.wrong rename to extensions/spellcheck/hunspell/tests/unit/data/checkcompoundpattern4.wrong diff --git a/extensions/spellcheck/hunspell/tests/checkcompoundrep.aff b/extensions/spellcheck/hunspell/tests/unit/data/checkcompoundrep.aff similarity index 100% rename from extensions/spellcheck/hunspell/tests/checkcompoundrep.aff rename to extensions/spellcheck/hunspell/tests/unit/data/checkcompoundrep.aff diff --git a/extensions/spellcheck/hunspell/tests/checkcompoundrep.dic b/extensions/spellcheck/hunspell/tests/unit/data/checkcompoundrep.dic similarity index 100% rename from extensions/spellcheck/hunspell/tests/checkcompoundrep.dic rename to extensions/spellcheck/hunspell/tests/unit/data/checkcompoundrep.dic diff --git a/extensions/spellcheck/hunspell/tests/checkcompoundrep.good b/extensions/spellcheck/hunspell/tests/unit/data/checkcompoundrep.good similarity index 100% rename from extensions/spellcheck/hunspell/tests/checkcompoundrep.good rename to extensions/spellcheck/hunspell/tests/unit/data/checkcompoundrep.good diff --git a/extensions/spellcheck/hunspell/tests/checkcompoundrep.test b/extensions/spellcheck/hunspell/tests/unit/data/checkcompoundrep.test similarity index 100% rename from extensions/spellcheck/hunspell/tests/checkcompoundrep.test rename to extensions/spellcheck/hunspell/tests/unit/data/checkcompoundrep.test diff --git a/extensions/spellcheck/hunspell/tests/checkcompoundrep.wrong b/extensions/spellcheck/hunspell/tests/unit/data/checkcompoundrep.wrong similarity index 100% rename from extensions/spellcheck/hunspell/tests/checkcompoundrep.wrong rename to extensions/spellcheck/hunspell/tests/unit/data/checkcompoundrep.wrong diff --git a/extensions/spellcheck/hunspell/tests/checkcompoundtriple.aff b/extensions/spellcheck/hunspell/tests/unit/data/checkcompoundtriple.aff similarity index 100% rename from extensions/spellcheck/hunspell/tests/checkcompoundtriple.aff rename to extensions/spellcheck/hunspell/tests/unit/data/checkcompoundtriple.aff diff --git a/extensions/spellcheck/hunspell/tests/checkcompoundtriple.dic b/extensions/spellcheck/hunspell/tests/unit/data/checkcompoundtriple.dic similarity index 100% rename from extensions/spellcheck/hunspell/tests/checkcompoundtriple.dic rename to extensions/spellcheck/hunspell/tests/unit/data/checkcompoundtriple.dic diff --git a/extensions/spellcheck/hunspell/tests/checkcompoundtriple.good b/extensions/spellcheck/hunspell/tests/unit/data/checkcompoundtriple.good similarity index 100% rename from extensions/spellcheck/hunspell/tests/checkcompoundtriple.good rename to extensions/spellcheck/hunspell/tests/unit/data/checkcompoundtriple.good diff --git a/extensions/spellcheck/hunspell/tests/checkcompoundtriple.test b/extensions/spellcheck/hunspell/tests/unit/data/checkcompoundtriple.test similarity index 100% rename from extensions/spellcheck/hunspell/tests/checkcompoundtriple.test rename to extensions/spellcheck/hunspell/tests/unit/data/checkcompoundtriple.test diff --git a/extensions/spellcheck/hunspell/tests/checkcompoundtriple.wrong b/extensions/spellcheck/hunspell/tests/unit/data/checkcompoundtriple.wrong similarity index 100% rename from extensions/spellcheck/hunspell/tests/checkcompoundtriple.wrong rename to extensions/spellcheck/hunspell/tests/unit/data/checkcompoundtriple.wrong diff --git a/extensions/spellcheck/hunspell/tests/checksharps.aff b/extensions/spellcheck/hunspell/tests/unit/data/checksharps.aff similarity index 100% rename from extensions/spellcheck/hunspell/tests/checksharps.aff rename to extensions/spellcheck/hunspell/tests/unit/data/checksharps.aff diff --git a/extensions/spellcheck/hunspell/tests/checksharps.dic b/extensions/spellcheck/hunspell/tests/unit/data/checksharps.dic similarity index 100% rename from extensions/spellcheck/hunspell/tests/checksharps.dic rename to extensions/spellcheck/hunspell/tests/unit/data/checksharps.dic diff --git a/extensions/spellcheck/hunspell/tests/checksharps.good b/extensions/spellcheck/hunspell/tests/unit/data/checksharps.good similarity index 100% rename from extensions/spellcheck/hunspell/tests/checksharps.good rename to extensions/spellcheck/hunspell/tests/unit/data/checksharps.good diff --git a/extensions/spellcheck/hunspell/tests/checksharps.sug b/extensions/spellcheck/hunspell/tests/unit/data/checksharps.sug similarity index 100% rename from extensions/spellcheck/hunspell/tests/checksharps.sug rename to extensions/spellcheck/hunspell/tests/unit/data/checksharps.sug diff --git a/extensions/spellcheck/hunspell/tests/checksharps.test b/extensions/spellcheck/hunspell/tests/unit/data/checksharps.test similarity index 100% rename from extensions/spellcheck/hunspell/tests/checksharps.test rename to extensions/spellcheck/hunspell/tests/unit/data/checksharps.test diff --git a/extensions/spellcheck/hunspell/tests/checksharps.wrong b/extensions/spellcheck/hunspell/tests/unit/data/checksharps.wrong similarity index 100% rename from extensions/spellcheck/hunspell/tests/checksharps.wrong rename to extensions/spellcheck/hunspell/tests/unit/data/checksharps.wrong diff --git a/extensions/spellcheck/hunspell/tests/checksharpsutf.aff b/extensions/spellcheck/hunspell/tests/unit/data/checksharpsutf.aff similarity index 100% rename from extensions/spellcheck/hunspell/tests/checksharpsutf.aff rename to extensions/spellcheck/hunspell/tests/unit/data/checksharpsutf.aff diff --git a/extensions/spellcheck/hunspell/tests/checksharpsutf.dic b/extensions/spellcheck/hunspell/tests/unit/data/checksharpsutf.dic similarity index 100% rename from extensions/spellcheck/hunspell/tests/checksharpsutf.dic rename to extensions/spellcheck/hunspell/tests/unit/data/checksharpsutf.dic diff --git a/extensions/spellcheck/hunspell/tests/checksharpsutf.good b/extensions/spellcheck/hunspell/tests/unit/data/checksharpsutf.good similarity index 100% rename from extensions/spellcheck/hunspell/tests/checksharpsutf.good rename to extensions/spellcheck/hunspell/tests/unit/data/checksharpsutf.good diff --git a/extensions/spellcheck/hunspell/tests/checksharpsutf.sug b/extensions/spellcheck/hunspell/tests/unit/data/checksharpsutf.sug similarity index 100% rename from extensions/spellcheck/hunspell/tests/checksharpsutf.sug rename to extensions/spellcheck/hunspell/tests/unit/data/checksharpsutf.sug diff --git a/extensions/spellcheck/hunspell/tests/checksharpsutf.test b/extensions/spellcheck/hunspell/tests/unit/data/checksharpsutf.test similarity index 100% rename from extensions/spellcheck/hunspell/tests/checksharpsutf.test rename to extensions/spellcheck/hunspell/tests/unit/data/checksharpsutf.test diff --git a/extensions/spellcheck/hunspell/tests/checksharpsutf.wrong b/extensions/spellcheck/hunspell/tests/unit/data/checksharpsutf.wrong similarity index 100% rename from extensions/spellcheck/hunspell/tests/checksharpsutf.wrong rename to extensions/spellcheck/hunspell/tests/unit/data/checksharpsutf.wrong diff --git a/extensions/spellcheck/hunspell/tests/circumfix.aff b/extensions/spellcheck/hunspell/tests/unit/data/circumfix.aff similarity index 100% rename from extensions/spellcheck/hunspell/tests/circumfix.aff rename to extensions/spellcheck/hunspell/tests/unit/data/circumfix.aff diff --git a/extensions/spellcheck/hunspell/tests/circumfix.dic b/extensions/spellcheck/hunspell/tests/unit/data/circumfix.dic similarity index 100% rename from extensions/spellcheck/hunspell/tests/circumfix.dic rename to extensions/spellcheck/hunspell/tests/unit/data/circumfix.dic diff --git a/extensions/spellcheck/hunspell/tests/circumfix.good b/extensions/spellcheck/hunspell/tests/unit/data/circumfix.good similarity index 100% rename from extensions/spellcheck/hunspell/tests/circumfix.good rename to extensions/spellcheck/hunspell/tests/unit/data/circumfix.good diff --git a/extensions/spellcheck/hunspell/tests/circumfix.morph b/extensions/spellcheck/hunspell/tests/unit/data/circumfix.morph similarity index 100% rename from extensions/spellcheck/hunspell/tests/circumfix.morph rename to extensions/spellcheck/hunspell/tests/unit/data/circumfix.morph diff --git a/extensions/spellcheck/hunspell/tests/circumfix.test b/extensions/spellcheck/hunspell/tests/unit/data/circumfix.test similarity index 100% rename from extensions/spellcheck/hunspell/tests/circumfix.test rename to extensions/spellcheck/hunspell/tests/unit/data/circumfix.test diff --git a/extensions/spellcheck/hunspell/tests/circumfix.wrong b/extensions/spellcheck/hunspell/tests/unit/data/circumfix.wrong similarity index 100% rename from extensions/spellcheck/hunspell/tests/circumfix.wrong rename to extensions/spellcheck/hunspell/tests/unit/data/circumfix.wrong diff --git a/extensions/spellcheck/hunspell/tests/colons_in_words.aff b/extensions/spellcheck/hunspell/tests/unit/data/colons_in_words.aff similarity index 100% rename from extensions/spellcheck/hunspell/tests/colons_in_words.aff rename to extensions/spellcheck/hunspell/tests/unit/data/colons_in_words.aff diff --git a/extensions/spellcheck/hunspell/tests/colons_in_words.dic b/extensions/spellcheck/hunspell/tests/unit/data/colons_in_words.dic similarity index 100% rename from extensions/spellcheck/hunspell/tests/colons_in_words.dic rename to extensions/spellcheck/hunspell/tests/unit/data/colons_in_words.dic diff --git a/extensions/spellcheck/hunspell/tests/colons_in_words.test b/extensions/spellcheck/hunspell/tests/unit/data/colons_in_words.test similarity index 100% rename from extensions/spellcheck/hunspell/tests/colons_in_words.test rename to extensions/spellcheck/hunspell/tests/unit/data/colons_in_words.test diff --git a/extensions/spellcheck/hunspell/tests/complexprefixes.aff b/extensions/spellcheck/hunspell/tests/unit/data/complexprefixes.aff similarity index 100% rename from extensions/spellcheck/hunspell/tests/complexprefixes.aff rename to extensions/spellcheck/hunspell/tests/unit/data/complexprefixes.aff diff --git a/extensions/spellcheck/hunspell/tests/complexprefixes.dic b/extensions/spellcheck/hunspell/tests/unit/data/complexprefixes.dic similarity index 100% rename from extensions/spellcheck/hunspell/tests/complexprefixes.dic rename to extensions/spellcheck/hunspell/tests/unit/data/complexprefixes.dic diff --git a/extensions/spellcheck/hunspell/tests/complexprefixes.good b/extensions/spellcheck/hunspell/tests/unit/data/complexprefixes.good similarity index 100% rename from extensions/spellcheck/hunspell/tests/complexprefixes.good rename to extensions/spellcheck/hunspell/tests/unit/data/complexprefixes.good diff --git a/extensions/spellcheck/hunspell/tests/complexprefixes.test b/extensions/spellcheck/hunspell/tests/unit/data/complexprefixes.test similarity index 100% rename from extensions/spellcheck/hunspell/tests/complexprefixes.test rename to extensions/spellcheck/hunspell/tests/unit/data/complexprefixes.test diff --git a/extensions/spellcheck/hunspell/tests/complexprefixes.wrong b/extensions/spellcheck/hunspell/tests/unit/data/complexprefixes.wrong similarity index 100% rename from extensions/spellcheck/hunspell/tests/complexprefixes.wrong rename to extensions/spellcheck/hunspell/tests/unit/data/complexprefixes.wrong diff --git a/extensions/spellcheck/hunspell/tests/complexprefixes2.aff b/extensions/spellcheck/hunspell/tests/unit/data/complexprefixes2.aff similarity index 100% rename from extensions/spellcheck/hunspell/tests/complexprefixes2.aff rename to extensions/spellcheck/hunspell/tests/unit/data/complexprefixes2.aff diff --git a/extensions/spellcheck/hunspell/tests/complexprefixes2.dic b/extensions/spellcheck/hunspell/tests/unit/data/complexprefixes2.dic similarity index 100% rename from extensions/spellcheck/hunspell/tests/complexprefixes2.dic rename to extensions/spellcheck/hunspell/tests/unit/data/complexprefixes2.dic diff --git a/extensions/spellcheck/hunspell/tests/complexprefixes2.good b/extensions/spellcheck/hunspell/tests/unit/data/complexprefixes2.good similarity index 100% rename from extensions/spellcheck/hunspell/tests/complexprefixes2.good rename to extensions/spellcheck/hunspell/tests/unit/data/complexprefixes2.good diff --git a/extensions/spellcheck/hunspell/tests/complexprefixes2.test b/extensions/spellcheck/hunspell/tests/unit/data/complexprefixes2.test similarity index 100% rename from extensions/spellcheck/hunspell/tests/complexprefixes2.test rename to extensions/spellcheck/hunspell/tests/unit/data/complexprefixes2.test diff --git a/extensions/spellcheck/hunspell/tests/complexprefixesutf.aff b/extensions/spellcheck/hunspell/tests/unit/data/complexprefixesutf.aff similarity index 100% rename from extensions/spellcheck/hunspell/tests/complexprefixesutf.aff rename to extensions/spellcheck/hunspell/tests/unit/data/complexprefixesutf.aff diff --git a/extensions/spellcheck/hunspell/tests/complexprefixesutf.dic b/extensions/spellcheck/hunspell/tests/unit/data/complexprefixesutf.dic similarity index 100% rename from extensions/spellcheck/hunspell/tests/complexprefixesutf.dic rename to extensions/spellcheck/hunspell/tests/unit/data/complexprefixesutf.dic diff --git a/extensions/spellcheck/hunspell/tests/complexprefixesutf.good b/extensions/spellcheck/hunspell/tests/unit/data/complexprefixesutf.good similarity index 100% rename from extensions/spellcheck/hunspell/tests/complexprefixesutf.good rename to extensions/spellcheck/hunspell/tests/unit/data/complexprefixesutf.good diff --git a/extensions/spellcheck/hunspell/tests/complexprefixesutf.test b/extensions/spellcheck/hunspell/tests/unit/data/complexprefixesutf.test similarity index 100% rename from extensions/spellcheck/hunspell/tests/complexprefixesutf.test rename to extensions/spellcheck/hunspell/tests/unit/data/complexprefixesutf.test diff --git a/extensions/spellcheck/hunspell/tests/complexprefixesutf.wrong b/extensions/spellcheck/hunspell/tests/unit/data/complexprefixesutf.wrong similarity index 100% rename from extensions/spellcheck/hunspell/tests/complexprefixesutf.wrong rename to extensions/spellcheck/hunspell/tests/unit/data/complexprefixesutf.wrong diff --git a/extensions/spellcheck/hunspell/tests/compoundaffix.aff b/extensions/spellcheck/hunspell/tests/unit/data/compoundaffix.aff similarity index 100% rename from extensions/spellcheck/hunspell/tests/compoundaffix.aff rename to extensions/spellcheck/hunspell/tests/unit/data/compoundaffix.aff diff --git a/extensions/spellcheck/hunspell/tests/compoundaffix.dic b/extensions/spellcheck/hunspell/tests/unit/data/compoundaffix.dic similarity index 100% rename from extensions/spellcheck/hunspell/tests/compoundaffix.dic rename to extensions/spellcheck/hunspell/tests/unit/data/compoundaffix.dic diff --git a/extensions/spellcheck/hunspell/tests/compoundaffix.good b/extensions/spellcheck/hunspell/tests/unit/data/compoundaffix.good similarity index 100% rename from extensions/spellcheck/hunspell/tests/compoundaffix.good rename to extensions/spellcheck/hunspell/tests/unit/data/compoundaffix.good diff --git a/extensions/spellcheck/hunspell/tests/compoundaffix.test b/extensions/spellcheck/hunspell/tests/unit/data/compoundaffix.test similarity index 100% rename from extensions/spellcheck/hunspell/tests/compoundaffix.test rename to extensions/spellcheck/hunspell/tests/unit/data/compoundaffix.test diff --git a/extensions/spellcheck/hunspell/tests/compoundaffix.wrong b/extensions/spellcheck/hunspell/tests/unit/data/compoundaffix.wrong similarity index 100% rename from extensions/spellcheck/hunspell/tests/compoundaffix.wrong rename to extensions/spellcheck/hunspell/tests/unit/data/compoundaffix.wrong diff --git a/extensions/spellcheck/hunspell/tests/compoundaffix2.aff b/extensions/spellcheck/hunspell/tests/unit/data/compoundaffix2.aff similarity index 100% rename from extensions/spellcheck/hunspell/tests/compoundaffix2.aff rename to extensions/spellcheck/hunspell/tests/unit/data/compoundaffix2.aff diff --git a/extensions/spellcheck/hunspell/tests/compoundaffix2.dic b/extensions/spellcheck/hunspell/tests/unit/data/compoundaffix2.dic similarity index 100% rename from extensions/spellcheck/hunspell/tests/compoundaffix2.dic rename to extensions/spellcheck/hunspell/tests/unit/data/compoundaffix2.dic diff --git a/extensions/spellcheck/hunspell/tests/compoundaffix2.good b/extensions/spellcheck/hunspell/tests/unit/data/compoundaffix2.good similarity index 100% rename from extensions/spellcheck/hunspell/tests/compoundaffix2.good rename to extensions/spellcheck/hunspell/tests/unit/data/compoundaffix2.good diff --git a/extensions/spellcheck/hunspell/tests/compoundaffix2.test b/extensions/spellcheck/hunspell/tests/unit/data/compoundaffix2.test similarity index 100% rename from extensions/spellcheck/hunspell/tests/compoundaffix2.test rename to extensions/spellcheck/hunspell/tests/unit/data/compoundaffix2.test diff --git a/extensions/spellcheck/hunspell/tests/compoundaffix3.aff b/extensions/spellcheck/hunspell/tests/unit/data/compoundaffix3.aff similarity index 100% rename from extensions/spellcheck/hunspell/tests/compoundaffix3.aff rename to extensions/spellcheck/hunspell/tests/unit/data/compoundaffix3.aff diff --git a/extensions/spellcheck/hunspell/tests/compoundaffix3.dic b/extensions/spellcheck/hunspell/tests/unit/data/compoundaffix3.dic similarity index 100% rename from extensions/spellcheck/hunspell/tests/compoundaffix3.dic rename to extensions/spellcheck/hunspell/tests/unit/data/compoundaffix3.dic diff --git a/extensions/spellcheck/hunspell/tests/compoundaffix3.good b/extensions/spellcheck/hunspell/tests/unit/data/compoundaffix3.good similarity index 100% rename from extensions/spellcheck/hunspell/tests/compoundaffix3.good rename to extensions/spellcheck/hunspell/tests/unit/data/compoundaffix3.good diff --git a/extensions/spellcheck/hunspell/tests/compoundaffix3.test b/extensions/spellcheck/hunspell/tests/unit/data/compoundaffix3.test similarity index 100% rename from extensions/spellcheck/hunspell/tests/compoundaffix3.test rename to extensions/spellcheck/hunspell/tests/unit/data/compoundaffix3.test diff --git a/extensions/spellcheck/hunspell/tests/compoundaffix3.wrong b/extensions/spellcheck/hunspell/tests/unit/data/compoundaffix3.wrong similarity index 100% rename from extensions/spellcheck/hunspell/tests/compoundaffix3.wrong rename to extensions/spellcheck/hunspell/tests/unit/data/compoundaffix3.wrong diff --git a/extensions/spellcheck/hunspell/tests/compoundflag.aff b/extensions/spellcheck/hunspell/tests/unit/data/compoundflag.aff similarity index 100% rename from extensions/spellcheck/hunspell/tests/compoundflag.aff rename to extensions/spellcheck/hunspell/tests/unit/data/compoundflag.aff diff --git a/extensions/spellcheck/hunspell/tests/compoundflag.dic b/extensions/spellcheck/hunspell/tests/unit/data/compoundflag.dic similarity index 100% rename from extensions/spellcheck/hunspell/tests/compoundflag.dic rename to extensions/spellcheck/hunspell/tests/unit/data/compoundflag.dic diff --git a/extensions/spellcheck/hunspell/tests/compoundflag.good b/extensions/spellcheck/hunspell/tests/unit/data/compoundflag.good similarity index 100% rename from extensions/spellcheck/hunspell/tests/compoundflag.good rename to extensions/spellcheck/hunspell/tests/unit/data/compoundflag.good diff --git a/extensions/spellcheck/hunspell/tests/compoundflag.test b/extensions/spellcheck/hunspell/tests/unit/data/compoundflag.test similarity index 100% rename from extensions/spellcheck/hunspell/tests/compoundflag.test rename to extensions/spellcheck/hunspell/tests/unit/data/compoundflag.test diff --git a/extensions/spellcheck/hunspell/tests/compoundflag.wrong b/extensions/spellcheck/hunspell/tests/unit/data/compoundflag.wrong similarity index 100% rename from extensions/spellcheck/hunspell/tests/compoundflag.wrong rename to extensions/spellcheck/hunspell/tests/unit/data/compoundflag.wrong diff --git a/extensions/spellcheck/hunspell/tests/compoundrule.aff b/extensions/spellcheck/hunspell/tests/unit/data/compoundrule.aff similarity index 100% rename from extensions/spellcheck/hunspell/tests/compoundrule.aff rename to extensions/spellcheck/hunspell/tests/unit/data/compoundrule.aff diff --git a/extensions/spellcheck/hunspell/tests/compoundrule.dic b/extensions/spellcheck/hunspell/tests/unit/data/compoundrule.dic similarity index 100% rename from extensions/spellcheck/hunspell/tests/compoundrule.dic rename to extensions/spellcheck/hunspell/tests/unit/data/compoundrule.dic diff --git a/extensions/spellcheck/hunspell/tests/compoundrule.good b/extensions/spellcheck/hunspell/tests/unit/data/compoundrule.good similarity index 100% rename from extensions/spellcheck/hunspell/tests/compoundrule.good rename to extensions/spellcheck/hunspell/tests/unit/data/compoundrule.good diff --git a/extensions/spellcheck/hunspell/tests/compoundrule.test b/extensions/spellcheck/hunspell/tests/unit/data/compoundrule.test similarity index 100% rename from extensions/spellcheck/hunspell/tests/compoundrule.test rename to extensions/spellcheck/hunspell/tests/unit/data/compoundrule.test diff --git a/extensions/spellcheck/hunspell/tests/compoundrule.wrong b/extensions/spellcheck/hunspell/tests/unit/data/compoundrule.wrong similarity index 100% rename from extensions/spellcheck/hunspell/tests/compoundrule.wrong rename to extensions/spellcheck/hunspell/tests/unit/data/compoundrule.wrong diff --git a/extensions/spellcheck/hunspell/tests/compoundrule2.aff b/extensions/spellcheck/hunspell/tests/unit/data/compoundrule2.aff similarity index 100% rename from extensions/spellcheck/hunspell/tests/compoundrule2.aff rename to extensions/spellcheck/hunspell/tests/unit/data/compoundrule2.aff diff --git a/extensions/spellcheck/hunspell/tests/compoundrule2.dic b/extensions/spellcheck/hunspell/tests/unit/data/compoundrule2.dic similarity index 100% rename from extensions/spellcheck/hunspell/tests/compoundrule2.dic rename to extensions/spellcheck/hunspell/tests/unit/data/compoundrule2.dic diff --git a/extensions/spellcheck/hunspell/tests/compoundrule2.good b/extensions/spellcheck/hunspell/tests/unit/data/compoundrule2.good similarity index 100% rename from extensions/spellcheck/hunspell/tests/compoundrule2.good rename to extensions/spellcheck/hunspell/tests/unit/data/compoundrule2.good diff --git a/extensions/spellcheck/hunspell/tests/compoundrule2.test b/extensions/spellcheck/hunspell/tests/unit/data/compoundrule2.test similarity index 100% rename from extensions/spellcheck/hunspell/tests/compoundrule2.test rename to extensions/spellcheck/hunspell/tests/unit/data/compoundrule2.test diff --git a/extensions/spellcheck/hunspell/tests/compoundrule2.wrong b/extensions/spellcheck/hunspell/tests/unit/data/compoundrule2.wrong similarity index 100% rename from extensions/spellcheck/hunspell/tests/compoundrule2.wrong rename to extensions/spellcheck/hunspell/tests/unit/data/compoundrule2.wrong diff --git a/extensions/spellcheck/hunspell/tests/compoundrule3.aff b/extensions/spellcheck/hunspell/tests/unit/data/compoundrule3.aff similarity index 100% rename from extensions/spellcheck/hunspell/tests/compoundrule3.aff rename to extensions/spellcheck/hunspell/tests/unit/data/compoundrule3.aff diff --git a/extensions/spellcheck/hunspell/tests/compoundrule3.dic b/extensions/spellcheck/hunspell/tests/unit/data/compoundrule3.dic similarity index 100% rename from extensions/spellcheck/hunspell/tests/compoundrule3.dic rename to extensions/spellcheck/hunspell/tests/unit/data/compoundrule3.dic diff --git a/extensions/spellcheck/hunspell/tests/compoundrule3.good b/extensions/spellcheck/hunspell/tests/unit/data/compoundrule3.good similarity index 100% rename from extensions/spellcheck/hunspell/tests/compoundrule3.good rename to extensions/spellcheck/hunspell/tests/unit/data/compoundrule3.good diff --git a/extensions/spellcheck/hunspell/tests/compoundrule3.test b/extensions/spellcheck/hunspell/tests/unit/data/compoundrule3.test similarity index 100% rename from extensions/spellcheck/hunspell/tests/compoundrule3.test rename to extensions/spellcheck/hunspell/tests/unit/data/compoundrule3.test diff --git a/extensions/spellcheck/hunspell/tests/compoundrule3.wrong b/extensions/spellcheck/hunspell/tests/unit/data/compoundrule3.wrong similarity index 100% rename from extensions/spellcheck/hunspell/tests/compoundrule3.wrong rename to extensions/spellcheck/hunspell/tests/unit/data/compoundrule3.wrong diff --git a/extensions/spellcheck/hunspell/tests/compoundrule4.aff b/extensions/spellcheck/hunspell/tests/unit/data/compoundrule4.aff similarity index 100% rename from extensions/spellcheck/hunspell/tests/compoundrule4.aff rename to extensions/spellcheck/hunspell/tests/unit/data/compoundrule4.aff diff --git a/extensions/spellcheck/hunspell/tests/compoundrule4.dic b/extensions/spellcheck/hunspell/tests/unit/data/compoundrule4.dic similarity index 100% rename from extensions/spellcheck/hunspell/tests/compoundrule4.dic rename to extensions/spellcheck/hunspell/tests/unit/data/compoundrule4.dic diff --git a/extensions/spellcheck/hunspell/tests/compoundrule4.good b/extensions/spellcheck/hunspell/tests/unit/data/compoundrule4.good similarity index 100% rename from extensions/spellcheck/hunspell/tests/compoundrule4.good rename to extensions/spellcheck/hunspell/tests/unit/data/compoundrule4.good diff --git a/extensions/spellcheck/hunspell/tests/compoundrule4.test b/extensions/spellcheck/hunspell/tests/unit/data/compoundrule4.test similarity index 100% rename from extensions/spellcheck/hunspell/tests/compoundrule4.test rename to extensions/spellcheck/hunspell/tests/unit/data/compoundrule4.test diff --git a/extensions/spellcheck/hunspell/tests/compoundrule4.wrong b/extensions/spellcheck/hunspell/tests/unit/data/compoundrule4.wrong similarity index 100% rename from extensions/spellcheck/hunspell/tests/compoundrule4.wrong rename to extensions/spellcheck/hunspell/tests/unit/data/compoundrule4.wrong diff --git a/extensions/spellcheck/hunspell/tests/compoundrule5.aff b/extensions/spellcheck/hunspell/tests/unit/data/compoundrule5.aff similarity index 100% rename from extensions/spellcheck/hunspell/tests/compoundrule5.aff rename to extensions/spellcheck/hunspell/tests/unit/data/compoundrule5.aff diff --git a/extensions/spellcheck/hunspell/tests/compoundrule5.dic b/extensions/spellcheck/hunspell/tests/unit/data/compoundrule5.dic similarity index 100% rename from extensions/spellcheck/hunspell/tests/compoundrule5.dic rename to extensions/spellcheck/hunspell/tests/unit/data/compoundrule5.dic diff --git a/extensions/spellcheck/hunspell/tests/compoundrule5.good b/extensions/spellcheck/hunspell/tests/unit/data/compoundrule5.good similarity index 100% rename from extensions/spellcheck/hunspell/tests/compoundrule5.good rename to extensions/spellcheck/hunspell/tests/unit/data/compoundrule5.good diff --git a/extensions/spellcheck/hunspell/tests/compoundrule5.morph b/extensions/spellcheck/hunspell/tests/unit/data/compoundrule5.morph similarity index 100% rename from extensions/spellcheck/hunspell/tests/compoundrule5.morph rename to extensions/spellcheck/hunspell/tests/unit/data/compoundrule5.morph diff --git a/extensions/spellcheck/hunspell/tests/compoundrule5.test b/extensions/spellcheck/hunspell/tests/unit/data/compoundrule5.test similarity index 100% rename from extensions/spellcheck/hunspell/tests/compoundrule5.test rename to extensions/spellcheck/hunspell/tests/unit/data/compoundrule5.test diff --git a/extensions/spellcheck/hunspell/tests/compoundrule5.wrong b/extensions/spellcheck/hunspell/tests/unit/data/compoundrule5.wrong similarity index 100% rename from extensions/spellcheck/hunspell/tests/compoundrule5.wrong rename to extensions/spellcheck/hunspell/tests/unit/data/compoundrule5.wrong diff --git a/extensions/spellcheck/hunspell/tests/compoundrule6.aff b/extensions/spellcheck/hunspell/tests/unit/data/compoundrule6.aff similarity index 100% rename from extensions/spellcheck/hunspell/tests/compoundrule6.aff rename to extensions/spellcheck/hunspell/tests/unit/data/compoundrule6.aff diff --git a/extensions/spellcheck/hunspell/tests/compoundrule6.dic b/extensions/spellcheck/hunspell/tests/unit/data/compoundrule6.dic similarity index 100% rename from extensions/spellcheck/hunspell/tests/compoundrule6.dic rename to extensions/spellcheck/hunspell/tests/unit/data/compoundrule6.dic diff --git a/extensions/spellcheck/hunspell/tests/compoundrule6.good b/extensions/spellcheck/hunspell/tests/unit/data/compoundrule6.good similarity index 100% rename from extensions/spellcheck/hunspell/tests/compoundrule6.good rename to extensions/spellcheck/hunspell/tests/unit/data/compoundrule6.good diff --git a/extensions/spellcheck/hunspell/tests/compoundrule6.test b/extensions/spellcheck/hunspell/tests/unit/data/compoundrule6.test similarity index 100% rename from extensions/spellcheck/hunspell/tests/compoundrule6.test rename to extensions/spellcheck/hunspell/tests/unit/data/compoundrule6.test diff --git a/extensions/spellcheck/hunspell/tests/compoundrule6.wrong b/extensions/spellcheck/hunspell/tests/unit/data/compoundrule6.wrong similarity index 100% rename from extensions/spellcheck/hunspell/tests/compoundrule6.wrong rename to extensions/spellcheck/hunspell/tests/unit/data/compoundrule6.wrong diff --git a/extensions/spellcheck/hunspell/tests/compoundrule7.aff b/extensions/spellcheck/hunspell/tests/unit/data/compoundrule7.aff similarity index 100% rename from extensions/spellcheck/hunspell/tests/compoundrule7.aff rename to extensions/spellcheck/hunspell/tests/unit/data/compoundrule7.aff diff --git a/extensions/spellcheck/hunspell/tests/compoundrule7.dic b/extensions/spellcheck/hunspell/tests/unit/data/compoundrule7.dic similarity index 100% rename from extensions/spellcheck/hunspell/tests/compoundrule7.dic rename to extensions/spellcheck/hunspell/tests/unit/data/compoundrule7.dic diff --git a/extensions/spellcheck/hunspell/tests/compoundrule7.good b/extensions/spellcheck/hunspell/tests/unit/data/compoundrule7.good similarity index 100% rename from extensions/spellcheck/hunspell/tests/compoundrule7.good rename to extensions/spellcheck/hunspell/tests/unit/data/compoundrule7.good diff --git a/extensions/spellcheck/hunspell/tests/compoundrule7.test b/extensions/spellcheck/hunspell/tests/unit/data/compoundrule7.test similarity index 100% rename from extensions/spellcheck/hunspell/tests/compoundrule7.test rename to extensions/spellcheck/hunspell/tests/unit/data/compoundrule7.test diff --git a/extensions/spellcheck/hunspell/tests/compoundrule7.wrong b/extensions/spellcheck/hunspell/tests/unit/data/compoundrule7.wrong similarity index 100% rename from extensions/spellcheck/hunspell/tests/compoundrule7.wrong rename to extensions/spellcheck/hunspell/tests/unit/data/compoundrule7.wrong diff --git a/extensions/spellcheck/hunspell/tests/compoundrule8.aff b/extensions/spellcheck/hunspell/tests/unit/data/compoundrule8.aff similarity index 100% rename from extensions/spellcheck/hunspell/tests/compoundrule8.aff rename to extensions/spellcheck/hunspell/tests/unit/data/compoundrule8.aff diff --git a/extensions/spellcheck/hunspell/tests/compoundrule8.dic b/extensions/spellcheck/hunspell/tests/unit/data/compoundrule8.dic similarity index 100% rename from extensions/spellcheck/hunspell/tests/compoundrule8.dic rename to extensions/spellcheck/hunspell/tests/unit/data/compoundrule8.dic diff --git a/extensions/spellcheck/hunspell/tests/compoundrule8.good b/extensions/spellcheck/hunspell/tests/unit/data/compoundrule8.good similarity index 100% rename from extensions/spellcheck/hunspell/tests/compoundrule8.good rename to extensions/spellcheck/hunspell/tests/unit/data/compoundrule8.good diff --git a/extensions/spellcheck/hunspell/tests/compoundrule8.test b/extensions/spellcheck/hunspell/tests/unit/data/compoundrule8.test similarity index 100% rename from extensions/spellcheck/hunspell/tests/compoundrule8.test rename to extensions/spellcheck/hunspell/tests/unit/data/compoundrule8.test diff --git a/extensions/spellcheck/hunspell/tests/compoundrule8.wrong b/extensions/spellcheck/hunspell/tests/unit/data/compoundrule8.wrong similarity index 100% rename from extensions/spellcheck/hunspell/tests/compoundrule8.wrong rename to extensions/spellcheck/hunspell/tests/unit/data/compoundrule8.wrong diff --git a/extensions/spellcheck/hunspell/tests/condition.aff b/extensions/spellcheck/hunspell/tests/unit/data/condition.aff similarity index 100% rename from extensions/spellcheck/hunspell/tests/condition.aff rename to extensions/spellcheck/hunspell/tests/unit/data/condition.aff diff --git a/extensions/spellcheck/hunspell/tests/condition.dic b/extensions/spellcheck/hunspell/tests/unit/data/condition.dic similarity index 100% rename from extensions/spellcheck/hunspell/tests/condition.dic rename to extensions/spellcheck/hunspell/tests/unit/data/condition.dic diff --git a/extensions/spellcheck/hunspell/tests/condition.good b/extensions/spellcheck/hunspell/tests/unit/data/condition.good similarity index 100% rename from extensions/spellcheck/hunspell/tests/condition.good rename to extensions/spellcheck/hunspell/tests/unit/data/condition.good diff --git a/extensions/spellcheck/hunspell/tests/condition.test b/extensions/spellcheck/hunspell/tests/unit/data/condition.test similarity index 100% rename from extensions/spellcheck/hunspell/tests/condition.test rename to extensions/spellcheck/hunspell/tests/unit/data/condition.test diff --git a/extensions/spellcheck/hunspell/tests/condition.wrong b/extensions/spellcheck/hunspell/tests/unit/data/condition.wrong similarity index 100% rename from extensions/spellcheck/hunspell/tests/condition.wrong rename to extensions/spellcheck/hunspell/tests/unit/data/condition.wrong diff --git a/extensions/spellcheck/hunspell/tests/condition_utf.aff b/extensions/spellcheck/hunspell/tests/unit/data/condition_utf.aff similarity index 100% rename from extensions/spellcheck/hunspell/tests/condition_utf.aff rename to extensions/spellcheck/hunspell/tests/unit/data/condition_utf.aff diff --git a/extensions/spellcheck/hunspell/tests/condition_utf.dic b/extensions/spellcheck/hunspell/tests/unit/data/condition_utf.dic similarity index 100% rename from extensions/spellcheck/hunspell/tests/condition_utf.dic rename to extensions/spellcheck/hunspell/tests/unit/data/condition_utf.dic diff --git a/extensions/spellcheck/hunspell/tests/condition_utf.good b/extensions/spellcheck/hunspell/tests/unit/data/condition_utf.good similarity index 100% rename from extensions/spellcheck/hunspell/tests/condition_utf.good rename to extensions/spellcheck/hunspell/tests/unit/data/condition_utf.good diff --git a/extensions/spellcheck/hunspell/tests/condition_utf.test b/extensions/spellcheck/hunspell/tests/unit/data/condition_utf.test similarity index 100% rename from extensions/spellcheck/hunspell/tests/condition_utf.test rename to extensions/spellcheck/hunspell/tests/unit/data/condition_utf.test diff --git a/extensions/spellcheck/hunspell/tests/condition_utf.wrong b/extensions/spellcheck/hunspell/tests/unit/data/condition_utf.wrong similarity index 100% rename from extensions/spellcheck/hunspell/tests/condition_utf.wrong rename to extensions/spellcheck/hunspell/tests/unit/data/condition_utf.wrong diff --git a/extensions/spellcheck/hunspell/tests/conditionalprefix.aff b/extensions/spellcheck/hunspell/tests/unit/data/conditionalprefix.aff similarity index 100% rename from extensions/spellcheck/hunspell/tests/conditionalprefix.aff rename to extensions/spellcheck/hunspell/tests/unit/data/conditionalprefix.aff diff --git a/extensions/spellcheck/hunspell/tests/conditionalprefix.dic b/extensions/spellcheck/hunspell/tests/unit/data/conditionalprefix.dic similarity index 100% rename from extensions/spellcheck/hunspell/tests/conditionalprefix.dic rename to extensions/spellcheck/hunspell/tests/unit/data/conditionalprefix.dic diff --git a/extensions/spellcheck/hunspell/tests/conditionalprefix.good b/extensions/spellcheck/hunspell/tests/unit/data/conditionalprefix.good similarity index 100% rename from extensions/spellcheck/hunspell/tests/conditionalprefix.good rename to extensions/spellcheck/hunspell/tests/unit/data/conditionalprefix.good diff --git a/extensions/spellcheck/hunspell/tests/conditionalprefix.morph b/extensions/spellcheck/hunspell/tests/unit/data/conditionalprefix.morph similarity index 100% rename from extensions/spellcheck/hunspell/tests/conditionalprefix.morph rename to extensions/spellcheck/hunspell/tests/unit/data/conditionalprefix.morph diff --git a/extensions/spellcheck/hunspell/tests/conditionalprefix.test b/extensions/spellcheck/hunspell/tests/unit/data/conditionalprefix.test similarity index 100% rename from extensions/spellcheck/hunspell/tests/conditionalprefix.test rename to extensions/spellcheck/hunspell/tests/unit/data/conditionalprefix.test diff --git a/extensions/spellcheck/hunspell/tests/conditionalprefix.wrong b/extensions/spellcheck/hunspell/tests/unit/data/conditionalprefix.wrong similarity index 100% rename from extensions/spellcheck/hunspell/tests/conditionalprefix.wrong rename to extensions/spellcheck/hunspell/tests/unit/data/conditionalprefix.wrong diff --git a/extensions/spellcheck/hunspell/tests/digits_in_words.aff b/extensions/spellcheck/hunspell/tests/unit/data/digits_in_words.aff similarity index 100% rename from extensions/spellcheck/hunspell/tests/digits_in_words.aff rename to extensions/spellcheck/hunspell/tests/unit/data/digits_in_words.aff diff --git a/extensions/spellcheck/hunspell/tests/digits_in_words.dic b/extensions/spellcheck/hunspell/tests/unit/data/digits_in_words.dic similarity index 100% rename from extensions/spellcheck/hunspell/tests/digits_in_words.dic rename to extensions/spellcheck/hunspell/tests/unit/data/digits_in_words.dic diff --git a/extensions/spellcheck/hunspell/tests/digits_in_words.test b/extensions/spellcheck/hunspell/tests/unit/data/digits_in_words.test similarity index 100% rename from extensions/spellcheck/hunspell/tests/digits_in_words.test rename to extensions/spellcheck/hunspell/tests/unit/data/digits_in_words.test diff --git a/extensions/spellcheck/hunspell/tests/digits_in_words.wrong b/extensions/spellcheck/hunspell/tests/unit/data/digits_in_words.wrong similarity index 100% rename from extensions/spellcheck/hunspell/tests/digits_in_words.wrong rename to extensions/spellcheck/hunspell/tests/unit/data/digits_in_words.wrong diff --git a/extensions/spellcheck/hunspell/tests/encoding.aff b/extensions/spellcheck/hunspell/tests/unit/data/encoding.aff similarity index 100% rename from extensions/spellcheck/hunspell/tests/encoding.aff rename to extensions/spellcheck/hunspell/tests/unit/data/encoding.aff diff --git a/extensions/spellcheck/hunspell/tests/encoding.dic b/extensions/spellcheck/hunspell/tests/unit/data/encoding.dic similarity index 100% rename from extensions/spellcheck/hunspell/tests/encoding.dic rename to extensions/spellcheck/hunspell/tests/unit/data/encoding.dic diff --git a/extensions/spellcheck/hunspell/tests/encoding.good b/extensions/spellcheck/hunspell/tests/unit/data/encoding.good similarity index 100% rename from extensions/spellcheck/hunspell/tests/encoding.good rename to extensions/spellcheck/hunspell/tests/unit/data/encoding.good diff --git a/extensions/spellcheck/hunspell/tests/encoding.test b/extensions/spellcheck/hunspell/tests/unit/data/encoding.test similarity index 100% rename from extensions/spellcheck/hunspell/tests/encoding.test rename to extensions/spellcheck/hunspell/tests/unit/data/encoding.test diff --git a/extensions/spellcheck/hunspell/tests/flag.aff b/extensions/spellcheck/hunspell/tests/unit/data/flag.aff similarity index 100% rename from extensions/spellcheck/hunspell/tests/flag.aff rename to extensions/spellcheck/hunspell/tests/unit/data/flag.aff diff --git a/extensions/spellcheck/hunspell/tests/flag.dic b/extensions/spellcheck/hunspell/tests/unit/data/flag.dic similarity index 100% rename from extensions/spellcheck/hunspell/tests/flag.dic rename to extensions/spellcheck/hunspell/tests/unit/data/flag.dic diff --git a/extensions/spellcheck/hunspell/tests/flag.good b/extensions/spellcheck/hunspell/tests/unit/data/flag.good similarity index 100% rename from extensions/spellcheck/hunspell/tests/flag.good rename to extensions/spellcheck/hunspell/tests/unit/data/flag.good diff --git a/extensions/spellcheck/hunspell/tests/flag.test b/extensions/spellcheck/hunspell/tests/unit/data/flag.test similarity index 100% rename from extensions/spellcheck/hunspell/tests/flag.test rename to extensions/spellcheck/hunspell/tests/unit/data/flag.test diff --git a/extensions/spellcheck/hunspell/tests/flaglong.aff b/extensions/spellcheck/hunspell/tests/unit/data/flaglong.aff similarity index 100% rename from extensions/spellcheck/hunspell/tests/flaglong.aff rename to extensions/spellcheck/hunspell/tests/unit/data/flaglong.aff diff --git a/extensions/spellcheck/hunspell/tests/flaglong.dic b/extensions/spellcheck/hunspell/tests/unit/data/flaglong.dic similarity index 100% rename from extensions/spellcheck/hunspell/tests/flaglong.dic rename to extensions/spellcheck/hunspell/tests/unit/data/flaglong.dic diff --git a/extensions/spellcheck/hunspell/tests/flaglong.good b/extensions/spellcheck/hunspell/tests/unit/data/flaglong.good similarity index 100% rename from extensions/spellcheck/hunspell/tests/flaglong.good rename to extensions/spellcheck/hunspell/tests/unit/data/flaglong.good diff --git a/extensions/spellcheck/hunspell/tests/flaglong.test b/extensions/spellcheck/hunspell/tests/unit/data/flaglong.test similarity index 100% rename from extensions/spellcheck/hunspell/tests/flaglong.test rename to extensions/spellcheck/hunspell/tests/unit/data/flaglong.test diff --git a/extensions/spellcheck/hunspell/tests/flagnum.aff b/extensions/spellcheck/hunspell/tests/unit/data/flagnum.aff similarity index 100% rename from extensions/spellcheck/hunspell/tests/flagnum.aff rename to extensions/spellcheck/hunspell/tests/unit/data/flagnum.aff diff --git a/extensions/spellcheck/hunspell/tests/flagnum.dic b/extensions/spellcheck/hunspell/tests/unit/data/flagnum.dic similarity index 100% rename from extensions/spellcheck/hunspell/tests/flagnum.dic rename to extensions/spellcheck/hunspell/tests/unit/data/flagnum.dic diff --git a/extensions/spellcheck/hunspell/tests/flagnum.good b/extensions/spellcheck/hunspell/tests/unit/data/flagnum.good similarity index 100% rename from extensions/spellcheck/hunspell/tests/flagnum.good rename to extensions/spellcheck/hunspell/tests/unit/data/flagnum.good diff --git a/extensions/spellcheck/hunspell/tests/flagnum.test b/extensions/spellcheck/hunspell/tests/unit/data/flagnum.test similarity index 100% rename from extensions/spellcheck/hunspell/tests/flagnum.test rename to extensions/spellcheck/hunspell/tests/unit/data/flagnum.test diff --git a/extensions/spellcheck/hunspell/tests/flagutf8.aff b/extensions/spellcheck/hunspell/tests/unit/data/flagutf8.aff similarity index 100% rename from extensions/spellcheck/hunspell/tests/flagutf8.aff rename to extensions/spellcheck/hunspell/tests/unit/data/flagutf8.aff diff --git a/extensions/spellcheck/hunspell/tests/flagutf8.dic b/extensions/spellcheck/hunspell/tests/unit/data/flagutf8.dic similarity index 100% rename from extensions/spellcheck/hunspell/tests/flagutf8.dic rename to extensions/spellcheck/hunspell/tests/unit/data/flagutf8.dic diff --git a/extensions/spellcheck/hunspell/tests/flagutf8.good b/extensions/spellcheck/hunspell/tests/unit/data/flagutf8.good similarity index 100% rename from extensions/spellcheck/hunspell/tests/flagutf8.good rename to extensions/spellcheck/hunspell/tests/unit/data/flagutf8.good diff --git a/extensions/spellcheck/hunspell/tests/flagutf8.test b/extensions/spellcheck/hunspell/tests/unit/data/flagutf8.test similarity index 100% rename from extensions/spellcheck/hunspell/tests/flagutf8.test rename to extensions/spellcheck/hunspell/tests/unit/data/flagutf8.test diff --git a/extensions/spellcheck/hunspell/tests/fogemorpheme.aff b/extensions/spellcheck/hunspell/tests/unit/data/fogemorpheme.aff similarity index 100% rename from extensions/spellcheck/hunspell/tests/fogemorpheme.aff rename to extensions/spellcheck/hunspell/tests/unit/data/fogemorpheme.aff diff --git a/extensions/spellcheck/hunspell/tests/fogemorpheme.dic b/extensions/spellcheck/hunspell/tests/unit/data/fogemorpheme.dic similarity index 100% rename from extensions/spellcheck/hunspell/tests/fogemorpheme.dic rename to extensions/spellcheck/hunspell/tests/unit/data/fogemorpheme.dic diff --git a/extensions/spellcheck/hunspell/tests/fogemorpheme.good b/extensions/spellcheck/hunspell/tests/unit/data/fogemorpheme.good similarity index 100% rename from extensions/spellcheck/hunspell/tests/fogemorpheme.good rename to extensions/spellcheck/hunspell/tests/unit/data/fogemorpheme.good diff --git a/extensions/spellcheck/hunspell/tests/fogemorpheme.test b/extensions/spellcheck/hunspell/tests/unit/data/fogemorpheme.test similarity index 100% rename from extensions/spellcheck/hunspell/tests/fogemorpheme.test rename to extensions/spellcheck/hunspell/tests/unit/data/fogemorpheme.test diff --git a/extensions/spellcheck/hunspell/tests/fogemorpheme.wrong b/extensions/spellcheck/hunspell/tests/unit/data/fogemorpheme.wrong similarity index 100% rename from extensions/spellcheck/hunspell/tests/fogemorpheme.wrong rename to extensions/spellcheck/hunspell/tests/unit/data/fogemorpheme.wrong diff --git a/extensions/spellcheck/hunspell/tests/forbiddenword.aff b/extensions/spellcheck/hunspell/tests/unit/data/forbiddenword.aff similarity index 100% rename from extensions/spellcheck/hunspell/tests/forbiddenword.aff rename to extensions/spellcheck/hunspell/tests/unit/data/forbiddenword.aff diff --git a/extensions/spellcheck/hunspell/tests/forbiddenword.dic b/extensions/spellcheck/hunspell/tests/unit/data/forbiddenword.dic similarity index 100% rename from extensions/spellcheck/hunspell/tests/forbiddenword.dic rename to extensions/spellcheck/hunspell/tests/unit/data/forbiddenword.dic diff --git a/extensions/spellcheck/hunspell/tests/forbiddenword.good b/extensions/spellcheck/hunspell/tests/unit/data/forbiddenword.good similarity index 100% rename from extensions/spellcheck/hunspell/tests/forbiddenword.good rename to extensions/spellcheck/hunspell/tests/unit/data/forbiddenword.good diff --git a/extensions/spellcheck/hunspell/tests/forbiddenword.test b/extensions/spellcheck/hunspell/tests/unit/data/forbiddenword.test similarity index 100% rename from extensions/spellcheck/hunspell/tests/forbiddenword.test rename to extensions/spellcheck/hunspell/tests/unit/data/forbiddenword.test diff --git a/extensions/spellcheck/hunspell/tests/forbiddenword.wrong b/extensions/spellcheck/hunspell/tests/unit/data/forbiddenword.wrong similarity index 100% rename from extensions/spellcheck/hunspell/tests/forbiddenword.wrong rename to extensions/spellcheck/hunspell/tests/unit/data/forbiddenword.wrong diff --git a/extensions/spellcheck/hunspell/tests/forceucase.aff b/extensions/spellcheck/hunspell/tests/unit/data/forceucase.aff similarity index 100% rename from extensions/spellcheck/hunspell/tests/forceucase.aff rename to extensions/spellcheck/hunspell/tests/unit/data/forceucase.aff diff --git a/extensions/spellcheck/hunspell/tests/forceucase.dic b/extensions/spellcheck/hunspell/tests/unit/data/forceucase.dic similarity index 100% rename from extensions/spellcheck/hunspell/tests/forceucase.dic rename to extensions/spellcheck/hunspell/tests/unit/data/forceucase.dic diff --git a/extensions/spellcheck/hunspell/tests/forceucase.good b/extensions/spellcheck/hunspell/tests/unit/data/forceucase.good similarity index 100% rename from extensions/spellcheck/hunspell/tests/forceucase.good rename to extensions/spellcheck/hunspell/tests/unit/data/forceucase.good diff --git a/extensions/spellcheck/hunspell/tests/forceucase.sug b/extensions/spellcheck/hunspell/tests/unit/data/forceucase.sug similarity index 100% rename from extensions/spellcheck/hunspell/tests/forceucase.sug rename to extensions/spellcheck/hunspell/tests/unit/data/forceucase.sug diff --git a/extensions/spellcheck/hunspell/tests/forceucase.test b/extensions/spellcheck/hunspell/tests/unit/data/forceucase.test similarity index 100% rename from extensions/spellcheck/hunspell/tests/forceucase.test rename to extensions/spellcheck/hunspell/tests/unit/data/forceucase.test diff --git a/extensions/spellcheck/hunspell/tests/forceucase.wrong b/extensions/spellcheck/hunspell/tests/unit/data/forceucase.wrong similarity index 100% rename from extensions/spellcheck/hunspell/tests/forceucase.wrong rename to extensions/spellcheck/hunspell/tests/unit/data/forceucase.wrong diff --git a/extensions/spellcheck/hunspell/tests/fullstrip.aff b/extensions/spellcheck/hunspell/tests/unit/data/fullstrip.aff similarity index 100% rename from extensions/spellcheck/hunspell/tests/fullstrip.aff rename to extensions/spellcheck/hunspell/tests/unit/data/fullstrip.aff diff --git a/extensions/spellcheck/hunspell/tests/fullstrip.dic b/extensions/spellcheck/hunspell/tests/unit/data/fullstrip.dic similarity index 100% rename from extensions/spellcheck/hunspell/tests/fullstrip.dic rename to extensions/spellcheck/hunspell/tests/unit/data/fullstrip.dic diff --git a/extensions/spellcheck/hunspell/tests/fullstrip.good b/extensions/spellcheck/hunspell/tests/unit/data/fullstrip.good similarity index 100% rename from extensions/spellcheck/hunspell/tests/fullstrip.good rename to extensions/spellcheck/hunspell/tests/unit/data/fullstrip.good diff --git a/extensions/spellcheck/hunspell/tests/fullstrip.test b/extensions/spellcheck/hunspell/tests/unit/data/fullstrip.test similarity index 100% rename from extensions/spellcheck/hunspell/tests/fullstrip.test rename to extensions/spellcheck/hunspell/tests/unit/data/fullstrip.test diff --git a/extensions/spellcheck/hunspell/tests/germancompounding.aff b/extensions/spellcheck/hunspell/tests/unit/data/germancompounding.aff similarity index 100% rename from extensions/spellcheck/hunspell/tests/germancompounding.aff rename to extensions/spellcheck/hunspell/tests/unit/data/germancompounding.aff diff --git a/extensions/spellcheck/hunspell/tests/germancompounding.dic b/extensions/spellcheck/hunspell/tests/unit/data/germancompounding.dic similarity index 100% rename from extensions/spellcheck/hunspell/tests/germancompounding.dic rename to extensions/spellcheck/hunspell/tests/unit/data/germancompounding.dic diff --git a/extensions/spellcheck/hunspell/tests/germancompounding.good b/extensions/spellcheck/hunspell/tests/unit/data/germancompounding.good similarity index 100% rename from extensions/spellcheck/hunspell/tests/germancompounding.good rename to extensions/spellcheck/hunspell/tests/unit/data/germancompounding.good diff --git a/extensions/spellcheck/hunspell/tests/germancompounding.test b/extensions/spellcheck/hunspell/tests/unit/data/germancompounding.test similarity index 100% rename from extensions/spellcheck/hunspell/tests/germancompounding.test rename to extensions/spellcheck/hunspell/tests/unit/data/germancompounding.test diff --git a/extensions/spellcheck/hunspell/tests/germancompounding.wrong b/extensions/spellcheck/hunspell/tests/unit/data/germancompounding.wrong similarity index 100% rename from extensions/spellcheck/hunspell/tests/germancompounding.wrong rename to extensions/spellcheck/hunspell/tests/unit/data/germancompounding.wrong diff --git a/extensions/spellcheck/hunspell/tests/germancompoundingold.aff b/extensions/spellcheck/hunspell/tests/unit/data/germancompoundingold.aff similarity index 100% rename from extensions/spellcheck/hunspell/tests/germancompoundingold.aff rename to extensions/spellcheck/hunspell/tests/unit/data/germancompoundingold.aff diff --git a/extensions/spellcheck/hunspell/tests/germancompoundingold.dic b/extensions/spellcheck/hunspell/tests/unit/data/germancompoundingold.dic similarity index 100% rename from extensions/spellcheck/hunspell/tests/germancompoundingold.dic rename to extensions/spellcheck/hunspell/tests/unit/data/germancompoundingold.dic diff --git a/extensions/spellcheck/hunspell/tests/germancompoundingold.good b/extensions/spellcheck/hunspell/tests/unit/data/germancompoundingold.good similarity index 100% rename from extensions/spellcheck/hunspell/tests/germancompoundingold.good rename to extensions/spellcheck/hunspell/tests/unit/data/germancompoundingold.good diff --git a/extensions/spellcheck/hunspell/tests/germancompoundingold.test b/extensions/spellcheck/hunspell/tests/unit/data/germancompoundingold.test similarity index 100% rename from extensions/spellcheck/hunspell/tests/germancompoundingold.test rename to extensions/spellcheck/hunspell/tests/unit/data/germancompoundingold.test diff --git a/extensions/spellcheck/hunspell/tests/germancompoundingold.wrong b/extensions/spellcheck/hunspell/tests/unit/data/germancompoundingold.wrong similarity index 100% rename from extensions/spellcheck/hunspell/tests/germancompoundingold.wrong rename to extensions/spellcheck/hunspell/tests/unit/data/germancompoundingold.wrong diff --git a/extensions/spellcheck/hunspell/tests/i35725.aff b/extensions/spellcheck/hunspell/tests/unit/data/i35725.aff similarity index 100% rename from extensions/spellcheck/hunspell/tests/i35725.aff rename to extensions/spellcheck/hunspell/tests/unit/data/i35725.aff diff --git a/extensions/spellcheck/hunspell/tests/i35725.dic b/extensions/spellcheck/hunspell/tests/unit/data/i35725.dic similarity index 100% rename from extensions/spellcheck/hunspell/tests/i35725.dic rename to extensions/spellcheck/hunspell/tests/unit/data/i35725.dic diff --git a/extensions/spellcheck/hunspell/tests/i35725.good b/extensions/spellcheck/hunspell/tests/unit/data/i35725.good similarity index 100% rename from extensions/spellcheck/hunspell/tests/i35725.good rename to extensions/spellcheck/hunspell/tests/unit/data/i35725.good diff --git a/extensions/spellcheck/hunspell/tests/i35725.sug b/extensions/spellcheck/hunspell/tests/unit/data/i35725.sug similarity index 100% rename from extensions/spellcheck/hunspell/tests/i35725.sug rename to extensions/spellcheck/hunspell/tests/unit/data/i35725.sug diff --git a/extensions/spellcheck/hunspell/tests/i35725.test b/extensions/spellcheck/hunspell/tests/unit/data/i35725.test similarity index 100% rename from extensions/spellcheck/hunspell/tests/i35725.test rename to extensions/spellcheck/hunspell/tests/unit/data/i35725.test diff --git a/extensions/spellcheck/hunspell/tests/i35725.wrong b/extensions/spellcheck/hunspell/tests/unit/data/i35725.wrong similarity index 100% rename from extensions/spellcheck/hunspell/tests/i35725.wrong rename to extensions/spellcheck/hunspell/tests/unit/data/i35725.wrong diff --git a/extensions/spellcheck/hunspell/tests/i53643.aff b/extensions/spellcheck/hunspell/tests/unit/data/i53643.aff similarity index 100% rename from extensions/spellcheck/hunspell/tests/i53643.aff rename to extensions/spellcheck/hunspell/tests/unit/data/i53643.aff diff --git a/extensions/spellcheck/hunspell/tests/i53643.dic b/extensions/spellcheck/hunspell/tests/unit/data/i53643.dic similarity index 100% rename from extensions/spellcheck/hunspell/tests/i53643.dic rename to extensions/spellcheck/hunspell/tests/unit/data/i53643.dic diff --git a/extensions/spellcheck/hunspell/tests/i53643.good b/extensions/spellcheck/hunspell/tests/unit/data/i53643.good similarity index 100% rename from extensions/spellcheck/hunspell/tests/i53643.good rename to extensions/spellcheck/hunspell/tests/unit/data/i53643.good diff --git a/extensions/spellcheck/hunspell/tests/i53643.test b/extensions/spellcheck/hunspell/tests/unit/data/i53643.test similarity index 100% rename from extensions/spellcheck/hunspell/tests/i53643.test rename to extensions/spellcheck/hunspell/tests/unit/data/i53643.test diff --git a/extensions/spellcheck/hunspell/tests/i53643.wrong b/extensions/spellcheck/hunspell/tests/unit/data/i53643.wrong similarity index 100% rename from extensions/spellcheck/hunspell/tests/i53643.wrong rename to extensions/spellcheck/hunspell/tests/unit/data/i53643.wrong diff --git a/extensions/spellcheck/hunspell/tests/i54633.aff b/extensions/spellcheck/hunspell/tests/unit/data/i54633.aff similarity index 100% rename from extensions/spellcheck/hunspell/tests/i54633.aff rename to extensions/spellcheck/hunspell/tests/unit/data/i54633.aff diff --git a/extensions/spellcheck/hunspell/tests/i54633.dic b/extensions/spellcheck/hunspell/tests/unit/data/i54633.dic similarity index 100% rename from extensions/spellcheck/hunspell/tests/i54633.dic rename to extensions/spellcheck/hunspell/tests/unit/data/i54633.dic diff --git a/extensions/spellcheck/hunspell/tests/i54633.good b/extensions/spellcheck/hunspell/tests/unit/data/i54633.good similarity index 100% rename from extensions/spellcheck/hunspell/tests/i54633.good rename to extensions/spellcheck/hunspell/tests/unit/data/i54633.good diff --git a/extensions/spellcheck/hunspell/tests/i54633.sug b/extensions/spellcheck/hunspell/tests/unit/data/i54633.sug similarity index 100% rename from extensions/spellcheck/hunspell/tests/i54633.sug rename to extensions/spellcheck/hunspell/tests/unit/data/i54633.sug diff --git a/extensions/spellcheck/hunspell/tests/i54633.test b/extensions/spellcheck/hunspell/tests/unit/data/i54633.test similarity index 100% rename from extensions/spellcheck/hunspell/tests/i54633.test rename to extensions/spellcheck/hunspell/tests/unit/data/i54633.test diff --git a/extensions/spellcheck/hunspell/tests/i54633.wrong b/extensions/spellcheck/hunspell/tests/unit/data/i54633.wrong similarity index 100% rename from extensions/spellcheck/hunspell/tests/i54633.wrong rename to extensions/spellcheck/hunspell/tests/unit/data/i54633.wrong diff --git a/extensions/spellcheck/hunspell/tests/i54980.aff b/extensions/spellcheck/hunspell/tests/unit/data/i54980.aff similarity index 100% rename from extensions/spellcheck/hunspell/tests/i54980.aff rename to extensions/spellcheck/hunspell/tests/unit/data/i54980.aff diff --git a/extensions/spellcheck/hunspell/tests/i54980.dic b/extensions/spellcheck/hunspell/tests/unit/data/i54980.dic similarity index 100% rename from extensions/spellcheck/hunspell/tests/i54980.dic rename to extensions/spellcheck/hunspell/tests/unit/data/i54980.dic diff --git a/extensions/spellcheck/hunspell/tests/i54980.good b/extensions/spellcheck/hunspell/tests/unit/data/i54980.good similarity index 100% rename from extensions/spellcheck/hunspell/tests/i54980.good rename to extensions/spellcheck/hunspell/tests/unit/data/i54980.good diff --git a/extensions/spellcheck/hunspell/tests/i54980.test b/extensions/spellcheck/hunspell/tests/unit/data/i54980.test similarity index 100% rename from extensions/spellcheck/hunspell/tests/i54980.test rename to extensions/spellcheck/hunspell/tests/unit/data/i54980.test diff --git a/extensions/spellcheck/hunspell/tests/i58202.aff b/extensions/spellcheck/hunspell/tests/unit/data/i58202.aff similarity index 100% rename from extensions/spellcheck/hunspell/tests/i58202.aff rename to extensions/spellcheck/hunspell/tests/unit/data/i58202.aff diff --git a/extensions/spellcheck/hunspell/tests/i58202.dic b/extensions/spellcheck/hunspell/tests/unit/data/i58202.dic similarity index 100% rename from extensions/spellcheck/hunspell/tests/i58202.dic rename to extensions/spellcheck/hunspell/tests/unit/data/i58202.dic diff --git a/extensions/spellcheck/hunspell/tests/i58202.good b/extensions/spellcheck/hunspell/tests/unit/data/i58202.good similarity index 100% rename from extensions/spellcheck/hunspell/tests/i58202.good rename to extensions/spellcheck/hunspell/tests/unit/data/i58202.good diff --git a/extensions/spellcheck/hunspell/tests/i58202.sug b/extensions/spellcheck/hunspell/tests/unit/data/i58202.sug similarity index 100% rename from extensions/spellcheck/hunspell/tests/i58202.sug rename to extensions/spellcheck/hunspell/tests/unit/data/i58202.sug diff --git a/extensions/spellcheck/hunspell/tests/i58202.test b/extensions/spellcheck/hunspell/tests/unit/data/i58202.test similarity index 100% rename from extensions/spellcheck/hunspell/tests/i58202.test rename to extensions/spellcheck/hunspell/tests/unit/data/i58202.test diff --git a/extensions/spellcheck/hunspell/tests/i58202.wrong b/extensions/spellcheck/hunspell/tests/unit/data/i58202.wrong similarity index 100% rename from extensions/spellcheck/hunspell/tests/i58202.wrong rename to extensions/spellcheck/hunspell/tests/unit/data/i58202.wrong diff --git a/extensions/spellcheck/hunspell/tests/i68568.aff b/extensions/spellcheck/hunspell/tests/unit/data/i68568.aff similarity index 100% rename from extensions/spellcheck/hunspell/tests/i68568.aff rename to extensions/spellcheck/hunspell/tests/unit/data/i68568.aff diff --git a/extensions/spellcheck/hunspell/tests/i68568.dic b/extensions/spellcheck/hunspell/tests/unit/data/i68568.dic similarity index 100% rename from extensions/spellcheck/hunspell/tests/i68568.dic rename to extensions/spellcheck/hunspell/tests/unit/data/i68568.dic diff --git a/extensions/spellcheck/hunspell/tests/i68568.test b/extensions/spellcheck/hunspell/tests/unit/data/i68568.test similarity index 100% rename from extensions/spellcheck/hunspell/tests/i68568.test rename to extensions/spellcheck/hunspell/tests/unit/data/i68568.test diff --git a/extensions/spellcheck/hunspell/tests/i68568.wrong b/extensions/spellcheck/hunspell/tests/unit/data/i68568.wrong similarity index 100% rename from extensions/spellcheck/hunspell/tests/i68568.wrong rename to extensions/spellcheck/hunspell/tests/unit/data/i68568.wrong diff --git a/extensions/spellcheck/hunspell/tests/i68568utf.aff b/extensions/spellcheck/hunspell/tests/unit/data/i68568utf.aff similarity index 100% rename from extensions/spellcheck/hunspell/tests/i68568utf.aff rename to extensions/spellcheck/hunspell/tests/unit/data/i68568utf.aff diff --git a/extensions/spellcheck/hunspell/tests/i68568utf.dic b/extensions/spellcheck/hunspell/tests/unit/data/i68568utf.dic similarity index 100% rename from extensions/spellcheck/hunspell/tests/i68568utf.dic rename to extensions/spellcheck/hunspell/tests/unit/data/i68568utf.dic diff --git a/extensions/spellcheck/hunspell/tests/i68568utf.test b/extensions/spellcheck/hunspell/tests/unit/data/i68568utf.test similarity index 100% rename from extensions/spellcheck/hunspell/tests/i68568utf.test rename to extensions/spellcheck/hunspell/tests/unit/data/i68568utf.test diff --git a/extensions/spellcheck/hunspell/tests/i68568utf.wrong b/extensions/spellcheck/hunspell/tests/unit/data/i68568utf.wrong similarity index 100% rename from extensions/spellcheck/hunspell/tests/i68568utf.wrong rename to extensions/spellcheck/hunspell/tests/unit/data/i68568utf.wrong diff --git a/extensions/spellcheck/hunspell/tests/iconv.aff b/extensions/spellcheck/hunspell/tests/unit/data/iconv.aff similarity index 100% rename from extensions/spellcheck/hunspell/tests/iconv.aff rename to extensions/spellcheck/hunspell/tests/unit/data/iconv.aff diff --git a/extensions/spellcheck/hunspell/tests/iconv.dic b/extensions/spellcheck/hunspell/tests/unit/data/iconv.dic similarity index 100% rename from extensions/spellcheck/hunspell/tests/iconv.dic rename to extensions/spellcheck/hunspell/tests/unit/data/iconv.dic diff --git a/extensions/spellcheck/hunspell/tests/iconv.good b/extensions/spellcheck/hunspell/tests/unit/data/iconv.good similarity index 100% rename from extensions/spellcheck/hunspell/tests/iconv.good rename to extensions/spellcheck/hunspell/tests/unit/data/iconv.good diff --git a/extensions/spellcheck/hunspell/tests/iconv.test b/extensions/spellcheck/hunspell/tests/unit/data/iconv.test similarity index 100% rename from extensions/spellcheck/hunspell/tests/iconv.test rename to extensions/spellcheck/hunspell/tests/unit/data/iconv.test diff --git a/extensions/spellcheck/hunspell/tests/ignore.aff b/extensions/spellcheck/hunspell/tests/unit/data/ignore.aff similarity index 100% rename from extensions/spellcheck/hunspell/tests/ignore.aff rename to extensions/spellcheck/hunspell/tests/unit/data/ignore.aff diff --git a/extensions/spellcheck/hunspell/tests/ignore.dic b/extensions/spellcheck/hunspell/tests/unit/data/ignore.dic similarity index 100% rename from extensions/spellcheck/hunspell/tests/ignore.dic rename to extensions/spellcheck/hunspell/tests/unit/data/ignore.dic diff --git a/extensions/spellcheck/hunspell/tests/ignore.good b/extensions/spellcheck/hunspell/tests/unit/data/ignore.good similarity index 100% rename from extensions/spellcheck/hunspell/tests/ignore.good rename to extensions/spellcheck/hunspell/tests/unit/data/ignore.good diff --git a/extensions/spellcheck/hunspell/tests/ignore.test b/extensions/spellcheck/hunspell/tests/unit/data/ignore.test similarity index 100% rename from extensions/spellcheck/hunspell/tests/ignore.test rename to extensions/spellcheck/hunspell/tests/unit/data/ignore.test diff --git a/extensions/spellcheck/hunspell/tests/ignoreutf.aff b/extensions/spellcheck/hunspell/tests/unit/data/ignoreutf.aff similarity index 100% rename from extensions/spellcheck/hunspell/tests/ignoreutf.aff rename to extensions/spellcheck/hunspell/tests/unit/data/ignoreutf.aff diff --git a/extensions/spellcheck/hunspell/tests/ignoreutf.dic b/extensions/spellcheck/hunspell/tests/unit/data/ignoreutf.dic similarity index 100% rename from extensions/spellcheck/hunspell/tests/ignoreutf.dic rename to extensions/spellcheck/hunspell/tests/unit/data/ignoreutf.dic diff --git a/extensions/spellcheck/hunspell/tests/ignoreutf.good b/extensions/spellcheck/hunspell/tests/unit/data/ignoreutf.good similarity index 100% rename from extensions/spellcheck/hunspell/tests/ignoreutf.good rename to extensions/spellcheck/hunspell/tests/unit/data/ignoreutf.good diff --git a/extensions/spellcheck/hunspell/tests/ignoreutf.test b/extensions/spellcheck/hunspell/tests/unit/data/ignoreutf.test similarity index 100% rename from extensions/spellcheck/hunspell/tests/ignoreutf.test rename to extensions/spellcheck/hunspell/tests/unit/data/ignoreutf.test diff --git a/extensions/spellcheck/hunspell/tests/keepcase.aff b/extensions/spellcheck/hunspell/tests/unit/data/keepcase.aff similarity index 100% rename from extensions/spellcheck/hunspell/tests/keepcase.aff rename to extensions/spellcheck/hunspell/tests/unit/data/keepcase.aff diff --git a/extensions/spellcheck/hunspell/tests/keepcase.dic b/extensions/spellcheck/hunspell/tests/unit/data/keepcase.dic similarity index 100% rename from extensions/spellcheck/hunspell/tests/keepcase.dic rename to extensions/spellcheck/hunspell/tests/unit/data/keepcase.dic diff --git a/extensions/spellcheck/hunspell/tests/keepcase.good b/extensions/spellcheck/hunspell/tests/unit/data/keepcase.good similarity index 100% rename from extensions/spellcheck/hunspell/tests/keepcase.good rename to extensions/spellcheck/hunspell/tests/unit/data/keepcase.good diff --git a/extensions/spellcheck/hunspell/tests/keepcase.sug b/extensions/spellcheck/hunspell/tests/unit/data/keepcase.sug similarity index 100% rename from extensions/spellcheck/hunspell/tests/keepcase.sug rename to extensions/spellcheck/hunspell/tests/unit/data/keepcase.sug diff --git a/extensions/spellcheck/hunspell/tests/keepcase.test b/extensions/spellcheck/hunspell/tests/unit/data/keepcase.test similarity index 100% rename from extensions/spellcheck/hunspell/tests/keepcase.test rename to extensions/spellcheck/hunspell/tests/unit/data/keepcase.test diff --git a/extensions/spellcheck/hunspell/tests/keepcase.wrong b/extensions/spellcheck/hunspell/tests/unit/data/keepcase.wrong similarity index 100% rename from extensions/spellcheck/hunspell/tests/keepcase.wrong rename to extensions/spellcheck/hunspell/tests/unit/data/keepcase.wrong diff --git a/extensions/spellcheck/hunspell/tests/korean.aff b/extensions/spellcheck/hunspell/tests/unit/data/korean.aff similarity index 100% rename from extensions/spellcheck/hunspell/tests/korean.aff rename to extensions/spellcheck/hunspell/tests/unit/data/korean.aff diff --git a/extensions/spellcheck/hunspell/tests/korean.dic b/extensions/spellcheck/hunspell/tests/unit/data/korean.dic similarity index 100% rename from extensions/spellcheck/hunspell/tests/korean.dic rename to extensions/spellcheck/hunspell/tests/unit/data/korean.dic diff --git a/extensions/spellcheck/hunspell/tests/korean.good b/extensions/spellcheck/hunspell/tests/unit/data/korean.good similarity index 100% rename from extensions/spellcheck/hunspell/tests/korean.good rename to extensions/spellcheck/hunspell/tests/unit/data/korean.good diff --git a/extensions/spellcheck/hunspell/tests/korean.test b/extensions/spellcheck/hunspell/tests/unit/data/korean.test similarity index 100% rename from extensions/spellcheck/hunspell/tests/korean.test rename to extensions/spellcheck/hunspell/tests/unit/data/korean.test diff --git a/extensions/spellcheck/hunspell/tests/korean.wrong b/extensions/spellcheck/hunspell/tests/unit/data/korean.wrong similarity index 100% rename from extensions/spellcheck/hunspell/tests/korean.wrong rename to extensions/spellcheck/hunspell/tests/unit/data/korean.wrong diff --git a/extensions/spellcheck/hunspell/tests/map.aff b/extensions/spellcheck/hunspell/tests/unit/data/map.aff similarity index 100% rename from extensions/spellcheck/hunspell/tests/map.aff rename to extensions/spellcheck/hunspell/tests/unit/data/map.aff diff --git a/extensions/spellcheck/hunspell/tests/map.dic b/extensions/spellcheck/hunspell/tests/unit/data/map.dic similarity index 100% rename from extensions/spellcheck/hunspell/tests/map.dic rename to extensions/spellcheck/hunspell/tests/unit/data/map.dic diff --git a/extensions/spellcheck/hunspell/tests/map.sug b/extensions/spellcheck/hunspell/tests/unit/data/map.sug similarity index 100% rename from extensions/spellcheck/hunspell/tests/map.sug rename to extensions/spellcheck/hunspell/tests/unit/data/map.sug diff --git a/extensions/spellcheck/hunspell/tests/map.test b/extensions/spellcheck/hunspell/tests/unit/data/map.test similarity index 100% rename from extensions/spellcheck/hunspell/tests/map.test rename to extensions/spellcheck/hunspell/tests/unit/data/map.test diff --git a/extensions/spellcheck/hunspell/tests/map.wrong b/extensions/spellcheck/hunspell/tests/unit/data/map.wrong similarity index 100% rename from extensions/spellcheck/hunspell/tests/map.wrong rename to extensions/spellcheck/hunspell/tests/unit/data/map.wrong diff --git a/extensions/spellcheck/hunspell/tests/maputf.aff b/extensions/spellcheck/hunspell/tests/unit/data/maputf.aff similarity index 100% rename from extensions/spellcheck/hunspell/tests/maputf.aff rename to extensions/spellcheck/hunspell/tests/unit/data/maputf.aff diff --git a/extensions/spellcheck/hunspell/tests/maputf.dic b/extensions/spellcheck/hunspell/tests/unit/data/maputf.dic similarity index 100% rename from extensions/spellcheck/hunspell/tests/maputf.dic rename to extensions/spellcheck/hunspell/tests/unit/data/maputf.dic diff --git a/extensions/spellcheck/hunspell/tests/maputf.sug b/extensions/spellcheck/hunspell/tests/unit/data/maputf.sug similarity index 100% rename from extensions/spellcheck/hunspell/tests/maputf.sug rename to extensions/spellcheck/hunspell/tests/unit/data/maputf.sug diff --git a/extensions/spellcheck/hunspell/tests/maputf.test b/extensions/spellcheck/hunspell/tests/unit/data/maputf.test similarity index 100% rename from extensions/spellcheck/hunspell/tests/maputf.test rename to extensions/spellcheck/hunspell/tests/unit/data/maputf.test diff --git a/extensions/spellcheck/hunspell/tests/maputf.wrong b/extensions/spellcheck/hunspell/tests/unit/data/maputf.wrong similarity index 100% rename from extensions/spellcheck/hunspell/tests/maputf.wrong rename to extensions/spellcheck/hunspell/tests/unit/data/maputf.wrong diff --git a/extensions/spellcheck/hunspell/tests/morph.aff b/extensions/spellcheck/hunspell/tests/unit/data/morph.aff similarity index 100% rename from extensions/spellcheck/hunspell/tests/morph.aff rename to extensions/spellcheck/hunspell/tests/unit/data/morph.aff diff --git a/extensions/spellcheck/hunspell/tests/morph.dic b/extensions/spellcheck/hunspell/tests/unit/data/morph.dic similarity index 100% rename from extensions/spellcheck/hunspell/tests/morph.dic rename to extensions/spellcheck/hunspell/tests/unit/data/morph.dic diff --git a/extensions/spellcheck/hunspell/tests/morph.good b/extensions/spellcheck/hunspell/tests/unit/data/morph.good similarity index 100% rename from extensions/spellcheck/hunspell/tests/morph.good rename to extensions/spellcheck/hunspell/tests/unit/data/morph.good diff --git a/extensions/spellcheck/hunspell/tests/morph.morph b/extensions/spellcheck/hunspell/tests/unit/data/morph.morph similarity index 100% rename from extensions/spellcheck/hunspell/tests/morph.morph rename to extensions/spellcheck/hunspell/tests/unit/data/morph.morph diff --git a/extensions/spellcheck/hunspell/tests/morph.test b/extensions/spellcheck/hunspell/tests/unit/data/morph.test similarity index 100% rename from extensions/spellcheck/hunspell/tests/morph.test rename to extensions/spellcheck/hunspell/tests/unit/data/morph.test diff --git a/extensions/spellcheck/hunspell/tests/needaffix.aff b/extensions/spellcheck/hunspell/tests/unit/data/needaffix.aff similarity index 100% rename from extensions/spellcheck/hunspell/tests/needaffix.aff rename to extensions/spellcheck/hunspell/tests/unit/data/needaffix.aff diff --git a/extensions/spellcheck/hunspell/tests/needaffix.dic b/extensions/spellcheck/hunspell/tests/unit/data/needaffix.dic similarity index 100% rename from extensions/spellcheck/hunspell/tests/needaffix.dic rename to extensions/spellcheck/hunspell/tests/unit/data/needaffix.dic diff --git a/extensions/spellcheck/hunspell/tests/needaffix.good b/extensions/spellcheck/hunspell/tests/unit/data/needaffix.good similarity index 100% rename from extensions/spellcheck/hunspell/tests/needaffix.good rename to extensions/spellcheck/hunspell/tests/unit/data/needaffix.good diff --git a/extensions/spellcheck/hunspell/tests/needaffix.test b/extensions/spellcheck/hunspell/tests/unit/data/needaffix.test similarity index 100% rename from extensions/spellcheck/hunspell/tests/needaffix.test rename to extensions/spellcheck/hunspell/tests/unit/data/needaffix.test diff --git a/extensions/spellcheck/hunspell/tests/needaffix.wrong b/extensions/spellcheck/hunspell/tests/unit/data/needaffix.wrong similarity index 100% rename from extensions/spellcheck/hunspell/tests/needaffix.wrong rename to extensions/spellcheck/hunspell/tests/unit/data/needaffix.wrong diff --git a/extensions/spellcheck/hunspell/tests/needaffix2.aff b/extensions/spellcheck/hunspell/tests/unit/data/needaffix2.aff similarity index 100% rename from extensions/spellcheck/hunspell/tests/needaffix2.aff rename to extensions/spellcheck/hunspell/tests/unit/data/needaffix2.aff diff --git a/extensions/spellcheck/hunspell/tests/needaffix2.dic b/extensions/spellcheck/hunspell/tests/unit/data/needaffix2.dic similarity index 100% rename from extensions/spellcheck/hunspell/tests/needaffix2.dic rename to extensions/spellcheck/hunspell/tests/unit/data/needaffix2.dic diff --git a/extensions/spellcheck/hunspell/tests/needaffix2.good b/extensions/spellcheck/hunspell/tests/unit/data/needaffix2.good similarity index 100% rename from extensions/spellcheck/hunspell/tests/needaffix2.good rename to extensions/spellcheck/hunspell/tests/unit/data/needaffix2.good diff --git a/extensions/spellcheck/hunspell/tests/needaffix2.morph b/extensions/spellcheck/hunspell/tests/unit/data/needaffix2.morph similarity index 100% rename from extensions/spellcheck/hunspell/tests/needaffix2.morph rename to extensions/spellcheck/hunspell/tests/unit/data/needaffix2.morph diff --git a/extensions/spellcheck/hunspell/tests/needaffix2.test b/extensions/spellcheck/hunspell/tests/unit/data/needaffix2.test similarity index 100% rename from extensions/spellcheck/hunspell/tests/needaffix2.test rename to extensions/spellcheck/hunspell/tests/unit/data/needaffix2.test diff --git a/extensions/spellcheck/hunspell/tests/needaffix3.aff b/extensions/spellcheck/hunspell/tests/unit/data/needaffix3.aff similarity index 100% rename from extensions/spellcheck/hunspell/tests/needaffix3.aff rename to extensions/spellcheck/hunspell/tests/unit/data/needaffix3.aff diff --git a/extensions/spellcheck/hunspell/tests/needaffix3.dic b/extensions/spellcheck/hunspell/tests/unit/data/needaffix3.dic similarity index 100% rename from extensions/spellcheck/hunspell/tests/needaffix3.dic rename to extensions/spellcheck/hunspell/tests/unit/data/needaffix3.dic diff --git a/extensions/spellcheck/hunspell/tests/needaffix3.good b/extensions/spellcheck/hunspell/tests/unit/data/needaffix3.good similarity index 100% rename from extensions/spellcheck/hunspell/tests/needaffix3.good rename to extensions/spellcheck/hunspell/tests/unit/data/needaffix3.good diff --git a/extensions/spellcheck/hunspell/tests/needaffix3.test b/extensions/spellcheck/hunspell/tests/unit/data/needaffix3.test similarity index 100% rename from extensions/spellcheck/hunspell/tests/needaffix3.test rename to extensions/spellcheck/hunspell/tests/unit/data/needaffix3.test diff --git a/extensions/spellcheck/hunspell/tests/needaffix3.wrong b/extensions/spellcheck/hunspell/tests/unit/data/needaffix3.wrong similarity index 100% rename from extensions/spellcheck/hunspell/tests/needaffix3.wrong rename to extensions/spellcheck/hunspell/tests/unit/data/needaffix3.wrong diff --git a/extensions/spellcheck/hunspell/tests/needaffix4.aff b/extensions/spellcheck/hunspell/tests/unit/data/needaffix4.aff similarity index 100% rename from extensions/spellcheck/hunspell/tests/needaffix4.aff rename to extensions/spellcheck/hunspell/tests/unit/data/needaffix4.aff diff --git a/extensions/spellcheck/hunspell/tests/needaffix4.dic b/extensions/spellcheck/hunspell/tests/unit/data/needaffix4.dic similarity index 100% rename from extensions/spellcheck/hunspell/tests/needaffix4.dic rename to extensions/spellcheck/hunspell/tests/unit/data/needaffix4.dic diff --git a/extensions/spellcheck/hunspell/tests/needaffix4.good b/extensions/spellcheck/hunspell/tests/unit/data/needaffix4.good similarity index 100% rename from extensions/spellcheck/hunspell/tests/needaffix4.good rename to extensions/spellcheck/hunspell/tests/unit/data/needaffix4.good diff --git a/extensions/spellcheck/hunspell/tests/needaffix4.test b/extensions/spellcheck/hunspell/tests/unit/data/needaffix4.test similarity index 100% rename from extensions/spellcheck/hunspell/tests/needaffix4.test rename to extensions/spellcheck/hunspell/tests/unit/data/needaffix4.test diff --git a/extensions/spellcheck/hunspell/tests/needaffix5.aff b/extensions/spellcheck/hunspell/tests/unit/data/needaffix5.aff similarity index 100% rename from extensions/spellcheck/hunspell/tests/needaffix5.aff rename to extensions/spellcheck/hunspell/tests/unit/data/needaffix5.aff diff --git a/extensions/spellcheck/hunspell/tests/needaffix5.dic b/extensions/spellcheck/hunspell/tests/unit/data/needaffix5.dic similarity index 100% rename from extensions/spellcheck/hunspell/tests/needaffix5.dic rename to extensions/spellcheck/hunspell/tests/unit/data/needaffix5.dic diff --git a/extensions/spellcheck/hunspell/tests/needaffix5.good b/extensions/spellcheck/hunspell/tests/unit/data/needaffix5.good similarity index 100% rename from extensions/spellcheck/hunspell/tests/needaffix5.good rename to extensions/spellcheck/hunspell/tests/unit/data/needaffix5.good diff --git a/extensions/spellcheck/hunspell/tests/needaffix5.test b/extensions/spellcheck/hunspell/tests/unit/data/needaffix5.test similarity index 100% rename from extensions/spellcheck/hunspell/tests/needaffix5.test rename to extensions/spellcheck/hunspell/tests/unit/data/needaffix5.test diff --git a/extensions/spellcheck/hunspell/tests/needaffix5.wrong b/extensions/spellcheck/hunspell/tests/unit/data/needaffix5.wrong similarity index 100% rename from extensions/spellcheck/hunspell/tests/needaffix5.wrong rename to extensions/spellcheck/hunspell/tests/unit/data/needaffix5.wrong diff --git a/extensions/spellcheck/hunspell/tests/ngram_utf_fix.aff b/extensions/spellcheck/hunspell/tests/unit/data/ngram_utf_fix.aff similarity index 100% rename from extensions/spellcheck/hunspell/tests/ngram_utf_fix.aff rename to extensions/spellcheck/hunspell/tests/unit/data/ngram_utf_fix.aff diff --git a/extensions/spellcheck/hunspell/tests/ngram_utf_fix.dic b/extensions/spellcheck/hunspell/tests/unit/data/ngram_utf_fix.dic similarity index 100% rename from extensions/spellcheck/hunspell/tests/ngram_utf_fix.dic rename to extensions/spellcheck/hunspell/tests/unit/data/ngram_utf_fix.dic diff --git a/extensions/spellcheck/hunspell/tests/ngram_utf_fix.good b/extensions/spellcheck/hunspell/tests/unit/data/ngram_utf_fix.good similarity index 100% rename from extensions/spellcheck/hunspell/tests/ngram_utf_fix.good rename to extensions/spellcheck/hunspell/tests/unit/data/ngram_utf_fix.good diff --git a/extensions/spellcheck/hunspell/tests/ngram_utf_fix.sug b/extensions/spellcheck/hunspell/tests/unit/data/ngram_utf_fix.sug similarity index 100% rename from extensions/spellcheck/hunspell/tests/ngram_utf_fix.sug rename to extensions/spellcheck/hunspell/tests/unit/data/ngram_utf_fix.sug diff --git a/extensions/spellcheck/hunspell/tests/ngram_utf_fix.test b/extensions/spellcheck/hunspell/tests/unit/data/ngram_utf_fix.test similarity index 100% rename from extensions/spellcheck/hunspell/tests/ngram_utf_fix.test rename to extensions/spellcheck/hunspell/tests/unit/data/ngram_utf_fix.test diff --git a/extensions/spellcheck/hunspell/tests/ngram_utf_fix.wrong b/extensions/spellcheck/hunspell/tests/unit/data/ngram_utf_fix.wrong similarity index 100% rename from extensions/spellcheck/hunspell/tests/ngram_utf_fix.wrong rename to extensions/spellcheck/hunspell/tests/unit/data/ngram_utf_fix.wrong diff --git a/extensions/spellcheck/hunspell/tests/nosuggest.aff b/extensions/spellcheck/hunspell/tests/unit/data/nosuggest.aff similarity index 100% rename from extensions/spellcheck/hunspell/tests/nosuggest.aff rename to extensions/spellcheck/hunspell/tests/unit/data/nosuggest.aff diff --git a/extensions/spellcheck/hunspell/tests/nosuggest.dic b/extensions/spellcheck/hunspell/tests/unit/data/nosuggest.dic similarity index 100% rename from extensions/spellcheck/hunspell/tests/nosuggest.dic rename to extensions/spellcheck/hunspell/tests/unit/data/nosuggest.dic diff --git a/extensions/spellcheck/hunspell/tests/nosuggest.good b/extensions/spellcheck/hunspell/tests/unit/data/nosuggest.good similarity index 100% rename from extensions/spellcheck/hunspell/tests/nosuggest.good rename to extensions/spellcheck/hunspell/tests/unit/data/nosuggest.good diff --git a/extensions/spellcheck/hunspell/tests/nosuggest.sug b/extensions/spellcheck/hunspell/tests/unit/data/nosuggest.sug similarity index 100% rename from extensions/spellcheck/hunspell/tests/nosuggest.sug rename to extensions/spellcheck/hunspell/tests/unit/data/nosuggest.sug diff --git a/extensions/spellcheck/hunspell/tests/nosuggest.test b/extensions/spellcheck/hunspell/tests/unit/data/nosuggest.test similarity index 100% rename from extensions/spellcheck/hunspell/tests/nosuggest.test rename to extensions/spellcheck/hunspell/tests/unit/data/nosuggest.test diff --git a/extensions/spellcheck/hunspell/tests/nosuggest.wrong b/extensions/spellcheck/hunspell/tests/unit/data/nosuggest.wrong similarity index 100% rename from extensions/spellcheck/hunspell/tests/nosuggest.wrong rename to extensions/spellcheck/hunspell/tests/unit/data/nosuggest.wrong diff --git a/extensions/spellcheck/hunspell/tests/oconv.aff b/extensions/spellcheck/hunspell/tests/unit/data/oconv.aff similarity index 100% rename from extensions/spellcheck/hunspell/tests/oconv.aff rename to extensions/spellcheck/hunspell/tests/unit/data/oconv.aff diff --git a/extensions/spellcheck/hunspell/tests/oconv.dic b/extensions/spellcheck/hunspell/tests/unit/data/oconv.dic similarity index 100% rename from extensions/spellcheck/hunspell/tests/oconv.dic rename to extensions/spellcheck/hunspell/tests/unit/data/oconv.dic diff --git a/extensions/spellcheck/hunspell/tests/oconv.good b/extensions/spellcheck/hunspell/tests/unit/data/oconv.good similarity index 100% rename from extensions/spellcheck/hunspell/tests/oconv.good rename to extensions/spellcheck/hunspell/tests/unit/data/oconv.good diff --git a/extensions/spellcheck/hunspell/tests/oconv.sug b/extensions/spellcheck/hunspell/tests/unit/data/oconv.sug similarity index 100% rename from extensions/spellcheck/hunspell/tests/oconv.sug rename to extensions/spellcheck/hunspell/tests/unit/data/oconv.sug diff --git a/extensions/spellcheck/hunspell/tests/oconv.test b/extensions/spellcheck/hunspell/tests/unit/data/oconv.test similarity index 100% rename from extensions/spellcheck/hunspell/tests/oconv.test rename to extensions/spellcheck/hunspell/tests/unit/data/oconv.test diff --git a/extensions/spellcheck/hunspell/tests/oconv.wrong b/extensions/spellcheck/hunspell/tests/unit/data/oconv.wrong similarity index 100% rename from extensions/spellcheck/hunspell/tests/oconv.wrong rename to extensions/spellcheck/hunspell/tests/unit/data/oconv.wrong diff --git a/extensions/spellcheck/hunspell/tests/onlyincompound.aff b/extensions/spellcheck/hunspell/tests/unit/data/onlyincompound.aff similarity index 100% rename from extensions/spellcheck/hunspell/tests/onlyincompound.aff rename to extensions/spellcheck/hunspell/tests/unit/data/onlyincompound.aff diff --git a/extensions/spellcheck/hunspell/tests/onlyincompound.dic b/extensions/spellcheck/hunspell/tests/unit/data/onlyincompound.dic similarity index 100% rename from extensions/spellcheck/hunspell/tests/onlyincompound.dic rename to extensions/spellcheck/hunspell/tests/unit/data/onlyincompound.dic diff --git a/extensions/spellcheck/hunspell/tests/onlyincompound.good b/extensions/spellcheck/hunspell/tests/unit/data/onlyincompound.good similarity index 100% rename from extensions/spellcheck/hunspell/tests/onlyincompound.good rename to extensions/spellcheck/hunspell/tests/unit/data/onlyincompound.good diff --git a/extensions/spellcheck/hunspell/tests/onlyincompound.sug b/extensions/spellcheck/hunspell/tests/unit/data/onlyincompound.sug similarity index 100% rename from extensions/spellcheck/hunspell/tests/onlyincompound.sug rename to extensions/spellcheck/hunspell/tests/unit/data/onlyincompound.sug diff --git a/extensions/spellcheck/hunspell/tests/onlyincompound.test b/extensions/spellcheck/hunspell/tests/unit/data/onlyincompound.test similarity index 100% rename from extensions/spellcheck/hunspell/tests/onlyincompound.test rename to extensions/spellcheck/hunspell/tests/unit/data/onlyincompound.test diff --git a/extensions/spellcheck/hunspell/tests/onlyincompound.wrong b/extensions/spellcheck/hunspell/tests/unit/data/onlyincompound.wrong similarity index 100% rename from extensions/spellcheck/hunspell/tests/onlyincompound.wrong rename to extensions/spellcheck/hunspell/tests/unit/data/onlyincompound.wrong diff --git a/extensions/spellcheck/hunspell/tests/onlyincompound2.aff b/extensions/spellcheck/hunspell/tests/unit/data/onlyincompound2.aff similarity index 100% rename from extensions/spellcheck/hunspell/tests/onlyincompound2.aff rename to extensions/spellcheck/hunspell/tests/unit/data/onlyincompound2.aff diff --git a/extensions/spellcheck/hunspell/tests/onlyincompound2.dic b/extensions/spellcheck/hunspell/tests/unit/data/onlyincompound2.dic similarity index 100% rename from extensions/spellcheck/hunspell/tests/onlyincompound2.dic rename to extensions/spellcheck/hunspell/tests/unit/data/onlyincompound2.dic diff --git a/extensions/spellcheck/hunspell/tests/onlyincompound2.good b/extensions/spellcheck/hunspell/tests/unit/data/onlyincompound2.good similarity index 100% rename from extensions/spellcheck/hunspell/tests/onlyincompound2.good rename to extensions/spellcheck/hunspell/tests/unit/data/onlyincompound2.good diff --git a/extensions/spellcheck/hunspell/tests/onlyincompound2.test b/extensions/spellcheck/hunspell/tests/unit/data/onlyincompound2.test similarity index 100% rename from extensions/spellcheck/hunspell/tests/onlyincompound2.test rename to extensions/spellcheck/hunspell/tests/unit/data/onlyincompound2.test diff --git a/extensions/spellcheck/hunspell/tests/onlyincompound2.wrong b/extensions/spellcheck/hunspell/tests/unit/data/onlyincompound2.wrong similarity index 100% rename from extensions/spellcheck/hunspell/tests/onlyincompound2.wrong rename to extensions/spellcheck/hunspell/tests/unit/data/onlyincompound2.wrong diff --git a/extensions/spellcheck/hunspell/tests/opentaal_cpdpat.aff b/extensions/spellcheck/hunspell/tests/unit/data/opentaal_cpdpat.aff similarity index 100% rename from extensions/spellcheck/hunspell/tests/opentaal_cpdpat.aff rename to extensions/spellcheck/hunspell/tests/unit/data/opentaal_cpdpat.aff diff --git a/extensions/spellcheck/hunspell/tests/opentaal_cpdpat.dic b/extensions/spellcheck/hunspell/tests/unit/data/opentaal_cpdpat.dic similarity index 100% rename from extensions/spellcheck/hunspell/tests/opentaal_cpdpat.dic rename to extensions/spellcheck/hunspell/tests/unit/data/opentaal_cpdpat.dic diff --git a/extensions/spellcheck/hunspell/tests/opentaal_cpdpat.good b/extensions/spellcheck/hunspell/tests/unit/data/opentaal_cpdpat.good similarity index 100% rename from extensions/spellcheck/hunspell/tests/opentaal_cpdpat.good rename to extensions/spellcheck/hunspell/tests/unit/data/opentaal_cpdpat.good diff --git a/extensions/spellcheck/hunspell/tests/opentaal_cpdpat.test b/extensions/spellcheck/hunspell/tests/unit/data/opentaal_cpdpat.test similarity index 100% rename from extensions/spellcheck/hunspell/tests/opentaal_cpdpat.test rename to extensions/spellcheck/hunspell/tests/unit/data/opentaal_cpdpat.test diff --git a/extensions/spellcheck/hunspell/tests/opentaal_cpdpat.wrong b/extensions/spellcheck/hunspell/tests/unit/data/opentaal_cpdpat.wrong similarity index 100% rename from extensions/spellcheck/hunspell/tests/opentaal_cpdpat.wrong rename to extensions/spellcheck/hunspell/tests/unit/data/opentaal_cpdpat.wrong diff --git a/extensions/spellcheck/hunspell/tests/opentaal_cpdpat2.aff b/extensions/spellcheck/hunspell/tests/unit/data/opentaal_cpdpat2.aff similarity index 100% rename from extensions/spellcheck/hunspell/tests/opentaal_cpdpat2.aff rename to extensions/spellcheck/hunspell/tests/unit/data/opentaal_cpdpat2.aff diff --git a/extensions/spellcheck/hunspell/tests/opentaal_cpdpat2.dic b/extensions/spellcheck/hunspell/tests/unit/data/opentaal_cpdpat2.dic similarity index 100% rename from extensions/spellcheck/hunspell/tests/opentaal_cpdpat2.dic rename to extensions/spellcheck/hunspell/tests/unit/data/opentaal_cpdpat2.dic diff --git a/extensions/spellcheck/hunspell/tests/opentaal_cpdpat2.good b/extensions/spellcheck/hunspell/tests/unit/data/opentaal_cpdpat2.good similarity index 100% rename from extensions/spellcheck/hunspell/tests/opentaal_cpdpat2.good rename to extensions/spellcheck/hunspell/tests/unit/data/opentaal_cpdpat2.good diff --git a/extensions/spellcheck/hunspell/tests/opentaal_cpdpat2.test b/extensions/spellcheck/hunspell/tests/unit/data/opentaal_cpdpat2.test similarity index 100% rename from extensions/spellcheck/hunspell/tests/opentaal_cpdpat2.test rename to extensions/spellcheck/hunspell/tests/unit/data/opentaal_cpdpat2.test diff --git a/extensions/spellcheck/hunspell/tests/opentaal_cpdpat2.wrong b/extensions/spellcheck/hunspell/tests/unit/data/opentaal_cpdpat2.wrong similarity index 100% rename from extensions/spellcheck/hunspell/tests/opentaal_cpdpat2.wrong rename to extensions/spellcheck/hunspell/tests/unit/data/opentaal_cpdpat2.wrong diff --git a/extensions/spellcheck/hunspell/tests/opentaal_forbiddenword1.aff b/extensions/spellcheck/hunspell/tests/unit/data/opentaal_forbiddenword1.aff similarity index 100% rename from extensions/spellcheck/hunspell/tests/opentaal_forbiddenword1.aff rename to extensions/spellcheck/hunspell/tests/unit/data/opentaal_forbiddenword1.aff diff --git a/extensions/spellcheck/hunspell/tests/opentaal_forbiddenword1.dic b/extensions/spellcheck/hunspell/tests/unit/data/opentaal_forbiddenword1.dic similarity index 100% rename from extensions/spellcheck/hunspell/tests/opentaal_forbiddenword1.dic rename to extensions/spellcheck/hunspell/tests/unit/data/opentaal_forbiddenword1.dic diff --git a/extensions/spellcheck/hunspell/tests/opentaal_forbiddenword1.good b/extensions/spellcheck/hunspell/tests/unit/data/opentaal_forbiddenword1.good similarity index 100% rename from extensions/spellcheck/hunspell/tests/opentaal_forbiddenword1.good rename to extensions/spellcheck/hunspell/tests/unit/data/opentaal_forbiddenword1.good diff --git a/extensions/spellcheck/hunspell/tests/opentaal_forbiddenword1.sug b/extensions/spellcheck/hunspell/tests/unit/data/opentaal_forbiddenword1.sug similarity index 100% rename from extensions/spellcheck/hunspell/tests/opentaal_forbiddenword1.sug rename to extensions/spellcheck/hunspell/tests/unit/data/opentaal_forbiddenword1.sug diff --git a/extensions/spellcheck/hunspell/tests/opentaal_forbiddenword1.test b/extensions/spellcheck/hunspell/tests/unit/data/opentaal_forbiddenword1.test similarity index 100% rename from extensions/spellcheck/hunspell/tests/opentaal_forbiddenword1.test rename to extensions/spellcheck/hunspell/tests/unit/data/opentaal_forbiddenword1.test diff --git a/extensions/spellcheck/hunspell/tests/opentaal_forbiddenword1.wrong b/extensions/spellcheck/hunspell/tests/unit/data/opentaal_forbiddenword1.wrong similarity index 100% rename from extensions/spellcheck/hunspell/tests/opentaal_forbiddenword1.wrong rename to extensions/spellcheck/hunspell/tests/unit/data/opentaal_forbiddenword1.wrong diff --git a/extensions/spellcheck/hunspell/tests/opentaal_forbiddenword2.aff b/extensions/spellcheck/hunspell/tests/unit/data/opentaal_forbiddenword2.aff similarity index 100% rename from extensions/spellcheck/hunspell/tests/opentaal_forbiddenword2.aff rename to extensions/spellcheck/hunspell/tests/unit/data/opentaal_forbiddenword2.aff diff --git a/extensions/spellcheck/hunspell/tests/opentaal_forbiddenword2.dic b/extensions/spellcheck/hunspell/tests/unit/data/opentaal_forbiddenword2.dic similarity index 100% rename from extensions/spellcheck/hunspell/tests/opentaal_forbiddenword2.dic rename to extensions/spellcheck/hunspell/tests/unit/data/opentaal_forbiddenword2.dic diff --git a/extensions/spellcheck/hunspell/tests/opentaal_forbiddenword2.good b/extensions/spellcheck/hunspell/tests/unit/data/opentaal_forbiddenword2.good similarity index 100% rename from extensions/spellcheck/hunspell/tests/opentaal_forbiddenword2.good rename to extensions/spellcheck/hunspell/tests/unit/data/opentaal_forbiddenword2.good diff --git a/extensions/spellcheck/hunspell/tests/opentaal_forbiddenword2.sug b/extensions/spellcheck/hunspell/tests/unit/data/opentaal_forbiddenword2.sug similarity index 100% rename from extensions/spellcheck/hunspell/tests/opentaal_forbiddenword2.sug rename to extensions/spellcheck/hunspell/tests/unit/data/opentaal_forbiddenword2.sug diff --git a/extensions/spellcheck/hunspell/tests/opentaal_forbiddenword2.test b/extensions/spellcheck/hunspell/tests/unit/data/opentaal_forbiddenword2.test similarity index 100% rename from extensions/spellcheck/hunspell/tests/opentaal_forbiddenword2.test rename to extensions/spellcheck/hunspell/tests/unit/data/opentaal_forbiddenword2.test diff --git a/extensions/spellcheck/hunspell/tests/opentaal_forbiddenword2.wrong b/extensions/spellcheck/hunspell/tests/unit/data/opentaal_forbiddenword2.wrong similarity index 100% rename from extensions/spellcheck/hunspell/tests/opentaal_forbiddenword2.wrong rename to extensions/spellcheck/hunspell/tests/unit/data/opentaal_forbiddenword2.wrong diff --git a/extensions/spellcheck/hunspell/tests/opentaal_keepcase.aff b/extensions/spellcheck/hunspell/tests/unit/data/opentaal_keepcase.aff similarity index 100% rename from extensions/spellcheck/hunspell/tests/opentaal_keepcase.aff rename to extensions/spellcheck/hunspell/tests/unit/data/opentaal_keepcase.aff diff --git a/extensions/spellcheck/hunspell/tests/opentaal_keepcase.dic b/extensions/spellcheck/hunspell/tests/unit/data/opentaal_keepcase.dic similarity index 100% rename from extensions/spellcheck/hunspell/tests/opentaal_keepcase.dic rename to extensions/spellcheck/hunspell/tests/unit/data/opentaal_keepcase.dic diff --git a/extensions/spellcheck/hunspell/tests/opentaal_keepcase.good b/extensions/spellcheck/hunspell/tests/unit/data/opentaal_keepcase.good similarity index 100% rename from extensions/spellcheck/hunspell/tests/opentaal_keepcase.good rename to extensions/spellcheck/hunspell/tests/unit/data/opentaal_keepcase.good diff --git a/extensions/spellcheck/hunspell/tests/opentaal_keepcase.sug b/extensions/spellcheck/hunspell/tests/unit/data/opentaal_keepcase.sug similarity index 100% rename from extensions/spellcheck/hunspell/tests/opentaal_keepcase.sug rename to extensions/spellcheck/hunspell/tests/unit/data/opentaal_keepcase.sug diff --git a/extensions/spellcheck/hunspell/tests/opentaal_keepcase.test b/extensions/spellcheck/hunspell/tests/unit/data/opentaal_keepcase.test similarity index 100% rename from extensions/spellcheck/hunspell/tests/opentaal_keepcase.test rename to extensions/spellcheck/hunspell/tests/unit/data/opentaal_keepcase.test diff --git a/extensions/spellcheck/hunspell/tests/opentaal_keepcase.wrong b/extensions/spellcheck/hunspell/tests/unit/data/opentaal_keepcase.wrong similarity index 100% rename from extensions/spellcheck/hunspell/tests/opentaal_keepcase.wrong rename to extensions/spellcheck/hunspell/tests/unit/data/opentaal_keepcase.wrong diff --git a/extensions/spellcheck/hunspell/tests/phone.aff b/extensions/spellcheck/hunspell/tests/unit/data/phone.aff similarity index 100% rename from extensions/spellcheck/hunspell/tests/phone.aff rename to extensions/spellcheck/hunspell/tests/unit/data/phone.aff diff --git a/extensions/spellcheck/hunspell/tests/phone.dic b/extensions/spellcheck/hunspell/tests/unit/data/phone.dic similarity index 100% rename from extensions/spellcheck/hunspell/tests/phone.dic rename to extensions/spellcheck/hunspell/tests/unit/data/phone.dic diff --git a/extensions/spellcheck/hunspell/tests/phone.sug b/extensions/spellcheck/hunspell/tests/unit/data/phone.sug similarity index 100% rename from extensions/spellcheck/hunspell/tests/phone.sug rename to extensions/spellcheck/hunspell/tests/unit/data/phone.sug diff --git a/extensions/spellcheck/hunspell/tests/phone.test b/extensions/spellcheck/hunspell/tests/unit/data/phone.test similarity index 100% rename from extensions/spellcheck/hunspell/tests/phone.test rename to extensions/spellcheck/hunspell/tests/unit/data/phone.test diff --git a/extensions/spellcheck/hunspell/tests/phone.wrong b/extensions/spellcheck/hunspell/tests/unit/data/phone.wrong similarity index 100% rename from extensions/spellcheck/hunspell/tests/phone.wrong rename to extensions/spellcheck/hunspell/tests/unit/data/phone.wrong diff --git a/extensions/spellcheck/hunspell/tests/rep.aff b/extensions/spellcheck/hunspell/tests/unit/data/rep.aff similarity index 100% rename from extensions/spellcheck/hunspell/tests/rep.aff rename to extensions/spellcheck/hunspell/tests/unit/data/rep.aff diff --git a/extensions/spellcheck/hunspell/tests/rep.dic b/extensions/spellcheck/hunspell/tests/unit/data/rep.dic similarity index 100% rename from extensions/spellcheck/hunspell/tests/rep.dic rename to extensions/spellcheck/hunspell/tests/unit/data/rep.dic diff --git a/extensions/spellcheck/hunspell/tests/rep.sug b/extensions/spellcheck/hunspell/tests/unit/data/rep.sug similarity index 100% rename from extensions/spellcheck/hunspell/tests/rep.sug rename to extensions/spellcheck/hunspell/tests/unit/data/rep.sug diff --git a/extensions/spellcheck/hunspell/tests/rep.test b/extensions/spellcheck/hunspell/tests/unit/data/rep.test similarity index 100% rename from extensions/spellcheck/hunspell/tests/rep.test rename to extensions/spellcheck/hunspell/tests/unit/data/rep.test diff --git a/extensions/spellcheck/hunspell/tests/rep.wrong b/extensions/spellcheck/hunspell/tests/unit/data/rep.wrong similarity index 100% rename from extensions/spellcheck/hunspell/tests/rep.wrong rename to extensions/spellcheck/hunspell/tests/unit/data/rep.wrong diff --git a/extensions/spellcheck/hunspell/tests/reputf.aff b/extensions/spellcheck/hunspell/tests/unit/data/reputf.aff similarity index 100% rename from extensions/spellcheck/hunspell/tests/reputf.aff rename to extensions/spellcheck/hunspell/tests/unit/data/reputf.aff diff --git a/extensions/spellcheck/hunspell/tests/reputf.dic b/extensions/spellcheck/hunspell/tests/unit/data/reputf.dic similarity index 100% rename from extensions/spellcheck/hunspell/tests/reputf.dic rename to extensions/spellcheck/hunspell/tests/unit/data/reputf.dic diff --git a/extensions/spellcheck/hunspell/tests/reputf.sug b/extensions/spellcheck/hunspell/tests/unit/data/reputf.sug similarity index 100% rename from extensions/spellcheck/hunspell/tests/reputf.sug rename to extensions/spellcheck/hunspell/tests/unit/data/reputf.sug diff --git a/extensions/spellcheck/hunspell/tests/reputf.test b/extensions/spellcheck/hunspell/tests/unit/data/reputf.test similarity index 100% rename from extensions/spellcheck/hunspell/tests/reputf.test rename to extensions/spellcheck/hunspell/tests/unit/data/reputf.test diff --git a/extensions/spellcheck/hunspell/tests/reputf.wrong b/extensions/spellcheck/hunspell/tests/unit/data/reputf.wrong similarity index 100% rename from extensions/spellcheck/hunspell/tests/reputf.wrong rename to extensions/spellcheck/hunspell/tests/unit/data/reputf.wrong diff --git a/extensions/spellcheck/hunspell/tests/simplifiedtriple.aff b/extensions/spellcheck/hunspell/tests/unit/data/simplifiedtriple.aff similarity index 100% rename from extensions/spellcheck/hunspell/tests/simplifiedtriple.aff rename to extensions/spellcheck/hunspell/tests/unit/data/simplifiedtriple.aff diff --git a/extensions/spellcheck/hunspell/tests/simplifiedtriple.dic b/extensions/spellcheck/hunspell/tests/unit/data/simplifiedtriple.dic similarity index 100% rename from extensions/spellcheck/hunspell/tests/simplifiedtriple.dic rename to extensions/spellcheck/hunspell/tests/unit/data/simplifiedtriple.dic diff --git a/extensions/spellcheck/hunspell/tests/simplifiedtriple.good b/extensions/spellcheck/hunspell/tests/unit/data/simplifiedtriple.good similarity index 100% rename from extensions/spellcheck/hunspell/tests/simplifiedtriple.good rename to extensions/spellcheck/hunspell/tests/unit/data/simplifiedtriple.good diff --git a/extensions/spellcheck/hunspell/tests/simplifiedtriple.test b/extensions/spellcheck/hunspell/tests/unit/data/simplifiedtriple.test similarity index 100% rename from extensions/spellcheck/hunspell/tests/simplifiedtriple.test rename to extensions/spellcheck/hunspell/tests/unit/data/simplifiedtriple.test diff --git a/extensions/spellcheck/hunspell/tests/simplifiedtriple.wrong b/extensions/spellcheck/hunspell/tests/unit/data/simplifiedtriple.wrong similarity index 100% rename from extensions/spellcheck/hunspell/tests/simplifiedtriple.wrong rename to extensions/spellcheck/hunspell/tests/unit/data/simplifiedtriple.wrong diff --git a/extensions/spellcheck/hunspell/tests/slash.aff b/extensions/spellcheck/hunspell/tests/unit/data/slash.aff similarity index 100% rename from extensions/spellcheck/hunspell/tests/slash.aff rename to extensions/spellcheck/hunspell/tests/unit/data/slash.aff diff --git a/extensions/spellcheck/hunspell/tests/slash.dic b/extensions/spellcheck/hunspell/tests/unit/data/slash.dic similarity index 100% rename from extensions/spellcheck/hunspell/tests/slash.dic rename to extensions/spellcheck/hunspell/tests/unit/data/slash.dic diff --git a/extensions/spellcheck/hunspell/tests/slash.good b/extensions/spellcheck/hunspell/tests/unit/data/slash.good similarity index 100% rename from extensions/spellcheck/hunspell/tests/slash.good rename to extensions/spellcheck/hunspell/tests/unit/data/slash.good diff --git a/extensions/spellcheck/hunspell/tests/slash.test b/extensions/spellcheck/hunspell/tests/unit/data/slash.test similarity index 100% rename from extensions/spellcheck/hunspell/tests/slash.test rename to extensions/spellcheck/hunspell/tests/unit/data/slash.test diff --git a/extensions/spellcheck/hunspell/tests/sug.aff b/extensions/spellcheck/hunspell/tests/unit/data/sug.aff similarity index 100% rename from extensions/spellcheck/hunspell/tests/sug.aff rename to extensions/spellcheck/hunspell/tests/unit/data/sug.aff diff --git a/extensions/spellcheck/hunspell/tests/sug.dic b/extensions/spellcheck/hunspell/tests/unit/data/sug.dic similarity index 100% rename from extensions/spellcheck/hunspell/tests/sug.dic rename to extensions/spellcheck/hunspell/tests/unit/data/sug.dic diff --git a/extensions/spellcheck/hunspell/tests/sug.sug b/extensions/spellcheck/hunspell/tests/unit/data/sug.sug similarity index 100% rename from extensions/spellcheck/hunspell/tests/sug.sug rename to extensions/spellcheck/hunspell/tests/unit/data/sug.sug diff --git a/extensions/spellcheck/hunspell/tests/sug.test b/extensions/spellcheck/hunspell/tests/unit/data/sug.test similarity index 100% rename from extensions/spellcheck/hunspell/tests/sug.test rename to extensions/spellcheck/hunspell/tests/unit/data/sug.test diff --git a/extensions/spellcheck/hunspell/tests/sug.wrong b/extensions/spellcheck/hunspell/tests/unit/data/sug.wrong similarity index 100% rename from extensions/spellcheck/hunspell/tests/sug.wrong rename to extensions/spellcheck/hunspell/tests/unit/data/sug.wrong diff --git a/extensions/spellcheck/hunspell/tests/suggestiontest/List_of_common_misspellings.txt b/extensions/spellcheck/hunspell/tests/unit/data/suggestiontest/List_of_common_misspellings.txt similarity index 100% rename from extensions/spellcheck/hunspell/tests/suggestiontest/List_of_common_misspellings.txt rename to extensions/spellcheck/hunspell/tests/unit/data/suggestiontest/List_of_common_misspellings.txt diff --git a/extensions/spellcheck/hunspell/tests/suggestiontest/Makefile.am b/extensions/spellcheck/hunspell/tests/unit/data/suggestiontest/Makefile.am similarity index 100% rename from extensions/spellcheck/hunspell/tests/suggestiontest/Makefile.am rename to extensions/spellcheck/hunspell/tests/unit/data/suggestiontest/Makefile.am diff --git a/extensions/spellcheck/hunspell/tests/suggestiontest/Makefile.in b/extensions/spellcheck/hunspell/tests/unit/data/suggestiontest/Makefile.in similarity index 100% rename from extensions/spellcheck/hunspell/tests/suggestiontest/Makefile.in rename to extensions/spellcheck/hunspell/tests/unit/data/suggestiontest/Makefile.in diff --git a/extensions/spellcheck/hunspell/tests/suggestiontest/README b/extensions/spellcheck/hunspell/tests/unit/data/suggestiontest/README similarity index 100% rename from extensions/spellcheck/hunspell/tests/suggestiontest/README rename to extensions/spellcheck/hunspell/tests/unit/data/suggestiontest/README diff --git a/extensions/spellcheck/hunspell/tests/suggestiontest/prepare b/extensions/spellcheck/hunspell/tests/unit/data/suggestiontest/prepare similarity index 100% rename from extensions/spellcheck/hunspell/tests/suggestiontest/prepare rename to extensions/spellcheck/hunspell/tests/unit/data/suggestiontest/prepare diff --git a/extensions/spellcheck/hunspell/tests/suggestiontest/test b/extensions/spellcheck/hunspell/tests/unit/data/suggestiontest/test similarity index 100% rename from extensions/spellcheck/hunspell/tests/suggestiontest/test rename to extensions/spellcheck/hunspell/tests/unit/data/suggestiontest/test diff --git a/extensions/spellcheck/hunspell/tests/sugutf.aff b/extensions/spellcheck/hunspell/tests/unit/data/sugutf.aff similarity index 100% rename from extensions/spellcheck/hunspell/tests/sugutf.aff rename to extensions/spellcheck/hunspell/tests/unit/data/sugutf.aff diff --git a/extensions/spellcheck/hunspell/tests/sugutf.dic b/extensions/spellcheck/hunspell/tests/unit/data/sugutf.dic similarity index 100% rename from extensions/spellcheck/hunspell/tests/sugutf.dic rename to extensions/spellcheck/hunspell/tests/unit/data/sugutf.dic diff --git a/extensions/spellcheck/hunspell/tests/sugutf.sug b/extensions/spellcheck/hunspell/tests/unit/data/sugutf.sug similarity index 100% rename from extensions/spellcheck/hunspell/tests/sugutf.sug rename to extensions/spellcheck/hunspell/tests/unit/data/sugutf.sug diff --git a/extensions/spellcheck/hunspell/tests/sugutf.test b/extensions/spellcheck/hunspell/tests/unit/data/sugutf.test similarity index 100% rename from extensions/spellcheck/hunspell/tests/sugutf.test rename to extensions/spellcheck/hunspell/tests/unit/data/sugutf.test diff --git a/extensions/spellcheck/hunspell/tests/sugutf.wrong b/extensions/spellcheck/hunspell/tests/unit/data/sugutf.wrong similarity index 100% rename from extensions/spellcheck/hunspell/tests/sugutf.wrong rename to extensions/spellcheck/hunspell/tests/unit/data/sugutf.wrong diff --git a/extensions/spellcheck/hunspell/tests/test.sh b/extensions/spellcheck/hunspell/tests/unit/data/test.sh similarity index 100% rename from extensions/spellcheck/hunspell/tests/test.sh rename to extensions/spellcheck/hunspell/tests/unit/data/test.sh diff --git a/extensions/spellcheck/hunspell/tests/utf8.aff b/extensions/spellcheck/hunspell/tests/unit/data/utf8.aff similarity index 100% rename from extensions/spellcheck/hunspell/tests/utf8.aff rename to extensions/spellcheck/hunspell/tests/unit/data/utf8.aff diff --git a/extensions/spellcheck/hunspell/tests/utf8.dic b/extensions/spellcheck/hunspell/tests/unit/data/utf8.dic similarity index 100% rename from extensions/spellcheck/hunspell/tests/utf8.dic rename to extensions/spellcheck/hunspell/tests/unit/data/utf8.dic diff --git a/extensions/spellcheck/hunspell/tests/utf8.good b/extensions/spellcheck/hunspell/tests/unit/data/utf8.good similarity index 100% rename from extensions/spellcheck/hunspell/tests/utf8.good rename to extensions/spellcheck/hunspell/tests/unit/data/utf8.good diff --git a/extensions/spellcheck/hunspell/tests/utf8.test b/extensions/spellcheck/hunspell/tests/unit/data/utf8.test similarity index 100% rename from extensions/spellcheck/hunspell/tests/utf8.test rename to extensions/spellcheck/hunspell/tests/unit/data/utf8.test diff --git a/extensions/spellcheck/hunspell/tests/utf8_bom.aff b/extensions/spellcheck/hunspell/tests/unit/data/utf8_bom.aff similarity index 100% rename from extensions/spellcheck/hunspell/tests/utf8_bom.aff rename to extensions/spellcheck/hunspell/tests/unit/data/utf8_bom.aff diff --git a/extensions/spellcheck/hunspell/tests/utf8_bom.dic b/extensions/spellcheck/hunspell/tests/unit/data/utf8_bom.dic similarity index 100% rename from extensions/spellcheck/hunspell/tests/utf8_bom.dic rename to extensions/spellcheck/hunspell/tests/unit/data/utf8_bom.dic diff --git a/extensions/spellcheck/hunspell/tests/utf8_bom.good b/extensions/spellcheck/hunspell/tests/unit/data/utf8_bom.good similarity index 100% rename from extensions/spellcheck/hunspell/tests/utf8_bom.good rename to extensions/spellcheck/hunspell/tests/unit/data/utf8_bom.good diff --git a/extensions/spellcheck/hunspell/tests/utf8_bom.test b/extensions/spellcheck/hunspell/tests/unit/data/utf8_bom.test similarity index 100% rename from extensions/spellcheck/hunspell/tests/utf8_bom.test rename to extensions/spellcheck/hunspell/tests/unit/data/utf8_bom.test diff --git a/extensions/spellcheck/hunspell/tests/utf8_bom2.aff b/extensions/spellcheck/hunspell/tests/unit/data/utf8_bom2.aff similarity index 100% rename from extensions/spellcheck/hunspell/tests/utf8_bom2.aff rename to extensions/spellcheck/hunspell/tests/unit/data/utf8_bom2.aff diff --git a/extensions/spellcheck/hunspell/tests/utf8_bom2.dic b/extensions/spellcheck/hunspell/tests/unit/data/utf8_bom2.dic similarity index 100% rename from extensions/spellcheck/hunspell/tests/utf8_bom2.dic rename to extensions/spellcheck/hunspell/tests/unit/data/utf8_bom2.dic diff --git a/extensions/spellcheck/hunspell/tests/utf8_bom2.good b/extensions/spellcheck/hunspell/tests/unit/data/utf8_bom2.good similarity index 100% rename from extensions/spellcheck/hunspell/tests/utf8_bom2.good rename to extensions/spellcheck/hunspell/tests/unit/data/utf8_bom2.good diff --git a/extensions/spellcheck/hunspell/tests/utf8_bom2.test b/extensions/spellcheck/hunspell/tests/unit/data/utf8_bom2.test similarity index 100% rename from extensions/spellcheck/hunspell/tests/utf8_bom2.test rename to extensions/spellcheck/hunspell/tests/unit/data/utf8_bom2.test diff --git a/extensions/spellcheck/hunspell/tests/utf8_nonbmp.aff b/extensions/spellcheck/hunspell/tests/unit/data/utf8_nonbmp.aff similarity index 100% rename from extensions/spellcheck/hunspell/tests/utf8_nonbmp.aff rename to extensions/spellcheck/hunspell/tests/unit/data/utf8_nonbmp.aff diff --git a/extensions/spellcheck/hunspell/tests/utf8_nonbmp.dic b/extensions/spellcheck/hunspell/tests/unit/data/utf8_nonbmp.dic similarity index 100% rename from extensions/spellcheck/hunspell/tests/utf8_nonbmp.dic rename to extensions/spellcheck/hunspell/tests/unit/data/utf8_nonbmp.dic diff --git a/extensions/spellcheck/hunspell/tests/utf8_nonbmp.good b/extensions/spellcheck/hunspell/tests/unit/data/utf8_nonbmp.good similarity index 100% rename from extensions/spellcheck/hunspell/tests/utf8_nonbmp.good rename to extensions/spellcheck/hunspell/tests/unit/data/utf8_nonbmp.good diff --git a/extensions/spellcheck/hunspell/tests/utf8_nonbmp.sug b/extensions/spellcheck/hunspell/tests/unit/data/utf8_nonbmp.sug similarity index 100% rename from extensions/spellcheck/hunspell/tests/utf8_nonbmp.sug rename to extensions/spellcheck/hunspell/tests/unit/data/utf8_nonbmp.sug diff --git a/extensions/spellcheck/hunspell/tests/utf8_nonbmp.test b/extensions/spellcheck/hunspell/tests/unit/data/utf8_nonbmp.test similarity index 100% rename from extensions/spellcheck/hunspell/tests/utf8_nonbmp.test rename to extensions/spellcheck/hunspell/tests/unit/data/utf8_nonbmp.test diff --git a/extensions/spellcheck/hunspell/tests/utf8_nonbmp.wrong b/extensions/spellcheck/hunspell/tests/unit/data/utf8_nonbmp.wrong similarity index 100% rename from extensions/spellcheck/hunspell/tests/utf8_nonbmp.wrong rename to extensions/spellcheck/hunspell/tests/unit/data/utf8_nonbmp.wrong diff --git a/extensions/spellcheck/hunspell/tests/utfcompound.aff b/extensions/spellcheck/hunspell/tests/unit/data/utfcompound.aff similarity index 100% rename from extensions/spellcheck/hunspell/tests/utfcompound.aff rename to extensions/spellcheck/hunspell/tests/unit/data/utfcompound.aff diff --git a/extensions/spellcheck/hunspell/tests/utfcompound.dic b/extensions/spellcheck/hunspell/tests/unit/data/utfcompound.dic similarity index 100% rename from extensions/spellcheck/hunspell/tests/utfcompound.dic rename to extensions/spellcheck/hunspell/tests/unit/data/utfcompound.dic diff --git a/extensions/spellcheck/hunspell/tests/utfcompound.good b/extensions/spellcheck/hunspell/tests/unit/data/utfcompound.good similarity index 100% rename from extensions/spellcheck/hunspell/tests/utfcompound.good rename to extensions/spellcheck/hunspell/tests/unit/data/utfcompound.good diff --git a/extensions/spellcheck/hunspell/tests/utfcompound.test b/extensions/spellcheck/hunspell/tests/unit/data/utfcompound.test similarity index 100% rename from extensions/spellcheck/hunspell/tests/utfcompound.test rename to extensions/spellcheck/hunspell/tests/unit/data/utfcompound.test diff --git a/extensions/spellcheck/hunspell/tests/utfcompound.wrong b/extensions/spellcheck/hunspell/tests/unit/data/utfcompound.wrong similarity index 100% rename from extensions/spellcheck/hunspell/tests/utfcompound.wrong rename to extensions/spellcheck/hunspell/tests/unit/data/utfcompound.wrong diff --git a/extensions/spellcheck/hunspell/tests/warn.aff b/extensions/spellcheck/hunspell/tests/unit/data/warn.aff similarity index 100% rename from extensions/spellcheck/hunspell/tests/warn.aff rename to extensions/spellcheck/hunspell/tests/unit/data/warn.aff diff --git a/extensions/spellcheck/hunspell/tests/warn.dic b/extensions/spellcheck/hunspell/tests/unit/data/warn.dic similarity index 100% rename from extensions/spellcheck/hunspell/tests/warn.dic rename to extensions/spellcheck/hunspell/tests/unit/data/warn.dic diff --git a/extensions/spellcheck/hunspell/tests/warn.good b/extensions/spellcheck/hunspell/tests/unit/data/warn.good similarity index 100% rename from extensions/spellcheck/hunspell/tests/warn.good rename to extensions/spellcheck/hunspell/tests/unit/data/warn.good diff --git a/extensions/spellcheck/hunspell/tests/warn.test b/extensions/spellcheck/hunspell/tests/unit/data/warn.test similarity index 100% rename from extensions/spellcheck/hunspell/tests/warn.test rename to extensions/spellcheck/hunspell/tests/unit/data/warn.test diff --git a/extensions/spellcheck/hunspell/tests/zeroaffix.aff b/extensions/spellcheck/hunspell/tests/unit/data/zeroaffix.aff similarity index 100% rename from extensions/spellcheck/hunspell/tests/zeroaffix.aff rename to extensions/spellcheck/hunspell/tests/unit/data/zeroaffix.aff diff --git a/extensions/spellcheck/hunspell/tests/zeroaffix.dic b/extensions/spellcheck/hunspell/tests/unit/data/zeroaffix.dic similarity index 100% rename from extensions/spellcheck/hunspell/tests/zeroaffix.dic rename to extensions/spellcheck/hunspell/tests/unit/data/zeroaffix.dic diff --git a/extensions/spellcheck/hunspell/tests/zeroaffix.good b/extensions/spellcheck/hunspell/tests/unit/data/zeroaffix.good similarity index 100% rename from extensions/spellcheck/hunspell/tests/zeroaffix.good rename to extensions/spellcheck/hunspell/tests/unit/data/zeroaffix.good diff --git a/extensions/spellcheck/hunspell/tests/zeroaffix.morph b/extensions/spellcheck/hunspell/tests/unit/data/zeroaffix.morph similarity index 100% rename from extensions/spellcheck/hunspell/tests/zeroaffix.morph rename to extensions/spellcheck/hunspell/tests/unit/data/zeroaffix.morph diff --git a/extensions/spellcheck/hunspell/tests/zeroaffix.test b/extensions/spellcheck/hunspell/tests/unit/data/zeroaffix.test similarity index 100% rename from extensions/spellcheck/hunspell/tests/zeroaffix.test rename to extensions/spellcheck/hunspell/tests/unit/data/zeroaffix.test diff --git a/js/src/config/Makefile.in b/js/src/config/Makefile.in index 2e818cf3de49..750f87897156 100644 --- a/js/src/config/Makefile.in +++ b/js/src/config/Makefile.in @@ -14,11 +14,8 @@ include $(DEPTH)/config/autoconf.mk # headers, so that we can use it to set up the wrapped system headers. VISIBILITY_FLAGS = +ifneq (WINNT,$(HOST_OS_ARCH)) HOST_PROGRAM = nsinstall$(HOST_BIN_SUFFIX) - -ifeq (WINNT,$(HOST_OS_ARCH)) -HOST_CSRCS = nsinstall_win.c -else HOST_CSRCS = nsinstall.c pathsub.c endif diff --git a/js/src/config/config.mk b/js/src/config/config.mk index 4457f50a1bd1..c46b3b123f33 100644 --- a/js/src/config/config.mk +++ b/js/src/config/config.mk @@ -633,19 +633,25 @@ endif PWD := $(CURDIR) endif +NSINSTALL_PY := $(PYTHON) $(call core_abspath,$(topsrcdir)/config/nsinstall.py) + ifdef NSINSTALL_BIN NSINSTALL = $(NSINSTALL_BIN) else ifeq (OS2,$(CROSS_COMPILE)$(OS_ARCH)) NSINSTALL = $(MOZ_TOOLS_DIR)/nsinstall else +ifeq ($(HOST_OS_ARCH),WINNT) +NSINSTALL = $(NSINSTALL_PY) +else NSINSTALL = $(CONFIG_TOOLS)/nsinstall$(HOST_BIN_SUFFIX) +endif # WINNT endif # OS2 endif # NSINSTALL_BIN ifeq (,$(CROSS_COMPILE)$(filter-out WINNT OS2, $(OS_ARCH))) -INSTALL = $(NSINSTALL) +INSTALL = $(NSINSTALL) -t else # This isn't laid out as conditional directives so that NSDISTMODE can be @@ -657,13 +663,8 @@ endif # WINNT/OS2 # Use nsinstall in copy mode to install files on the system SYSINSTALL = $(NSINSTALL) -t -# Directory nsinstall. Windows and OS/2 nsinstall can't recursively copy -# directories. -ifneq (,$(filter WINNT os2-emx,$(HOST_OS_ARCH))) -DIR_INSTALL = $(PYTHON) $(topsrcdir)/config/nsinstall.py -else +# Directory nsinstall. DIR_INSTALL = $(INSTALL) -endif # WINNT/OS2 # # Localization build automation diff --git a/js/src/config/nsinstall.py b/js/src/config/nsinstall.py index 4cb34b0a4327..42f920feb634 100644 --- a/js/src/config/nsinstall.py +++ b/js/src/config/nsinstall.py @@ -15,6 +15,7 @@ import os import os.path import sys import shutil +import stat def nsinstall(argv): usage = "usage: %prog [options] arg1 [arg2 ...] target-directory" @@ -51,6 +52,13 @@ def nsinstall(argv): help="Set group (NOT SUPPORTED)", metavar="group") (options, args) = p.parse_args(argv) + # Switching to Unicode strings makes python use the wide Windows APIs, which is + # what we want here since the wide APIs normally do a better job at handling long + # paths and such. + if sys.stdin.encoding is None: + args = [unicode(arg) for arg in args] + else: + args = [unicode(arg, sys.stdin.encoding) for arg in args] if options.m: # mode is specified @@ -61,36 +69,47 @@ def nsinstall(argv): return 1 # just create one directory? - if options.D: - if len(args) != 1: + def maybe_create_dir(dir, mode, try_again): + if os.path.exists(dir): + if not os.path.isdir(dir): + print >> sys.stderr, ('nsinstall: %s is not a directory' % dir) + return 1 + if mode: + os.chmod(dir, mode) + return 0 + + try: + if mode: + os.makedirs(dir, mode) + else: + os.makedirs(dir) + except Exception, e: + # We might have hit EEXIST due to a race condition (see bug 463411) -- try again once + if try_again: + return maybe_create_dir(dir, mode, False) + print >> sys.stderr, ("nsinstall: failed to create directory %s: %s" % (dir, e)) return 1 - if os.path.exists(args[0]): - if not os.path.isdir(args[0]): - sys.stderr.write('nsinstall: ' + args[0] + ' is not a directory\n') - sys.exit(1) - if options.m: - os.chmod(args[0], options.m) - sys.exit() - if options.m: - os.makedirs(args[0], options.m) else: - os.makedirs(args[0]) - return 0 + return 0 if options.X: options.X = [os.path.abspath(p) for p in options.X] + if options.D: + return maybe_create_dir(args[0], options.m, True) + # nsinstall arg1 [...] directory if len(args) < 2: p.error('not enough arguments') def copy_all_entries(entries, target): for e in entries: - if options.X and os.path.abspath(e) in options.X: + e = os.path.abspath(e) + if options.X and e in options.X: continue - dest = os.path.join(target, - os.path.basename(os.path.normpath(e))) + dest = os.path.join(target, os.path.basename(e)) + dest = os.path.abspath(dest) handleTarget(e, dest) if options.m: os.chmod(dest, options.m) @@ -112,19 +131,46 @@ def nsinstall(argv): # options.t is not relevant for directories if options.m: os.chmod(targetpath, options.m) - elif options.t: - shutil.copy2(srcpath, targetpath) else: - shutil.copy(srcpath, targetpath) + if os.path.exists(targetpath): + # On Windows, read-only files can't be deleted + os.chmod(targetpath, stat.S_IWUSR) + os.remove(targetpath) + if options.t: + shutil.copy2(srcpath, targetpath) + else: + shutil.copy(srcpath, targetpath) # the last argument is the target directory target = args.pop() - # ensure target directory - if not os.path.isdir(target): - os.makedirs(target) + # ensure target directory (importantly, we do not apply a mode to the directory + # because we want to copy files into it and the mode might be read-only) + rv = maybe_create_dir(target, None, True) + if rv != 0: + return rv copy_all_entries(args, target) return 0 if __name__ == '__main__': - sys.exit(nsinstall(sys.argv[1:])) + # sys.argv corrupts characters outside the system code page on Windows + # . Use ctypes instead. + if sys.platform == "win32": + import ctypes + from ctypes import wintypes + GetCommandLine = ctypes.windll.kernel32.GetCommandLineW + GetCommandLine.argtypes = [] + GetCommandLine.restype = wintypes.LPWSTR + + CommandLineToArgv = ctypes.windll.shell32.CommandLineToArgvW + CommandLineToArgv.argtypes = [wintypes.LPWSTR, ctypes.POINTER(ctypes.c_int)] + CommandLineToArgv.restype = ctypes.POINTER(wintypes.LPWSTR) + + argc = ctypes.c_int(0) + argv_arr = CommandLineToArgv(GetCommandLine(), ctypes.byref(argc)) + # The first argument will be "python", the second will be the .py file + argv = argv_arr[1:argc.value] + else: + argv = sys.argv + + sys.exit(nsinstall(argv[1:])) diff --git a/js/src/config/nsinstall_win.c b/js/src/config/nsinstall_win.c deleted file mode 100644 index 0f72c5d4a465..000000000000 --- a/js/src/config/nsinstall_win.c +++ /dev/null @@ -1,747 +0,0 @@ -/* This Source Code Form is subject to the terms of the Mozilla Public - * License, v. 2.0. If a copy of the MPL was not distributed with this - * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ - -/* - * The nsinstall command for Win32 - * - * Our gmake makefiles use the nsinstall command to create the - * object directories or installing headers and libs. This code was originally - * taken from shmsdos.c - */ - -#include -#include -#include -#include -#include -#pragma hdrstop - -/* - * sh_FileFcn -- - * - * A function that operates on a file. The pathname is either - * absolute or relative to the current directory, and contains - * no wildcard characters such as * and ?. Additional arguments - * can be passed to the function via the arg pointer. - */ - -typedef BOOL (*sh_FileFcn)( - wchar_t *pathName, - WIN32_FIND_DATA *fileData, - void *arg); - -static int shellCp (wchar_t **pArgv); -static int shellNsinstall (wchar_t **pArgv); -static int shellMkdir (wchar_t **pArgv); -static BOOL sh_EnumerateFiles(const wchar_t *pattern, const wchar_t *where, - sh_FileFcn fileFcn, void *arg, int *nFiles); -static const char *sh_GetLastErrorMessage(void); -static BOOL sh_DoCopy(wchar_t *srcFileName, DWORD srcFileAttributes, - wchar_t *dstFileName, DWORD dstFileAttributes, - int force, int recursive); - -#define LONGPATH_PREFIX L"\\\\?\\" -#define ARRAY_LEN(a) (sizeof(a) / sizeof(a[0])) -#define STR_LEN(a) (ARRAY_LEN(a) - 1) - -#ifdef __MINGW32__ - -/* MingW currently does not implement a wide version of the - startup routines. Workaround is to implement something like - it ourselves. */ - -#include - -int wmain(int argc, WCHAR **argv); - -int main(int argc, char **argv) -{ - int result; - wchar_t *commandLine = GetCommandLineW(); - int argcw = 0; - wchar_t **_argvw = CommandLineToArgvW( commandLine, &argcw ); - wchar_t *argvw[argcw + 1]; - int i; - if (!_argvw) - return 127; - /* CommandLineToArgvW doesn't output the ending NULL so - we have to manually add it on */ - for ( i = 0; i < argcw; i++ ) - argvw[i] = _argvw[i]; - argvw[argcw] = NULL; - - result = wmain(argcw, argvw); - LocalFree(_argvw); - return result; -} -#endif /* __MINGW32__ */ - -/* changes all forward slashes in token to backslashes */ -void changeForwardSlashesToBackSlashes ( wchar_t *arg ) -{ - if ( arg == NULL ) - return; - - while ( *arg ) { - if ( *arg == '/' ) - *arg = '\\'; - arg++; - } -} - -int wmain(int argc, wchar_t *argv[ ]) -{ - return shellNsinstall ( argv + 1 ); -} - -static int -shellNsinstall (wchar_t **pArgv) -{ - int retVal = 0; /* exit status */ - int dirOnly = 0; /* 1 if and only if -D is specified */ - wchar_t **pSrc; - wchar_t **pDst; - - /* - * Process the command-line options. We ignore the - * options except for -D. Some options, such as -m, - * are followed by an argument. We need to skip the - * argument too. - */ - while ( *pArgv && **pArgv == '-' ) { - wchar_t c = (*pArgv)[1]; /* The char after '-' */ - - if ( c == 'D' ) { - dirOnly = 1; - } else if ( c == 'm' ) { - pArgv++; /* skip the next argument */ - } - pArgv++; - } - - if ( !dirOnly ) { - /* There are files to install. Get source files */ - if ( *pArgv ) { - pSrc = pArgv++; - } else { - fprintf( stderr, "nsinstall: not enough arguments\n"); - return 3; - } - } - - /* Get to last token to find destination directory */ - if ( *pArgv ) { - pDst = pArgv++; - if ( dirOnly && *pArgv ) { - fprintf( stderr, "nsinstall: too many arguments with -D\n"); - return 3; - } - } else { - fprintf( stderr, "nsinstall: not enough arguments\n"); - return 3; - } - while ( *pArgv ) - pDst = pArgv++; - - retVal = shellMkdir ( pDst ); - if ( retVal ) - return retVal; - if ( !dirOnly ) - retVal = shellCp ( pSrc ); - return retVal; -} - -static int -shellMkdir (wchar_t **pArgv) -{ - int retVal = 0; /* assume valid return */ - wchar_t *arg; - wchar_t *pArg; - wchar_t path[_MAX_PATH]; - wchar_t tmpPath[_MAX_PATH]; - wchar_t *pTmpPath = tmpPath; - - /* All the options are simply ignored in this implementation */ - while ( *pArgv && **pArgv == '-' ) { - if ( (*pArgv)[1] == 'm' ) { - pArgv++; /* skip the next argument (mode) */ - } - pArgv++; - } - - while ( *pArgv ) { - arg = *pArgv; - changeForwardSlashesToBackSlashes ( arg ); - pArg = arg; - pTmpPath = tmpPath; - while ( 1 ) { - /* create part of path */ - while ( *pArg ) { - *pTmpPath++ = *pArg++; - if ( *pArg == '\\' ) - break; - } - *pTmpPath = '\0'; - - /* check if directory already exists */ - _wgetcwd ( path, _MAX_PATH ); - if ( _wchdir ( tmpPath ) == -1 && - _wmkdir ( tmpPath ) == -1 && // might have hit EEXIST - _wchdir ( tmpPath ) == -1) { // so try again - char buf[2048]; - _snprintf(buf, 2048, "Could not create the directory: %S", - tmpPath); - perror ( buf ); - retVal = 3; - break; - } else { - // get back to the cwd - _wchdir ( path ); - } - if ( *pArg == '\0' ) /* complete path? */ - break; - /* loop for next directory */ - } - - pArgv++; - } - return retVal; -} - -static const char * -sh_GetLastErrorMessage() -{ - static char buf[128]; - - FormatMessageA( - FORMAT_MESSAGE_FROM_SYSTEM, - NULL, - GetLastError(), - MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), /* default language */ - buf, - sizeof(buf), - NULL - ); - return buf; -} - -/* - * struct sh_FileData -- - * - * A pointer to the sh_FileData structure is passed into sh_RecordFileData, - * which will fill in the fields. - */ - -struct sh_FileData { - wchar_t pathName[_MAX_PATH]; - DWORD dwFileAttributes; -}; - -/* - * sh_RecordFileData -- - * - * Record the pathname and attributes of the file in - * the sh_FileData structure pointed to by arg. - * - * Always return TRUE (successful completion). - * - * This function is intended to be passed into sh_EnumerateFiles - * to see if a certain pattern expands to exactly one file/directory, - * and if so, record its pathname and attributes. - */ - -static BOOL -sh_RecordFileData(wchar_t *pathName, WIN32_FIND_DATA *findData, void *arg) -{ - struct sh_FileData *fData = (struct sh_FileData *) arg; - - wcscpy(fData->pathName, pathName); - fData->dwFileAttributes = findData->dwFileAttributes; - return TRUE; -} - -static BOOL -sh_DoCopy(wchar_t *srcFileName, - DWORD srcFileAttributes, - wchar_t *dstFileName, - DWORD dstFileAttributes, - int force, - int recursive -) -{ - if (dstFileAttributes != 0xFFFFFFFF) { - if ((dstFileAttributes & FILE_ATTRIBUTE_READONLY) && force) { - dstFileAttributes &= ~FILE_ATTRIBUTE_READONLY; - SetFileAttributes(dstFileName, dstFileAttributes); - } - } - - if (srcFileAttributes & FILE_ATTRIBUTE_DIRECTORY) { - fprintf(stderr, "nsinstall: %ls is a directory\n", - srcFileName); - return FALSE; - } else { - DWORD r; - wchar_t longSrc[1004] = LONGPATH_PREFIX; - wchar_t longDst[1004] = LONGPATH_PREFIX; - r = GetFullPathName(srcFileName, 1000, longSrc + STR_LEN(LONGPATH_PREFIX), NULL); - if (!r) { - fprintf(stderr, "nsinstall: couldn't get full path of %ls: %s\n", - srcFileName, sh_GetLastErrorMessage()); - return FALSE; - } - r = GetFullPathName(dstFileName, 1000, longDst + ARRAY_LEN(LONGPATH_PREFIX) - 1, NULL); - if (!r) { - fprintf(stderr, "nsinstall: couldn't get full path of %ls: %s\n", - dstFileName, sh_GetLastErrorMessage()); - return FALSE; - } - - if (!CopyFile(longSrc, longDst, FALSE)) { - fprintf(stderr, "nsinstall: cannot copy %ls to %ls: %s\n", - srcFileName, dstFileName, sh_GetLastErrorMessage()); - return FALSE; - } - } - return TRUE; -} - -/* - * struct sh_CpCmdArg -- - * - * A pointer to the sh_CpCmdArg structure is passed into sh_CpFileCmd. - * The sh_CpCmdArg contains information about the cp command, and - * provide a buffer for constructing the destination file name. - */ - -struct sh_CpCmdArg { - int force; /* -f option, ok to overwrite an existing - * read-only destination file */ - int recursive; /* -r or -R option, recursively copy - * directories. Note: this field is not used - * by nsinstall and should always be 0. */ - wchar_t *dstFileName; /* a buffer for constructing the destination - * file name */ - wchar_t *dstFileNameMarker; /* points to where in the dstFileName buffer - * we should write the file component of the - * destination file */ -}; - -/* - * sh_CpFileCmd -- - * - * Copy a file to the destination directory - * - * This function is intended to be passed into sh_EnumerateFiles to - * copy all the files specified by the pattern to the destination - * directory. - * - * Return TRUE if the file is successfully copied, and FALSE otherwise. - */ - -static BOOL -sh_CpFileCmd(wchar_t *pathName, WIN32_FIND_DATA *findData, void *cpArg) -{ - BOOL retVal = TRUE; - struct sh_CpCmdArg *arg = (struct sh_CpCmdArg *) cpArg; - - wcscpy(arg->dstFileNameMarker, findData->cFileName); - return sh_DoCopy(pathName, findData->dwFileAttributes, - arg->dstFileName, GetFileAttributes(arg->dstFileName), - arg->force, arg->recursive); -} - -static int -shellCp (wchar_t **pArgv) -{ - int retVal = 0; - wchar_t **pSrc; - wchar_t **pDst; - struct sh_CpCmdArg arg; - struct sh_FileData dstData; - int dstIsDir = 0; - int n; - - arg.force = 0; - arg.recursive = 0; - arg.dstFileName = dstData.pathName; - arg.dstFileNameMarker = 0; - - while (*pArgv && **pArgv == '-') { - wchar_t *p = *pArgv; - - while (*(++p)) { - if (*p == 'f') { - arg.force = 1; - } - } - pArgv++; - } - - /* the first source file */ - if (*pArgv) { - pSrc = pArgv++; - } else { - fprintf(stderr, "nsinstall: not enough arguments\n"); - return 3; - } - - /* get to the last token to find destination */ - if (*pArgv) { - pDst = pArgv++; - } else { - fprintf(stderr, "nsinstall: not enough arguments\n"); - return 3; - } - while (*pArgv) { - pDst = pArgv++; - } - - /* - * The destination pattern must unambiguously expand to exactly - * one file or directory. - */ - - changeForwardSlashesToBackSlashes(*pDst); - sh_EnumerateFiles(*pDst, *pDst, sh_RecordFileData, &dstData, &n); - assert(n >= 0); - if (n == 1) { - /* - * Is the destination a file or directory? - */ - - if (dstData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) { - dstIsDir = 1; - } - } else if (n > 1) { - fprintf(stderr, "nsinstall: %ls: ambiguous destination file " - "or directory\n", *pDst); - return 3; - } else { - /* - * n == 0, meaning that destination file or directory does - * not exist. In this case the destination file directory - * name must be fully specified. - */ - - wchar_t *p; - - for (p = *pDst; *p; p++) { - if (*p == '*' || *p == '?') { - fprintf(stderr, "nsinstall: %ls: No such file or directory\n", - *pDst); - return 3; - } - } - - /* - * Do not include the trailing \, if any, unless it is a root - * directory (\ or X:\). - */ - - if (p > *pDst && p[-1] == '\\' && p != *pDst + 1 && p[-2] != ':') { - p[-1] = '\0'; - } - wcscpy(dstData.pathName, *pDst); - dstData.dwFileAttributes = 0xFFFFFFFF; - } - - /* - * If there are two or more source files, the destination has - * to be a directory. - */ - - if (pDst - pSrc > 1 && !dstIsDir) { - fprintf(stderr, "nsinstall: cannot copy more than" - " one file to the same destination file\n"); - return 3; - } - - if (dstIsDir) { - arg.dstFileNameMarker = arg.dstFileName + wcslen(arg.dstFileName); - - /* - * Now arg.dstFileNameMarker is pointing to the null byte at the - * end of string. We want to make sure that there is a \ at the - * end of string, and arg.dstFileNameMarker should point right - * after that \. - */ - - if (arg.dstFileNameMarker[-1] != '\\') { - *(arg.dstFileNameMarker++) = '\\'; - } - } - - if (!dstIsDir) { - struct sh_FileData srcData; - - assert(pDst - pSrc == 1); - changeForwardSlashesToBackSlashes(*pSrc); - sh_EnumerateFiles(*pSrc, *pSrc, sh_RecordFileData, &srcData, &n); - if (n == 0) { - fprintf(stderr, "nsinstall: %ls: No such file or directory\n", - *pSrc); - retVal = 3; - } else if (n > 1) { - fprintf(stderr, "nsinstall: cannot copy more than one file or " - "directory to the same destination\n"); - retVal = 3; - } else { - assert(n == 1); - if (sh_DoCopy(srcData.pathName, srcData.dwFileAttributes, - dstData.pathName, dstData.dwFileAttributes, - arg.force, arg.recursive) == FALSE) { - retVal = 3; - } - } - return retVal; - } - - for ( ; *pSrc != *pDst; pSrc++) { - BOOL rv; - - changeForwardSlashesToBackSlashes(*pSrc); - rv = sh_EnumerateFiles(*pSrc, *pSrc, sh_CpFileCmd, &arg, &n); - if (rv == FALSE) { - retVal = 3; - } else { - if (n == 0) { - fprintf(stderr, "nsinstall: %ls: No such file or directory\n", - *pSrc); - retVal = 3; - } - } - } - - return retVal; -} - -/* - * sh_EnumerateFiles -- - * - * Enumerate all the files in the specified pattern, which is a pathname - * containing possibly wildcard characters such as * and ?. fileFcn - * is called on each file, passing the expanded file name, a pointer - * to the file's WIN32_FILE_DATA, and the arg pointer. - * - * It is assumed that there are no wildcard characters before the - * character pointed to by 'where'. - * - * On return, *nFiles stores the number of files enumerated. *nFiles is - * set to this number whether sh_EnumerateFiles or 'fileFcn' succeeds - * or not. - * - * Return TRUE if the files are successfully enumerated and all - * 'fileFcn' invocations succeeded. Return FALSE if something went - * wrong. - */ - -static BOOL sh_EnumerateFiles( - const wchar_t *pattern, - const wchar_t *where, - sh_FileFcn fileFcn, - void *arg, - int *nFiles - ) -{ - WIN32_FIND_DATA fileData; - HANDLE hSearch; - const wchar_t *src; - wchar_t *dst; - wchar_t fileName[_MAX_PATH]; - wchar_t *fileNameMarker = fileName; - wchar_t *oldFileNameMarker; - BOOL hasWildcard = FALSE; - BOOL retVal = TRUE; - BOOL patternEndsInDotStar = FALSE; - BOOL patternEndsInDot = FALSE; /* a special case of - * patternEndsInDotStar */ - int numDotsInPattern; - int len; - - /* - * Windows expands patterns ending in ".", ".*", ".**", etc. - * differently from the glob expansion on Unix. For example, - * both "foo." and "foo.*" match "foo", and "*.*" matches - * everything, including filenames with no dots. So we need - * to throw away extra files returned by the FindNextFile() - * function. We require that a matched filename have at least - * the number of dots in the pattern. - */ - len = wcslen(pattern); - if (len >= 2) { - /* Start from the end of pattern and go backward */ - const wchar_t *p = &pattern[len - 1]; - - /* We can have zero or more *'s */ - while (p >= pattern && *p == '*') { - p--; - } - if (p >= pattern && *p == '.') { - patternEndsInDotStar = TRUE; - if (p == &pattern[len - 1]) { - patternEndsInDot = TRUE; - } - p--; - numDotsInPattern = 1; - while (p >= pattern && *p != '\\') { - if (*p == '.') { - numDotsInPattern++; - } - p--; - } - } - } - - *nFiles = 0; - - /* - * Copy pattern to fileName, but only up to and not including - * the first \ after the first wildcard letter. - * - * Make fileNameMarker point to one of the following: - * - the start of fileName, if fileName does not contain any \. - * - right after the \ before the first wildcard letter, if there is - * a wildcard character. - * - right after the last \, if there is no wildcard character. - */ - - dst = fileName; - src = pattern; - while (src < where) { - if (*src == '\\') { - oldFileNameMarker = fileNameMarker; - fileNameMarker = dst + 1; - } - *(dst++) = *(src++); - } - - while (*src && *src != '*' && *src != '?') { - if (*src == '\\') { - oldFileNameMarker = fileNameMarker; - fileNameMarker = dst + 1; - } - *(dst++) = *(src++); - } - - if (*src) { - /* - * Must have seen the first wildcard letter - */ - - hasWildcard = TRUE; - while (*src && *src != '\\') { - *(dst++) = *(src++); - } - } - - /* Now src points to either null or \ */ - - assert(*src == '\0' || *src == '\\'); - assert(hasWildcard || *src == '\0'); - *dst = '\0'; - - /* - * If the pattern does not contain any wildcard characters, then - * we don't need to go the FindFirstFile route. - */ - - if (!hasWildcard) { - /* - * See if it is the root directory, \, or X:\. - */ - - assert(!wcscmp(fileName, pattern)); - assert(wcslen(fileName) >= 1); - if (dst[-1] == '\\' && (dst == fileName + 1 || dst[-2] == ':')) { - fileData.cFileName[0] = '\0'; - } else { - /* - * Do not include the trailing \, if any - */ - - if (dst[-1] == '\\') { - assert(*fileNameMarker == '\0'); - dst[-1] = '\0'; - fileNameMarker = oldFileNameMarker; - } - wcscpy(fileData.cFileName, fileNameMarker); - } - fileData.dwFileAttributes = GetFileAttributes(fileName); - if (fileData.dwFileAttributes == 0xFFFFFFFF) { - return TRUE; - } - *nFiles = 1; - return (*fileFcn)(fileName, &fileData, arg); - } - - hSearch = FindFirstFile(fileName, &fileData); - if (hSearch == INVALID_HANDLE_VALUE) { - return retVal; - } - - do { - if (!wcscmp(fileData.cFileName, L".") - || !wcscmp(fileData.cFileName, L"..")) { - /* - * Skip over . and .. - */ - - continue; - } - - if (patternEndsInDotStar) { - int nDots = 0; - wchar_t *p = fileData.cFileName; - while (*p) { - if (*p == '.') { - nDots++; - } - p++; - } - /* Now p points to the null byte at the end of file name */ - if (patternEndsInDot && (p == fileData.cFileName - || p[-1] != '.')) { - /* - * File name does not end in dot. Skip this file. - * Note: windows file name probably cannot end in dot, - * but we do this check anyway. - */ - continue; - } - if (nDots < numDotsInPattern) { - /* - * Not enough dots in file name. Must be an extra - * file in matching .* pattern. Skip this file. - */ - continue; - } - } - - wcscpy(fileNameMarker, fileData.cFileName); - if (*src && *(src + 1)) { - /* - * More to go. Recurse. - */ - - int n; - - assert(*src == '\\'); - where = fileName + wcslen(fileName); - wcscat(fileName, src); - sh_EnumerateFiles(fileName, where, fileFcn, arg, &n); - *nFiles += n; - } else { - assert(wcschr(fileName, '*') == NULL); - assert(wcschr(fileName, '?') == NULL); - (*nFiles)++; - if ((*fileFcn)(fileName, &fileData, arg) == FALSE) { - retVal = FALSE; - } - } - } while (FindNextFile(hSearch, &fileData)); - - FindClose(hSearch); - return retVal; -}