Implement READ-LINE and WRITE-LINE
[pforth] / fth / t_file.fth
CommitLineData
593eb738
HE
1\ Test PForth FILE wordset
2
3\ To test the ANS File Access word set and extension words
4
5\ This program was written by Gerry Jackson in 2006, with contributions from
6\ others where indicated, and is in the public domain - it can be distributed
7\ and/or modified in any way but please retain this notice.
8
9\ This program is distributed in the hope that it will be useful,
10\ but WITHOUT ANY WARRANTY; without even the implied warranty of
11\ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
12
13\ The tests are not claimed to be comprehensive or correct
14
15\ ----------------------------------------------------------------------------
16\ Version 0.13 S" in interpretation mode tested.
17\ Added SAVE-INPUT RESTORE-INPUT REFILL in a file, (moved from
18\ coreexttest.fth).
19\ Calls to COMPARE replaced with S= (in utilities.fth)
20\ 0.11 25 April 2015 S\" in interpretation mode test added
21\ REQUIRED REQUIRE INCLUDE tests added
22\ Two S" and/or S\" buffers availability tested
23\ 0.5 1 April 2012 Tests placed in the public domain.
24\ 0.4 22 March 2009 { and } replaced with T{ and }T
25\ 0.3 20 April 2007 ANS Forth words changed to upper case.
26\ Removed directory test from the filenames.
27\ 0.2 30 Oct 2006 updated following GForth tests to remove
28\ system dependency on file size, to allow for file
29\ buffering and to allow for PAD moving around.
30\ 0.1 Oct 2006 First version released.
31
32\ ----------------------------------------------------------------------------
33\ The tests are based on John Hayes test program for the core word set
34\ and requires those files to have been loaded
35
36\ Words tested in this file are:
37\ ( BIN CLOSE-FILE CREATE-FILE DELETE-FILE FILE-POSITION FILE-SIZE
38\ OPEN-FILE R/O R/W READ-FILE READ-LINE REPOSITION-FILE RESIZE-FILE
39\ S" S\" SOURCE-ID W/O WRITE-FILE WRITE-LINE
40\ FILE-STATUS FLUSH-FILE RENAME-FILE SAVE-INPUT RESTORE-INPUT
41\ REFILL
42
43\ Words not tested:
44\ INCLUDED INCLUDE-FILE (as these will likely have been
45\ tested in the execution of the test files)
46\ ----------------------------------------------------------------------------
47\ Assumptions, dependencies and notes:
48\ - tester.fr (or ttester.fs), errorreport.fth and utilities.fth have been
49\ included prior to this file
50\ - the Core word set is available and tested
51\ - These tests create files in the current directory, if all goes
52\ well these will be deleted. If something fails they may not be
53\ deleted. If this is a problem ensure you set a suitable
54\ directory before running this test. There is no ANS standard
55\ way of doing this. Also be aware of the file names used below
56\ which are: fatest1.txt, fatest2.txt and fatest3.txt
57\ ----------------------------------------------------------------------------
58
59include? }T{ t_tools.fth
60
61true fp-require-e !
62
63true value verbose
64
65: testing
66 verbose IF
67 source >in @ /string ." TESTING: " type cr
68 THEN
69 source nip >in !
70; immediate
71
72: -> }T{ ;
73: s= compare 0= ;
74: $" state IF postpone s" else ['] s" execute THEN ; immediate
75
76
77\ FIXME: stubs for missing definition
78: flush-file drop -1 ;
79: resize-file drop 2drop -1 ;
80: rename-file 2drop 2drop -1 ;
81: file-status 2drop 0 -1 ;
82
83
84TESTING File Access word set
85
86DECIMAL
87
88TEST{
89
90\ ----------------------------------------------------------------------------
91TESTING CREATE-FILE CLOSE-FILE
92
93: FN1 S" fatest1.txt" ;
94VARIABLE FID1
95
96T{ FN1 R/W CREATE-FILE SWAP FID1 ! -> 0 }T
97T{ FID1 @ CLOSE-FILE -> 0 }T
98
99\ ----------------------------------------------------------------------------
100TESTING OPEN-FILE W/O WRITE-LINE
101
102: LINE1 S" Line 1" ;
103
104T{ FN1 W/O OPEN-FILE SWAP FID1 ! -> 0 }T
105T{ LINE1 FID1 @ WRITE-LINE -> 0 }T
106T{ FID1 @ CLOSE-FILE -> 0 }T
107
108\ ----------------------------------------------------------------------------
109TESTING R/O FILE-POSITION (simple) READ-LINE
110
111200 CONSTANT BSIZE
112CREATE BUF BSIZE ALLOT
113VARIABLE #CHARS
114
115T{ FN1 R/O OPEN-FILE SWAP FID1 ! -> 0 }T
116T{ FID1 @ FILE-POSITION -> 0. 0 }T
117T{ BUF 100 FID1 @ READ-LINE ROT DUP #CHARS ! -> TRUE 0 LINE1 SWAP DROP }T
118T{ BUF #CHARS @ LINE1 S= -> TRUE }T
119T{ FID1 @ CLOSE-FILE -> 0 }T
120
121\ ----------------------------------------------------------------------------
122TESTING S" in interpretation mode (compile mode tested in Core tests)
123
124T{ S" abcdef" $" abcdef" S= -> TRUE }T
125T{ S" " $" " S= -> TRUE }T
126T{ S" ghi"$" ghi" S= -> TRUE }T
127
128\ ----------------------------------------------------------------------------
129TESTING R/W WRITE-FILE REPOSITION-FILE READ-FILE FILE-POSITION S"
130
131: LINE2 S" Line 2 blah blah blah" ;
132: RL1 BUF 100 FID1 @ READ-LINE ;
1332VARIABLE FP
134
135T{ FN1 R/W OPEN-FILE SWAP FID1 ! -> 0 }T
136T{ FID1 @ FILE-SIZE DROP FID1 @ REPOSITION-FILE -> 0 }T
137T{ FID1 @ FILE-SIZE -> FID1 @ FILE-POSITION }T
138T{ LINE2 FID1 @ WRITE-FILE -> 0 }T
139T{ 10. FID1 @ REPOSITION-FILE -> 0 }T
140T{ FID1 @ FILE-POSITION -> 10. 0 }T
141T{ 0. FID1 @ REPOSITION-FILE -> 0 }T
142T{ RL1 -> LINE1 SWAP DROP TRUE 0 }T
143T{ RL1 ROT DUP #CHARS ! -> TRUE 0 LINE2 SWAP DROP }T
144T{ BUF #CHARS @ LINE2 S= -> TRUE }T
145T{ RL1 -> 0 FALSE 0 }T
146T{ FID1 @ FILE-POSITION ROT ROT FP 2! -> 0 }T
147T{ FP 2@ FID1 @ FILE-SIZE DROP D= -> TRUE }T
148T{ S" " FID1 @ WRITE-LINE -> 0 }T
149T{ S" " FID1 @ WRITE-LINE -> 0 }T
150T{ FP 2@ FID1 @ REPOSITION-FILE -> 0 }T
151T{ RL1 -> 0 TRUE 0 }T
152T{ RL1 -> 0 TRUE 0 }T
153T{ RL1 -> 0 FALSE 0 }T
154T{ FID1 @ CLOSE-FILE -> 0 }T
155
156\ ----------------------------------------------------------------------------
157TESTING BIN READ-FILE FILE-SIZE
158
159: CBUF BUF BSIZE 0 FILL ;
160: FN2 S" FATEST2.TXT" ;
161VARIABLE FID2
162: SETPAD PAD 50 0 DO I OVER C! CHAR+ LOOP DROP ;
163
164SETPAD \ If anything else is defined setpad must be called again
165 \ as pad may move
166
167T{ FN2 R/W BIN CREATE-FILE SWAP FID2 ! -> 0 }T
168T{ PAD 50 FID2 @ WRITE-FILE FID2 @ FLUSH-FILE -> 0 0 }T
169T{ FID2 @ FILE-SIZE -> 50. 0 }T
170T{ 0. FID2 @ REPOSITION-FILE -> 0 }T
171T{ CBUF BUF 29 FID2 @ READ-FILE -> 29 0 }T
172T{ PAD 29 BUF 29 S= -> TRUE }T
173T{ PAD 30 BUF 30 S= -> FALSE }T
174T{ CBUF BUF 29 FID2 @ READ-FILE -> 21 0 }T
175T{ PAD 29 + 21 BUF 21 S= -> TRUE }T
176T{ FID2 @ FILE-SIZE DROP FID2 @ FILE-POSITION DROP D= -> TRUE }T
177T{ BUF 10 FID2 @ READ-FILE -> 0 0 }T
178T{ FID2 @ CLOSE-FILE -> 0 }T
179
180\ ----------------------------------------------------------------------------
181TESTING RESIZE-FILE
182
183T{ FN2 R/W BIN OPEN-FILE SWAP FID2 ! -> 0 }T
184T{ 37. FID2 @ RESIZE-FILE -> 0 }T
185T{ FID2 @ FILE-SIZE -> 37. 0 }T
186T{ 0. FID2 @ REPOSITION-FILE -> 0 }T
187T{ CBUF BUF 100 FID2 @ READ-FILE -> 37 0 }T
188T{ PAD 37 BUF 37 S= -> TRUE }T
189T{ PAD 38 BUF 38 S= -> FALSE }T
190T{ 500. FID2 @ RESIZE-FILE -> 0 }T
191T{ FID2 @ FILE-SIZE -> 500. 0 }T
192T{ 0. FID2 @ REPOSITION-FILE -> 0 }T
193T{ CBUF BUF 100 FID2 @ READ-FILE -> 100 0 }T
194T{ PAD 37 BUF 37 S= -> TRUE }T
195T{ FID2 @ CLOSE-FILE -> 0 }T
196
197\ ----------------------------------------------------------------------------
198TESTING DELETE-FILE
199
200T{ FN2 DELETE-FILE -> 0 }T
201T{ FN2 R/W BIN OPEN-FILE SWAP DROP 0= -> FALSE }T
202T{ FN2 DELETE-FILE 0= -> FALSE }T
203
204\ ----------------------------------------------------------------------------
205\ TESTING multi-line ( comments
206\
207\ T{ ( 1 2 3
208\ 4 5 6
209\ 7 8 9 ) 11 22 33 -> 11 22 33 }T
210\
211\ ----------------------------------------------------------------------------
212TESTING SOURCE-ID (can only test it does not return 0 or -1)
213
214T{ SOURCE-ID DUP -1 = SWAP 0= OR -> FALSE }T
215
216\ ----------------------------------------------------------------------------
217TESTING RENAME-FILE FILE-STATUS FLUSH-FILE
218
219: FN3 S" fatest3.txt" ;
220: >END FID1 @ FILE-SIZE .s DROP FID1 @ REPOSITION-FILE ;
221
222
223T{ FN3 DELETE-FILE DROP -> }T
224T{ FN1 FN3 RENAME-FILE 0= -> TRUE }T
225T{ FN1 FILE-STATUS SWAP DROP 0= -> FALSE }T
226T{ FN3 FILE-STATUS SWAP DROP 0= -> TRUE }T \ Return value is undefined
227T{ FN3 R/W OPEN-FILE SWAP FID1 ! -> 0 }T
228\ nyi T{ >END -> 0 }T
229\ nyi T{ S" Final line" fid1 @ WRITE-LINE -> 0 }T
230
231\ nyi T{ FID1 @ FLUSH-FILE -> 0 }T \ Can only test FLUSH-FILE doesn't fail
232\ nyi T{ FID1 @ CLOSE-FILE -> 0 }T
233
234\ Tidy the test folder
235T{ fn3 DELETE-FILE DROP -> }T
236
237\ ----------------------------------------------------------------------------
238TESTING two buffers available for S" and/or S\" (Forth 2012)
239
240: SSQ12 S" abcd" ; : SSQ13 S" 1234" ;
241T{ S" abcd" S" 1234" SSQ13 S= ROT ROT SSQ12 S= -> TRUE TRUE }T
242\ nyi T{ S\" abcd" S\" 1234" SSQ13 S= ROT ROT SSQ12 S= -> TRUE TRUE }T
243\ nyi T{ S" abcd" S\" 1234" SSQ13 S= ROT ROT SSQ12 S= -> TRUE TRUE }T
244\ nyi T{ S\" abcd" S" 1234" SSQ13 S= ROT ROT SSQ12 S= -> TRUE TRUE }T
245
246
247\ -----------------------------------------------------------------------------
248TESTING SAVE-INPUT and RESTORE-INPUT with a file source
249
250VARIABLE SIV -1 SIV !
251
252: NEVEREXECUTED
253 CR ." This should never be executed" CR
254;
255
256T{ 11111 SAVE-INPUT
257
258SIV @
259
260[IF]
261 TESTING the -[IF]- part is executed
262 0 SIV !
263 RESTORE-INPUT
264 NEVEREXECUTED
265 33333
266[ELSE]
267
268 TESTING the -[ELSE]- part is executed
269 22222
270
271[THEN]
272
273 -> 11111 0 22222 }T \ 0 comes from RESTORE-INPUT
274
275TESTING nested SAVE-INPUT, RESTORE-INPUT and REFILL from a file
276
277: READ_A_LINE
278 REFILL 0=
279 ABORT" REFILL FAILED"
280;
281
282VARIABLE SI_INC 0 SI_INC !
283
284: SI1
285 SI_INC @ >IN +!
286 15 SI_INC !
287;
288
289: S$ S" SAVE-INPUT SI1 RESTORE-INPUT 12345" ;
290
291CREATE 2RES -1 , -1 , \ Don't use 2VARIABLE from Double number word set
292
293: SI2
294 READ_A_LINE
295 READ_A_LINE
296 SAVE-INPUT
297 READ_A_LINE
298 READ_A_LINE
299 S$ EVALUATE 2RES 2!
300 RESTORE-INPUT
301;
302
303\ WARNING: do not delete or insert lines of text after si2 is called
304\ otherwise the next test will fail
305
306T{ SI2
30733333 \ This line should be ignored
3082RES 2@ 44444 \ RESTORE-INPUT should return to this line
309
31055555
311TESTING the nested results
312 -> 0 0 2345 44444 55555 }T
313
314\ End of warning
315
316\ ----------------------------------------------------------------------------
317
318\ CR .( End of File-Access word set tests) CR
319
320}TEST