SDL-1.2.14
[sdl_omap.git] / test / testfile.c
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 }