wintrust/tests: Fix test on win9x.
[wine] / dlls / lz32 / tests / lzexpand_main.c
1 /*
2  * Unit test suite for lz32 functions
3  *
4  * Copyright 2004 Evan Parry, Daniel Kegel
5  *
6  * This library is free software; you can redistribute it and/or
7  * modify it under the terms of the GNU Lesser General Public
8  * License as published by the Free Software Foundation; either
9  * version 2.1 of the License, or (at your option) any later version.
10  *
11  * This library is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
14  * Lesser General Public License for more details.
15  *
16  * You should have received a copy of the GNU Lesser General Public
17  * License along with this library; if not, write to the Free Software
18  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
19  */
20
21 #include <stdarg.h>
22 #include <windef.h>
23 #include <winbase.h>
24 #include <stdlib.h>
25 #include <winerror.h>
26 #include <lzexpand.h>
27
28 #include "wine/test.h"
29
30 /* Compressed file names end with underscore. */
31 static char filename [] = "testfile.xxx";
32 static char filename_[] = "testfile.xx_";
33 static WCHAR filenameW [] = {'t','e','s','t','f','i','l','e','.','x','x','x',0};
34 static WCHAR filenameW_[] = {'t','e','s','t','f','i','l','e','.','x','x','_',0};
35
36 static char dotless [] = "dotless";
37 static char dotless_[] = "dotless._";
38 static WCHAR dotlessW [] = {'d','o','t','l','e','s','s', 0};
39 static WCHAR dotlessW_[] = {'d','o','t','l','e','s','s','.','_', 0};
40
41 static char extless [] = "extless.";
42 static char extless_[] = "extless._";
43 static WCHAR extlessW [] = {'e','x','t','l','e','s','s','.', 0};
44 static WCHAR extlessW_[] = {'e','x','t','l','e','s','s','.','_', 0};
45
46 static char _terminated [] = "_terminated.xxxx_";
47 static char _terminated_[] = "_terminated.xxxx_";
48 static WCHAR _terminatedW [] = {'_','t','e','r','m','i','n','a','t','e','d','.','x','x','x','x','_', 0};
49 static WCHAR _terminatedW_[] = {'_','t','e','r','m','i','n','a','t','e','d','.','x','x','x','x','_', 0};
50
51 static char filename2[] = "testfile.yyy";
52
53 /* This is the hex string representation of the file created by compressing
54    a simple text file with the contents "This is a test file."
55  
56    The file was created using COMPRESS.EXE from the Windows Server 2003
57    Resource Kit from Microsoft.
58  */
59 static const unsigned char compressed_file[] = 
60   {0x53,0x5A,0x44,0x44,0x88,0xF0,0x27,0x33,0x41,
61    0x74,0x75,0x14,0x00,0x00,0xDF,0x54,0x68,0x69,
62    0x73,0x20,0xF2,0xF0,0x61,0x20,0xFF,0x74,0x65,
63    0x73,0x74,0x20,0x66,0x69,0x6C,0x03,0x65,0x2E};
64 static const DWORD compressed_file_size = sizeof(compressed_file);
65
66 static const char uncompressed_data[] = "This is a test file.";
67 static const DWORD uncompressed_data_size = sizeof(uncompressed_data) - 1;
68
69 static char *buf;
70
71 static void full_file_path_name_in_a_CWD(const char *src, char *dst, BOOL expect_short)
72 {
73   DWORD retval;
74   char shortname[MAX_PATH];
75
76   retval = GetCurrentDirectoryA(MAX_PATH, dst);
77   ok(retval > 0, "GetCurrentDirectoryA returned %d, GLE=%d\n",
78      retval, GetLastError());
79   if(dst[retval-1] != '\\')
80     /* Append backslash only when it's missing */
81       lstrcatA(dst, "\\");
82   lstrcatA(dst, src);
83   if(expect_short) 
84   {
85     memcpy(shortname, dst, MAX_PATH);
86     retval = GetShortPathName(shortname, dst, MAX_PATH-1);
87     ok(retval > 0, "GetShortPathName returned %d for '%s', GLE=%d\n",
88        retval, dst, GetLastError());
89   }
90 }
91
92 static void create_file(char *fname)
93 {
94   INT file;
95   OFSTRUCT ofs;
96   DWORD retval;
97
98   file = LZOpenFileA(fname, &ofs, OF_CREATE);
99   ok(file >= 0, "LZOpenFileA failed to create '%s'\n", fname);
100   LZClose(file);
101   retval = GetFileAttributesA(fname);
102   ok(retval != INVALID_FILE_ATTRIBUTES, "GetFileAttributesA('%s'): error %d\n", ofs.szPathName, GetLastError());
103 }
104
105 static void delete_file(char *fname)
106 {
107   INT file;
108   OFSTRUCT ofs;
109   DWORD retval;
110
111   file = LZOpenFileA(fname, &ofs, OF_DELETE);
112   ok(file >= 0, "LZOpenFileA failed to delete '%s'\n", fname);
113   LZClose(file);
114   retval = GetFileAttributesA(fname);
115   ok(retval == INVALID_FILE_ATTRIBUTES, "GetFileAttributesA succeeded on deleted file ('%s')\n", ofs.szPathName);
116 }
117
118 static void test_LZOpenFileA_existing_compressed(void)
119 {
120   OFSTRUCT test;
121   INT file;
122   char expected[MAX_PATH];
123   char short_expected[MAX_PATH];
124   char filled_0xA5[OFS_MAXPATHNAME];
125
126   /* Try to open existing compressed files: */
127   create_file(filename_);
128   create_file(dotless_);
129   create_file(extless_);
130   create_file(_terminated_);
131
132   memset(&filled_0xA5, 0xA5, OFS_MAXPATHNAME);
133   memset(&test, 0xA5, sizeof(test));
134   full_file_path_name_in_a_CWD(filename_, expected, FALSE);
135   SetLastError(0xfaceabee);
136
137   /* a, using 8.3-conformant file name. */
138   file = LZOpenFileA(filename, &test, OF_EXIST);
139   /* If the file "foo.xxx" does not exist, LZOpenFileA should then
140      check for the file "foo.xx_" and open that -- at least on some
141      operating systems.  Doesn't seem to on my copy of Win98.   
142    */
143   if(file != LZERROR_BADINHANDLE) {
144     ok(file >= 0, "LZOpenFileA returns negative file descriptor for '%s'\n", filename);
145     ok(test.cBytes == sizeof(OFSTRUCT), 
146        "LZOpenFileA set test.cBytes to %d\n", test.cBytes);
147     ok(test.nErrCode == 0, "LZOpenFileA set test.nErrCode to %d\n", 
148        test.nErrCode);
149     ok(lstrcmpA(test.szPathName, expected) == 0, 
150        "LZOpenFileA returned '%s', but was expected to return '%s'\n", 
151        test.szPathName, expected);
152     LZClose(file);
153   } else { /* Win9x */
154     ok(GetLastError() == ERROR_FILE_NOT_FOUND,
155        "GetLastError() returns %d\n", GetLastError());
156     ok(test.cBytes == 0xA5, 
157        "LZOpenFileA set test.cBytes to %d\n", test.cBytes);
158     ok(test.nErrCode == ERROR_FILE_NOT_FOUND, 
159        "LZOpenFileA set test.nErrCode to %d\n", test.nErrCode);
160     ok(strncmp(test.szPathName, filled_0xA5, OFS_MAXPATHNAME) == 0, 
161        "LZOpenFileA returned '%s', but was expected to return '%s'\n", 
162        test.szPathName, filled_0xA5);
163   }
164
165   memset(&filled_0xA5, 0xA5, OFS_MAXPATHNAME);
166   memset(&test, 0xA5, sizeof(test));
167   full_file_path_name_in_a_CWD(dotless_, expected, FALSE);
168   SetLastError(0xfaceabee);
169
170   /* b, using dotless file name. */
171   file = LZOpenFileA(dotless, &test, OF_EXIST);
172   if(file != LZERROR_BADINHANDLE) {
173     ok(file >= 0, "LZOpenFileA returns negative file descriptor for '%s'\n", dotless);
174     ok(test.cBytes == sizeof(OFSTRUCT), 
175        "LZOpenFileA set test.cBytes to %d\n", test.cBytes);
176     ok(test.nErrCode == 0, "LZOpenFileA set test.nErrCode to %d\n", 
177        test.nErrCode);
178     ok(lstrcmpA(test.szPathName, expected) == 0, 
179        "LZOpenFileA returned '%s', but was expected to return '%s'\n", 
180        test.szPathName, expected);
181     LZClose(file);
182   } else { /* Win9x */
183     ok(GetLastError() == ERROR_FILE_NOT_FOUND,
184        "GetLastError() returns %d\n", GetLastError());
185     todo_wine
186     ok(test.cBytes == 0xA5, 
187        "LZOpenFileA set test.cBytes to %d\n", test.cBytes);
188     ok(test.nErrCode == ERROR_FILE_NOT_FOUND, 
189        "LZOpenFileA set test.nErrCode to %d\n", test.nErrCode);
190     todo_wine
191     ok(strncmp(test.szPathName, filled_0xA5, OFS_MAXPATHNAME) == 0, 
192        "LZOpenFileA returned '%s', but was expected to return '%s'\n", 
193        test.szPathName, filled_0xA5);
194   }
195
196   memset(&filled_0xA5, 0xA5, OFS_MAXPATHNAME);
197   memset(&test, 0xA5, sizeof(test));
198   full_file_path_name_in_a_CWD(extless_, expected, FALSE);
199   SetLastError(0xfaceabee);
200
201   /* c, using extensionless file name. */
202   file = LZOpenFileA(extless, &test, OF_EXIST);
203   if(file != LZERROR_BADINHANDLE) {
204     ok(file >= 0, "LZOpenFileA returns negative file descriptor for '%s'\n", extless);
205     ok(test.cBytes == sizeof(OFSTRUCT), 
206        "LZOpenFileA set test.cBytes to %d\n", test.cBytes);
207     ok(test.nErrCode == 0, "LZOpenFileA set test.nErrCode to %d\n", 
208        test.nErrCode);
209     ok(lstrcmpA(test.szPathName, expected) == 0, 
210        "LZOpenFileA returned '%s', but was expected to return '%s'\n", 
211        test.szPathName, expected);
212     LZClose(file);
213   } else { /* Win9x */
214     ok(GetLastError() == ERROR_FILE_NOT_FOUND,
215        "GetLastError() returns %d\n", GetLastError());
216     ok(test.cBytes == 0xA5, 
217        "LZOpenFileA set test.cBytes to %d\n", test.cBytes);
218     ok(test.nErrCode == ERROR_FILE_NOT_FOUND, 
219        "LZOpenFileA set test.nErrCode to %d\n", test.nErrCode);
220     ok(strncmp(test.szPathName, filled_0xA5, OFS_MAXPATHNAME) == 0, 
221        "LZOpenFileA returned '%s', but was expected to return '%s'\n", 
222        test.szPathName, filled_0xA5);
223   }
224
225   memset(&filled_0xA5, 0xA5, OFS_MAXPATHNAME);
226   memset(&test, 0xA5, sizeof(test));
227   full_file_path_name_in_a_CWD(_terminated_, expected, FALSE);
228   full_file_path_name_in_a_CWD(_terminated_, short_expected, TRUE);
229
230   /* d, using underscore-terminated file name. */
231   file = LZOpenFileA(_terminated, &test, OF_EXIST);
232   ok(file >= 0, "LZOpenFileA failed on switching to a compressed file name\n");
233   ok(test.cBytes == sizeof(OFSTRUCT), 
234      "LZOpenFileA set test.cBytes to %d\n", test.cBytes);
235   ok(test.nErrCode == 0, "LZOpenFileA set test.nErrCode to %d\n", 
236      test.nErrCode);
237   ok(lstrcmpA(test.szPathName, expected) == 0 ||
238      lstrcmpA(test.szPathName, short_expected) == 0, /* Win9x */
239      "LZOpenFileA returned '%s', but was expected to return '%s' or '%s'\n", 
240      test.szPathName, expected, short_expected);
241   LZClose(file);
242
243   delete_file(filename_);
244   delete_file(dotless_);
245   delete_file(extless_);
246   delete_file(_terminated_);
247 }
248
249 static void test_LZOpenFileA_nonexisting_compressed(void)
250 {
251   OFSTRUCT test;
252   INT file;
253   char expected[MAX_PATH];
254   char filled_0xA5[OFS_MAXPATHNAME];
255
256   /* Try to open nonexisting compressed files: */
257   memset(&filled_0xA5, 0xA5, OFS_MAXPATHNAME);
258   memset(&test, 0xA5, sizeof(test));
259   full_file_path_name_in_a_CWD(filename_, expected, FALSE);
260   SetLastError(0xfaceabee);
261
262   /* a, using 8.3-conformant file name. */
263   file = LZOpenFileA(filename, &test, OF_EXIST);
264   /* If the file "foo.xxx" does not exist, LZOpenFileA should then
265      check for the file "foo.xx_" and open that -- at least on some
266      operating systems.  Doesn't seem to on my copy of Win98.   
267    */
268   ok(file == LZERROR_BADINHANDLE, 
269      "LZOpenFileA succeeded on nonexistent file\n");
270   ok(GetLastError() == ERROR_FILE_NOT_FOUND,
271      "GetLastError() returns %d\n", GetLastError());
272   todo_wine
273   ok(test.cBytes == 0xA5, 
274      "LZOpenFileA set test.cBytes to %d\n", test.cBytes);
275   ok(test.nErrCode == ERROR_FILE_NOT_FOUND, 
276      "LZOpenFileA set test.nErrCode to %d\n", test.nErrCode);
277   ok(lstrcmpA(test.szPathName, expected) == 0 ||
278      strncmp(test.szPathName, filled_0xA5, OFS_MAXPATHNAME) == 0, /* Win9x */
279      "LZOpenFileA returned '%s', but was expected to return '%s' or '%s'\n", 
280      test.szPathName, expected, filled_0xA5);
281
282   memset(&filled_0xA5, 0xA5, OFS_MAXPATHNAME);
283   memset(&test, 0xA5, sizeof(test));
284   full_file_path_name_in_a_CWD(dotless_, expected, FALSE);
285   SetLastError(0xfaceabee);
286
287   /* b, using dotless file name. */
288   file = LZOpenFileA(dotless, &test, OF_EXIST);
289   ok(file == LZERROR_BADINHANDLE, 
290      "LZOpenFileA succeeded on nonexistent file\n");
291   ok(GetLastError() == ERROR_FILE_NOT_FOUND,
292      "GetLastError() returns %d\n", GetLastError());
293   todo_wine
294   ok(test.cBytes == 0xA5, 
295      "LZOpenFileA set test.cBytes to %d\n", test.cBytes);
296   ok(test.nErrCode == ERROR_FILE_NOT_FOUND, 
297      "LZOpenFileA set test.nErrCode to %d\n", test.nErrCode);
298   ok(lstrcmpA(test.szPathName, expected) == 0 ||
299      strncmp(test.szPathName, filled_0xA5, OFS_MAXPATHNAME) == 0, /* Win9x */
300      "LZOpenFileA returned '%s', but was expected to return '%s' or '%s'\n", 
301      test.szPathName, expected, filled_0xA5);
302
303   memset(&filled_0xA5, 0xA5, OFS_MAXPATHNAME);
304   memset(&test, 0xA5, sizeof(test));
305   full_file_path_name_in_a_CWD(extless_, expected, FALSE);
306   SetLastError(0xfaceabee);
307
308   /* c, using extensionless file name. */
309   file = LZOpenFileA(extless, &test, OF_EXIST);
310   ok(file == LZERROR_BADINHANDLE, 
311      "LZOpenFileA succeeded on nonexistent file\n");
312   ok(GetLastError() == ERROR_FILE_NOT_FOUND,
313      "GetLastError() returns %d\n", GetLastError());
314   todo_wine
315   ok(test.cBytes == 0xA5, 
316      "LZOpenFileA set test.cBytes to %d\n", test.cBytes);
317   ok(test.nErrCode == ERROR_FILE_NOT_FOUND, 
318      "LZOpenFileA set test.nErrCode to %d\n", test.nErrCode);
319   ok(lstrcmpA(test.szPathName, expected) == 0 ||
320      strncmp(test.szPathName, filled_0xA5, OFS_MAXPATHNAME) == 0, /* Win9x */
321      "LZOpenFileA returned '%s', but was expected to return '%s' or '%s'\n", 
322      test.szPathName, expected, filled_0xA5);
323
324   memset(&filled_0xA5, 0xA5, OFS_MAXPATHNAME);
325   memset(&test, 0xA5, sizeof(test));
326   full_file_path_name_in_a_CWD(_terminated_, expected, FALSE);
327   SetLastError(0xfaceabee);
328
329   /* d, using underscore-terminated file name. */
330   file = LZOpenFileA(_terminated, &test, OF_EXIST);
331   ok(file == LZERROR_BADINHANDLE, 
332      "LZOpenFileA succeeded on nonexistent file\n");
333   ok(GetLastError() == ERROR_FILE_NOT_FOUND,
334      "GetLastError() returns %d\n", GetLastError());
335   todo_wine
336   ok(test.cBytes == 0xA5, 
337      "LZOpenFileA set test.cBytes to %d\n", test.cBytes);
338   ok(test.nErrCode == ERROR_FILE_NOT_FOUND, 
339      "LZOpenFileA set test.nErrCode to %d\n", test.nErrCode);
340   ok(lstrcmpA(test.szPathName, expected) == 0 ||
341      strncmp(test.szPathName, filled_0xA5, OFS_MAXPATHNAME) == 0, /* Win9x */
342      "LZOpenFileA returned '%s', but was expected to return '%s' or '%s'\n", 
343      test.szPathName, expected, filled_0xA5);
344 }
345
346 static void test_LZOpenFileA(void)
347 {
348   OFSTRUCT test;
349   DWORD retval;
350   INT file;
351   static char badfilename_[] = "badfilename_";
352   char expected[MAX_PATH];
353   char short_expected[MAX_PATH];
354
355   SetLastError(0xfaceabee);
356   /* Check for nonexistent file. */
357   file = LZOpenFileA(badfilename_, &test, OF_READ);
358   ok(file == LZERROR_BADINHANDLE, 
359      "LZOpenFileA succeeded on nonexistent file\n");
360   ok(GetLastError() == ERROR_FILE_NOT_FOUND, 
361      "GetLastError() returns %d\n", GetLastError());
362   LZClose(file);
363
364   memset(&test, 0xA5, sizeof(test));
365   full_file_path_name_in_a_CWD(filename_, expected, FALSE);
366
367   /* Create an empty file. */
368   file = LZOpenFileA(filename_, &test, OF_CREATE);
369   ok(file >= 0, "LZOpenFileA failed on creation\n");
370   ok(test.cBytes == sizeof(OFSTRUCT),
371      "LZOpenFileA set test.cBytes to %d\n", test.cBytes);
372   ok(test.nErrCode == ERROR_SUCCESS,
373      "LZOpenFileA set test.nErrCode to %d\n", test.nErrCode);
374   ok(lstrcmpA(test.szPathName, expected) == 0,
375      "LZOpenFileA returned '%s', but was expected to return '%s'\n",
376      test.szPathName, expected);
377   LZClose(file);
378
379   retval = GetFileAttributesA(filename_);
380   ok(retval != INVALID_FILE_ATTRIBUTES, "GetFileAttributesA: error %d\n", 
381      GetLastError());
382
383   /* Check various opening options: */
384   memset(&test, 0xA5, sizeof(test));
385   full_file_path_name_in_a_CWD(filename_, short_expected, TRUE);
386
387   /* a, for reading. */
388   file = LZOpenFileA(filename_, &test, OF_READ);
389   ok(file >= 0, "LZOpenFileA failed on read\n");
390   ok(test.cBytes == sizeof(OFSTRUCT),
391      "LZOpenFileA set test.cBytes to %d\n", test.cBytes);
392   ok(test.nErrCode == ERROR_SUCCESS,
393      "LZOpenFileA set test.nErrCode to %d\n", test.nErrCode);
394   ok(lstrcmpA(test.szPathName, expected) == 0 ||
395      lstrcmpA(test.szPathName, short_expected) == 0, /* Win9x */
396      "LZOpenFileA returned '%s', but was expected to return '%s' or '%s'\n",
397      test.szPathName, expected, short_expected);
398   LZClose(file);
399
400   memset(&test, 0xA5, sizeof(test));
401
402   /* b, for writing. */
403   file = LZOpenFileA(filename_, &test, OF_WRITE);
404   ok(file >= 0, "LZOpenFileA failed on write\n");
405   ok(test.cBytes == sizeof(OFSTRUCT),
406      "LZOpenFileA set test.cBytes to %d\n", test.cBytes);
407   ok(test.nErrCode == ERROR_SUCCESS,
408      "LZOpenFileA set test.nErrCode to %d\n", test.nErrCode);
409   ok(lstrcmpA(test.szPathName, expected) == 0 ||
410      lstrcmpA(test.szPathName, short_expected) == 0, /* Win9x */
411      "LZOpenFileA returned '%s', but was expected to return '%s' or '%s'\n",
412      test.szPathName, expected, short_expected);
413   LZClose(file);
414
415   memset(&test, 0xA5, sizeof(test));
416
417   /* c, for reading and writing. */
418   file = LZOpenFileA(filename_, &test, OF_READWRITE);
419   ok(file >= 0, "LZOpenFileA failed on read/write\n");
420   ok(test.cBytes == sizeof(OFSTRUCT),
421      "LZOpenFileA set test.cBytes to %d\n", test.cBytes);
422   ok(test.nErrCode == ERROR_SUCCESS,
423      "LZOpenFileA set test.nErrCode to %d\n", test.nErrCode);
424   ok(lstrcmpA(test.szPathName, expected) == 0 ||
425      lstrcmpA(test.szPathName, short_expected) == 0, /* Win9x */
426      "LZOpenFileA returned '%s', but was expected to return '%s' or '%s'\n",
427      test.szPathName, expected, short_expected);
428   LZClose(file);
429
430   memset(&test, 0xA5, sizeof(test));
431
432   /* d, for checking file existence. */
433   file = LZOpenFileA(filename_, &test, OF_EXIST);
434   ok(file >= 0, "LZOpenFileA failed on read/write\n");
435   ok(test.cBytes == sizeof(OFSTRUCT),
436      "LZOpenFileA set test.cBytes to %d\n", test.cBytes);
437   ok(test.nErrCode == ERROR_SUCCESS,
438      "LZOpenFileA set test.nErrCode to %d\n", test.nErrCode);
439   ok(lstrcmpA(test.szPathName, expected) == 0 ||
440      lstrcmpA(test.szPathName, short_expected) == 0, /* Win9x */
441      "LZOpenFileA returned '%s', but was expected to return '%s' or '%s'\n",
442      test.szPathName, expected, short_expected);
443   LZClose(file);
444
445   memset(&test, 0xA5, sizeof(test));
446
447   /* Delete the file then make sure it doesn't exist anymore. */
448   file = LZOpenFileA(filename_, &test, OF_DELETE);
449   ok(file >= 0, "LZOpenFileA failed on delete\n");
450   ok(test.cBytes == sizeof(OFSTRUCT),
451      "LZOpenFileA set test.cBytes to %d\n", test.cBytes);
452   ok(test.nErrCode == ERROR_SUCCESS,
453      "LZOpenFileA set test.nErrCode to %d\n", test.nErrCode);
454   ok(lstrcmpA(test.szPathName, expected) == 0 ||
455      lstrcmpA(test.szPathName, short_expected) == 0, /* Win9x */
456      "LZOpenFileA returned '%s', but was expected to return '%s' or '%s'\n",
457      test.szPathName, expected, short_expected);
458   LZClose(file);
459
460   retval = GetFileAttributesA(filename_);
461   ok(retval == INVALID_FILE_ATTRIBUTES, 
462      "GetFileAttributesA succeeded on deleted file\n");
463
464   test_LZOpenFileA_existing_compressed();
465   test_LZOpenFileA_nonexisting_compressed();
466 }
467
468 static void test_LZRead(void)
469 {
470   HANDLE file;
471   DWORD ret;
472   int cfile;
473   OFSTRUCT test;
474   BOOL retok;
475
476   /* Create the compressed file. */
477   file = CreateFileA(filename_, GENERIC_WRITE, 0, NULL, CREATE_NEW, 0, 0);
478   ok(file != INVALID_HANDLE_VALUE, "Could not create test file\n");
479   retok = WriteFile(file, compressed_file, compressed_file_size, &ret, 0);
480   ok( retok, "WriteFile: error %d\n", GetLastError());
481   ok(ret == compressed_file_size, "Wrote wrong number of bytes with WriteFile?\n");
482   CloseHandle(file);
483
484   cfile = LZOpenFileA(filename_, &test, OF_READ);
485   ok(cfile > 0, "LZOpenFileA failed\n");
486
487   ret = LZRead(cfile, buf, uncompressed_data_size);
488   ok(ret == uncompressed_data_size, "Read wrong number of bytes\n");
489
490   /* Compare what we read with what we think we should read. */
491   ok(memcmp(buf, uncompressed_data, uncompressed_data_size) == 0,
492      "buffer contents mismatch\n");
493
494   todo_wine {
495      /* Wine returns the number of bytes actually read instead of an error */
496      ret = LZRead(cfile, buf, uncompressed_data_size);
497      ok(ret == LZERROR_READ, "Expected read-past-EOF to return LZERROR_READ\n");
498   }
499
500   LZClose(cfile);
501
502   ret = DeleteFileA(filename_);
503   ok(ret, "DeleteFileA: error %d\n", GetLastError());
504 }
505
506 static void test_LZCopy(void)
507 {
508   HANDLE file;
509   DWORD ret;
510   int source, dest;
511   OFSTRUCT stest, dtest;
512   BOOL retok;
513
514   /* Create the compressed file. */
515   file = CreateFileA(filename_, GENERIC_WRITE, 0, NULL, CREATE_NEW, 0, 0);
516   ok(file != INVALID_HANDLE_VALUE, 
517      "CreateFileA: error %d\n", GetLastError());
518   retok = WriteFile(file, compressed_file, compressed_file_size, &ret, 0);
519   ok( retok, "WriteFile error %d\n", GetLastError());
520   ok(ret == compressed_file_size, "Wrote wrong number of bytes\n");
521   CloseHandle(file);
522
523   source = LZOpenFileA(filename_, &stest, OF_READ);
524   ok(source >= 0, "LZOpenFileA failed on compressed file\n");
525   dest = LZOpenFileA(filename2, &dtest, OF_CREATE);
526   ok(dest >= 0, "LZOpenFileA failed on creating new file %d\n", dest);
527
528   ret = LZCopy(source, dest);
529   ok(ret > 0, "LZCopy error\n");
530
531   LZClose(source);
532   LZClose(dest);
533
534   file = CreateFileA(filename2, GENERIC_READ, 0, NULL, OPEN_EXISTING, 0, 0);
535   ok(file != INVALID_HANDLE_VALUE,
536      "CreateFileA: error %d\n", GetLastError());
537
538   retok = ReadFile(file, buf, uncompressed_data_size*2, &ret, 0);
539   ok( retok && ret == uncompressed_data_size, "ReadFile: error %d\n", GetLastError());
540   /* Compare what we read with what we think we should read. */
541   ok(!memcmp(buf, uncompressed_data, uncompressed_data_size),
542      "buffer contents mismatch\n");
543   CloseHandle(file);
544
545   ret = DeleteFileA(filename_);
546   ok(ret, "DeleteFileA: error %d\n", GetLastError());
547   ret = DeleteFileA(filename2);
548   ok(ret, "DeleteFileA: error %d\n", GetLastError());
549 }
550
551 static void create_fileW(WCHAR *fnameW)
552 {
553   INT file;
554   OFSTRUCT ofs;
555   DWORD retval;
556
557   file = LZOpenFileW(fnameW, &ofs, OF_CREATE);
558   ok(file >= 0, "LZOpenFileW failed on creation\n");
559   LZClose(file);
560   retval = GetFileAttributesW(fnameW);
561   ok(retval != INVALID_FILE_ATTRIBUTES, "GetFileAttributesW('%s'): error %d\n", ofs.szPathName, GetLastError());
562 }
563
564 static void delete_fileW(WCHAR *fnameW)
565 {
566   INT file;
567   OFSTRUCT ofs;
568   DWORD retval;
569
570   file = LZOpenFileW(fnameW, &ofs, OF_DELETE);
571   ok(file >= 0, "LZOpenFileW failed on delete\n");
572   LZClose(file);
573   retval = GetFileAttributesW(fnameW);
574   ok(retval == INVALID_FILE_ATTRIBUTES, "GetFileAttributesW succeeded on deleted file ('%s')\n", ofs.szPathName);
575 }
576
577 static void test_LZOpenFileW_existing_compressed(void)
578 {
579   OFSTRUCT test;
580   INT file;
581   char expected[MAX_PATH];
582
583   /* Try to open existing compressed files: */
584   create_fileW(filenameW_);
585   create_fileW(dotlessW_);
586   create_fileW(extlessW_);
587   create_fileW(_terminatedW_);
588
589   full_file_path_name_in_a_CWD(filename_, expected, FALSE);
590   memset(&test, 0xA5, sizeof(test));
591
592   /* a, using 8.3-conformant file name. */
593   file = LZOpenFileW(filenameW, &test, OF_EXIST);
594   /* If the file "foo.xxx" does not exist, LZOpenFileW should then
595      check for the file "foo.xx_" and open that.
596    */
597   ok(file >= 0, "LZOpenFileW failed on switching to a compressed file name\n");
598   ok(test.cBytes == sizeof(OFSTRUCT), 
599      "LZOpenFileW set test.cBytes to %d\n", test.cBytes);
600   ok(test.nErrCode == ERROR_SUCCESS, "LZOpenFileW set test.nErrCode to %d\n", 
601      test.nErrCode);
602   /* Note that W-function returns A-string by a OFSTRUCT.szPathName: */
603   ok(lstrcmpA(test.szPathName, expected) == 0, 
604      "LZOpenFileW returned '%s', but was expected to return '%s'\n", 
605      test.szPathName, expected);
606   LZClose(file);
607
608   memset(&test, 0xA5, sizeof(test));
609   full_file_path_name_in_a_CWD(dotless_, expected, FALSE);
610
611   /* b, using dotless file name. */
612   file = LZOpenFileW(dotlessW, &test, OF_EXIST);
613   ok(file >= 0, "LZOpenFileW failed on switching to a compressed file name\n");
614   ok(test.cBytes == sizeof(OFSTRUCT), 
615      "LZOpenFileW set test.cBytes to %d\n", test.cBytes);
616   ok(test.nErrCode == ERROR_SUCCESS, "LZOpenFileW set test.nErrCode to %d\n", 
617      test.nErrCode);
618   /* Note that W-function returns A-string by a OFSTRUCT.szPathName: */
619   ok(lstrcmpA(test.szPathName, expected) == 0, 
620      "LZOpenFileW returned '%s', but was expected to return '%s'\n", 
621      test.szPathName, expected);
622   LZClose(file);
623
624   memset(&test, 0xA5, sizeof(test));
625   full_file_path_name_in_a_CWD(extless_, expected, FALSE);
626
627   /* c, using extensionless file name. */
628   file = LZOpenFileW(extlessW, &test, OF_EXIST);
629   ok(file >= 0, "LZOpenFileW failed on switching to a compressed file name\n");
630   ok(test.cBytes == sizeof(OFSTRUCT), 
631      "LZOpenFileW set test.cBytes to %d\n", test.cBytes);
632   ok(test.nErrCode == ERROR_SUCCESS, "LZOpenFileW set test.nErrCode to %d\n", 
633      test.nErrCode);
634   /* Note that W-function returns A-string by a OFSTRUCT.szPathName: */
635   ok(lstrcmpA(test.szPathName, expected) == 0, 
636      "LZOpenFileW returned '%s', but was expected to return '%s'\n", 
637      test.szPathName, expected);
638   LZClose(file);
639
640   memset(&test, 0xA5, sizeof(test));
641   full_file_path_name_in_a_CWD(_terminated_, expected, FALSE);
642
643   /* d, using underscore-terminated file name. */
644   file = LZOpenFileW(_terminatedW, &test, OF_EXIST);
645   ok(file >= 0, "LZOpenFileW failed on switching to a compressed file name\n");
646   ok(test.cBytes == sizeof(OFSTRUCT), 
647      "LZOpenFileW set test.cBytes to %d\n", test.cBytes);
648   ok(test.nErrCode == ERROR_SUCCESS, "LZOpenFileW set test.nErrCode to %d\n", 
649      test.nErrCode);
650   /* Note that W-function returns A-string by a OFSTRUCT.szPathName: */
651   ok(lstrcmpA(test.szPathName, expected) == 0, 
652      "LZOpenFileW returned '%s', but was expected to return '%s'\n", 
653      test.szPathName, expected);
654   LZClose(file);
655
656   delete_fileW(filenameW_);
657   delete_fileW(dotlessW_);
658   delete_fileW(extlessW_);
659   delete_fileW(_terminatedW_);
660 }
661
662 static void test_LZOpenFileW_nonexisting_compressed(void)
663 {
664   OFSTRUCT test;
665   INT file;
666   char expected[MAX_PATH];
667   char filled_0xA5[OFS_MAXPATHNAME];
668
669   /* Try to open nonexisting compressed files: */
670   memset(&filled_0xA5, 0xA5, OFS_MAXPATHNAME);
671   memset(&test, 0xA5, sizeof(test));
672   full_file_path_name_in_a_CWD(filename_, expected, FALSE);
673   SetLastError(0xfaceabee);
674
675   /* a, using 8.3-conformant file name. */
676   file = LZOpenFileW(filenameW, &test, OF_EXIST);
677   /* If the file "foo.xxx" does not exist, LZOpenFileA should then
678      check for the file "foo.xx_" and open that -- at least on some
679      operating systems.  Doesn't seem to on my copy of Win98.   
680    */
681   ok(file == LZERROR_BADINHANDLE, 
682      "LZOpenFileW succeeded on nonexistent file\n");
683   ok(GetLastError() == ERROR_FILE_NOT_FOUND,
684      "GetLastError() returns %d\n", GetLastError());
685   todo_wine
686   ok(test.cBytes == 0xA5, 
687      "LZOpenFileW set test.cBytes to %d\n", test.cBytes);
688   ok(test.nErrCode == ERROR_FILE_NOT_FOUND, 
689      "LZOpenFileW set test.nErrCode to %d\n", test.nErrCode);
690   ok(lstrcmpA(test.szPathName, expected) == 0,
691      "LZOpenFileW returned '%s', but was expected to return '%s' or '%s'\n", 
692      test.szPathName, expected, filled_0xA5);
693
694   memset(&filled_0xA5, 0xA5, OFS_MAXPATHNAME);
695   memset(&test, 0xA5, sizeof(test));
696   full_file_path_name_in_a_CWD(dotless_, expected, FALSE);
697   SetLastError(0xfaceabee);
698
699   /* b, using dotless file name. */
700   file = LZOpenFileW(dotlessW, &test, OF_EXIST);
701   ok(file == LZERROR_BADINHANDLE, 
702      "LZOpenFileW succeeded on nonexistent file\n");
703   ok(GetLastError() == ERROR_FILE_NOT_FOUND,
704      "GetLastError() returns %d\n", GetLastError());
705   todo_wine
706   ok(test.cBytes == 0xA5, 
707      "LZOpenFileW set test.cBytes to %d\n", test.cBytes);
708   ok(test.nErrCode == ERROR_FILE_NOT_FOUND, 
709      "LZOpenFileW set test.nErrCode to %d\n", test.nErrCode);
710   ok(lstrcmpA(test.szPathName, expected) == 0,
711      "LZOpenFileW returned '%s', but was expected to return '%s' or '%s'\n", 
712      test.szPathName, expected, filled_0xA5);
713
714   memset(&filled_0xA5, 0xA5, OFS_MAXPATHNAME);
715   memset(&test, 0xA5, sizeof(test));
716   full_file_path_name_in_a_CWD(extless_, expected, FALSE);
717   SetLastError(0xfaceabee);
718
719   /* c, using extensionless file name. */
720   file = LZOpenFileW(extlessW, &test, OF_EXIST);
721   ok(file == LZERROR_BADINHANDLE, 
722      "LZOpenFileW succeeded on nonexistent file\n");
723   ok(GetLastError() == ERROR_FILE_NOT_FOUND,
724      "GetLastError() returns %d\n", GetLastError());
725   todo_wine
726   ok(test.cBytes == 0xA5, 
727      "LZOpenFileW set test.cBytes to %d\n", test.cBytes);
728   ok(test.nErrCode == ERROR_FILE_NOT_FOUND, 
729      "LZOpenFileW set test.nErrCode to %d\n", test.nErrCode);
730   ok(lstrcmpA(test.szPathName, expected) == 0,
731      "LZOpenFileW returned '%s', but was expected to return '%s' or '%s'\n", 
732      test.szPathName, expected, filled_0xA5);
733
734   memset(&filled_0xA5, 0xA5, OFS_MAXPATHNAME);
735   memset(&test, 0xA5, sizeof(test));
736   full_file_path_name_in_a_CWD(_terminated_, expected, FALSE);
737   SetLastError(0xfaceabee);
738
739   /* d, using underscore-terminated file name. */
740   file = LZOpenFileW(_terminatedW, &test, OF_EXIST);
741   ok(file == LZERROR_BADINHANDLE, 
742      "LZOpenFileW succeeded on nonexistent file\n");
743   ok(GetLastError() == ERROR_FILE_NOT_FOUND,
744      "GetLastError() returns %d\n", GetLastError());
745   todo_wine
746   ok(test.cBytes == 0xA5, 
747      "LZOpenFileW set test.cBytes to %d\n", test.cBytes);
748   ok(test.nErrCode == ERROR_FILE_NOT_FOUND, 
749      "LZOpenFileW set test.nErrCode to %d\n", test.nErrCode);
750   ok(lstrcmpA(test.szPathName, expected) == 0,
751      "LZOpenFileW returned '%s', but was expected to return '%s' or '%s'\n",
752      test.szPathName, expected, filled_0xA5);
753 }
754
755 static void test_LZOpenFileW(void)
756 {
757   OFSTRUCT test;
758   DWORD retval;
759   INT file;
760   static WCHAR badfilenameW[] = {'b','a','d','f','i','l','e','n','a','m','e','.','x','t','n',0};
761   char expected[MAX_PATH];
762
763   SetLastError(0xfaceabee);
764   /* Check for nonexistent file. */
765   file = LZOpenFileW(badfilenameW, &test, OF_READ);
766   ok(GetLastError() == ERROR_FILE_NOT_FOUND || GetLastError() == ERROR_CALL_NOT_IMPLEMENTED,
767      "GetLastError() returns %d\n", GetLastError());
768   if(GetLastError() == ERROR_CALL_NOT_IMPLEMENTED)
769   {
770     trace("LZOpenFileW call not implemented, skipping rest of the test\n");
771     return;
772   }
773   ok(file == LZERROR_BADINHANDLE, "LZOpenFileW succeeded on nonexistent file\n");
774   LZClose(file);
775
776   memset(&test, 0xA5, sizeof(test));
777   full_file_path_name_in_a_CWD(filename_, expected, FALSE);
778
779   /* Create an empty file. */
780   file = LZOpenFileW(filenameW_, &test, OF_CREATE);
781   ok(file >= 0, "LZOpenFile failed on creation\n");
782   ok(test.cBytes == sizeof(OFSTRUCT),
783      "LZOpenFileW set test.cBytes to %d\n", test.cBytes);
784   ok(test.nErrCode == ERROR_SUCCESS,
785      "LZOpenFileW set test.nErrCode to %d\n", test.nErrCode);
786   ok(lstrcmpA(test.szPathName, expected) == 0,
787      "LZOpenFileW returned '%s', but was expected to return '%s'\n",
788      test.szPathName, expected);
789   LZClose(file);
790
791   retval = GetFileAttributesW(filenameW_);
792   ok(retval != INVALID_FILE_ATTRIBUTES, "GetFileAttributes: error %d\n", 
793     GetLastError());
794
795   /* Check various opening options: */
796   memset(&test, 0xA5, sizeof(test));
797
798   /* a, for reading. */
799   file = LZOpenFileW(filenameW_, &test, OF_READ);
800   ok(file >= 0, "LZOpenFileW failed on read\n");
801   ok(test.cBytes == sizeof(OFSTRUCT),
802      "LZOpenFileW set test.cBytes to %d\n", test.cBytes);
803   ok(test.nErrCode == ERROR_SUCCESS,
804      "LZOpenFileW set test.nErrCode to %d\n", test.nErrCode);
805   ok(lstrcmpA(test.szPathName, expected) == 0,
806      "LZOpenFileW returned '%s', but was expected to return '%s'\n",
807      test.szPathName, expected);
808   LZClose(file);
809
810   memset(&test, 0xA5, sizeof(test));
811
812   /* b, for writing. */
813   file = LZOpenFileW(filenameW_, &test, OF_WRITE);
814   ok(file >= 0, "LZOpenFileW failed on write\n");
815   ok(test.cBytes == sizeof(OFSTRUCT),
816      "LZOpenFileW set test.cBytes to %d\n", test.cBytes);
817   ok(test.nErrCode == ERROR_SUCCESS,
818      "LZOpenFileW set test.nErrCode to %d\n", test.nErrCode);
819   ok(lstrcmpA(test.szPathName, expected) == 0,
820      "LZOpenFileW returned '%s', but was expected to return '%s'\n",
821      test.szPathName, expected);
822   LZClose(file);
823
824   memset(&test, 0xA5, sizeof(test));
825
826   /* c, for reading and writing. */
827   file = LZOpenFileW(filenameW_, &test, OF_READWRITE);
828   ok(file >= 0, "LZOpenFileW failed on read/write\n");
829   ok(test.cBytes == sizeof(OFSTRUCT),
830      "LZOpenFileW set test.cBytes to %d\n", test.cBytes);
831   ok(test.nErrCode == ERROR_SUCCESS,
832      "LZOpenFileW set test.nErrCode to %d\n", test.nErrCode);
833   ok(lstrcmpA(test.szPathName, expected) == 0,
834      "LZOpenFileW returned '%s', but was expected to return '%s'\n",
835      test.szPathName, expected);
836   LZClose(file);
837
838   memset(&test, 0xA5, sizeof(test));
839
840   /* d, for checking file existence. */
841   file = LZOpenFileW(filenameW_, &test, OF_EXIST);
842   ok(file >= 0, "LZOpenFileW failed on read/write\n");
843   ok(test.cBytes == sizeof(OFSTRUCT),
844      "LZOpenFileW set test.cBytes to %d\n", test.cBytes);
845   ok(test.nErrCode == ERROR_SUCCESS,
846      "LZOpenFileW set test.nErrCode to %d\n", test.nErrCode);
847   ok(lstrcmpA(test.szPathName, expected) == 0,
848      "LZOpenFileW returned '%s', but was expected to return '%s'\n",
849      test.szPathName, expected);
850   LZClose(file);
851
852   memset(&test, 0xA5, sizeof(test));
853
854   /* Delete the file then make sure it doesn't exist anymore. */
855   file = LZOpenFileW(filenameW_, &test, OF_DELETE);
856   ok(file >= 0, "LZOpenFileW failed on delete\n");
857   ok(test.cBytes == sizeof(OFSTRUCT),
858      "LZOpenFileW set test.cBytes to %d\n", test.cBytes);
859   ok(test.nErrCode == ERROR_SUCCESS,
860      "LZOpenFileW set test.nErrCode to %d\n", test.nErrCode);
861   ok(lstrcmpA(test.szPathName, expected) == 0,
862      "LZOpenFileW returned '%s', but was expected to return '%s'\n",
863      test.szPathName, expected);
864   LZClose(file);
865
866   retval = GetFileAttributesW(filenameW_);
867   ok(retval == INVALID_FILE_ATTRIBUTES, 
868      "GetFileAttributesW succeeded on deleted file\n");
869
870   test_LZOpenFileW_existing_compressed();
871   test_LZOpenFileW_nonexisting_compressed();
872 }
873
874
875 START_TEST(lzexpand_main)
876 {
877   buf = malloc(uncompressed_data_size * 2);
878   test_LZOpenFileA();
879   test_LZOpenFileW();
880   test_LZRead();
881   test_LZCopy();
882   free(buf);
883 }