1'use strict';
2
3require('../common');
4const assert = require('assert');
5
6// Test (64 bit) double
7const buffer = Buffer.allocUnsafe(8);
8
9buffer[0] = 0x55;
10buffer[1] = 0x55;
11buffer[2] = 0x55;
12buffer[3] = 0x55;
13buffer[4] = 0x55;
14buffer[5] = 0x55;
15buffer[6] = 0xd5;
16buffer[7] = 0x3f;
17assert.strictEqual(buffer.readDoubleBE(0), 1.1945305291680097e+103);
18assert.strictEqual(buffer.readDoubleLE(0), 0.3333333333333333);
19
20buffer[0] = 1;
21buffer[1] = 0;
22buffer[2] = 0;
23buffer[3] = 0;
24buffer[4] = 0;
25buffer[5] = 0;
26buffer[6] = 0xf0;
27buffer[7] = 0x3f;
28assert.strictEqual(buffer.readDoubleBE(0), 7.291122019655968e-304);
29assert.strictEqual(buffer.readDoubleLE(0), 1.0000000000000002);
30
31buffer[0] = 2;
32assert.strictEqual(buffer.readDoubleBE(0), 4.778309726801735e-299);
33assert.strictEqual(buffer.readDoubleLE(0), 1.0000000000000004);
34
35buffer[0] = 1;
36buffer[6] = 0;
37buffer[7] = 0;
38// eslint-disable-next-line no-loss-of-precision
39assert.strictEqual(buffer.readDoubleBE(0), 7.291122019556398e-304);
40assert.strictEqual(buffer.readDoubleLE(0), 5e-324);
41
42buffer[0] = 0xff;
43buffer[1] = 0xff;
44buffer[2] = 0xff;
45buffer[3] = 0xff;
46buffer[4] = 0xff;
47buffer[5] = 0xff;
48buffer[6] = 0x0f;
49buffer[7] = 0x00;
50assert.ok(Number.isNaN(buffer.readDoubleBE(0)));
51assert.strictEqual(buffer.readDoubleLE(0), 2.225073858507201e-308);
52
53buffer[6] = 0xef;
54buffer[7] = 0x7f;
55assert.ok(Number.isNaN(buffer.readDoubleBE(0)));
56assert.strictEqual(buffer.readDoubleLE(0), 1.7976931348623157e+308);
57
58buffer[0] = 0;
59buffer[1] = 0;
60buffer[2] = 0;
61buffer[3] = 0;
62buffer[4] = 0;
63buffer[5] = 0;
64buffer[6] = 0xf0;
65buffer[7] = 0x3f;
66assert.strictEqual(buffer.readDoubleBE(0), 3.03865e-319);
67assert.strictEqual(buffer.readDoubleLE(0), 1);
68
69buffer[6] = 0;
70buffer[7] = 0x40;
71assert.strictEqual(buffer.readDoubleBE(0), 3.16e-322);
72assert.strictEqual(buffer.readDoubleLE(0), 2);
73
74buffer[7] = 0xc0;
75assert.strictEqual(buffer.readDoubleBE(0), 9.5e-322);
76assert.strictEqual(buffer.readDoubleLE(0), -2);
77
78buffer[6] = 0x10;
79buffer[7] = 0;
80assert.strictEqual(buffer.readDoubleBE(0), 2.0237e-320);
81assert.strictEqual(buffer.readDoubleLE(0), 2.2250738585072014e-308);
82
83buffer[6] = 0;
84assert.strictEqual(buffer.readDoubleBE(0), 0);
85assert.strictEqual(buffer.readDoubleLE(0), 0);
86assert.ok(1 / buffer.readDoubleLE(0) >= 0);
87
88buffer[7] = 0x80;
89assert.strictEqual(buffer.readDoubleBE(0), 6.3e-322);
90assert.strictEqual(buffer.readDoubleLE(0), -0);
91assert.ok(1 / buffer.readDoubleLE(0) < 0);
92
93buffer[6] = 0xf0;
94buffer[7] = 0x7f;
95assert.strictEqual(buffer.readDoubleBE(0), 3.0418e-319);
96assert.strictEqual(buffer.readDoubleLE(0), Infinity);
97
98buffer[7] = 0xff;
99assert.strictEqual(buffer.readDoubleBE(0), 3.04814e-319);
100assert.strictEqual(buffer.readDoubleLE(0), -Infinity);
101
102['readDoubleLE', 'readDoubleBE'].forEach((fn) => {
103
104  // Verify that default offset works fine.
105  buffer[fn](undefined);
106  buffer[fn]();
107
108  ['', '0', null, {}, [], () => {}, true, false].forEach((off) => {
109    assert.throws(
110      () => buffer[fn](off),
111      { code: 'ERR_INVALID_ARG_TYPE' }
112    );
113  });
114
115  [Infinity, -1, 1].forEach((offset) => {
116    assert.throws(
117      () => buffer[fn](offset),
118      {
119        code: 'ERR_OUT_OF_RANGE',
120        name: 'RangeError',
121        message: 'The value of "offset" is out of range. ' +
122                 `It must be >= 0 and <= 0. Received ${offset}`
123      });
124  });
125
126  assert.throws(
127    () => Buffer.alloc(1)[fn](1),
128    {
129      code: 'ERR_BUFFER_OUT_OF_BOUNDS',
130      name: 'RangeError',
131      message: 'Attempt to access memory outside buffer bounds'
132    });
133
134  [NaN, 1.01].forEach((offset) => {
135    assert.throws(
136      () => buffer[fn](offset),
137      {
138        code: 'ERR_OUT_OF_RANGE',
139        name: 'RangeError',
140        message: 'The value of "offset" is out of range. ' +
141                 `It must be an integer. Received ${offset}`
142      });
143  });
144});
145