source: project/mat5-lib/trunk/tests/run.scm @ 4313

Last change on this file since 4313 was 4313, checked in by Ivan Raikov, 13 years ago

Bug fix in the sparse array routines.

File size: 8.8 KB
Line 
1;;
2;;
3;; MAT 5.0 library test cases.
4;;
5;;
6;; Version $Revision$
7;;
8;;
9;; Copyright 2005 Ivan Raikov and the Georgia Institute of Technology
10;;
11;; This program is free software; you can redistribute it and/or
12;; modify it under the terms of the GNU General Public License as
13;; published by the Free Software Foundation; either version 2 of the
14;; License, or (at your option) any later version.
15;;
16;; This program is distributed in the hope that it will be useful, but
17;; WITHOUT ANY WARRANTY; without even the implied warranty of
18;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
19;; General Public License for more details.
20;;
21;; You should have received a copy of the GNU General Public License
22;; along with this program; if not, write to the Free Software
23;; Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
24;; 02110-1301 USA
25;;
26;; A full copy of the GPL license can be found on Debian systems in
27;; /usr/share/common-licenses/GPL-2
28;;
29;;
30;;
31
32(require-extension testeez)
33(require-extension srfi-4)
34(require-extension srfi-40)
35(require-extension srfi-47)
36(require-for-syntax 'datatype)
37(require-extension mat5-lib)
38(require-extension endian-port)
39
40(define (mat5:test:spec)
41  (testeez
42   "MAT5 library numeric array test from specification document p. 1-20"
43   
44   (test-define "Open endian port for writing" eport+path
45                (let-values (((fd temp-path) (file-mkstemp "/tmp/mat5-test.XXXXXX")))
46                            (let ((temp-port (open-output-file* fd)))
47                              (cons (port->endian-port temp-port) temp-path))))
48
49   (test-define "" eport (car eport+path))
50   (test-define "" temp-path (cdr eport+path))
51
52   (test-define "Test array" aa
53                (let ((real (make-array (ar32 0) 2 2))
54                      (imag (make-array (ar32 0) 2 2)))
55
56                  (array-set! real 1.0  0 0)
57                  (array-set! real 3.0  0 1)
58                  (array-set! real 2.0  1 0)
59                  (array-set! real 4.0  1 1)
60
61                  (array-set! imag 1.1  0 0)
62
63                  (MAT5:num-array  "my_array" (miSINGLE) '(2 2) real imag)))
64
65   (test-eval "Test array" aa)
66   
67   (test-eval "Write MAT5 file header" 
68              (MAT5:write-header eport "MATLAB 5.0 MAT-file" ""))
69
70   (test-eval "Write test array aa" 
71              (MAT5:write-data-element eport aa))
72
73   (test-eval "Close endian port for writing" 
74              (close-endian-port eport))
75
76   (test-define "Reopen endian port for reading"  eport
77                (open-endian-port 'read temp-path))
78
79   (test-eval "Read header from file" 
80              (MAT5:read-header eport))
81
82   (test-define "Read array from file"  aa1
83              (MAT5:read-data-element eport))
84
85   (test/equal "Compare array from file with original array"
86              (MAT5:data-element-data (car aa1)) aa)
87
88   (test-eval "Close endian port for reading" 
89              (close-endian-port eport))))
90
91(define (mat5:test:r+w)
92  (testeez
93   "MAT5 library read+write test"
94   
95   (test-define "Open endian port for writing" eport+path
96                (let-values (((fd temp-path) (file-mkstemp "/tmp/mat5-test.XXXXXX")))
97                            (let ((temp-port (open-output-file* fd)))
98                              (cons (port->endian-port temp-port) temp-path))))
99
100   (test-define "" eport (car eport+path))
101   (test-define "" temp-path (cdr eport+path))
102
103   (test-define "Test array" aa
104                (let ((av (make-array (ar64 0) 2 3 4)))
105
106                  (array-set! av 2.0  0 0 0)
107                  (array-set! av 7.0  0 0 1)
108                  (array-set! av 8.0  0 0 2)
109                  (array-set! av 9.0  0 0 3)
110
111                  (array-set! av 1.0  0 1 0)
112                  (array-set! av 13.0 0 1 1)
113                  (array-set! av 14.0 0 1 2)
114                  (array-set! av 15.0 0 1 3)
115
116                  (array-set! av 4.0  0 2 0)
117                  (array-set! av 19.0 0 2 1)
118                  (array-set! av 20.0 0 2 2)
119                  (array-set! av 21.0 0 2 3)
120
121                  (array-set! av 5.0  1 0 0)
122                  (array-set! av 10.0 1 0 1)
123                  (array-set! av 11.0 1 0 2)
124                  (array-set! av 12.0 1 0 3)
125
126                  (array-set! av 3.0  1 1 0)
127                  (array-set! av 16.0 1 1 1)
128                  (array-set! av 17.0 1 1 2)
129                  (array-set! av 18.0 1 1 3)
130
131                  (array-set! av 6.0  1 2 0)
132                  (array-set! av 22.0 1 2 1)
133                  (array-set! av 23.0 1 2 2)
134                  (array-set! av 24.0 1 2 3)
135
136                  (MAT5:num-array  "aa1" (miDOUBLE) '(2 3 4) av  #f)))
137
138   (test-eval "Test array" aa)
139   
140   (test-eval "Write MAT5 file header" 
141              (MAT5:write-header eport "MATLAB 5.0 MAT-file" ""))
142
143   (test-eval "Write test array aa" 
144              (MAT5:write-data-element eport aa))
145
146   (test-eval "Close endian port for writing" 
147              (close-endian-port eport))
148
149   (test-define "Reopen endian port for reading"  eport
150                (open-endian-port 'read temp-path))
151
152   (test-eval "Read header from file" 
153              (MAT5:read-header eport))
154
155   (test-define "Read array from file"  aa1
156              (MAT5:read-data-element eport))
157
158   (test/equal "Compare array from file with original array"
159              (MAT5:data-element-data (car aa1)) aa)
160
161   (test-eval "Close endian port for reading" 
162              (close-endian-port eport))))
163
164
165(define (mat5:test:stream-r+w)
166  (testeez
167   "MAT5 library stream read/write test"
168   
169   (test-define "Open endian port for writing" eport+path
170                (let-values (((fd temp-path) (file-mkstemp "/tmp/mat5-test.XXXXXX")))
171                            (let ((temp-port (open-output-file* fd)))
172                              (cons (port->endian-port temp-port) temp-path))))
173
174   (test-define "" eport (car eport+path))
175   (test-define "" temp-path (cdr eport+path))
176   
177   (test-define "Test array" aa
178                (let ((av (stream (stream (list->f64vector '(2.0 5.0))
179                                          (list->f64vector '(1.0 3.0))
180                                          (list->f64vector '(4.0 6.0)))
181                                 
182                                  (stream (list->f64vector '(7.0  10.0))
183                                          (list->f64vector '(13.0 16.0))
184                                          (list->f64vector '(19.0 22.0)))
185
186                                  (stream (list->f64vector '(8.0  11.0))
187                                          (list->f64vector '(14.0 17.0))
188                                          (list->f64vector '(20.0 23.0)))
189
190                                  (stream (list->f64vector '(9.0  12.0)))
191                                          (list->f64vector '(15.0 18.0))
192                                          (list->f64vector '(21.0 24.0)))))
193                  (MAT5:num-array  "aa2" (miDOUBLE) '(2 3 ??) av  #f)))
194
195   (test-eval "Test array" aa)
196
197   (test-eval "Write MAT5 file header" 
198              (MAT5:write-header eport "MATLAB 5.0 MAT-file" ""))
199
200   (test-eval "Write test array aa" 
201              (MAT5:stream-write-data-element eport aa))
202
203   (test-eval "Close endian port for writing" 
204              (close-endian-port eport))
205
206
207   (test-define "Reopen endian port for reading"  eport
208                (open-endian-port 'read temp-path))
209
210   (test-eval "Read header from file" 
211              (MAT5:read-header eport))
212
213   (test-eval "Read array from file" 
214              (MAT5:read-data-element eport))
215
216   (test-eval "Close endian port for reading" 
217              (close-endian-port eport))
218
219   (test-define "Reopen endian port for reading"  eport
220                (open-endian-port 'read temp-path))
221
222   (test-define "Create read stream" stream
223              (MAT5:read-stream eport))
224   
225   (test-eval "First stream element"
226              (stream-car stream))
227
228   (test-define "Second stream element" el2
229                (stream-car (stream-cdr stream)))
230
231   (test-eval "Contents of second stream element"
232              (for-each
233               (lambda (x) 
234                 (if (MAT5:array-type? (MAT5:data-element-type x))
235                     (cases MAT5:array (MAT5:data-element-data x)
236                            (MAT5:num-array (name data-type dims real imag)
237                                            (stream-for-each (lambda (x) (print "column: " x)) real))
238                            (else (print data)))
239                     (else (print x))))
240               el2))
241   
242   (test-eval "Close endian port for reading" 
243              (close-endian-port eport))))
244
245
246(define (mat5:teststruct:r+w)
247  (testeez
248   "MAT5 library read+write test for structures"
249   
250   (test-define "Open endian port for writing" eport+path
251                (let-values (((fd temp-path) (file-mkstemp "/tmp/mat5-test.XXXXXX")))
252                            (let ((temp-port (open-output-file* fd)))
253                              (cons (port->endian-port temp-port) temp-path))))
254
255   (test-define "" eport (car eport+path))
256   (test-define "" temp-path (cdr eport+path))
257
258   (test-define "Test structure" aa
259                (let ((av (init-MAT5:cell 1 1))
260                      (w  (make-array (ar64 0) 1 1))
261                      (y  (make-array (ar64 0) 1 1))
262                      (z  (make-array (ar64 0) 1 1)))
263
264                  (array-set! w 1.0  0 0)
265                  (array-set! y 2.0  0 0)
266                  (array-set! z 3.0  0 0)
267                 
268                  (MAT5:cell-set! av 
269                                  (list (MAT5:num-array "w" (miDOUBLE) '(1 1) w #f)
270                                        (MAT5:num-array "y" (miDOUBLE) '(1 1) y #f)
271                                        (MAT5:num-array "z" (miDOUBLE) '(1 1) z #f))
272                                  0 0)
273
274                  (MAT5:structure  "aa1" '(1 1) '("w" "y" "z")  av)))
275
276   (test-eval "Test structure" aa)
277   
278   (test-eval "Write MAT5 file header" 
279              (MAT5:write-header eport "MATLAB 5.0 MAT-file" ""))
280
281   (test-eval "Write test structure aa" 
282              (MAT5:write-data-element eport aa))
283
284   (test-eval "Close endian port for writing" 
285              (close-endian-port eport))
286
287   (test-define "Reopen endian port for reading"  eport
288                (open-endian-port 'read temp-path))
289
290   (test-eval "Read header from file" 
291              (MAT5:read-header eport))
292
293   (test-define "Read structure from file"  aa1
294              (MAT5:read-data-element eport))
295
296   (test/equal "Compare structure from file with original structure"
297              (MAT5:data-element-data (car aa1)) aa)
298
299   (test-eval "Close endian port for reading" 
300              (close-endian-port eport))))
301
302
303(mat5:test:spec)
304(mat5:test:r+w)
305(mat5:test:stream-r+w)
306(mat5:teststruct:r+w)
307
Note: See TracBrowser for help on using the repository browser.