source: project/release/3/mat5-lib/trunk/tests/run.scm @ 11550

Last change on this file since 11550 was 11550, checked in by Ivan Raikov, 12 years ago

Updates to license text; eliminated use of syntax-case.

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