e14743d1 |
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 | } |