1_debug_info = 1; () = evalfile ("inc.sl"); 2 3 4print ("Testing stdio routines..."); 5 6define fopen_tmp_file (fileptr, mode) 7{ 8 variable n; 9 variable file, fp; 10 variable fmt; 11 12 @fileptr = NULL; 13 14 fmt = "tmp-xxx.%03d"; % I need something that works on an 8+3 filesystem 15 16 n = -1; 17 while (n < 999) 18 { 19 n++; 20 file = sprintf (fmt, n); 21 if (NULL != stat_file (file)) 22 continue; 23 24 fp = fopen (file, mode); 25 if (fp != NULL) 26 { 27 @fileptr = file; 28 return fp; 29 } 30 } 31 failed ("Unable to open a tmp file"); 32} 33 34define run_tests (some_text, read_fun, write_fun, length_fun) 35{ 36 variable file, fp; 37 variable new_text, nbytes, len; 38 variable pos; 39 40 fp = fopen_tmp_file (&file, "wb"); 41 42 if (-1 == @write_fun (some_text, fp)) 43 failed (string (write_fun)); 44 45 if (-1 == fclose (fp)) 46 failed ("fclose"); 47 48 fp = fopen (file, "rb"); 49 if (fp == NULL) failed ("fopen existing"); 50 51 len = @length_fun (some_text); 52 nbytes = @read_fun (&new_text, len, fp); 53 54 if ((nbytes != len) 55 or (some_text != new_text)) 56 failed (string (read_fun)); 57 58 if (-1 != @read_fun (&new_text, 1, fp)) 59 failed (string (read_fun) + " at EOF"); 60 61 if (0 == feof (fp)) failed ("feof"); 62 63 clearerr (fp); 64 if (feof (fp)) failed ("clearerr"); 65 66 if (0 != fseek (fp, 0, SEEK_SET)) failed ("fseek"); 67 68 nbytes = @read_fun (&new_text, len, fp); 69 70 if ((nbytes != len) 71 or (some_text != new_text)) 72 failed (string (read_fun) + " after fseek"); 73 74 75 pos = ftell (fp); 76 if (pos == -1) failed ("ftell at EOF"); 77 78 if (0 != fseek (fp, 0, SEEK_SET)) failed ("fseek"); 79 if (0 != ftell (fp)) failed ("ftell at BOF"); 80 if (0 != fseek (fp, pos, SEEK_CUR)) failed ("fseek to pos"); 81 82 if (pos != ftell (fp)) failed ("ftell after fseek to pos"); 83 84 if (feof (fp) != 0) failed ("feof after fseek to EOF"); 85 86 () = fseek (fp, 0, SEEK_SET); 87 nbytes = fread (&new_text, Char_Type, 0, fp); 88 if (nbytes != 0) 89 failed ("fread for 0 bytes"); 90 91 nbytes = fread (&new_text, Char_Type, len + 100, fp); 92 if (nbytes != len) 93 failed ("fread for 100 extra bytes"); 94 95 if (-1 == fclose (fp)) failed ("fclose after tests"); 96 () = remove (file); 97 if (stat_file (file) != NULL) failed ("remove"); 98} 99 100static define do_fgets (addr, nbytes, fp) 101{ 102 return fgets (addr, fp); 103} 104 105static define do_fread (addr, nbytes, fp) 106{ 107 return fread (addr, UChar_Type, nbytes, fp); 108} 109 110run_tests ("ABCDEFG", &do_fgets, &fputs, &strlen); 111run_tests ("A\000BC\000\n\n\n", &do_fread, &fwrite, &bstrlen); 112 113define test_fread_fwrite (x) 114{ 115 variable fp, file, str, n, m, y, type, ch; 116 117 fp = fopen_tmp_file (&file, "w+b"); 118 119 type = _typeof(x); 120 n = length (x); 121 if ((type == String_Type) or (type == BString_Type)) 122 { 123 type = UChar_Type; 124 n = bstrlen (x); 125 } 126 127 if (n != fwrite (x, fp)) 128 failed ("test_fread_fwrite: fwrite"); 129 130 if (-1 == fseek (fp, 0, SEEK_SET)) 131 failed ("test_fread_fwrite: fseek"); 132 133 if (n != fread (&y, type, n, fp)) 134 failed ("test_fread_fwrite: fread"); 135 136 if (length (where (y != x))) 137 failed ("test_fread_fwrite: fread failed to return: " + string(x)); 138 139 if (-1 == fseek (fp, 0, SEEK_SET)) 140 failed ("test_fread_fwrite: fseek"); 141 142 if (type == UChar_Type) 143 { 144 y = 0; 145 foreach (fp) using ("char") 146 { 147 ch = (); 148 if (ch != x[y]) 149 failed ("foreach using char: %S != %S", ch, x[y]); 150 y++; 151 } 152 if (y != n) 153 failed ("foreach using char 2"); 154 } 155 156 () = fclose (fp); 157 158 if (-1 == remove (file)) 159 failed ("remove:" + errno_string(errno)); 160 if (stat_file (file) != NULL) failed ("remove"); 161} 162 163test_fread_fwrite (""); 164test_fread_fwrite ("hello"); 165test_fread_fwrite ("hel\0\0lo"); 166test_fread_fwrite (3.17); 167test_fread_fwrite (Integer_Type[0]); 168test_fread_fwrite ([1:10]); 169test_fread_fwrite ([1:10:0.01]); 170#ifexists Complex_Type 171test_fread_fwrite (Complex_Type[50] + 3 + 2i); 172test_fread_fwrite (2i+3); 173test_fread_fwrite ([2i+3, 7i+1]); 174#endif 175 176print ("Ok\n"); 177 178exit (0); 179