1/*
2 * Licensed to the Apache Software Foundation (ASF) under one
3 * or more contributor license agreements. See the NOTICE file
4 * distributed with this work for additional information
5 * regarding copyright ownership. The ASF licenses this file
6 * to you under the Apache License, Version 2.0 (the
7 * "License"); you may not use this file except in compliance
8 * with the License. You may obtain a copy of the License at
9 *
10 *   http://www.apache.org/licenses/LICENSE-2.0
11 *
12 * Unless required by applicable law or agreed to in writing,
13 * software distributed under the License is distributed on an
14 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
15 * KIND, either express or implied. See the License for the
16 * specific language governing permissions and limitations
17 * under the License.
18 */
19
20const test = require("tape");
21const binary = require("thrift/binary");
22
23const cases = {
24  "Should read signed byte": function(assert) {
25    assert.equal(1, binary.readByte(0x01));
26    assert.equal(-1, binary.readByte(0xff));
27
28    assert.equal(127, binary.readByte(0x7f));
29    assert.equal(-128, binary.readByte(0x80));
30    assert.end();
31  },
32  "Should write byte": function(assert) {
33    //Protocol simply writes to the buffer. Nothing to test.. yet.
34    assert.ok(true);
35    assert.end();
36  },
37  "Should read I16": function(assert) {
38    assert.equal(0, binary.readI16([0x00, 0x00]));
39    assert.equal(1, binary.readI16([0x00, 0x01]));
40    assert.equal(-1, binary.readI16([0xff, 0xff]));
41
42    // Min I16
43    assert.equal(-32768, binary.readI16([0x80, 0x00]));
44    // Max I16
45    assert.equal(32767, binary.readI16([0x7f, 0xff]));
46    assert.end();
47  },
48
49  "Should write I16": function(assert) {
50    assert.deepEqual([0x00, 0x00], binary.writeI16([], 0));
51    assert.deepEqual([0x00, 0x01], binary.writeI16([], 1));
52    assert.deepEqual([0xff, 0xff], binary.writeI16([], -1));
53
54    // Min I16
55    assert.deepEqual([0x80, 0x00], binary.writeI16([], -32768));
56    // Max I16
57    assert.deepEqual([0x7f, 0xff], binary.writeI16([], 32767));
58    assert.end();
59  },
60
61  "Should read I32": function(assert) {
62    assert.equal(0, binary.readI32([0x00, 0x00, 0x00, 0x00]));
63    assert.equal(1, binary.readI32([0x00, 0x00, 0x00, 0x01]));
64    assert.equal(-1, binary.readI32([0xff, 0xff, 0xff, 0xff]));
65
66    // Min I32
67    assert.equal(-2147483648, binary.readI32([0x80, 0x00, 0x00, 0x00]));
68    // Max I32
69    assert.equal(2147483647, binary.readI32([0x7f, 0xff, 0xff, 0xff]));
70    assert.end();
71  },
72
73  "Should write I32": function(assert) {
74    assert.deepEqual([0x00, 0x00, 0x00, 0x00], binary.writeI32([], 0));
75    assert.deepEqual([0x00, 0x00, 0x00, 0x01], binary.writeI32([], 1));
76    assert.deepEqual([0xff, 0xff, 0xff, 0xff], binary.writeI32([], -1));
77
78    // Min I32
79    assert.deepEqual(
80      [0x80, 0x00, 0x00, 0x00],
81      binary.writeI32([], -2147483648)
82    );
83    // Max I32
84    assert.deepEqual([0x7f, 0xff, 0xff, 0xff], binary.writeI32([], 2147483647));
85    assert.end();
86  },
87
88  "Should read doubles": function(assert) {
89    assert.equal(
90      0,
91      binary.readDouble([0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00])
92    );
93    assert.equal(
94      0,
95      binary.readDouble([0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00])
96    );
97    assert.equal(
98      1,
99      binary.readDouble([0x3f, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00])
100    );
101    assert.equal(
102      2,
103      binary.readDouble([0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00])
104    );
105    assert.equal(
106      -2,
107      binary.readDouble([0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00])
108    );
109
110    assert.equal(
111      Math.PI,
112      binary.readDouble([0x40, 0x9, 0x21, 0xfb, 0x54, 0x44, 0x2d, 0x18])
113    );
114
115    assert.equal(
116      Infinity,
117      binary.readDouble([0x7f, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00])
118    );
119    assert.equal(
120      -Infinity,
121      binary.readDouble([0xff, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00])
122    );
123
124    assert.ok(
125      isNaN(binary.readDouble([0x7f, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00]))
126    );
127
128    assert.equal(
129      1 / 3,
130      binary.readDouble([0x3f, 0xd5, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55])
131    );
132
133    // Min subnormal positive double
134    assert.equal(
135      4.9406564584124654e-324,
136      binary.readDouble([0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01])
137    );
138    // Min normal positive double
139    assert.equal(
140      2.2250738585072014e-308,
141      binary.readDouble([0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00])
142    );
143    // Max positive double
144    assert.equal(
145      1.7976931348623157e308,
146      binary.readDouble([0x7f, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff])
147    );
148    assert.end();
149  },
150
151  "Should write doubles": function(assert) {
152    assert.deepEqual(
153      [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00],
154      binary.writeDouble([], 0)
155    );
156    assert.deepEqual(
157      [0x3f, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00],
158      binary.writeDouble([], 1)
159    );
160    assert.deepEqual(
161      [0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00],
162      binary.writeDouble([], 2)
163    );
164    assert.deepEqual(
165      [0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00],
166      binary.writeDouble([], -2)
167    );
168
169    assert.deepEqual(
170      [0x40, 0x9, 0x21, 0xfb, 0x54, 0x44, 0x2d, 0x18],
171      binary.writeDouble([], Math.PI)
172    );
173
174    assert.deepEqual(
175      [0x7f, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00],
176      binary.writeDouble([], Infinity)
177    );
178    assert.deepEqual(
179      [0xff, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00],
180      binary.writeDouble([], -Infinity)
181    );
182
183    assert.deepEqual(
184      [0x7f, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00],
185      binary.writeDouble([], NaN)
186    );
187
188    assert.deepEqual(
189      [0x3f, 0xd5, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55],
190      binary.writeDouble([], 1 / 3)
191    );
192
193    // Min subnormal positive double
194    assert.deepEqual(
195      [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01],
196      binary.writeDouble([], 4.9406564584124654e-324)
197    );
198    // Min normal positive double
199    assert.deepEqual(
200      [0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00],
201      binary.writeDouble([], 2.2250738585072014e-308)
202    );
203    // Max positive double
204    assert.deepEqual(
205      [0x7f, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff],
206      binary.writeDouble([], 1.7976931348623157e308)
207    );
208    assert.end();
209  }
210};
211
212Object.keys(cases).forEach(function(caseName) {
213  test(caseName, cases[caseName]);
214});
215