Don't treat inner classes as test classes with ant.
[fits.git] / src / nom / tam / util / test / BufferedFileTester.java
1 /* Copyright: Thomas McGlynn 1999.\r
2  * This code may be used for any purpose, non-commercial\r
3  * or commercial so long as this copyright notice is retained\r
4  * in the source code or included in or referred to in any\r
5  * derived software.\r
6  */\r
7 package nom.tam.util.test;\r
8 \r
9 import org.junit.Test;\r
10 import static org.junit.Assert.assertEquals;\r
11 import junit.framework.JUnit4TestAdapter;\r
12 \r
13 import nom.tam.util.*;\r
14 import nom.tam.util.ArrayFuncs;\r
15 import java.io.*;\r
16 \r
17 /** This class provides runs tests of the\r
18  *  BufferedI/O classes: BufferedFile, BufferedDataInputStream\r
19  *  and BufferedDataOutputStream.  A limited comparison\r
20  *  to the standard I/O classes can also be made.\r
21  *  <p>\r
22  *  Input and output of all primitive scalar and array types is\r
23  *  tested, however input and output of String data is not.\r
24  *  Users may choose to test the BufferedFile class, the\r
25  *  BufferedDataXPUT classes array methods, the BufferedDataXPUT\r
26  *  classes using the methods of DataXput, the traditional\r
27  *  I/O classes, or any combination thereof.\r
28  */\r
29 public class BufferedFileTester {\r
30 \r
31     /** Usage: java nom.tam.util.test.BufferedFileTester file [dim [iter [flags]]]\r
32      *         where\r
33      *         file     is the file to be read and written.\r
34      *         dim      is the dimension of the arrays to be written.\r
35      *         iter     is the number of times each array is written.\r
36      *         flags    a string indicating what I/O to test\r
37      *                  O  -- test old I/O (RandomAccessFile and standard streams)\r
38      *                  R  -- BufferedFile (i.e., random access)\r
39      *                  S  -- BufferedDataXPutStream\r
40      *                  X  -- BufferedDataXPutStream using standard methods\r
41      */\r
42     public static void main(String[] args) throws Exception {\r
43 \r
44         String filename = args[0];\r
45         int dim = 1000;\r
46         if (args.length > 1) {\r
47             dim = Integer.parseInt(args[1]);\r
48         }\r
49         int iter = 1;\r
50         if (args.length > 2) {\r
51             iter = Integer.parseInt(args[2]);\r
52         }\r
53 \r
54         System.out.println("Allocating arrays.");\r
55         double[] db = new double[dim];\r
56         float[] fl = new float[dim];\r
57         int[] in = new int[dim];\r
58         long[] ln = new long[dim];\r
59         short[] sh = new short[dim];\r
60         byte[] by = new byte[dim];\r
61         char[] ch = new char[dim];\r
62         boolean[] bl = new boolean[dim];\r
63 \r
64         System.out.println("Initializing arrays -- may take a while");\r
65         int sign = 1;\r
66         for (int i = 0; i < dim; i += 1) {\r
67 \r
68 \r
69             double x = sign * Math.pow(10., 20 * Math.random() - 10);\r
70             db[i] = x;\r
71             fl[i] = (float) x;\r
72 \r
73             if (Math.abs(x) < 1) {\r
74                 x = 1 / x;\r
75             }\r
76 \r
77             in[i] = (int) x;\r
78             ln[i] = (long) x;\r
79             sh[i] = (short) x;\r
80             by[i] = (byte) x;\r
81             ch[i] = (char) x;\r
82             bl[i] = x > 0;\r
83 \r
84             sign = -sign;\r
85         }\r
86 \r
87         // Ensure special values are tested.\r
88 \r
89         by[0] = Byte.MIN_VALUE;\r
90         by[1] = Byte.MAX_VALUE;\r
91         by[2] = 0;\r
92         ch[0] = Character.MIN_VALUE;\r
93         ch[1] = Character.MAX_VALUE;\r
94         ch[2] = 0;\r
95         sh[0] = Short.MAX_VALUE;\r
96         sh[1] = Short.MIN_VALUE;\r
97         sh[0] = 0;\r
98         in[0] = Integer.MAX_VALUE;\r
99         in[1] = Integer.MIN_VALUE;\r
100         in[2] = 0;\r
101         ln[0] = Long.MIN_VALUE;\r
102         ln[1] = Long.MAX_VALUE;\r
103         ln[2] = 0;\r
104         fl[0] = Float.MIN_VALUE;\r
105         fl[1] = Float.MAX_VALUE;\r
106         fl[2] = Float.POSITIVE_INFINITY;\r
107         fl[3] = Float.NEGATIVE_INFINITY;\r
108         fl[4] = Float.NaN;\r
109         fl[5] = 0;\r
110         db[0] = Double.MIN_VALUE;\r
111         db[1] = Double.MAX_VALUE;\r
112         db[2] = Double.POSITIVE_INFINITY;\r
113         db[3] = Double.NEGATIVE_INFINITY;\r
114         db[4] = Double.NaN;\r
115         db[5] = 0;\r
116 \r
117         double[] db2 = new double[dim];\r
118         float[] fl2 = new float[dim];\r
119         int[] in2 = new int[dim];\r
120         long[] ln2 = new long[dim];\r
121         short[] sh2 = new short[dim];\r
122         byte[] by2 = new byte[dim];\r
123         char[] ch2 = new char[dim];\r
124         boolean[] bl2 = new boolean[dim];\r
125 \r
126         int[][][][] multi = new int[10][10][10][10];\r
127         int[][][][] multi2 = new int[10][10][10][10];\r
128         for (int i = 0; i < 10; i += 1) {\r
129             multi[i][i][i][i] = i;\r
130         }\r
131 \r
132         if (args.length < 4 || args[3].indexOf('O') >= 0) {\r
133             standardFileTest(filename, iter, in, in2);\r
134             standardStreamTest(filename, iter, in, in2);\r
135         }\r
136 \r
137         if (args.length < 4 || args[3].indexOf('X') >= 0) {\r
138             buffStreamSimpleTest(filename, iter, in, in2);\r
139         }\r
140 \r
141         if (args.length < 4 || args[3].indexOf('R') >= 0) {\r
142             bufferedFileTest(filename, iter, db, db2, fl, fl2, ln, ln2, in, in2, sh, sh2,\r
143                     ch, ch2, by, by2, bl, bl2, multi, multi2);\r
144         }\r
145 \r
146 \r
147         if (args.length < 4 || args[3].indexOf('S') >= 0) {\r
148             bufferedStreamTest(filename, iter, db, db2, fl, fl2, ln, ln2, in, in2, sh, sh2,\r
149                     ch, ch2, by, by2, bl, bl2, multi, multi2);\r
150         }\r
151     }\r
152 \r
153     public static void standardFileTest(String filename, int iter, int[] in, int[] in2)\r
154             throws Exception {\r
155         System.out.println("Standard I/O library: java.io.RandomAccessFile");\r
156 \r
157         RandomAccessFile f = new RandomAccessFile(filename, "rw");\r
158         int dim = in.length;\r
159         resetTime();\r
160         f.seek(0);\r
161         for (int j = 0; j < iter; j += 1) {\r
162             for (int i = 0; i < dim; i += 1) {\r
163                 f.writeInt(in[i]);\r
164             }\r
165         }\r
166         System.out.println("  RAF Int write: " + (4 * dim * iter) / (1000 * deltaTime()));\r
167         f.seek(0);\r
168         resetTime();\r
169         for (int j = 0; j < iter; j += 1) {\r
170             for (int i = 0; i < dim; i += 1) {\r
171                 in2[i] = f.readInt();\r
172             }\r
173         }\r
174         System.out.println("  RAF Int read:  " + (4 * dim * iter) / (1000 * deltaTime()));\r
175 \r
176 \r
177         synchronized (f) {\r
178             f.seek(0);\r
179             for (int j = 0; j < iter; j += 1) {\r
180                 for (int i = 0; i < dim; i += 1) {\r
181                     f.writeInt(in[i]);\r
182                 }\r
183             }\r
184             System.out.println("  SyncRAF Int write: " + (4 * dim * iter) / (1000 * deltaTime()));\r
185             f.seek(0);\r
186             resetTime();\r
187             for (int j = 0; j < iter; j += 1) {\r
188                 for (int i = 0; i < dim; i += 1) {\r
189                     in2[i] = f.readInt();\r
190                 }\r
191             }\r
192         }\r
193         System.out.println("  SyncRAF Int read:  " + (4 * dim * iter) / (1000 * deltaTime()));\r
194     }\r
195 \r
196     public static void standardStreamTest(String filename, int iter, int[] in, int[] in2)\r
197             throws Exception {\r
198         System.out.println("Standard I/O library: java.io.DataXXputStream");\r
199         System.out.println("                      layered atop a BufferedXXputStream");\r
200 \r
201         DataOutputStream f = new DataOutputStream(new BufferedOutputStream(\r
202                 new FileOutputStream(filename), 32768));\r
203         resetTime();\r
204         int dim = in.length;\r
205         for (int j = 0; j < iter; j += 1) {\r
206             for (int i = 0; i < dim; i += 1) {\r
207                 f.writeInt(in[i]);\r
208             }\r
209         }\r
210         f.flush();\r
211         f.close();\r
212         System.out.println("  DIS Int write: " + (4 * dim * iter) / (1000 * deltaTime()));\r
213 \r
214         DataInputStream is = new DataInputStream(new BufferedInputStream(\r
215                 new FileInputStream(filename), 32768));\r
216         resetTime();\r
217         for (int j = 0; j < iter; j += 1) {\r
218             for (int i = 0; i < dim; i += 1) {\r
219                 in2[i] = is.readInt();\r
220             }\r
221         }\r
222         System.out.println("  DIS Int read:  " + (4 * dim * iter) / (1000 * deltaTime()));\r
223 \r
224 \r
225         f = new DataOutputStream(new BufferedOutputStream(\r
226                 new FileOutputStream(filename), 32768));\r
227         resetTime();\r
228         dim = in.length;\r
229         synchronized (f) {\r
230             for (int j = 0; j < iter; j += 1) {\r
231                 for (int i = 0; i < dim; i += 1) {\r
232                     f.writeInt(in[i]);\r
233                 }\r
234             }\r
235             f.flush();\r
236             f.close();\r
237             System.out.println("  DIS Int write: " + (4 * dim * iter) / (1000 * deltaTime()));\r
238 \r
239             is = new DataInputStream(new BufferedInputStream(\r
240                     new FileInputStream(filename), 32768));\r
241             resetTime();\r
242             for (int j = 0; j < iter; j += 1) {\r
243                 for (int i = 0; i < dim; i += 1) {\r
244                     in2[i] = is.readInt();\r
245                 }\r
246             }\r
247         }\r
248         System.out.println("  DIS Int read:  " + (4 * dim * iter) / (1000 * deltaTime()));\r
249     }\r
250 \r
251     public static void buffStreamSimpleTest(String filename, int iter, int[] in, int[] in2)\r
252             throws Exception {\r
253 \r
254         System.out.println("New libraries:  nom.tam.BufferedDataXXputStream");\r
255         System.out.println("                Using non-array I/O");\r
256         BufferedDataOutputStream f = new BufferedDataOutputStream(\r
257                 new FileOutputStream(filename), 32768);\r
258         resetTime();\r
259         int dim = in.length;\r
260         for (int j = 0; j < iter; j += 1) {\r
261             for (int i = 0; i < dim; i += 1) {\r
262                 f.writeInt(in[i]);\r
263             }\r
264         }\r
265         f.flush();\r
266         f.close();\r
267         System.out.println("  BDS Int write: " + (4 * dim * iter) / (1000 * deltaTime()));\r
268 \r
269         BufferedDataInputStream is = new BufferedDataInputStream(new BufferedInputStream(\r
270                 new FileInputStream(filename), 32768));\r
271         resetTime();\r
272         for (int j = 0; j < iter; j += 1) {\r
273             for (int i = 0; i < dim; i += 1) {\r
274                 in2[i] = is.readInt();\r
275             }\r
276         }\r
277         System.out.println("  BDS Int read:  " + (4 * dim * iter) / (1000 * deltaTime()));\r
278     }\r
279 \r
280     public static void bufferedStreamTest(String filename, int iter, double[] db, double[] db2,\r
281             float[] fl, float[] fl2, long[] ln, long[] ln2,\r
282             int[] in, int[] in2, short[] sh, short[] sh2,\r
283             char[] ch, char[] ch2, byte[] by, byte[] by2,\r
284             boolean[] bl, boolean[] bl2,\r
285             int[][][][] multi, int[][][][] multi2) throws Exception {\r
286 \r
287         int dim = db.length;\r
288 \r
289         double ds = Math.random() - 0.5;\r
290         double ds2;\r
291         float fs = (float) (Math.random() - 0.5);\r
292         float fs2;\r
293         int is = (int) (1000000 * (Math.random() - 500000));\r
294         int is2;\r
295         long ls = (long) (100000000000L * (Math.random() - 50000000000L));\r
296         long ls2;\r
297         short ss = (short) (60000 * (Math.random() - 30000));\r
298         short ss2;\r
299         char cs = (char) (60000 * Math.random());\r
300         char cs2;\r
301         byte bs = (byte) (256 * Math.random() - 128);\r
302         byte bs2;\r
303         boolean bls = (Math.random() > 0.5);\r
304         boolean bls2;\r
305         System.out.println("New libraries: nom.tam.util.BufferedDataXXputStream");\r
306         System.out.println("               Using array I/O methods");\r
307 \r
308         {\r
309             BufferedDataOutputStream f = new BufferedDataOutputStream(new FileOutputStream(filename));\r
310 \r
311             resetTime();\r
312             for (int i = 0; i < iter; i += 1) {\r
313                 f.writeArray(db);\r
314             }\r
315             System.out.println("  BDS Dbl write: " + (8 * dim * iter) / (1000 * deltaTime()));\r
316             for (int i = 0; i < iter; i += 1) {\r
317                 f.writeArray(fl);\r
318             }\r
319             System.out.println("  BDS Flt write: " + (4 * dim * iter) / (1000 * deltaTime()));\r
320             for (int i = 0; i < iter; i += 1) {\r
321                 f.writeArray(in);\r
322             }\r
323             System.out.println("  BDS Int write: " + (4 * dim * iter) / (1000 * deltaTime()));\r
324             for (int i = 0; i < iter; i += 1) {\r
325                 f.writeArray(ln);\r
326             }\r
327             System.out.println("  BDS Lng write: " + (8 * dim * iter) / (1000 * deltaTime()));\r
328             for (int i = 0; i < iter; i += 1) {\r
329                 f.writeArray(sh);\r
330             }\r
331             System.out.println("  BDS Sht write: " + (2 * dim * iter) / (1000 * deltaTime()));\r
332             for (int i = 0; i < iter; i += 1) {\r
333                 f.writeArray(ch);\r
334             }\r
335             System.out.println("  BDS Chr write: " + (2 * dim * iter) / (1000 * deltaTime()));\r
336             for (int i = 0; i < iter; i += 1) {\r
337                 f.writeArray((byte[]) by);\r
338             }\r
339             System.out.println("  BDS Byt write: " + (1 * dim * iter) / (1000 * deltaTime()));\r
340             for (int i = 0; i < iter; i += 1) {\r
341                 f.writeArray(bl);\r
342             }\r
343             System.out.println("  BDS Boo write: " + (1 * dim * iter) / (1000 * deltaTime()));\r
344 \r
345             f.writeByte(bs);\r
346             f.writeChar(cs);\r
347             f.writeShort(ss);\r
348             f.writeInt(is);\r
349             f.writeLong(ls);\r
350             f.writeFloat(fs);\r
351             f.writeDouble(ds);\r
352             f.writeBoolean(bls);\r
353 \r
354             f.writeArray(multi);\r
355             f.flush();\r
356             f.close();\r
357         }\r
358 \r
359         {\r
360             BufferedDataInputStream f = new BufferedDataInputStream(new FileInputStream(filename));\r
361 \r
362 \r
363             resetTime();\r
364             for (int i = 0; i < iter; i += 1) {\r
365                 f.readLArray(db2);\r
366             }\r
367             System.out.println("  BDS Dbl read:  " + (8 * dim * iter) / (1000 * deltaTime()));\r
368             for (int i = 0; i < iter; i += 1) {\r
369                 f.readLArray(fl2);\r
370             }\r
371             System.out.println("  BDS Flt read:  " + (4 * dim * iter) / (1000 * deltaTime()));\r
372             for (int i = 0; i < iter; i += 1) {\r
373                 f.readLArray(in2);\r
374             }\r
375             System.out.println("  BDS Int read:  " + (4 * dim * iter) / (1000 * deltaTime()));\r
376             for (int i = 0; i < iter; i += 1) {\r
377                 f.readLArray(ln2);\r
378             }\r
379             System.out.println("  BDS Lng read:  " + (8 * dim * iter) / (1000 * deltaTime()));\r
380             for (int i = 0; i < iter; i += 1) {\r
381                 f.readLArray(sh2);\r
382             }\r
383             System.out.println("  BDS Sht read:  " + (2 * dim * iter) / (1000 * deltaTime()));\r
384             for (int i = 0; i < iter; i += 1) {\r
385                 f.readLArray(ch2);\r
386             }\r
387             System.out.println("  BDS Chr read:  " + (2 * dim * iter) / (1000 * deltaTime()));\r
388             for (int i = 0; i < iter; i += 1) {\r
389                 f.readLArray((byte[]) by2);\r
390             }\r
391             System.out.println("  BDS Byt read:  " + (1 * dim * iter) / (1000 * deltaTime()));\r
392             for (int i = 0; i < iter; i += 1) {\r
393                 f.readLArray(bl2);\r
394             }\r
395             System.out.println("  BDS Boo read:  " + (1 * dim * iter) / (1000 * deltaTime()));\r
396 \r
397             bs2 = f.readByte();\r
398             cs2 = f.readChar();\r
399             ss2 = f.readShort();\r
400             is2 = f.readInt();\r
401             ls2 = f.readLong();\r
402             fs2 = f.readFloat();\r
403             ds2 = f.readDouble();\r
404             bls2 = f.readBoolean();\r
405 \r
406             for (int i = 0; i < 10; i += 1) {\r
407                 multi2[i][i][i][i] = 0;\r
408             }\r
409 \r
410             // Now read only pieces of the multidimensional array.\r
411             for (int i = 0; i < 5; i += 1) {\r
412                 System.out.println("Multiread:" + i);\r
413                 // Skip the odd initial indices and\r
414                 // read the evens.\r
415                 f.skipBytes(4000);\r
416                 f.readLArray(multi2[2 * i + 1]);\r
417             }\r
418             f.close();\r
419         }\r
420 \r
421         System.out.println("Stream Verification:");\r
422         System.out.println("  An error should be reported for double and float NaN's");\r
423         System.out.println("  Arrays:");\r
424 \r
425         for (int i = 0; i < dim; i += 1) {\r
426 \r
427             if (db[i] != db2[i]) {\r
428                 System.out.println("     Double error at " + i + " " + db[i] + " " + db2[i]);\r
429             }\r
430             if (fl[i] != fl2[i]) {\r
431                 System.out.println("     Float error at " + i + " " + fl[i] + " " + fl2[i]);\r
432             }\r
433             if (in[i] != in2[i]) {\r
434                 System.out.println("     Int error at " + i + " " + in[i] + " " + in2[i]);\r
435             }\r
436             if (ln[i] != ln2[i]) {\r
437                 System.out.println("     Long error at " + i + " " + ln[i] + " " + ln2[i]);\r
438             }\r
439             if (sh[i] != sh2[i]) {\r
440                 System.out.println("     Short error at " + i + " " + sh[i] + " " + sh2[i]);\r
441             }\r
442             if (ch[i] != ch2[i]) {\r
443                 System.out.println("     Char error at " + i + " " + (int) ch[i] + " " + (int) ch2[i]);\r
444             }\r
445             if (by[i] != by2[i]) {\r
446                 System.out.println("     Byte error at " + i + " " + by[i] + " " + by2[i]);\r
447             }\r
448             if (bl[i] != bl2[i]) {\r
449                 System.out.println("     Bool error at " + i + " " + bl[i] + " " + bl2[i]);\r
450             }\r
451         }\r
452 \r
453         System.out.println("  Scalars:");\r
454         // Check the scalars.\r
455         if (bls != bls2) {\r
456             System.out.println("     Bool Scalar mismatch:" + bls + " " + bls2);\r
457         }\r
458         if (bs != bs2) {\r
459             System.out.println("     Byte Scalar mismatch:" + bs + " " + bs2);\r
460         }\r
461         if (cs != cs2) {\r
462             System.out.println("     Char Scalar mismatch:" + (int) cs + " " + (int) cs2);\r
463         }\r
464         if (ss != ss2) {\r
465             System.out.println("     Short Scalar mismatch:" + ss + " " + ss2);\r
466         }\r
467         if (is != is2) {\r
468             System.out.println("     Int Scalar mismatch:" + is + " " + is2);\r
469         }\r
470         if (ls != ls2) {\r
471             System.out.println("     Long Scalar mismatch:" + ls + " " + ls2);\r
472         }\r
473         if (fs != fs2) {\r
474             System.out.println("     Float Scalar mismatch:" + fs + " " + fs2);\r
475         }\r
476         if (ds != ds2) {\r
477             System.out.println("     Double Scalar mismatch:" + ds + " " + ds2);\r
478         }\r
479 \r
480         System.out.println("  Multi: odd rows should match");\r
481         for (int i = 0; i < 10; i += 1) {\r
482             System.out.println("      " + i + " " + multi[i][i][i][i] + " " + multi2[i][i][i][i]);\r
483         }\r
484         System.out.println("Done BufferedStream Tests");\r
485     }\r
486 \r
487     public static void bufferedFileTest(String filename, int iter, double[] db, double[] db2,\r
488             float[] fl, float[] fl2, long[] ln, long[] ln2,\r
489             int[] in, int[] in2, short[] sh, short[] sh2,\r
490             char[] ch, char[] ch2, byte[] by, byte[] by2,\r
491             boolean[] bl, boolean[] bl2,\r
492             int[][][][] multi, int[][][][] multi2) throws Exception {\r
493 \r
494 \r
495         int dim = db.length;\r
496 \r
497         double ds = Math.random() - 0.5;\r
498         double ds2;\r
499         float fs = (float) (Math.random() - 0.5);\r
500         float fs2;\r
501         int is = (int) (1000000 * (Math.random() - 500000));\r
502         int is2;\r
503         long ls = (long) (100000000000L * (Math.random() - 50000000000L));\r
504         long ls2;\r
505         short ss = (short) (60000 * (Math.random() - 30000));\r
506         short ss2;\r
507         char cs = (char) (60000 * Math.random());\r
508         char cs2;\r
509         byte bs = (byte) (256 * Math.random() - 128);\r
510         byte bs2;\r
511         boolean bls = (Math.random() > 0.5);\r
512         boolean bls2;\r
513 \r
514         System.out.println("New libraries: nom.tam.util.BufferedFile");\r
515         System.out.println("               Using array I/O methods.");\r
516 \r
517         BufferedFile f = new BufferedFile(filename, "rw");\r
518 \r
519         resetTime();\r
520         for (int i = 0; i < iter; i += 1) {\r
521             f.writeArray(db);\r
522         }\r
523         System.out.println("  BF  Dbl write: " + (8 * dim * iter) / (1000 * deltaTime()));\r
524         for (int i = 0; i < iter; i += 1) {\r
525             f.writeArray(fl);\r
526         }\r
527         System.out.println("  BF  Flt write: " + (4 * dim * iter) / (1000 * deltaTime()));\r
528         for (int i = 0; i < iter; i += 1) {\r
529             f.writeArray(in);\r
530         }\r
531         System.out.println("  BF  Int write: " + (4 * dim * iter) / (1000 * deltaTime()));\r
532         for (int i = 0; i < iter; i += 1) {\r
533             f.writeArray(ln);\r
534         }\r
535         System.out.println("  BF  Lng write: " + (8 * dim * iter) / (1000 * deltaTime()));\r
536         for (int i = 0; i < iter; i += 1) {\r
537             f.writeArray(sh);\r
538         }\r
539         System.out.println("  BF  Sht write: " + (2 * dim * iter) / (1000 * deltaTime()));\r
540         for (int i = 0; i < iter; i += 1) {\r
541             f.writeArray(ch);\r
542         }\r
543         System.out.println("  BF  Chr write: " + (2 * dim * iter) / (1000 * deltaTime()));\r
544         for (int i = 0; i < iter; i += 1) {\r
545             f.writeArray(by);\r
546         }\r
547         System.out.println("  BF  Byt write: " + (1 * dim * iter) / (1000 * deltaTime()));\r
548         for (int i = 0; i < iter; i += 1) {\r
549             f.writeArray(bl);\r
550         }\r
551         System.out.println("  BF  Boo write: " + (1 * dim * iter) / (1000 * deltaTime()));\r
552 \r
553         f.writeByte(bs);\r
554         f.writeChar(cs);\r
555         f.writeShort(ss);\r
556         f.writeInt(is);\r
557         f.writeLong(ls);\r
558         f.writeFloat(fs);\r
559         f.writeDouble(ds);\r
560         f.writeBoolean(bls);\r
561 \r
562         f.writeArray(multi);\r
563         f.seek(0);\r
564 \r
565 \r
566         resetTime();\r
567         for (int i = 0; i < iter; i += 1) {\r
568             f.readLArray(db2);\r
569         }\r
570         System.out.println("  BF  Dbl read:  " + (8 * dim * iter) / (1000 * deltaTime()));\r
571         for (int i = 0; i < iter; i += 1) {\r
572             f.readLArray(fl2);\r
573         }\r
574         System.out.println("  BF  Flt read:  " + (4 * dim * iter) / (1000 * deltaTime()));\r
575         for (int i = 0; i < iter; i += 1) {\r
576             f.readLArray(in2);\r
577         }\r
578         System.out.println("  BF  Int read:  " + (4 * dim * iter) / (1000 * deltaTime()));\r
579         for (int i = 0; i < iter; i += 1) {\r
580             f.readLArray(ln2);\r
581         }\r
582         System.out.println("  BF  Lng read:  " + (8 * dim * iter) / (1000 * deltaTime()));\r
583         for (int i = 0; i < iter; i += 1) {\r
584             f.readLArray(sh2);\r
585         }\r
586         System.out.println("  BF  Sht read:  " + (2 * dim * iter) / (1000 * deltaTime()));\r
587         for (int i = 0; i < iter; i += 1) {\r
588             f.readLArray(ch2);\r
589         }\r
590         System.out.println("  BF  Chr read:  " + (2 * dim * iter) / (1000 * deltaTime()));\r
591         for (int i = 0; i < iter; i += 1) {\r
592             f.readLArray(by2);\r
593         }\r
594         System.out.println("  BF  Byt read:  " + (1 * dim * iter) / (1000 * deltaTime()));\r
595         for (int i = 0; i < iter; i += 1) {\r
596             f.readLArray(bl2);\r
597         }\r
598         System.out.println("  BF  Boo read:  " + (1 * dim * iter) / (1000 * deltaTime()));\r
599 \r
600         bs2 = f.readByte();\r
601         cs2 = f.readChar();\r
602         ss2 = f.readShort();\r
603         is2 = f.readInt();\r
604         ls2 = f.readLong();\r
605         fs2 = f.readFloat();\r
606         ds2 = f.readDouble();\r
607         bls2 = f.readBoolean();\r
608 \r
609         // Now read only pieces of the multidimensional array.\r
610         for (int i = 0; i < 5; i += 1) {\r
611             // Skip the odd initial indices and\r
612             // read the evens.\r
613             f.skipBytes(4000);\r
614             f.readLArray(multi2[2 * i + 1]);\r
615         }\r
616 \r
617         System.out.println("BufferedFile Verification:");\r
618         System.out.println("  An error should be reported for double and float NaN's");\r
619         System.out.println("  Arrays:");\r
620 \r
621         for (int i = 0; i < dim; i += 1) {\r
622 \r
623             if (db[i] != db2[i]) {\r
624                 System.out.println("     Double error at " + i + " " + db[i] + " " + db2[i]);\r
625             }\r
626             if (fl[i] != fl2[i]) {\r
627                 System.out.println("     Float error at " + i + " " + fl[i] + " " + fl2[i]);\r
628             }\r
629             if (in[i] != in2[i]) {\r
630                 System.out.println("     Int error at " + i + " " + in[i] + " " + in2[i]);\r
631             }\r
632             if (ln[i] != ln2[i]) {\r
633                 System.out.println("     Long error at " + i + " " + ln[i] + " " + ln2[i]);\r
634             }\r
635             if (sh[i] != sh2[i]) {\r
636                 System.out.println("     Short error at " + i + " " + sh[i] + " " + sh2[i]);\r
637             }\r
638             if (ch[i] != ch2[i]) {\r
639                 System.out.println("     Char error at " + i + " " + (int) ch[i] + " " + (int) ch2[i]);\r
640             }\r
641             if (by[i] != by2[i]) {\r
642                 System.out.println("     Byte error at " + i + " " + by[i] + " " + by2[i]);\r
643             }\r
644             if (bl[i] != bl2[i]) {\r
645                 System.out.println("     Bool error at " + i + " " + bl[i] + " " + bl2[i]);\r
646             }\r
647         }\r
648 \r
649         System.out.println("  Scalars:");\r
650         // Check the scalars.\r
651         if (bls != bls2) {\r
652             System.out.println("     Bool Scalar mismatch:" + bls + " " + bls2);\r
653         }\r
654         if (bs != bs2) {\r
655             System.out.println("     Byte Scalar mismatch:" + bs + " " + bs2);\r
656         }\r
657         if (cs != cs2) {\r
658             System.out.println("     Char Scalar mismatch:" + (int) cs + " " + (int) cs2);\r
659         }\r
660         if (ss != ss2) {\r
661             System.out.println("     Short Scalar mismatch:" + ss + " " + ss2);\r
662         }\r
663         if (is != is2) {\r
664             System.out.println("     Int Scalar mismatch:" + is + " " + is2);\r
665         }\r
666         if (ls != ls2) {\r
667             System.out.println("     Long Scalar mismatch:" + ls + " " + ls2);\r
668         }\r
669         if (fs != fs2) {\r
670             System.out.println("     Float Scalar mismatch:" + fs + " " + fs2);\r
671         }\r
672         if (ds != ds2) {\r
673             System.out.println("     Double Scalar mismatch:" + ds + " " + ds2);\r
674         }\r
675 \r
676         System.out.println("  Multi: odd rows should match");\r
677         for (int i = 0; i < 10; i += 1) {\r
678             System.out.println("      " + i + " " + multi[i][i][i][i] + " " + multi2[i][i][i][i]);\r
679         }\r
680         System.out.println("Done BufferedFile Tests");\r
681     }\r
682     static long lastTime;\r
683 \r
684     static void resetTime() {\r
685         lastTime = new java.util.Date().getTime();\r
686     }\r
687 \r
688     static double deltaTime() {\r
689         long time = lastTime;\r
690         lastTime = new java.util.Date().getTime();\r
691         return (lastTime - time) / 1000.;\r
692     }\r
693 \r
694     @Test\r
695     public void testBufferedFile() throws Exception {\r
696 \r
697         double[][] td = new double[100][600];\r
698         for (int i = 0; i < 100; i += 1) {\r
699             for (int j = 0; j < 600; j += 1) {\r
700                 td[i][j] = i + 2 * j;\r
701             }\r
702         }\r
703         int[][][] ti = new int[5][4][3];\r
704         for (int i = 0; i < 5; i += 1) {\r
705             for (int j = 0; j < 4; j += 1) {\r
706                 for (int k = 0; k < 3; k += 1) {\r
707                     ti[i][j][k] = i * j * k;\r
708                 }\r
709             }\r
710         }\r
711 \r
712         float[][] tf = new float[10][];\r
713         for (int i = 0; i < 10; i += 1) {\r
714             tf[i] = new float[i];\r
715             for (int j = 0; j < i; j += 1) {\r
716                 tf[i][j] = (float) Math.sin(i * j);\r
717             }\r
718         }\r
719 \r
720         boolean[] tb = new boolean[100];\r
721         for (int i = 2; i < 100; i += 1) {\r
722             tb[i] = !tb[i - 1];\r
723         }\r
724 \r
725         short[][] ts = new short[5][5];\r
726         ts[2][2] = 222;\r
727 \r
728         byte[] tbyte = new byte[1024];\r
729         for (int i = 0; i < tbyte.length; i += 1) {\r
730             tbyte[i] = (byte) i;\r
731         }\r
732 \r
733         char[] tc = new char[10];\r
734         tc[3] = 'c';\r
735 \r
736         long[][][] tl0 = new long[1][1][1];\r
737         long[][][] tl1 = new long[1][1][0];\r
738 \r
739         BufferedFile bf = new BufferedFile("jtest.fil", "rw");\r
740 \r
741         bf.writeArray(td);\r
742         bf.writeArray(tf);\r
743         bf.writeArray(ti);\r
744         bf.writeArray(ts);\r
745         bf.writeArray(tb);\r
746         bf.writeArray(tbyte);\r
747         bf.writeArray(tc);\r
748         bf.writeArray(tl0);\r
749         bf.writeArray(tl1);\r
750         bf.writeArray(ts);\r
751 \r
752         bf.close();\r
753 \r
754         bf = new BufferedFile("jtest.fil", "r");\r
755 \r
756         boolean thrown = false;\r
757 \r
758         try {\r
759             bf.writeArray(td);\r
760         } catch (Exception e) {\r
761             thrown = true;\r
762         }\r
763         assertEquals("BufferedFile protections", true, thrown);\r
764         try {\r
765             bf.close();\r
766         } catch (Exception e) {\r
767         }\r
768 \r
769         bf = new BufferedFile("jtest.fil", "r");\r
770 \r
771         testArray(bf, "double", td);\r
772         testArray(bf, "float", tf);\r
773         testArray(bf, "int", ti);\r
774         testArray(bf, "short", ts);\r
775         testArray(bf, "bool", tb);\r
776         testArray(bf, "byte", tbyte);\r
777         testArray(bf, "char", tc);\r
778         testArray(bf, "long1", tl0);\r
779         testArray(bf, "longnull", tl1);\r
780         testArray(bf, "short2", ts);\r
781     }\r
782 \r
783     @Test\r
784     public void testBufferedStreams() throws Exception {\r
785 \r
786         double[][] td = new double[100][600];\r
787         for (int i = 0; i < 100; i += 1) {\r
788             for (int j = 0; j < 600; j += 1) {\r
789                 td[i][j] = i + 2 * j;\r
790             }\r
791         }\r
792         int[][][] ti = new int[5][4][3];\r
793         for (int i = 0; i < 5; i += 1) {\r
794             for (int j = 0; j < 4; j += 1) {\r
795                 for (int k = 0; k < 3; k += 1) {\r
796                     ti[i][j][k] = i * j * k;\r
797                 }\r
798             }\r
799         }\r
800 \r
801         float[][] tf = new float[10][];\r
802         for (int i = 0; i < 10; i += 1) {\r
803             tf[i] = new float[i];\r
804             for (int j = 0; j < i; j += 1) {\r
805                 tf[i][j] = (float) Math.sin(i * j);\r
806             }\r
807         }\r
808 \r
809         boolean[] tb = new boolean[100];\r
810         for (int i = 2; i < 100; i += 1) {\r
811             tb[i] = !tb[i - 1];\r
812         }\r
813 \r
814         short[][] ts = new short[5][5];\r
815         ts[2][2] = 222;\r
816 \r
817         byte[] tbyte = new byte[1024];\r
818         for (int i = 0; i < tbyte.length; i += 1) {\r
819             tbyte[i] = (byte) i;\r
820         }\r
821 \r
822         char[] tc = new char[10];\r
823         tc[3] = 'c';\r
824 \r
825         long[][][] tl0 = new long[1][1][1];\r
826         long[][][] tl1 = new long[1][1][0];\r
827 \r
828         BufferedDataOutputStream bf = new BufferedDataOutputStream(\r
829                 new FileOutputStream("jtest.fil"));\r
830 \r
831         bf.writeArray(td);\r
832         bf.writeArray(tf);\r
833         bf.writeArray(ti);\r
834         bf.writeArray(ts);\r
835         bf.writeArray(tb);\r
836         bf.writeArray(tbyte);\r
837         bf.writeArray(tc);\r
838         bf.writeArray(tl0);\r
839         bf.writeArray(tl1);\r
840         bf.writeArray(ts);\r
841 \r
842         bf.close();\r
843 \r
844         BufferedDataInputStream bi = new BufferedDataInputStream(\r
845                 new FileInputStream("jtest.fil"));\r
846 \r
847         testArray(bi, "sdouble", td);\r
848         testArray(bi, "sfloat", tf);\r
849         testArray(bi, "sint", ti);\r
850         testArray(bi, "sshort", ts);\r
851         testArray(bi, "sbool", tb);\r
852         testArray(bi, "sbyte", tbyte);\r
853         testArray(bi, "schar", tc);\r
854         testArray(bi, "slong1", tl0);\r
855         testArray(bi, "slongnull", tl1);\r
856         testArray(bi, "sshort2", ts);\r
857     }\r
858 \r
859     void testArray(ArrayDataInput bf, String label, Object array) throws Exception {\r
860         Object newArray = ArrayFuncs.mimicArray(array, ArrayFuncs.getBaseClass(array));\r
861         bf.readLArray(newArray);\r
862         boolean state = ArrayFuncs.arrayEquals(array, newArray);\r
863         assertEquals(label, true, state);\r
864     }\r
865 }\r
866 \r
867 \r