b5fd95cdf8e373679b20a7ffb36bedc86b2112e5
[platform/upstream/nodejs.git] /
1 /*
2  * Another place to find bugs that may yet plague us. This time with writing out
3  * floats to arrays. We are lazy and did basically just take the opposite of our
4  * test code to read in values.
5  */
6
7 var mod_ctype = require('../../../ctio.js');
8 var ASSERT = require('assert');
9
10
11 /*
12  *      A useful thing to keep around for debugging
13  *      console.log('buffer[0]: ' + buffer[0].toString(16));
14  *      console.log('buffer[1]: ' + buffer[1].toString(16));
15  *      console.log('buffer[2]: ' + buffer[2].toString(16));
16  *      console.log('buffer[3]: ' + buffer[3].toString(16));
17  *      console.log('buffer[4]: ' + buffer[4].toString(16));
18  *      console.log('buffer[5]: ' + buffer[5].toString(16));
19  *      console.log('buffer[6]: ' + buffer[6].toString(16));
20  *      console.log('buffer[7]: ' + buffer[7].toString(16));
21  */
22
23 function testfloat()
24 {
25         var buffer = new Buffer(4);
26         mod_ctype.wfloat(0, 'big', buffer, 0);
27         /* Start off with some of the easy ones: +zero */
28         ASSERT.equal(0, buffer[0]);
29         ASSERT.equal(0, buffer[1]);
30         ASSERT.equal(0, buffer[2]);
31         ASSERT.equal(0, buffer[3]);
32         mod_ctype.wfloat(0, 'little', buffer, 0);
33         ASSERT.equal(0, buffer[0]);
34         ASSERT.equal(0, buffer[1]);
35         ASSERT.equal(0, buffer[2]);
36         ASSERT.equal(0, buffer[3]);
37
38         /* Catch +infin */
39         mod_ctype.wfloat(Number.POSITIVE_INFINITY, 'big', buffer, 0);
40         ASSERT.equal(0x7f, buffer[0]);
41         ASSERT.equal(0x80, buffer[1]);
42         ASSERT.equal(0x00, buffer[2]);
43         ASSERT.equal(0x00, buffer[3]);
44         mod_ctype.wfloat(Number.POSITIVE_INFINITY, 'little', buffer, 0);
45         ASSERT.equal(0x7f, buffer[3]);
46         ASSERT.equal(0x80, buffer[2]);
47         ASSERT.equal(0x00, buffer[1]);
48         ASSERT.equal(0x00, buffer[0]);
49
50         /* Catch -infin */
51         mod_ctype.wfloat(Number.NEGATIVE_INFINITY, 'big', buffer, 0);
52         ASSERT.equal(0xff, buffer[0]);
53         ASSERT.equal(0x80, buffer[1]);
54         ASSERT.equal(0x00, buffer[2]);
55         ASSERT.equal(0x00, buffer[3]);
56         mod_ctype.wfloat(Number.NEGATIVE_INFINITY, 'little', buffer, 0);
57         ASSERT.equal(0xff, buffer[3]);
58         ASSERT.equal(0x80, buffer[2]);
59         ASSERT.equal(0x00, buffer[1]);
60         ASSERT.equal(0x00, buffer[0]);
61
62         /* Catch NaN */
63
64         /*
65          * NaN Is a litle weird in its requirements, so we're going to encode a
66          * bit of how we actually implement it into this test. Probably not the
67          * best, since technically the sign is a don't care and the mantissa
68          * needs to just be non-zero.
69          */
70         mod_ctype.wfloat(NaN, 'big', buffer, 0);
71         ASSERT.equal(0x7f, buffer[0]);
72         ASSERT.equal(0x80, buffer[1]);
73         ASSERT.equal(0x00, buffer[2]);
74         ASSERT.equal(0x17, buffer[3]);
75         mod_ctype.wfloat(NaN, 'little', buffer, 0);
76         ASSERT.equal(0x7f, buffer[3]);
77         ASSERT.equal(0x80, buffer[2]);
78         ASSERT.equal(0x00, buffer[1]);
79         ASSERT.equal(0x17, buffer[0]);
80
81         /* On to some basic tests */
82         /* 1.125 */
83         mod_ctype.wfloat(1.125, 'big', buffer, 0);
84         ASSERT.equal(0x3f, buffer[0]);
85         ASSERT.equal(0x90, buffer[1]);
86         ASSERT.equal(0x00, buffer[2]);
87         ASSERT.equal(0x00, buffer[3]);
88         mod_ctype.wfloat(1.125, 'little', buffer, 0);
89         ASSERT.equal(0x3f, buffer[3]);
90         ASSERT.equal(0x90, buffer[2]);
91         ASSERT.equal(0x00, buffer[1]);
92         ASSERT.equal(0x00, buffer[0]);
93
94         mod_ctype.wfloat(1.0000001192092896, 'big', buffer, 0);
95         ASSERT.equal(0x3f, buffer[0]);
96         ASSERT.equal(0x80, buffer[1]);
97         ASSERT.equal(0x00, buffer[2]);
98         ASSERT.equal(0x01, buffer[3]);
99         mod_ctype.wfloat(1.0000001192092896, 'little', buffer, 0);
100         ASSERT.equal(0x3f, buffer[3]);
101         ASSERT.equal(0x80, buffer[2]);
102         ASSERT.equal(0x00, buffer[1]);
103         ASSERT.equal(0x01, buffer[0]);
104
105         mod_ctype.wfloat(1.0000001192092896, 'big', buffer, 0);
106         ASSERT.equal(0x3f, buffer[0]);
107         ASSERT.equal(0x80, buffer[1]);
108         ASSERT.equal(0x00, buffer[2]);
109         ASSERT.equal(0x01, buffer[3]);
110         mod_ctype.wfloat(1.0000001192092896, 'little', buffer, 0);
111         ASSERT.equal(0x3f, buffer[3]);
112         ASSERT.equal(0x80, buffer[2]);
113         ASSERT.equal(0x00, buffer[1]);
114         ASSERT.equal(0x01, buffer[0]);
115
116         mod_ctype.wfloat(2.3283067140944524e-10, 'big', buffer, 0);
117         ASSERT.equal(0x2f, buffer[0]);
118         ASSERT.equal(0x80, buffer[1]);
119         ASSERT.equal(0x00, buffer[2]);
120         ASSERT.equal(0x01, buffer[3]);
121         mod_ctype.wfloat(2.3283067140944524e-10, 'little', buffer, 0);
122         ASSERT.equal(0x2f, buffer[3]);
123         ASSERT.equal(0x80, buffer[2]);
124         ASSERT.equal(0x00, buffer[1]);
125         ASSERT.equal(0x01, buffer[0]);
126
127         /* ff34a2b0 -2.4010576103645774e+38 */
128         mod_ctype.wfloat(-2.4010576103645774e+38,
129             'big', buffer, 0);
130         ASSERT.equal(0xff, buffer[0]);
131         ASSERT.equal(0x34, buffer[1]);
132         ASSERT.equal(0xa2, buffer[2]);
133         ASSERT.equal(0xb0, buffer[3]);
134         mod_ctype.wfloat(-2.4010576103645774e+38,
135             'little', buffer, 0);
136         ASSERT.equal(0xff, buffer[3]);
137         ASSERT.equal(0x34, buffer[2]);
138         ASSERT.equal(0xa2, buffer[1]);
139         ASSERT.equal(0xb0, buffer[0]);
140
141         /* Denormalized tests */
142
143         /* 0003f89a +/- 3.6468792534053364e-40 */
144         mod_ctype.wfloat(3.6468792534053364e-40,
145             'big', buffer, 0);
146         ASSERT.equal(0x00, buffer[0]);
147         ASSERT.equal(0x03, buffer[1]);
148         ASSERT.equal(0xf8, buffer[2]);
149         ASSERT.equal(0x9a, buffer[3]);
150         mod_ctype.wfloat(3.6468792534053364e-40,
151             'little', buffer, 0);
152         ASSERT.equal(0x00, buffer[3]);
153         ASSERT.equal(0x03, buffer[2]);
154         ASSERT.equal(0xf8, buffer[1]);
155         ASSERT.equal(0x9a, buffer[0]);
156
157         mod_ctype.wfloat(-3.6468792534053364e-40,
158             'big', buffer, 0);
159         ASSERT.equal(0x80, buffer[0]);
160         ASSERT.equal(0x03, buffer[1]);
161         ASSERT.equal(0xf8, buffer[2]);
162         ASSERT.equal(0x9a, buffer[3]);
163         mod_ctype.wfloat(-3.6468792534053364e-40,
164             'little', buffer, 0);
165         ASSERT.equal(0x80, buffer[3]);
166         ASSERT.equal(0x03, buffer[2]);
167         ASSERT.equal(0xf8, buffer[1]);
168         ASSERT.equal(0x9a, buffer[0]);
169
170         /* Maximum and minimum normalized and denormalized values */
171
172         /* Largest normalized number +/- 3.4028234663852886e+38 */
173
174         mod_ctype.wfloat(3.4028234663852886e+38,
175             'big', buffer, 0);
176         ASSERT.equal(0x7f, buffer[0]);
177         ASSERT.equal(0x7f, buffer[1]);
178         ASSERT.equal(0xff, buffer[2]);
179         ASSERT.equal(0xff, buffer[3]);
180         mod_ctype.wfloat(3.4028234663852886e+38,
181             'little', buffer, 0);
182         ASSERT.equal(0x7f, buffer[3]);
183         ASSERT.equal(0x7f, buffer[2]);
184         ASSERT.equal(0xff, buffer[1]);
185         ASSERT.equal(0xff, buffer[0]);
186
187         mod_ctype.wfloat(-3.4028234663852886e+38,
188             'big', buffer, 0);
189         ASSERT.equal(0xff, buffer[0]);
190         ASSERT.equal(0x7f, buffer[1]);
191         ASSERT.equal(0xff, buffer[2]);
192         ASSERT.equal(0xff, buffer[3]);
193         mod_ctype.wfloat(-3.4028234663852886e+38,
194             'little', buffer, 0);
195         ASSERT.equal(0xff, buffer[3]);
196         ASSERT.equal(0x7f, buffer[2]);
197         ASSERT.equal(0xff, buffer[1]);
198         ASSERT.equal(0xff, buffer[0]);
199
200         /* Smallest normalied number +/- 1.1754943508222875e-38 */
201
202         mod_ctype.wfloat(1.1754943508222875e-38,
203             'big', buffer, 0);
204         ASSERT.equal(0x00, buffer[0]);
205         ASSERT.equal(0x80, buffer[1]);
206         ASSERT.equal(0x00, buffer[2]);
207         ASSERT.equal(0x00, buffer[3]);
208         mod_ctype.wfloat(1.1754943508222875e-38,
209             'little', buffer, 0);
210         ASSERT.equal(0x00, buffer[3]);
211         ASSERT.equal(0x80, buffer[2]);
212         ASSERT.equal(0x00, buffer[1]);
213         ASSERT.equal(0x00, buffer[0]);
214
215         mod_ctype.wfloat(-1.1754943508222875e-38,
216             'big', buffer, 0);
217         ASSERT.equal(0x80, buffer[0]);
218         ASSERT.equal(0x80, buffer[1]);
219         ASSERT.equal(0x00, buffer[2]);
220         ASSERT.equal(0x00, buffer[3]);
221         mod_ctype.wfloat(-1.1754943508222875e-38,
222             'little', buffer, 0);
223         ASSERT.equal(0x80, buffer[3]);
224         ASSERT.equal(0x80, buffer[2]);
225         ASSERT.equal(0x00, buffer[1]);
226         ASSERT.equal(0x00, buffer[0]);
227
228         /* Smallest denormalized number 1.401298464324817e-45 */
229         mod_ctype.wfloat(1.401298464324817e-45,
230             'big', buffer, 0);
231         ASSERT.equal(0x00, buffer[0]);
232         ASSERT.equal(0x00, buffer[1]);
233         ASSERT.equal(0x00, buffer[2]);
234         ASSERT.equal(0x01, buffer[3]);
235         mod_ctype.wfloat(1.401298464324817e-45,
236             'little', buffer, 0);
237         ASSERT.equal(0x00, buffer[3]);
238         ASSERT.equal(0x00, buffer[2]);
239         ASSERT.equal(0x00, buffer[1]);
240         ASSERT.equal(0x01, buffer[0]);
241
242         mod_ctype.wfloat(-1.401298464324817e-45,
243             'big', buffer, 0);
244         ASSERT.equal(0x80, buffer[0]);
245         ASSERT.equal(0x00, buffer[1]);
246         ASSERT.equal(0x00, buffer[2]);
247         ASSERT.equal(0x01, buffer[3]);
248         mod_ctype.wfloat(-1.401298464324817e-45,
249             'little', buffer, 0);
250         ASSERT.equal(0x80, buffer[3]);
251         ASSERT.equal(0x00, buffer[2]);
252         ASSERT.equal(0x00, buffer[1]);
253         ASSERT.equal(0x01, buffer[0]);
254
255         /* Largest denormalized value +/- 1.1754942106924411e-38 */
256
257         mod_ctype.wfloat(1.1754942106924411e-38,
258             'big', buffer, 0);
259         ASSERT.equal(0x00, buffer[0]);
260         ASSERT.equal(0x7f, buffer[1]);
261         ASSERT.equal(0xff, buffer[2]);
262         ASSERT.equal(0xff, buffer[3]);
263         mod_ctype.wfloat(1.1754942106924411e-38,
264             'little', buffer, 0);
265         ASSERT.equal(0x00, buffer[3]);
266         ASSERT.equal(0x7f, buffer[2]);
267         ASSERT.equal(0xff, buffer[1]);
268         ASSERT.equal(0xff, buffer[0]);
269
270         mod_ctype.wfloat(-1.1754942106924411e-38,
271             'big', buffer, 0);
272         ASSERT.equal(0x80, buffer[0]);
273         ASSERT.equal(0x7f, buffer[1]);
274         ASSERT.equal(0xff, buffer[2]);
275         ASSERT.equal(0xff, buffer[3]);
276         mod_ctype.wfloat(-1.1754942106924411e-38,
277             'little', buffer, 0);
278         ASSERT.equal(0x80, buffer[3]);
279         ASSERT.equal(0x7f, buffer[2]);
280         ASSERT.equal(0xff, buffer[1]);
281         ASSERT.equal(0xff, buffer[0]);
282
283         /* Do some quick offset testing */
284         buffer = new Buffer(6);
285         mod_ctype.wfloat(-1.2027516403607578e-32,
286             'big', buffer, 2);
287         ASSERT.equal(0x8a, buffer[2]);
288         ASSERT.equal(0x79, buffer[3]);
289         ASSERT.equal(0xcd, buffer[4]);
290         ASSERT.equal(0x3f, buffer[5]);
291
292         mod_ctype.wfloat(-1.2027516403607578e-32,
293             'little', buffer, 2);
294         ASSERT.equal(0x8a, buffer[5]);
295         ASSERT.equal(0x79, buffer[4]);
296         ASSERT.equal(0xcd, buffer[3]);
297         ASSERT.equal(0x3f, buffer[2]);
298
299 }
300
301 function testdouble()
302 {
303         var buffer = new Buffer(10);
304
305         /* Check 0 */
306         mod_ctype.wdouble(0, 'big', buffer, 0);
307         ASSERT.equal(0x00, buffer[0]);
308         ASSERT.equal(0x00, buffer[1]);
309         ASSERT.equal(0x00, buffer[2]);
310         ASSERT.equal(0x00, buffer[3]);
311         ASSERT.equal(0x00, buffer[4]);
312         ASSERT.equal(0x00, buffer[5]);
313         ASSERT.equal(0x00, buffer[6]);
314         ASSERT.equal(0x00, buffer[7]);
315         mod_ctype.wdouble(0, 'little', buffer, 0);
316         ASSERT.equal(0x00, buffer[7]);
317         ASSERT.equal(0x00, buffer[6]);
318         ASSERT.equal(0x00, buffer[5]);
319         ASSERT.equal(0x00, buffer[4]);
320         ASSERT.equal(0x00, buffer[3]);
321         ASSERT.equal(0x00, buffer[2]);
322         ASSERT.equal(0x00, buffer[1]);
323         ASSERT.equal(0x00, buffer[0]);
324
325         /* Check NaN */
326         /* Similar to floats we are only generating a subset of values */
327         mod_ctype.wdouble(NaN, 'big', buffer, 0);
328         ASSERT.equal(0x7f, buffer[0]);
329         ASSERT.equal(0xf0, buffer[1]);
330         ASSERT.equal(0x00, buffer[2]);
331         ASSERT.equal(0x00, buffer[3]);
332         ASSERT.equal(0x00, buffer[4]);
333         ASSERT.equal(0x00, buffer[5]);
334         ASSERT.equal(0x00, buffer[6]);
335         ASSERT.equal(0x17, buffer[7]);
336         mod_ctype.wdouble(NaN, 'little', buffer, 0);
337         ASSERT.equal(0x7f, buffer[7]);
338         ASSERT.equal(0xf0, buffer[6]);
339         ASSERT.equal(0x00, buffer[5]);
340         ASSERT.equal(0x00, buffer[4]);
341         ASSERT.equal(0x00, buffer[3]);
342         ASSERT.equal(0x00, buffer[2]);
343         ASSERT.equal(0x00, buffer[1]);
344         ASSERT.equal(0x17, buffer[0]);
345
346         /* pos inf */
347         mod_ctype.wdouble(Number.POSITIVE_INFINITY,
348             'big', buffer, 0);
349         ASSERT.equal(0x7f, buffer[0]);
350         ASSERT.equal(0xf0, buffer[1]);
351         ASSERT.equal(0x00, buffer[2]);
352         ASSERT.equal(0x00, buffer[3]);
353         ASSERT.equal(0x00, buffer[4]);
354         ASSERT.equal(0x00, buffer[5]);
355         ASSERT.equal(0x00, buffer[6]);
356         ASSERT.equal(0x00, buffer[7]);
357         mod_ctype.wdouble(Number.POSITIVE_INFINITY,
358             'little', buffer, 0);
359         ASSERT.equal(0x7f, buffer[7]);
360         ASSERT.equal(0xf0, buffer[6]);
361         ASSERT.equal(0x00, buffer[5]);
362         ASSERT.equal(0x00, buffer[4]);
363         ASSERT.equal(0x00, buffer[3]);
364         ASSERT.equal(0x00, buffer[2]);
365         ASSERT.equal(0x00, buffer[1]);
366         ASSERT.equal(0x00, buffer[0]);
367
368         /* neg inf */
369         mod_ctype.wdouble(Number.NEGATIVE_INFINITY,
370             'big', buffer, 0);
371         ASSERT.equal(0xff, buffer[0]);
372         ASSERT.equal(0xf0, buffer[1]);
373         ASSERT.equal(0x00, buffer[2]);
374         ASSERT.equal(0x00, buffer[3]);
375         ASSERT.equal(0x00, buffer[4]);
376         ASSERT.equal(0x00, buffer[5]);
377         ASSERT.equal(0x00, buffer[6]);
378         ASSERT.equal(0x00, buffer[7]);
379         mod_ctype.wdouble(Number.NEGATIVE_INFINITY,
380             'little', buffer, 0);
381         ASSERT.equal(0xff, buffer[7]);
382         ASSERT.equal(0xf0, buffer[6]);
383         ASSERT.equal(0x00, buffer[5]);
384         ASSERT.equal(0x00, buffer[4]);
385         ASSERT.equal(0x00, buffer[3]);
386         ASSERT.equal(0x00, buffer[2]);
387         ASSERT.equal(0x00, buffer[1]);
388         ASSERT.equal(0x00, buffer[0]);
389
390         /* Simple normalized values */
391
392         /* +/- 1.125 */
393         mod_ctype.wdouble(1.125,
394             'big', buffer, 0);
395         ASSERT.equal(0x3f, buffer[0]);
396         ASSERT.equal(0xf2, buffer[1]);
397         ASSERT.equal(0x00, buffer[2]);
398         ASSERT.equal(0x00, buffer[3]);
399         ASSERT.equal(0x00, buffer[4]);
400         ASSERT.equal(0x00, buffer[5]);
401         ASSERT.equal(0x00, buffer[6]);
402         ASSERT.equal(0x00, buffer[7]);
403
404         mod_ctype.wdouble(1.125,
405             'little', buffer, 0);
406         ASSERT.equal(0x3f, buffer[7]);
407         ASSERT.equal(0xf2, buffer[6]);
408         ASSERT.equal(0x00, buffer[5]);
409         ASSERT.equal(0x00, buffer[4]);
410         ASSERT.equal(0x00, buffer[3]);
411         ASSERT.equal(0x00, buffer[2]);
412         ASSERT.equal(0x00, buffer[1]);
413         ASSERT.equal(0x00, buffer[0]);
414
415         mod_ctype.wdouble(-1.125,
416             'big', buffer, 0);
417         ASSERT.equal(0xbf, buffer[0]);
418         ASSERT.equal(0xf2, buffer[1]);
419         ASSERT.equal(0x00, buffer[2]);
420         ASSERT.equal(0x00, buffer[3]);
421         ASSERT.equal(0x00, buffer[4]);
422         ASSERT.equal(0x00, buffer[5]);
423         ASSERT.equal(0x00, buffer[6]);
424         ASSERT.equal(0x00, buffer[7]);
425
426         mod_ctype.wdouble(-1.125,
427             'little', buffer, 0);
428         ASSERT.equal(0xbf, buffer[7]);
429         ASSERT.equal(0xf2, buffer[6]);
430         ASSERT.equal(0x00, buffer[5]);
431         ASSERT.equal(0x00, buffer[4]);
432         ASSERT.equal(0x00, buffer[3]);
433         ASSERT.equal(0x00, buffer[2]);
434         ASSERT.equal(0x00, buffer[1]);
435         ASSERT.equal(0x00, buffer[0]);
436
437
438         /* +/- 1.4397318913736026e+283 */
439         mod_ctype.wdouble(1.4397318913736026e+283,
440             'big', buffer, 0);
441         ASSERT.equal(0x7a, buffer[0]);
442         ASSERT.equal(0xb8, buffer[1]);
443         ASSERT.equal(0xc9, buffer[2]);
444         ASSERT.equal(0x34, buffer[3]);
445         ASSERT.equal(0x72, buffer[4]);
446         ASSERT.equal(0x16, buffer[5]);
447         ASSERT.equal(0xf9, buffer[6]);
448         ASSERT.equal(0x0e, buffer[7]);
449
450         mod_ctype.wdouble(1.4397318913736026e+283,
451             'little', buffer, 0);
452         ASSERT.equal(0x7a, buffer[7]);
453         ASSERT.equal(0xb8, buffer[6]);
454         ASSERT.equal(0xc9, buffer[5]);
455         ASSERT.equal(0x34, buffer[4]);
456         ASSERT.equal(0x72, buffer[3]);
457         ASSERT.equal(0x16, buffer[2]);
458         ASSERT.equal(0xf9, buffer[1]);
459         ASSERT.equal(0x0e, buffer[0]);
460
461         mod_ctype.wdouble(-1.4397318913736026e+283,
462             'big', buffer, 0);
463         ASSERT.equal(0xfa, buffer[0]);
464         ASSERT.equal(0xb8, buffer[1]);
465         ASSERT.equal(0xc9, buffer[2]);
466         ASSERT.equal(0x34, buffer[3]);
467         ASSERT.equal(0x72, buffer[4]);
468         ASSERT.equal(0x16, buffer[5]);
469         ASSERT.equal(0xf9, buffer[6]);
470         ASSERT.equal(0x0e, buffer[7]);
471
472         mod_ctype.wdouble(-1.4397318913736026e+283,
473             'little', buffer, 0);
474         ASSERT.equal(0xfa, buffer[7]);
475         ASSERT.equal(0xb8, buffer[6]);
476         ASSERT.equal(0xc9, buffer[5]);
477         ASSERT.equal(0x34, buffer[4]);
478         ASSERT.equal(0x72, buffer[3]);
479         ASSERT.equal(0x16, buffer[2]);
480         ASSERT.equal(0xf9, buffer[1]);
481         ASSERT.equal(0x0e, buffer[0]);
482
483         /* Denormalized values */
484         /* +/- 8.82521232268344e-309 */
485         mod_ctype.wdouble(8.82521232268344e-309,
486             'big', buffer, 0);
487         ASSERT.equal(0x00, buffer[0]);
488         ASSERT.equal(0x06, buffer[1]);
489         ASSERT.equal(0x58, buffer[2]);
490         ASSERT.equal(0x94, buffer[3]);
491         ASSERT.equal(0x13, buffer[4]);
492         ASSERT.equal(0x27, buffer[5]);
493         ASSERT.equal(0x8a, buffer[6]);
494         ASSERT.equal(0xcd, buffer[7]);
495
496         mod_ctype.wdouble(8.82521232268344e-309,
497             'little', buffer, 0);
498         ASSERT.equal(0x00, buffer[7]);
499         ASSERT.equal(0x06, buffer[6]);
500         ASSERT.equal(0x58, buffer[5]);
501         ASSERT.equal(0x94, buffer[4]);
502         ASSERT.equal(0x13, buffer[3]);
503         ASSERT.equal(0x27, buffer[2]);
504         ASSERT.equal(0x8a, buffer[1]);
505         ASSERT.equal(0xcd, buffer[0]);
506
507         mod_ctype.wdouble(-8.82521232268344e-309,
508             'big', buffer, 0);
509         ASSERT.equal(0x80, buffer[0]);
510         ASSERT.equal(0x06, buffer[1]);
511         ASSERT.equal(0x58, buffer[2]);
512         ASSERT.equal(0x94, buffer[3]);
513         ASSERT.equal(0x13, buffer[4]);
514         ASSERT.equal(0x27, buffer[5]);
515         ASSERT.equal(0x8a, buffer[6]);
516         ASSERT.equal(0xcd, buffer[7]);
517
518         mod_ctype.wdouble(-8.82521232268344e-309,
519             'little', buffer, 0);
520         ASSERT.equal(0x80, buffer[7]);
521         ASSERT.equal(0x06, buffer[6]);
522         ASSERT.equal(0x58, buffer[5]);
523         ASSERT.equal(0x94, buffer[4]);
524         ASSERT.equal(0x13, buffer[3]);
525         ASSERT.equal(0x27, buffer[2]);
526         ASSERT.equal(0x8a, buffer[1]);
527         ASSERT.equal(0xcd, buffer[0]);
528
529
530         /* Edge cases, maximum and minimum values */
531
532         /* Smallest denormalized value 5e-324 */
533         mod_ctype.wdouble(5e-324,
534             'big', buffer, 0);
535         ASSERT.equal(0x00, buffer[0]);
536         ASSERT.equal(0x00, buffer[1]);
537         ASSERT.equal(0x00, buffer[2]);
538         ASSERT.equal(0x00, buffer[3]);
539         ASSERT.equal(0x00, buffer[4]);
540         ASSERT.equal(0x00, buffer[5]);
541         ASSERT.equal(0x00, buffer[6]);
542         ASSERT.equal(0x01, buffer[7]);
543
544         mod_ctype.wdouble(5e-324,
545             'little', buffer, 0);
546         ASSERT.equal(0x00, buffer[7]);
547         ASSERT.equal(0x00, buffer[6]);
548         ASSERT.equal(0x00, buffer[5]);
549         ASSERT.equal(0x00, buffer[4]);
550         ASSERT.equal(0x00, buffer[3]);
551         ASSERT.equal(0x00, buffer[2]);
552         ASSERT.equal(0x00, buffer[1]);
553         ASSERT.equal(0x01, buffer[0]);
554
555         mod_ctype.wdouble(-5e-324,
556             'big', buffer, 0);
557         ASSERT.equal(0x80, buffer[0]);
558         ASSERT.equal(0x00, buffer[1]);
559         ASSERT.equal(0x00, buffer[2]);
560         ASSERT.equal(0x00, buffer[3]);
561         ASSERT.equal(0x00, buffer[4]);
562         ASSERT.equal(0x00, buffer[5]);
563         ASSERT.equal(0x00, buffer[6]);
564         ASSERT.equal(0x01, buffer[7]);
565
566         mod_ctype.wdouble(-5e-324,
567             'little', buffer, 0);
568         ASSERT.equal(0x80, buffer[7]);
569         ASSERT.equal(0x00, buffer[6]);
570         ASSERT.equal(0x00, buffer[5]);
571         ASSERT.equal(0x00, buffer[4]);
572         ASSERT.equal(0x00, buffer[3]);
573         ASSERT.equal(0x00, buffer[2]);
574         ASSERT.equal(0x00, buffer[1]);
575         ASSERT.equal(0x01, buffer[0]);
576
577
578
579         /* Largest denormalized value 2.225073858507201e-308 */
580         mod_ctype.wdouble(2.225073858507201e-308,
581             'big', buffer, 0);
582         ASSERT.equal(0x00, buffer[0]);
583         ASSERT.equal(0x0f, buffer[1]);
584         ASSERT.equal(0xff, buffer[2]);
585         ASSERT.equal(0xff, buffer[3]);
586         ASSERT.equal(0xff, buffer[4]);
587         ASSERT.equal(0xff, buffer[5]);
588         ASSERT.equal(0xff, buffer[6]);
589         ASSERT.equal(0xff, buffer[7]);
590
591         mod_ctype.wdouble(2.225073858507201e-308,
592             'little', buffer, 0);
593         ASSERT.equal(0x00, buffer[7]);
594         ASSERT.equal(0x0f, buffer[6]);
595         ASSERT.equal(0xff, buffer[5]);
596         ASSERT.equal(0xff, buffer[4]);
597         ASSERT.equal(0xff, buffer[3]);
598         ASSERT.equal(0xff, buffer[2]);
599         ASSERT.equal(0xff, buffer[1]);
600         ASSERT.equal(0xff, buffer[0]);
601
602         mod_ctype.wdouble(-2.225073858507201e-308,
603             'big', buffer, 0);
604         ASSERT.equal(0x80, buffer[0]);
605         ASSERT.equal(0x0f, buffer[1]);
606         ASSERT.equal(0xff, buffer[2]);
607         ASSERT.equal(0xff, buffer[3]);
608         ASSERT.equal(0xff, buffer[4]);
609         ASSERT.equal(0xff, buffer[5]);
610         ASSERT.equal(0xff, buffer[6]);
611         ASSERT.equal(0xff, buffer[7]);
612
613         mod_ctype.wdouble(-2.225073858507201e-308,
614             'little', buffer, 0);
615         ASSERT.equal(0x80, buffer[7]);
616         ASSERT.equal(0x0f, buffer[6]);
617         ASSERT.equal(0xff, buffer[5]);
618         ASSERT.equal(0xff, buffer[4]);
619         ASSERT.equal(0xff, buffer[3]);
620         ASSERT.equal(0xff, buffer[2]);
621         ASSERT.equal(0xff, buffer[1]);
622         ASSERT.equal(0xff, buffer[0]);
623
624
625         /* Smallest normalized value 2.2250738585072014e-308 */
626         mod_ctype.wdouble(2.2250738585072014e-308,
627             'big', buffer, 0);
628         ASSERT.equal(0x00, buffer[0]);
629         ASSERT.equal(0x10, buffer[1]);
630         ASSERT.equal(0x00, buffer[2]);
631         ASSERT.equal(0x00, buffer[3]);
632         ASSERT.equal(0x00, buffer[4]);
633         ASSERT.equal(0x00, buffer[5]);
634         ASSERT.equal(0x00, buffer[6]);
635         ASSERT.equal(0x00, buffer[7]);
636
637         mod_ctype.wdouble(2.2250738585072014e-308,
638             'little', buffer, 0);
639         ASSERT.equal(0x00, buffer[7]);
640         ASSERT.equal(0x10, buffer[6]);
641         ASSERT.equal(0x00, buffer[5]);
642         ASSERT.equal(0x00, buffer[4]);
643         ASSERT.equal(0x00, buffer[3]);
644         ASSERT.equal(0x00, buffer[2]);
645         ASSERT.equal(0x00, buffer[1]);
646         ASSERT.equal(0x00, buffer[0]);
647
648         mod_ctype.wdouble(-2.2250738585072014e-308,
649             'big', buffer, 0);
650         ASSERT.equal(0x80, buffer[0]);
651         ASSERT.equal(0x10, buffer[1]);
652         ASSERT.equal(0x00, buffer[2]);
653         ASSERT.equal(0x00, buffer[3]);
654         ASSERT.equal(0x00, buffer[4]);
655         ASSERT.equal(0x00, buffer[5]);
656         ASSERT.equal(0x00, buffer[6]);
657         ASSERT.equal(0x00, buffer[7]);
658
659         mod_ctype.wdouble(-2.2250738585072014e-308,
660             'little', buffer, 0);
661         ASSERT.equal(0x80, buffer[7]);
662         ASSERT.equal(0x10, buffer[6]);
663         ASSERT.equal(0x00, buffer[5]);
664         ASSERT.equal(0x00, buffer[4]);
665         ASSERT.equal(0x00, buffer[3]);
666         ASSERT.equal(0x00, buffer[2]);
667         ASSERT.equal(0x00, buffer[1]);
668         ASSERT.equal(0x00, buffer[0]);
669
670
671         /* Largest normalized value 1.7976931348623157e+308 */
672         mod_ctype.wdouble(1.7976931348623157e+308,
673             'big', buffer, 0);
674         ASSERT.equal(0x7f, buffer[0]);
675         ASSERT.equal(0xef, buffer[1]);
676         ASSERT.equal(0xff, buffer[2]);
677         ASSERT.equal(0xff, buffer[3]);
678         ASSERT.equal(0xff, buffer[4]);
679         ASSERT.equal(0xff, buffer[5]);
680         ASSERT.equal(0xff, buffer[6]);
681         ASSERT.equal(0xff, buffer[7]);
682
683         mod_ctype.wdouble(1.7976931348623157e+308,
684             'little', buffer, 0);
685         ASSERT.equal(0x7f, buffer[7]);
686         ASSERT.equal(0xef, buffer[6]);
687         ASSERT.equal(0xff, buffer[5]);
688         ASSERT.equal(0xff, buffer[4]);
689         ASSERT.equal(0xff, buffer[3]);
690         ASSERT.equal(0xff, buffer[2]);
691         ASSERT.equal(0xff, buffer[1]);
692         ASSERT.equal(0xff, buffer[0]);
693
694         mod_ctype.wdouble(-1.7976931348623157e+308,
695             'big', buffer, 0);
696         ASSERT.equal(0xff, buffer[0]);
697         ASSERT.equal(0xef, buffer[1]);
698         ASSERT.equal(0xff, buffer[2]);
699         ASSERT.equal(0xff, buffer[3]);
700         ASSERT.equal(0xff, buffer[4]);
701         ASSERT.equal(0xff, buffer[5]);
702         ASSERT.equal(0xff, buffer[6]);
703         ASSERT.equal(0xff, buffer[7]);
704
705         mod_ctype.wdouble(-1.7976931348623157e+308,
706             'little', buffer, 0);
707         ASSERT.equal(0xff, buffer[7]);
708         ASSERT.equal(0xef, buffer[6]);
709         ASSERT.equal(0xff, buffer[5]);
710         ASSERT.equal(0xff, buffer[4]);
711         ASSERT.equal(0xff, buffer[3]);
712         ASSERT.equal(0xff, buffer[2]);
713         ASSERT.equal(0xff, buffer[1]);
714         ASSERT.equal(0xff, buffer[0]);
715
716
717         /* Try offsets */
718         buffer[0] = 0xde;
719         buffer[1] = 0xad;
720         buffer[2] = 0xbe;
721         buffer[3] = 0xef;
722         buffer[4] = 0xba;
723         buffer[5] = 0xdd;
724         buffer[6] = 0xca;
725         buffer[7] = 0xfe;
726         buffer[8] = 0x16;
727         buffer[9] = 0x79;
728
729         mod_ctype.wdouble(-0.000015130017658081283,
730             'big', buffer, 2);
731         ASSERT.equal(0xbe, buffer[2]);
732         ASSERT.equal(0xef, buffer[3]);
733         ASSERT.equal(0xba, buffer[4]);
734         ASSERT.equal(0xdd, buffer[5]);
735         ASSERT.equal(0xca, buffer[6]);
736         ASSERT.equal(0xfe, buffer[7]);
737         ASSERT.equal(0x16, buffer[8]);
738         ASSERT.equal(0x79, buffer[9]);
739
740         mod_ctype.wdouble(-0.000015130017658081283,
741             'little', buffer, 2);
742         ASSERT.equal(0xbe, buffer[9]);
743         ASSERT.equal(0xef, buffer[8]);
744         ASSERT.equal(0xba, buffer[7]);
745         ASSERT.equal(0xdd, buffer[6]);
746         ASSERT.equal(0xca, buffer[5]);
747         ASSERT.equal(0xfe, buffer[4]);
748         ASSERT.equal(0x16, buffer[3]);
749         ASSERT.equal(0x79, buffer[2]);
750 }
751
752 testfloat();
753 testdouble();