Module: wine Branch: refs/heads/master Commit: d74b6055fe882504742be0f96d01b03607fdfd3b URL: http://source.winehq.org/git/?p=wine.git;a=commit;h=d74b6055fe882504742be0f9...
Author: Duane Clark fpga@pacbell.net Date: Mon Jul 31 12:14:04 2006 -0700
msvcrt: Test fgetwc/s in binary mode.
---
dlls/msvcrt/tests/file.c | 99 +++++++++++++++++++++++++++++++++++++++++++--- 1 files changed, 92 insertions(+), 7 deletions(-)
diff --git a/dlls/msvcrt/tests/file.c b/dlls/msvcrt/tests/file.c index b9387ce..284e3ba 100644 --- a/dlls/msvcrt/tests/file.c +++ b/dlls/msvcrt/tests/file.c @@ -261,27 +261,112 @@ #define LLEN 512
char* tempf; FILE *tempfh; - static const char mytext[]= "This is test_fgetwc\n"; - WCHAR wtextW[LLEN+1]; + static const char mytext[]= "This is test_fgetwc\r\n"; + WCHAR wtextW[MSVCRT_BUFSIZ+LLEN+1]; WCHAR *mytextW = NULL, *aptr, *wptr; BOOL diff_found = FALSE; - unsigned int i; + int i, j; + long l;
tempf=_tempnam(".","wne"); - tempfh = fopen(tempf,"wt"); /* open in TEXT mode */ + tempfh = fopen(tempf,"wb"); + j = 'a'; + /* pad to almost the length of the internal buffer */ + for (i=0; i<MSVCRT_BUFSIZ-4; i++) + fputc(j,tempfh); + j = '\r'; + fputc(j,tempfh); + j = '\n'; + fputc(j,tempfh); fputs(mytext,tempfh); fclose(tempfh); - tempfh = fopen(tempf,"rt"); + /* in text mode, getws/c expects multibyte characters */ + /*currently Wine only supports plain ascii, and that is all that is tested here */ + tempfh = fopen(tempf,"rt"); /* open in TEXT mode */ + fgetws(wtextW,LLEN,tempfh); + l=ftell(tempfh); + ok(l==MSVCRT_BUFSIZ-2, "ftell expected %d got %ld\n", MSVCRT_BUFSIZ-2, l); fgetws(wtextW,LLEN,tempfh); + l=ftell(tempfh); + ok(l==MSVCRT_BUFSIZ-2+strlen(mytext), "ftell expected %d got %ld\n", + MSVCRT_BUFSIZ-2+strlen(mytext), l); mytextW = AtoW ((char*)mytext); aptr = mytextW; wptr = wtextW; - - for (i=0; i<strlen(mytext); i++, aptr++, wptr++) + for (i=0; i<strlen(mytext)-2; i++, aptr++, wptr++) { diff_found |= (*aptr != *wptr); } ok(!(diff_found), "fgetwc difference found in TEXT mode\n"); + ok(*wptr == '\n', "Carriage return was not skipped\n"); + fclose(tempfh); + unlink(tempf); + + tempfh = fopen(tempf,"wb"); + j = 'a'; + /* pad to almost the length of the internal buffer. Use an odd number of bytes + to test that we can read wchars that are split across the internal buffer + boundary */ + for (i=0; i<MSVCRT_BUFSIZ-3-strlen(mytext)*sizeof(WCHAR); i++) + fputc(j,tempfh); + j = '\r'; + fputwc(j,tempfh); + j = '\n'; + fputwc(j,tempfh); + fputws(wtextW,tempfh); + fputws(wtextW,tempfh); + fclose(tempfh); + /* in binary mode, getws/c expects wide characters */ + tempfh = fopen(tempf,"rb"); /* open in BINARY mode */ + j=(MSVCRT_BUFSIZ-2)/sizeof(WCHAR)-strlen(mytext); + fgetws(wtextW,j,tempfh); + l=ftell(tempfh); + j=(j-1)*sizeof(WCHAR); + ok(l==j, "ftell expected %d got %ld\n", j, l); + i=fgetc(tempfh); + ok(i=='a', "fgetc expected %d got %d\n", 0x61, i); + l=ftell(tempfh); + j++; + ok(l==j, "ftell expected %d got %ld\n", j, l); + fgetws(wtextW,3,tempfh); + todo_wine ok(wtextW[0]=='\r',"expected carriage return got %04hx\n", wtextW[0]); + todo_wine ok(wtextW[1]=='\n',"expected newline got %04hx\n", wtextW[1]); + l=ftell(tempfh); + j += 4; + todo_wine ok(l==j, "ftell expected %d got %ld\n", j, l); + for(i=0; i<strlen(mytext); i++) + wtextW[i] = 0; + /* the first time we get the string, it should be entirely within the local buffer */ + fgetws(wtextW,LLEN,tempfh); + l=ftell(tempfh); + j += (strlen(mytext)-1)*sizeof(WCHAR); + todo_wine ok(l==j, "ftell expected %d got %ld\n", j, l); + diff_found = FALSE; + aptr = mytextW; + wptr = wtextW; + for (i=0; i<strlen(mytext)-2; i++, aptr++, wptr++) + { + todo_wine ok(*aptr == *wptr, "Char %d expected %04hx got %04hx\n", i, *aptr, *wptr); + diff_found |= (*aptr != *wptr); + } + todo_wine ok(!(diff_found), "fgetwc difference found in BINARY mode\n"); + todo_wine ok(*wptr == '\n', "Should get newline\n"); + for(i=0; i<strlen(mytext); i++) + wtextW[i] = 0; + /* the second time we get the string, it should cross the local buffer boundary. + One of the wchars should be split across the boundary */ + fgetws(wtextW,LLEN,tempfh); + diff_found = FALSE; + aptr = mytextW; + wptr = wtextW; + for (i=0; i<strlen(mytext)-2; i++, aptr++, wptr++) + { + todo_wine ok(*aptr == *wptr, "Char %d expected %04hx got %04hx\n", i, *aptr, *wptr); + diff_found |= (*aptr != *wptr); + } + todo_wine ok(!(diff_found), "fgetwc difference found in BINARY mode\n"); + todo_wine ok(*wptr == '\n', "Should get newline\n"); + if(mytextW) free (mytextW); fclose(tempfh); unlink(tempf);