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