Home | History | Annotate | Download | only in test
      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 }
    183