test/testfile.c
author Sam Lantinga <slouken@libsdl.org>
Sat, 26 Sep 2009 23:17:08 +0000
branchSDL-1.2
changeset 4246 8b8314cc34a6
parent 3927 f86ced1837de
permissions -rw-r--r--
Fixed bug #810

Lauri Kenttä 2009-09-26 06:42:23 PDT

Support for disabling stdio redirect with environment variables.
     1 
     2 /* sanity tests on SDL_rwops.c (usefull for alternative implementations of stdio rwops) */
     3 
     4 #include <stdlib.h>
     5 
     6 #ifndef _MSC_VER
     7 #include <unistd.h>
     8 #endif
     9 
    10 #include "SDL.h"
    11 #include "SDL_endian.h"
    12 
    13 
    14 #include <stdio.h>	
    15 
    16 /* WARNING ! those 2 files will be destroyed by this test program */
    17 #define FBASENAME1	"sdldata1"		/* this file will be created during tests */
    18 #define FBASENAME2	"sdldata2"		/* this file should not exists before starting test */
    19 
    20 
    21 #ifndef NULL
    22 #define NULL ((void *)0)
    23 #endif 
    24 
    25 static void cleanup( void ) {
    26 
    27 	unlink(FBASENAME1);
    28 	unlink(FBASENAME2); 
    29 }
    30 
    31 static void rwops_error_quit( unsigned line, SDL_RWops *rwops) {
    32 	
    33 	printf("testfile.c(%d): failed\n",line);
    34 	if (rwops) {
    35 		rwops->close(rwops); /* This calls SDL_FreeRW(rwops); */
    36 	}
    37 	cleanup();
    38 	exit(1); /* quit with rwops error (test failed) */
    39 }
    40 
    41 #define RWOP_ERR_QUIT(x)	rwops_error_quit( __LINE__, (x) )
    42 
    43 
    44 
    45 int main(int argc, char *argv[])
    46 {
    47 	SDL_RWops *rwops = NULL;
    48 	char test_buf[30];
    49 	
    50 	cleanup();
    51 
    52 /* test 1 : basic argument test: all those calls to SDL_RWFromFile should fail */
    53 	
    54 	rwops = SDL_RWFromFile(NULL,NULL);
    55 	if (rwops) RWOP_ERR_QUIT(rwops);
    56 	rwops = SDL_RWFromFile(NULL,"ab+");
    57 	if (rwops) RWOP_ERR_QUIT(rwops);
    58 	rwops = SDL_RWFromFile(NULL,"sldfkjsldkfj");
    59 	if (rwops) RWOP_ERR_QUIT(rwops);
    60 	rwops = SDL_RWFromFile("something","");
    61 	if (rwops) RWOP_ERR_QUIT(rwops);
    62 	rwops = SDL_RWFromFile("something",NULL);
    63 	if (rwops) RWOP_ERR_QUIT(rwops);	
    64 	printf("test1 OK\n");
    65 
    66 /* test 2 : check that inexistant file is not successfully opened/created when required */
    67 /* modes : r, r+ implie that file MUST exist 
    68    modes : a, a+, w, w+ checks that it succeeds (file may not exists)
    69    
    70  */
    71 	rwops = SDL_RWFromFile(FBASENAME2,"rb"); /* this file doesn't exist that call must fail */
    72 	if (rwops) RWOP_ERR_QUIT(rwops);
    73 	rwops = SDL_RWFromFile(FBASENAME2,"rb+"); /* this file doesn't exist that call must fail */
    74 	if (rwops) RWOP_ERR_QUIT(rwops);
    75 	rwops = SDL_RWFromFile(FBASENAME2,"wb");
    76 	if (!rwops) RWOP_ERR_QUIT(rwops); 
    77 	rwops->close(rwops); unlink(FBASENAME2);
    78 	rwops = SDL_RWFromFile(FBASENAME2,"wb+");
    79 	if (!rwops) RWOP_ERR_QUIT(rwops); 
    80 	rwops->close(rwops); unlink(FBASENAME2);
    81 	rwops = SDL_RWFromFile(FBASENAME2,"ab"); 
    82 	if (!rwops) RWOP_ERR_QUIT(rwops); 
    83 	rwops->close(rwops); unlink(FBASENAME2);
    84 	rwops = SDL_RWFromFile(FBASENAME2,"ab+");
    85 	if (!rwops) RWOP_ERR_QUIT(rwops); 
    86 	rwops->close(rwops); unlink(FBASENAME2);
    87 	printf("test2 OK\n");
    88 
    89 /* test 3 : creation, writing , reading, seeking, 
    90 	        test : w mode, r mode, w+ mode
    91  */
    92 	rwops = SDL_RWFromFile(FBASENAME1,"wb"); /* write only */	
    93 	if (!rwops)											RWOP_ERR_QUIT(rwops);
    94 	if (1 != rwops->write(rwops,"1234567890",10,1) )	RWOP_ERR_QUIT(rwops);		
    95 	if (10 != rwops->write(rwops,"1234567890",1,10) )	RWOP_ERR_QUIT(rwops);		
    96 	if (7 != rwops->write(rwops,"1234567",1,7) )		RWOP_ERR_QUIT(rwops);		
    97 	if (0!=rwops->seek(rwops,0L,RW_SEEK_SET))			RWOP_ERR_QUIT(rwops);					
    98 	if (0!=rwops->read(rwops,test_buf,1,1))				RWOP_ERR_QUIT(rwops); /* we are in write only mode */
    99 	rwops->close(rwops);
   100 
   101 	rwops = SDL_RWFromFile(FBASENAME1,"rb"); /* read mode, file must exists */
   102 	if (!rwops)											RWOP_ERR_QUIT(rwops);
   103 	if (0!=rwops->seek(rwops,0L,RW_SEEK_SET))			RWOP_ERR_QUIT(rwops);					
   104 	if (20!=rwops->seek(rwops,-7,RW_SEEK_END))			RWOP_ERR_QUIT(rwops);					
   105 	if (7!=rwops->read(rwops,test_buf,1,7))				RWOP_ERR_QUIT(rwops);		
   106 	if (SDL_memcmp(test_buf,"1234567",7))				RWOP_ERR_QUIT(rwops);		
   107 	if (0!=rwops->read(rwops,test_buf,1,1))				RWOP_ERR_QUIT(rwops);		
   108 	if (0!=rwops->read(rwops,test_buf,10,100))			RWOP_ERR_QUIT(rwops);		
   109 	if (0!=rwops->seek(rwops,-27,RW_SEEK_CUR))			RWOP_ERR_QUIT(rwops);		
   110 	if (2!=rwops->read(rwops,test_buf,10,3))			RWOP_ERR_QUIT(rwops);				
   111 	if (SDL_memcmp(test_buf,"12345678901234567890",20))	RWOP_ERR_QUIT(rwops);
   112 	if (0!=rwops->write(rwops,test_buf,1,1))			RWOP_ERR_QUIT(rwops); /* readonly mode */
   113 	rwops->close(rwops);
   114 
   115 /* test 3: same with w+ mode */
   116 	rwops = SDL_RWFromFile(FBASENAME1,"wb+"); /* write + read + truncation */		
   117 	if (!rwops)											RWOP_ERR_QUIT(rwops);
   118 	if (1 != rwops->write(rwops,"1234567890",10,1) )	RWOP_ERR_QUIT(rwops);		
   119 	if (10 != rwops->write(rwops,"1234567890",1,10) )	RWOP_ERR_QUIT(rwops);		
   120 	if (7 != rwops->write(rwops,"1234567",1,7) )		RWOP_ERR_QUIT(rwops);		
   121 	if (0!=rwops->seek(rwops,0L,RW_SEEK_SET))			RWOP_ERR_QUIT(rwops);					
   122 	if (1!=rwops->read(rwops,test_buf,1,1))				RWOP_ERR_QUIT(rwops); /* we are in read/write mode */
   123 	if (0!=rwops->seek(rwops,0L,RW_SEEK_SET))			RWOP_ERR_QUIT(rwops);					
   124 	if (20!=rwops->seek(rwops,-7,RW_SEEK_END))			RWOP_ERR_QUIT(rwops);					
   125 	if (7!=rwops->read(rwops,test_buf,1,7))				RWOP_ERR_QUIT(rwops);		
   126 	if (SDL_memcmp(test_buf,"1234567",7))				RWOP_ERR_QUIT(rwops);		
   127 	if (0!=rwops->read(rwops,test_buf,1,1))				RWOP_ERR_QUIT(rwops);		
   128 	if (0!=rwops->read(rwops,test_buf,10,100))			RWOP_ERR_QUIT(rwops);		
   129 	if (0!=rwops->seek(rwops,-27,RW_SEEK_CUR))			RWOP_ERR_QUIT(rwops);		
   130 	if (2!=rwops->read(rwops,test_buf,10,3))			RWOP_ERR_QUIT(rwops);				
   131 	if (SDL_memcmp(test_buf,"12345678901234567890",20))	RWOP_ERR_QUIT(rwops);
   132 	rwops->close(rwops);
   133 	printf("test3 OK\n");
   134 
   135 /* test 4: same in r+ mode */
   136 	rwops = SDL_RWFromFile(FBASENAME1,"rb+"); /* write + read + file must exists, no truncation */		
   137 	if (!rwops)											RWOP_ERR_QUIT(rwops);
   138 	if (1 != rwops->write(rwops,"1234567890",10,1) )	RWOP_ERR_QUIT(rwops);		
   139 	if (10 != rwops->write(rwops,"1234567890",1,10) )	RWOP_ERR_QUIT(rwops);		
   140 	if (7 != rwops->write(rwops,"1234567",1,7) )		RWOP_ERR_QUIT(rwops);		
   141 	if (0!=rwops->seek(rwops,0L,RW_SEEK_SET))			RWOP_ERR_QUIT(rwops);					
   142 	if (1!=rwops->read(rwops,test_buf,1,1))				RWOP_ERR_QUIT(rwops); /* we are in read/write mode */
   143 	if (0!=rwops->seek(rwops,0L,RW_SEEK_SET))			RWOP_ERR_QUIT(rwops);					
   144 	if (20!=rwops->seek(rwops,-7,RW_SEEK_END))			RWOP_ERR_QUIT(rwops);					
   145 	if (7!=rwops->read(rwops,test_buf,1,7))				RWOP_ERR_QUIT(rwops);		
   146 	if (SDL_memcmp(test_buf,"1234567",7))				RWOP_ERR_QUIT(rwops);		
   147 	if (0!=rwops->read(rwops,test_buf,1,1))				RWOP_ERR_QUIT(rwops);		
   148 	if (0!=rwops->read(rwops,test_buf,10,100))			RWOP_ERR_QUIT(rwops);		
   149 	if (0!=rwops->seek(rwops,-27,RW_SEEK_CUR))			RWOP_ERR_QUIT(rwops);		
   150 	if (2!=rwops->read(rwops,test_buf,10,3))			RWOP_ERR_QUIT(rwops);				
   151 	if (SDL_memcmp(test_buf,"12345678901234567890",20))	RWOP_ERR_QUIT(rwops);
   152 	rwops->close(rwops);
   153 	printf("test4 OK\n");
   154 
   155 /* test5 : append mode */
   156 	rwops = SDL_RWFromFile(FBASENAME1,"ab+"); /* write + read + append */		
   157 	if (!rwops)											RWOP_ERR_QUIT(rwops);
   158 	if (1 != rwops->write(rwops,"1234567890",10,1) )	RWOP_ERR_QUIT(rwops);		
   159 	if (10 != rwops->write(rwops,"1234567890",1,10) )	RWOP_ERR_QUIT(rwops);		
   160 	if (7 != rwops->write(rwops,"1234567",1,7) )		RWOP_ERR_QUIT(rwops); 	
   161 	if (0!=rwops->seek(rwops,0L,RW_SEEK_SET))			RWOP_ERR_QUIT(rwops);					
   162 	
   163 	if (1!=rwops->read(rwops,test_buf,1,1))				RWOP_ERR_QUIT(rwops); 
   164 	if (0!=rwops->seek(rwops,0L,RW_SEEK_SET))			RWOP_ERR_QUIT(rwops);					
   165 	
   166 	if (20+27!=rwops->seek(rwops,-7,RW_SEEK_END))		RWOP_ERR_QUIT(rwops);					
   167 	if (7!=rwops->read(rwops,test_buf,1,7))				RWOP_ERR_QUIT(rwops);		
   168 	if (SDL_memcmp(test_buf,"1234567",7))				RWOP_ERR_QUIT(rwops);		
   169 	if (0!=rwops->read(rwops,test_buf,1,1))				RWOP_ERR_QUIT(rwops);		
   170 	if (0!=rwops->read(rwops,test_buf,10,100))			RWOP_ERR_QUIT(rwops);		
   171 	
   172 	if (27!=rwops->seek(rwops,-27,RW_SEEK_CUR))			RWOP_ERR_QUIT(rwops);
   173 	
   174 	if (0!=rwops->seek(rwops,0L,RW_SEEK_SET))			RWOP_ERR_QUIT(rwops);
   175 	if (3!=rwops->read(rwops,test_buf,10,3))			RWOP_ERR_QUIT(rwops);				
   176 	if (SDL_memcmp(test_buf,"123456789012345678901234567123",30))	
   177 														RWOP_ERR_QUIT(rwops);
   178 	rwops->close(rwops);
   179 	printf("test5 OK\n");
   180 	cleanup();
   181 	return 0; /* all ok */
   182 }