1ffe3c632Sopenharmony_ci// Protocol Buffers - Google's data interchange format
2ffe3c632Sopenharmony_ci// Copyright 2008 Google Inc.  All rights reserved.
3ffe3c632Sopenharmony_ci// https://developers.google.com/protocol-buffers/
4ffe3c632Sopenharmony_ci//
5ffe3c632Sopenharmony_ci// Redistribution and use in source and binary forms, with or without
6ffe3c632Sopenharmony_ci// modification, are permitted provided that the following conditions are
7ffe3c632Sopenharmony_ci// met:
8ffe3c632Sopenharmony_ci//
9ffe3c632Sopenharmony_ci//     * Redistributions of source code must retain the above copyright
10ffe3c632Sopenharmony_ci// notice, this list of conditions and the following disclaimer.
11ffe3c632Sopenharmony_ci//     * Redistributions in binary form must reproduce the above
12ffe3c632Sopenharmony_ci// copyright notice, this list of conditions and the following disclaimer
13ffe3c632Sopenharmony_ci// in the documentation and/or other materials provided with the
14ffe3c632Sopenharmony_ci// distribution.
15ffe3c632Sopenharmony_ci//     * Neither the name of Google Inc. nor the names of its
16ffe3c632Sopenharmony_ci// contributors may be used to endorse or promote products derived from
17ffe3c632Sopenharmony_ci// this software without specific prior written permission.
18ffe3c632Sopenharmony_ci//
19ffe3c632Sopenharmony_ci// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
20ffe3c632Sopenharmony_ci// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
21ffe3c632Sopenharmony_ci// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
22ffe3c632Sopenharmony_ci// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
23ffe3c632Sopenharmony_ci// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
24ffe3c632Sopenharmony_ci// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
25ffe3c632Sopenharmony_ci// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
26ffe3c632Sopenharmony_ci// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
27ffe3c632Sopenharmony_ci// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
28ffe3c632Sopenharmony_ci// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
29ffe3c632Sopenharmony_ci// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
30ffe3c632Sopenharmony_ci
31ffe3c632Sopenharmony_ci/**
32ffe3c632Sopenharmony_ci * @fileoverview Test cases for jspb's helper functions.
33ffe3c632Sopenharmony_ci *
34ffe3c632Sopenharmony_ci * Test suite is written using Jasmine -- see http://jasmine.github.io/
35ffe3c632Sopenharmony_ci *
36ffe3c632Sopenharmony_ci * @author aappleby@google.com (Austin Appleby)
37ffe3c632Sopenharmony_ci */
38ffe3c632Sopenharmony_ci
39ffe3c632Sopenharmony_cigoog.require('goog.crypt.base64');
40ffe3c632Sopenharmony_cigoog.require('goog.testing.asserts');
41ffe3c632Sopenharmony_cigoog.require('jspb.BinaryConstants');
42ffe3c632Sopenharmony_cigoog.require('jspb.BinaryWriter');
43ffe3c632Sopenharmony_cigoog.require('jspb.utils');
44ffe3c632Sopenharmony_ci
45ffe3c632Sopenharmony_ci
46ffe3c632Sopenharmony_ci/**
47ffe3c632Sopenharmony_ci * @param {number} x
48ffe3c632Sopenharmony_ci * @return {number}
49ffe3c632Sopenharmony_ci */
50ffe3c632Sopenharmony_cifunction truncate(x) {
51ffe3c632Sopenharmony_ci  var temp = new Float32Array(1);
52ffe3c632Sopenharmony_ci  temp[0] = x;
53ffe3c632Sopenharmony_ci  return temp[0];
54ffe3c632Sopenharmony_ci}
55ffe3c632Sopenharmony_ci
56ffe3c632Sopenharmony_ci
57ffe3c632Sopenharmony_ci/**
58ffe3c632Sopenharmony_ci * Converts an 64-bit integer in split representation to a 64-bit hash string
59ffe3c632Sopenharmony_ci * (8 bits encoded per character).
60ffe3c632Sopenharmony_ci * @param {number} bitsLow The low 32 bits of the split 64-bit integer.
61ffe3c632Sopenharmony_ci * @param {number} bitsHigh The high 32 bits of the split 64-bit integer.
62ffe3c632Sopenharmony_ci * @return {string} The encoded hash string, 8 bits per character.
63ffe3c632Sopenharmony_ci */
64ffe3c632Sopenharmony_cifunction toHashString(bitsLow, bitsHigh) {
65ffe3c632Sopenharmony_ci  return String.fromCharCode((bitsLow >>> 0) & 0xFF,
66ffe3c632Sopenharmony_ci                             (bitsLow >>> 8) & 0xFF,
67ffe3c632Sopenharmony_ci                             (bitsLow >>> 16) & 0xFF,
68ffe3c632Sopenharmony_ci                             (bitsLow >>> 24) & 0xFF,
69ffe3c632Sopenharmony_ci                             (bitsHigh >>> 0) & 0xFF,
70ffe3c632Sopenharmony_ci                             (bitsHigh >>> 8) & 0xFF,
71ffe3c632Sopenharmony_ci                             (bitsHigh >>> 16) & 0xFF,
72ffe3c632Sopenharmony_ci                             (bitsHigh >>> 24) & 0xFF);
73ffe3c632Sopenharmony_ci}
74ffe3c632Sopenharmony_ci
75ffe3c632Sopenharmony_ci
76ffe3c632Sopenharmony_cidescribe('binaryUtilsTest', function() {
77ffe3c632Sopenharmony_ci  /**
78ffe3c632Sopenharmony_ci   * Tests lossless binary-to-decimal conversion.
79ffe3c632Sopenharmony_ci   */
80ffe3c632Sopenharmony_ci  it('testDecimalConversion', function() {
81ffe3c632Sopenharmony_ci    // Check some magic numbers.
82ffe3c632Sopenharmony_ci    var result =
83ffe3c632Sopenharmony_ci        jspb.utils.joinUnsignedDecimalString(0x89e80001, 0x8ac72304);
84ffe3c632Sopenharmony_ci    assertEquals('10000000000000000001', result);
85ffe3c632Sopenharmony_ci
86ffe3c632Sopenharmony_ci    result = jspb.utils.joinUnsignedDecimalString(0xacd05f15, 0x1b69b4b);
87ffe3c632Sopenharmony_ci    assertEquals('123456789123456789', result);
88ffe3c632Sopenharmony_ci
89ffe3c632Sopenharmony_ci    result = jspb.utils.joinUnsignedDecimalString(0xeb1f0ad2, 0xab54a98c);
90ffe3c632Sopenharmony_ci    assertEquals('12345678901234567890', result);
91ffe3c632Sopenharmony_ci
92ffe3c632Sopenharmony_ci    result = jspb.utils.joinUnsignedDecimalString(0xe3b70cb1, 0x891087b8);
93ffe3c632Sopenharmony_ci    assertEquals('9876543210987654321', result);
94ffe3c632Sopenharmony_ci
95ffe3c632Sopenharmony_ci    // Check limits.
96ffe3c632Sopenharmony_ci    result = jspb.utils.joinUnsignedDecimalString(0x00000000, 0x00000000);
97ffe3c632Sopenharmony_ci    assertEquals('0', result);
98ffe3c632Sopenharmony_ci
99ffe3c632Sopenharmony_ci    result = jspb.utils.joinUnsignedDecimalString(0xFFFFFFFF, 0xFFFFFFFF);
100ffe3c632Sopenharmony_ci    assertEquals('18446744073709551615', result);
101ffe3c632Sopenharmony_ci
102ffe3c632Sopenharmony_ci    // Check each bit of the low dword.
103ffe3c632Sopenharmony_ci    for (var i = 0; i < 32; i++) {
104ffe3c632Sopenharmony_ci      var low = (1 << i) >>> 0;
105ffe3c632Sopenharmony_ci      result = jspb.utils.joinUnsignedDecimalString(low, 0);
106ffe3c632Sopenharmony_ci      assertEquals('' + Math.pow(2, i), result);
107ffe3c632Sopenharmony_ci    }
108ffe3c632Sopenharmony_ci
109ffe3c632Sopenharmony_ci    // Check the first 20 bits of the high dword.
110ffe3c632Sopenharmony_ci    for (var i = 0; i < 20; i++) {
111ffe3c632Sopenharmony_ci      var high = (1 << i) >>> 0;
112ffe3c632Sopenharmony_ci      result = jspb.utils.joinUnsignedDecimalString(0, high);
113ffe3c632Sopenharmony_ci      assertEquals('' + Math.pow(2, 32 + i), result);
114ffe3c632Sopenharmony_ci    }
115ffe3c632Sopenharmony_ci
116ffe3c632Sopenharmony_ci    // V8's internal double-to-string conversion is inaccurate for values above
117ffe3c632Sopenharmony_ci    // 2^52, even if they're representable integers - check the rest of the bits
118ffe3c632Sopenharmony_ci    // manually against the correct string representations of 2^N.
119ffe3c632Sopenharmony_ci
120ffe3c632Sopenharmony_ci    result = jspb.utils.joinUnsignedDecimalString(0x00000000, 0x00100000);
121ffe3c632Sopenharmony_ci    assertEquals('4503599627370496', result);
122ffe3c632Sopenharmony_ci
123ffe3c632Sopenharmony_ci    result = jspb.utils.joinUnsignedDecimalString(0x00000000, 0x00200000);
124ffe3c632Sopenharmony_ci    assertEquals('9007199254740992', result);
125ffe3c632Sopenharmony_ci
126ffe3c632Sopenharmony_ci    result = jspb.utils.joinUnsignedDecimalString(0x00000000, 0x00400000);
127ffe3c632Sopenharmony_ci    assertEquals('18014398509481984', result);
128ffe3c632Sopenharmony_ci
129ffe3c632Sopenharmony_ci    result = jspb.utils.joinUnsignedDecimalString(0x00000000, 0x00800000);
130ffe3c632Sopenharmony_ci    assertEquals('36028797018963968', result);
131ffe3c632Sopenharmony_ci
132ffe3c632Sopenharmony_ci    result = jspb.utils.joinUnsignedDecimalString(0x00000000, 0x01000000);
133ffe3c632Sopenharmony_ci    assertEquals('72057594037927936', result);
134ffe3c632Sopenharmony_ci
135ffe3c632Sopenharmony_ci    result = jspb.utils.joinUnsignedDecimalString(0x00000000, 0x02000000);
136ffe3c632Sopenharmony_ci    assertEquals('144115188075855872', result);
137ffe3c632Sopenharmony_ci
138ffe3c632Sopenharmony_ci    result = jspb.utils.joinUnsignedDecimalString(0x00000000, 0x04000000);
139ffe3c632Sopenharmony_ci    assertEquals('288230376151711744', result);
140ffe3c632Sopenharmony_ci
141ffe3c632Sopenharmony_ci    result = jspb.utils.joinUnsignedDecimalString(0x00000000, 0x08000000);
142ffe3c632Sopenharmony_ci    assertEquals('576460752303423488', result);
143ffe3c632Sopenharmony_ci
144ffe3c632Sopenharmony_ci    result = jspb.utils.joinUnsignedDecimalString(0x00000000, 0x10000000);
145ffe3c632Sopenharmony_ci    assertEquals('1152921504606846976', result);
146ffe3c632Sopenharmony_ci
147ffe3c632Sopenharmony_ci    result = jspb.utils.joinUnsignedDecimalString(0x00000000, 0x20000000);
148ffe3c632Sopenharmony_ci    assertEquals('2305843009213693952', result);
149ffe3c632Sopenharmony_ci
150ffe3c632Sopenharmony_ci    result = jspb.utils.joinUnsignedDecimalString(0x00000000, 0x40000000);
151ffe3c632Sopenharmony_ci    assertEquals('4611686018427387904', result);
152ffe3c632Sopenharmony_ci
153ffe3c632Sopenharmony_ci    result = jspb.utils.joinUnsignedDecimalString(0x00000000, 0x80000000);
154ffe3c632Sopenharmony_ci    assertEquals('9223372036854775808', result);
155ffe3c632Sopenharmony_ci  });
156ffe3c632Sopenharmony_ci
157ffe3c632Sopenharmony_ci
158ffe3c632Sopenharmony_ci  /**
159ffe3c632Sopenharmony_ci   * Going from hash strings to decimal strings should also be lossless.
160ffe3c632Sopenharmony_ci   */
161ffe3c632Sopenharmony_ci  it('testHashToDecimalConversion', function() {
162ffe3c632Sopenharmony_ci    var result;
163ffe3c632Sopenharmony_ci    var convert = jspb.utils.hash64ToDecimalString;
164ffe3c632Sopenharmony_ci
165ffe3c632Sopenharmony_ci    result = convert(toHashString(0x00000000, 0x00000000), false);
166ffe3c632Sopenharmony_ci    assertEquals('0', result);
167ffe3c632Sopenharmony_ci
168ffe3c632Sopenharmony_ci    result = convert(toHashString(0x00000000, 0x00000000), true);
169ffe3c632Sopenharmony_ci    assertEquals('0', result);
170ffe3c632Sopenharmony_ci
171ffe3c632Sopenharmony_ci    result = convert(toHashString(0xFFFFFFFF, 0xFFFFFFFF), false);
172ffe3c632Sopenharmony_ci    assertEquals('18446744073709551615', result);
173ffe3c632Sopenharmony_ci
174ffe3c632Sopenharmony_ci    result = convert(toHashString(0xFFFFFFFF, 0xFFFFFFFF), true);
175ffe3c632Sopenharmony_ci    assertEquals('-1', result);
176ffe3c632Sopenharmony_ci
177ffe3c632Sopenharmony_ci    result = convert(toHashString(0x00000000, 0x80000000), false);
178ffe3c632Sopenharmony_ci    assertEquals('9223372036854775808', result);
179ffe3c632Sopenharmony_ci
180ffe3c632Sopenharmony_ci    result = convert(toHashString(0x00000000, 0x80000000), true);
181ffe3c632Sopenharmony_ci    assertEquals('-9223372036854775808', result);
182ffe3c632Sopenharmony_ci
183ffe3c632Sopenharmony_ci    result = convert(toHashString(0xacd05f15, 0x01b69b4b), false);
184ffe3c632Sopenharmony_ci    assertEquals('123456789123456789', result);
185ffe3c632Sopenharmony_ci
186ffe3c632Sopenharmony_ci    result = convert(toHashString(~0xacd05f15 + 1, ~0x01b69b4b), true);
187ffe3c632Sopenharmony_ci    assertEquals('-123456789123456789', result);
188ffe3c632Sopenharmony_ci
189ffe3c632Sopenharmony_ci    // And converting arrays of hashes should work the same way.
190ffe3c632Sopenharmony_ci    result = jspb.utils.hash64ArrayToDecimalStrings([
191ffe3c632Sopenharmony_ci      toHashString(0xFFFFFFFF, 0xFFFFFFFF),
192ffe3c632Sopenharmony_ci      toHashString(0x00000000, 0x80000000),
193ffe3c632Sopenharmony_ci      toHashString(0xacd05f15, 0x01b69b4b)], false);
194ffe3c632Sopenharmony_ci    assertEquals(3, result.length);
195ffe3c632Sopenharmony_ci    assertEquals('18446744073709551615', result[0]);
196ffe3c632Sopenharmony_ci    assertEquals('9223372036854775808', result[1]);
197ffe3c632Sopenharmony_ci    assertEquals('123456789123456789', result[2]);
198ffe3c632Sopenharmony_ci  });
199ffe3c632Sopenharmony_ci
200ffe3c632Sopenharmony_ci  /*
201ffe3c632Sopenharmony_ci   * Going from decimal strings to hash strings should be lossless.
202ffe3c632Sopenharmony_ci   */
203ffe3c632Sopenharmony_ci  it('testDecimalToHashConversion', function() {
204ffe3c632Sopenharmony_ci    var result;
205ffe3c632Sopenharmony_ci    var convert = jspb.utils.decimalStringToHash64;
206ffe3c632Sopenharmony_ci
207ffe3c632Sopenharmony_ci    result = convert('0');
208ffe3c632Sopenharmony_ci    assertEquals(String.fromCharCode.apply(null,
209ffe3c632Sopenharmony_ci      [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00]), result);
210ffe3c632Sopenharmony_ci
211ffe3c632Sopenharmony_ci    result = convert('-1');
212ffe3c632Sopenharmony_ci    assertEquals(String.fromCharCode.apply(null,
213ffe3c632Sopenharmony_ci      [0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF]), result);
214ffe3c632Sopenharmony_ci
215ffe3c632Sopenharmony_ci    result = convert('18446744073709551615');
216ffe3c632Sopenharmony_ci    assertEquals(String.fromCharCode.apply(null,
217ffe3c632Sopenharmony_ci      [0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF]), result);
218ffe3c632Sopenharmony_ci
219ffe3c632Sopenharmony_ci    result = convert('9223372036854775808');
220ffe3c632Sopenharmony_ci    assertEquals(String.fromCharCode.apply(null,
221ffe3c632Sopenharmony_ci      [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80]), result);
222ffe3c632Sopenharmony_ci
223ffe3c632Sopenharmony_ci    result = convert('-9223372036854775808');
224ffe3c632Sopenharmony_ci    assertEquals(String.fromCharCode.apply(null,
225ffe3c632Sopenharmony_ci      [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80]), result);
226ffe3c632Sopenharmony_ci
227ffe3c632Sopenharmony_ci    result = convert('123456789123456789');
228ffe3c632Sopenharmony_ci    assertEquals(String.fromCharCode.apply(null,
229ffe3c632Sopenharmony_ci      [0x15, 0x5F, 0xD0, 0xAC, 0x4B, 0x9B, 0xB6, 0x01]), result);
230ffe3c632Sopenharmony_ci
231ffe3c632Sopenharmony_ci    result = convert('-123456789123456789');
232ffe3c632Sopenharmony_ci    assertEquals(String.fromCharCode.apply(null,
233ffe3c632Sopenharmony_ci      [0xEB, 0xA0, 0x2F, 0x53, 0xB4, 0x64, 0x49, 0xFE]), result);
234ffe3c632Sopenharmony_ci  });
235ffe3c632Sopenharmony_ci
236ffe3c632Sopenharmony_ci  /**
237ffe3c632Sopenharmony_ci   * Going from hash strings to hex strings should be lossless.
238ffe3c632Sopenharmony_ci   */
239ffe3c632Sopenharmony_ci  it('testHashToHexConversion', function() {
240ffe3c632Sopenharmony_ci    var result;
241ffe3c632Sopenharmony_ci    var convert = jspb.utils.hash64ToHexString;
242ffe3c632Sopenharmony_ci
243ffe3c632Sopenharmony_ci    result = convert(toHashString(0x00000000, 0x00000000));
244ffe3c632Sopenharmony_ci    assertEquals('0x0000000000000000', result);
245ffe3c632Sopenharmony_ci
246ffe3c632Sopenharmony_ci    result = convert(toHashString(0xFFFFFFFF, 0xFFFFFFFF));
247ffe3c632Sopenharmony_ci    assertEquals('0xffffffffffffffff', result);
248ffe3c632Sopenharmony_ci
249ffe3c632Sopenharmony_ci    result = convert(toHashString(0x12345678, 0x9ABCDEF0));
250ffe3c632Sopenharmony_ci    assertEquals('0x9abcdef012345678', result);
251ffe3c632Sopenharmony_ci  });
252ffe3c632Sopenharmony_ci
253ffe3c632Sopenharmony_ci
254ffe3c632Sopenharmony_ci  /**
255ffe3c632Sopenharmony_ci   * Going from hex strings to hash strings should be lossless.
256ffe3c632Sopenharmony_ci   */
257ffe3c632Sopenharmony_ci  it('testHexToHashConversion', function() {
258ffe3c632Sopenharmony_ci    var result;
259ffe3c632Sopenharmony_ci    var convert = jspb.utils.hexStringToHash64;
260ffe3c632Sopenharmony_ci
261ffe3c632Sopenharmony_ci    result = convert('0x0000000000000000');
262ffe3c632Sopenharmony_ci    assertEquals(String.fromCharCode.apply(null,
263ffe3c632Sopenharmony_ci        [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00]), result);
264ffe3c632Sopenharmony_ci
265ffe3c632Sopenharmony_ci    result = convert('0xffffffffffffffff');
266ffe3c632Sopenharmony_ci    assertEquals(String.fromCharCode.apply(null,
267ffe3c632Sopenharmony_ci        [0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF]), result);
268ffe3c632Sopenharmony_ci
269ffe3c632Sopenharmony_ci    // Hex string is big-endian, hash string is little-endian.
270ffe3c632Sopenharmony_ci    result = convert('0x123456789ABCDEF0');
271ffe3c632Sopenharmony_ci    assertEquals(String.fromCharCode.apply(null,
272ffe3c632Sopenharmony_ci        [0xF0, 0xDE, 0xBC, 0x9A, 0x78, 0x56, 0x34, 0x12]), result);
273ffe3c632Sopenharmony_ci
274ffe3c632Sopenharmony_ci    // Capitalization should not matter.
275ffe3c632Sopenharmony_ci    result = convert('0x0000abcdefABCDEF');
276ffe3c632Sopenharmony_ci    assertEquals(String.fromCharCode.apply(null,
277ffe3c632Sopenharmony_ci        [0xEF, 0xCD, 0xAB, 0xEF, 0xCD, 0xAB, 0x00, 0x00]), result);
278ffe3c632Sopenharmony_ci  });
279ffe3c632Sopenharmony_ci
280ffe3c632Sopenharmony_ci
281ffe3c632Sopenharmony_ci  /**
282ffe3c632Sopenharmony_ci   * Going from numbers to hash strings should be lossless for up to 53 bits of
283ffe3c632Sopenharmony_ci   * precision.
284ffe3c632Sopenharmony_ci   */
285ffe3c632Sopenharmony_ci  it('testNumberToHashConversion', function() {
286ffe3c632Sopenharmony_ci    var result;
287ffe3c632Sopenharmony_ci    var convert = jspb.utils.numberToHash64;
288ffe3c632Sopenharmony_ci
289ffe3c632Sopenharmony_ci    result = convert(0x0000000000000);
290ffe3c632Sopenharmony_ci    assertEquals('0x0000000000000000', jspb.utils.hash64ToHexString(result));
291ffe3c632Sopenharmony_ci
292ffe3c632Sopenharmony_ci    result = convert(0xFFFFFFFFFFFFF);
293ffe3c632Sopenharmony_ci    assertEquals('0x000fffffffffffff', jspb.utils.hash64ToHexString(result));
294ffe3c632Sopenharmony_ci
295ffe3c632Sopenharmony_ci    result = convert(0x123456789ABCD);
296ffe3c632Sopenharmony_ci    assertEquals('0x000123456789abcd', jspb.utils.hash64ToHexString(result));
297ffe3c632Sopenharmony_ci
298ffe3c632Sopenharmony_ci    result = convert(0xDCBA987654321);
299ffe3c632Sopenharmony_ci    assertEquals('0x000dcba987654321', jspb.utils.hash64ToHexString(result));
300ffe3c632Sopenharmony_ci
301ffe3c632Sopenharmony_ci    // 53 bits of precision should not be truncated.
302ffe3c632Sopenharmony_ci    result = convert(0x10000000000001);
303ffe3c632Sopenharmony_ci    assertEquals('0x0010000000000001', jspb.utils.hash64ToHexString(result));
304ffe3c632Sopenharmony_ci
305ffe3c632Sopenharmony_ci    // 54 bits of precision should be truncated.
306ffe3c632Sopenharmony_ci    result = convert(0x20000000000001);
307ffe3c632Sopenharmony_ci    assertNotEquals(
308ffe3c632Sopenharmony_ci        '0x0020000000000001', jspb.utils.hash64ToHexString(result));
309ffe3c632Sopenharmony_ci  });
310ffe3c632Sopenharmony_ci
311ffe3c632Sopenharmony_ci
312ffe3c632Sopenharmony_ci  /**
313ffe3c632Sopenharmony_ci   * Sanity check the behavior of Javascript's strings when doing funny things
314ffe3c632Sopenharmony_ci   * with unicode characters.
315ffe3c632Sopenharmony_ci   */
316ffe3c632Sopenharmony_ci  it('sanityCheckUnicodeStrings', function() {
317ffe3c632Sopenharmony_ci    var strings = new Array(65536);
318ffe3c632Sopenharmony_ci
319ffe3c632Sopenharmony_ci    // All possible unsigned 16-bit values should be storable in a string, they
320ffe3c632Sopenharmony_ci    // shouldn't do weird things with the length of the string, and they should
321ffe3c632Sopenharmony_ci    // come back out of the string unchanged.
322ffe3c632Sopenharmony_ci    for (var i = 0; i < 65536; i++) {
323ffe3c632Sopenharmony_ci      strings[i] = 'a' + String.fromCharCode(i) + 'a';
324ffe3c632Sopenharmony_ci      if (3 != strings[i].length) throw 'fail!';
325ffe3c632Sopenharmony_ci      if (i != strings[i].charCodeAt(1)) throw 'fail!';
326ffe3c632Sopenharmony_ci    }
327ffe3c632Sopenharmony_ci
328ffe3c632Sopenharmony_ci    // Each unicode character should compare equal to itself and not equal to a
329ffe3c632Sopenharmony_ci    // different unicode character.
330ffe3c632Sopenharmony_ci    for (var i = 0; i < 65536; i++) {
331ffe3c632Sopenharmony_ci      if (strings[i] != strings[i]) throw 'fail!';
332ffe3c632Sopenharmony_ci      if (strings[i] == strings[(i + 1) % 65536]) throw 'fail!';
333ffe3c632Sopenharmony_ci    }
334ffe3c632Sopenharmony_ci  });
335ffe3c632Sopenharmony_ci
336ffe3c632Sopenharmony_ci
337ffe3c632Sopenharmony_ci  /**
338ffe3c632Sopenharmony_ci   * Tests conversion from 32-bit floating point numbers to split64 numbers.
339ffe3c632Sopenharmony_ci   */
340ffe3c632Sopenharmony_ci  it('testFloat32ToSplit64', function() {
341ffe3c632Sopenharmony_ci    var f32_eps = jspb.BinaryConstants.FLOAT32_EPS;
342ffe3c632Sopenharmony_ci    var f32_min = jspb.BinaryConstants.FLOAT32_MIN;
343ffe3c632Sopenharmony_ci    var f32_max = jspb.BinaryConstants.FLOAT32_MAX;
344ffe3c632Sopenharmony_ci
345ffe3c632Sopenharmony_ci    // NaN.
346ffe3c632Sopenharmony_ci    jspb.utils.splitFloat32(NaN);
347ffe3c632Sopenharmony_ci    if (!isNaN(jspb.utils.joinFloat32(jspb.utils.split64Low,
348ffe3c632Sopenharmony_ci                                      jspb.utils.split64High))) {
349ffe3c632Sopenharmony_ci      throw 'fail!';
350ffe3c632Sopenharmony_ci    }
351ffe3c632Sopenharmony_ci
352ffe3c632Sopenharmony_ci    /**
353ffe3c632Sopenharmony_ci     * @param {number} x
354ffe3c632Sopenharmony_ci     * @param {number=} opt_bits
355ffe3c632Sopenharmony_ci     */
356ffe3c632Sopenharmony_ci    function test(x, opt_bits) {
357ffe3c632Sopenharmony_ci      jspb.utils.splitFloat32(x);
358ffe3c632Sopenharmony_ci      if (opt_bits !== undefined) {
359ffe3c632Sopenharmony_ci        if (opt_bits != jspb.utils.split64Low) throw 'fail!';
360ffe3c632Sopenharmony_ci      }
361ffe3c632Sopenharmony_ci      if (truncate(x) != jspb.utils.joinFloat32(jspb.utils.split64Low,
362ffe3c632Sopenharmony_ci          jspb.utils.split64High)) {
363ffe3c632Sopenharmony_ci        throw 'fail!';
364ffe3c632Sopenharmony_ci      }
365ffe3c632Sopenharmony_ci    }
366ffe3c632Sopenharmony_ci
367ffe3c632Sopenharmony_ci    // Positive and negative infinity.
368ffe3c632Sopenharmony_ci    test(Infinity, 0x7f800000);
369ffe3c632Sopenharmony_ci    test(-Infinity, 0xff800000);
370ffe3c632Sopenharmony_ci
371ffe3c632Sopenharmony_ci    // Positive and negative zero.
372ffe3c632Sopenharmony_ci    test(0, 0x00000000);
373ffe3c632Sopenharmony_ci    test(-0, 0x80000000);
374ffe3c632Sopenharmony_ci
375ffe3c632Sopenharmony_ci    // Positive and negative epsilon.
376ffe3c632Sopenharmony_ci    test(f32_eps, 0x00000001);
377ffe3c632Sopenharmony_ci    test(-f32_eps, 0x80000001);
378ffe3c632Sopenharmony_ci
379ffe3c632Sopenharmony_ci    // Positive and negative min.
380ffe3c632Sopenharmony_ci    test(f32_min, 0x00800000);
381ffe3c632Sopenharmony_ci    test(-f32_min, 0x80800000);
382ffe3c632Sopenharmony_ci
383ffe3c632Sopenharmony_ci    // Positive and negative max.
384ffe3c632Sopenharmony_ci    test(f32_max, 0x7F7FFFFF);
385ffe3c632Sopenharmony_ci    test(-f32_max, 0xFF7FFFFF);
386ffe3c632Sopenharmony_ci
387ffe3c632Sopenharmony_ci    // Various positive values.
388ffe3c632Sopenharmony_ci    var cursor = f32_eps * 10;
389ffe3c632Sopenharmony_ci    while (cursor != Infinity) {
390ffe3c632Sopenharmony_ci      test(cursor);
391ffe3c632Sopenharmony_ci      cursor *= 1.1;
392ffe3c632Sopenharmony_ci    }
393ffe3c632Sopenharmony_ci
394ffe3c632Sopenharmony_ci    // Various negative values.
395ffe3c632Sopenharmony_ci    cursor = -f32_eps * 10;
396ffe3c632Sopenharmony_ci    while (cursor != -Infinity) {
397ffe3c632Sopenharmony_ci      test(cursor);
398ffe3c632Sopenharmony_ci      cursor *= 1.1;
399ffe3c632Sopenharmony_ci    }
400ffe3c632Sopenharmony_ci  });
401ffe3c632Sopenharmony_ci
402ffe3c632Sopenharmony_ci
403ffe3c632Sopenharmony_ci  /**
404ffe3c632Sopenharmony_ci   * Tests conversion from 64-bit floating point numbers to split64 numbers.
405ffe3c632Sopenharmony_ci   */
406ffe3c632Sopenharmony_ci  it('testFloat64ToSplit64', function() {
407ffe3c632Sopenharmony_ci    var f64_eps = jspb.BinaryConstants.FLOAT64_EPS;
408ffe3c632Sopenharmony_ci    var f64_min = jspb.BinaryConstants.FLOAT64_MIN;
409ffe3c632Sopenharmony_ci    var f64_max = jspb.BinaryConstants.FLOAT64_MAX;
410ffe3c632Sopenharmony_ci
411ffe3c632Sopenharmony_ci    // NaN.
412ffe3c632Sopenharmony_ci    jspb.utils.splitFloat64(NaN);
413ffe3c632Sopenharmony_ci    if (!isNaN(jspb.utils.joinFloat64(jspb.utils.split64Low,
414ffe3c632Sopenharmony_ci        jspb.utils.split64High))) {
415ffe3c632Sopenharmony_ci      throw 'fail!';
416ffe3c632Sopenharmony_ci    }
417ffe3c632Sopenharmony_ci
418ffe3c632Sopenharmony_ci    /**
419ffe3c632Sopenharmony_ci     * @param {number} x
420ffe3c632Sopenharmony_ci     * @param {number=} opt_highBits
421ffe3c632Sopenharmony_ci     * @param {number=} opt_lowBits
422ffe3c632Sopenharmony_ci     */
423ffe3c632Sopenharmony_ci    function test(x, opt_highBits, opt_lowBits) {
424ffe3c632Sopenharmony_ci      jspb.utils.splitFloat64(x);
425ffe3c632Sopenharmony_ci      if (opt_highBits !== undefined) {
426ffe3c632Sopenharmony_ci        if (opt_highBits != jspb.utils.split64High) throw 'fail!';
427ffe3c632Sopenharmony_ci      }
428ffe3c632Sopenharmony_ci      if (opt_lowBits !== undefined) {
429ffe3c632Sopenharmony_ci        if (opt_lowBits != jspb.utils.split64Low) throw 'fail!';
430ffe3c632Sopenharmony_ci      }
431ffe3c632Sopenharmony_ci      if (x != jspb.utils.joinFloat64(jspb.utils.split64Low,
432ffe3c632Sopenharmony_ci          jspb.utils.split64High)) {
433ffe3c632Sopenharmony_ci        throw 'fail!';
434ffe3c632Sopenharmony_ci      }
435ffe3c632Sopenharmony_ci    }
436ffe3c632Sopenharmony_ci
437ffe3c632Sopenharmony_ci    // Positive and negative infinity.
438ffe3c632Sopenharmony_ci    test(Infinity, 0x7ff00000, 0x00000000);
439ffe3c632Sopenharmony_ci    test(-Infinity, 0xfff00000, 0x00000000);
440ffe3c632Sopenharmony_ci
441ffe3c632Sopenharmony_ci    // Positive and negative zero.
442ffe3c632Sopenharmony_ci    test(0, 0x00000000, 0x00000000);
443ffe3c632Sopenharmony_ci    test(-0, 0x80000000, 0x00000000);
444ffe3c632Sopenharmony_ci
445ffe3c632Sopenharmony_ci    // Positive and negative epsilon.
446ffe3c632Sopenharmony_ci    test(f64_eps, 0x00000000, 0x00000001);
447ffe3c632Sopenharmony_ci    test(-f64_eps, 0x80000000, 0x00000001);
448ffe3c632Sopenharmony_ci
449ffe3c632Sopenharmony_ci    // Positive and negative min.
450ffe3c632Sopenharmony_ci    test(f64_min, 0x00100000, 0x00000000);
451ffe3c632Sopenharmony_ci    test(-f64_min, 0x80100000, 0x00000000);
452ffe3c632Sopenharmony_ci
453ffe3c632Sopenharmony_ci    // Positive and negative max.
454ffe3c632Sopenharmony_ci    test(f64_max, 0x7FEFFFFF, 0xFFFFFFFF);
455ffe3c632Sopenharmony_ci    test(-f64_max, 0xFFEFFFFF, 0xFFFFFFFF);
456ffe3c632Sopenharmony_ci
457ffe3c632Sopenharmony_ci    // Various positive values.
458ffe3c632Sopenharmony_ci    var cursor = f64_eps * 10;
459ffe3c632Sopenharmony_ci    while (cursor != Infinity) {
460ffe3c632Sopenharmony_ci      test(cursor);
461ffe3c632Sopenharmony_ci      cursor *= 1.1;
462ffe3c632Sopenharmony_ci    }
463ffe3c632Sopenharmony_ci
464ffe3c632Sopenharmony_ci    // Various negative values.
465ffe3c632Sopenharmony_ci    cursor = -f64_eps * 10;
466ffe3c632Sopenharmony_ci    while (cursor != -Infinity) {
467ffe3c632Sopenharmony_ci      test(cursor);
468ffe3c632Sopenharmony_ci      cursor *= 1.1;
469ffe3c632Sopenharmony_ci    }
470ffe3c632Sopenharmony_ci  });
471ffe3c632Sopenharmony_ci
472ffe3c632Sopenharmony_ci
473ffe3c632Sopenharmony_ci  /**
474ffe3c632Sopenharmony_ci   * Tests counting packed varints.
475ffe3c632Sopenharmony_ci   */
476ffe3c632Sopenharmony_ci  it('testCountVarints', function() {
477ffe3c632Sopenharmony_ci    var values = [];
478ffe3c632Sopenharmony_ci    for (var i = 1; i < 1000000000; i *= 1.1) {
479ffe3c632Sopenharmony_ci      values.push(Math.floor(i));
480ffe3c632Sopenharmony_ci    }
481ffe3c632Sopenharmony_ci
482ffe3c632Sopenharmony_ci    var writer = new jspb.BinaryWriter();
483ffe3c632Sopenharmony_ci    writer.writePackedUint64(1, values);
484ffe3c632Sopenharmony_ci
485ffe3c632Sopenharmony_ci    var buffer = new Uint8Array(writer.getResultBuffer());
486ffe3c632Sopenharmony_ci
487ffe3c632Sopenharmony_ci    // We should have two more varints than we started with - one for the field
488ffe3c632Sopenharmony_ci    // tag, one for the packed length.
489ffe3c632Sopenharmony_ci    assertEquals(values.length + 2,
490ffe3c632Sopenharmony_ci                 jspb.utils.countVarints(buffer, 0, buffer.length));
491ffe3c632Sopenharmony_ci  });
492ffe3c632Sopenharmony_ci
493ffe3c632Sopenharmony_ci
494ffe3c632Sopenharmony_ci  /**
495ffe3c632Sopenharmony_ci   * Tests counting matching varint fields.
496ffe3c632Sopenharmony_ci   */
497ffe3c632Sopenharmony_ci  it('testCountVarintFields', function() {
498ffe3c632Sopenharmony_ci    var writer = new jspb.BinaryWriter();
499ffe3c632Sopenharmony_ci
500ffe3c632Sopenharmony_ci    var count = 0;
501ffe3c632Sopenharmony_ci    for (var i = 1; i < 1000000000; i *= 1.1) {
502ffe3c632Sopenharmony_ci      writer.writeUint64(1, Math.floor(i));
503ffe3c632Sopenharmony_ci      count++;
504ffe3c632Sopenharmony_ci    }
505ffe3c632Sopenharmony_ci    writer.writeString(2, 'terminator');
506ffe3c632Sopenharmony_ci
507ffe3c632Sopenharmony_ci    var buffer = new Uint8Array(writer.getResultBuffer());
508ffe3c632Sopenharmony_ci    assertEquals(count,
509ffe3c632Sopenharmony_ci        jspb.utils.countVarintFields(buffer, 0, buffer.length, 1));
510ffe3c632Sopenharmony_ci
511ffe3c632Sopenharmony_ci    writer = new jspb.BinaryWriter();
512ffe3c632Sopenharmony_ci
513ffe3c632Sopenharmony_ci    count = 0;
514ffe3c632Sopenharmony_ci    for (var i = 1; i < 1000000000; i *= 1.1) {
515ffe3c632Sopenharmony_ci      writer.writeUint64(123456789, Math.floor(i));
516ffe3c632Sopenharmony_ci      count++;
517ffe3c632Sopenharmony_ci    }
518ffe3c632Sopenharmony_ci    writer.writeString(2, 'terminator');
519ffe3c632Sopenharmony_ci
520ffe3c632Sopenharmony_ci    buffer = new Uint8Array(writer.getResultBuffer());
521ffe3c632Sopenharmony_ci    assertEquals(count,
522ffe3c632Sopenharmony_ci        jspb.utils.countVarintFields(buffer, 0, buffer.length, 123456789));
523ffe3c632Sopenharmony_ci  });
524ffe3c632Sopenharmony_ci
525ffe3c632Sopenharmony_ci
526ffe3c632Sopenharmony_ci  /**
527ffe3c632Sopenharmony_ci   * Tests counting matching fixed32 fields.
528ffe3c632Sopenharmony_ci   */
529ffe3c632Sopenharmony_ci  it('testCountFixed32Fields', function() {
530ffe3c632Sopenharmony_ci    var writer = new jspb.BinaryWriter();
531ffe3c632Sopenharmony_ci
532ffe3c632Sopenharmony_ci    var count = 0;
533ffe3c632Sopenharmony_ci    for (var i = 1; i < 1000000000; i *= 1.1) {
534ffe3c632Sopenharmony_ci      writer.writeFixed32(1, Math.floor(i));
535ffe3c632Sopenharmony_ci      count++;
536ffe3c632Sopenharmony_ci    }
537ffe3c632Sopenharmony_ci    writer.writeString(2, 'terminator');
538ffe3c632Sopenharmony_ci
539ffe3c632Sopenharmony_ci    var buffer = new Uint8Array(writer.getResultBuffer());
540ffe3c632Sopenharmony_ci    assertEquals(count,
541ffe3c632Sopenharmony_ci        jspb.utils.countFixed32Fields(buffer, 0, buffer.length, 1));
542ffe3c632Sopenharmony_ci
543ffe3c632Sopenharmony_ci    writer = new jspb.BinaryWriter();
544ffe3c632Sopenharmony_ci
545ffe3c632Sopenharmony_ci    count = 0;
546ffe3c632Sopenharmony_ci    for (var i = 1; i < 1000000000; i *= 1.1) {
547ffe3c632Sopenharmony_ci      writer.writeFixed32(123456789, Math.floor(i));
548ffe3c632Sopenharmony_ci      count++;
549ffe3c632Sopenharmony_ci    }
550ffe3c632Sopenharmony_ci    writer.writeString(2, 'terminator');
551ffe3c632Sopenharmony_ci
552ffe3c632Sopenharmony_ci    buffer = new Uint8Array(writer.getResultBuffer());
553ffe3c632Sopenharmony_ci    assertEquals(count,
554ffe3c632Sopenharmony_ci        jspb.utils.countFixed32Fields(buffer, 0, buffer.length, 123456789));
555ffe3c632Sopenharmony_ci  });
556ffe3c632Sopenharmony_ci
557ffe3c632Sopenharmony_ci
558ffe3c632Sopenharmony_ci  /**
559ffe3c632Sopenharmony_ci   * Tests counting matching fixed64 fields.
560ffe3c632Sopenharmony_ci   */
561ffe3c632Sopenharmony_ci  it('testCountFixed64Fields', function() {
562ffe3c632Sopenharmony_ci    var writer = new jspb.BinaryWriter();
563ffe3c632Sopenharmony_ci
564ffe3c632Sopenharmony_ci    var count = 0;
565ffe3c632Sopenharmony_ci    for (var i = 1; i < 1000000000; i *= 1.1) {
566ffe3c632Sopenharmony_ci      writer.writeDouble(1, i);
567ffe3c632Sopenharmony_ci      count++;
568ffe3c632Sopenharmony_ci    }
569ffe3c632Sopenharmony_ci    writer.writeString(2, 'terminator');
570ffe3c632Sopenharmony_ci
571ffe3c632Sopenharmony_ci    var buffer = new Uint8Array(writer.getResultBuffer());
572ffe3c632Sopenharmony_ci    assertEquals(count,
573ffe3c632Sopenharmony_ci        jspb.utils.countFixed64Fields(buffer, 0, buffer.length, 1));
574ffe3c632Sopenharmony_ci
575ffe3c632Sopenharmony_ci    writer = new jspb.BinaryWriter();
576ffe3c632Sopenharmony_ci
577ffe3c632Sopenharmony_ci    count = 0;
578ffe3c632Sopenharmony_ci    for (var i = 1; i < 1000000000; i *= 1.1) {
579ffe3c632Sopenharmony_ci      writer.writeDouble(123456789, i);
580ffe3c632Sopenharmony_ci      count++;
581ffe3c632Sopenharmony_ci    }
582ffe3c632Sopenharmony_ci    writer.writeString(2, 'terminator');
583ffe3c632Sopenharmony_ci
584ffe3c632Sopenharmony_ci    buffer = new Uint8Array(writer.getResultBuffer());
585ffe3c632Sopenharmony_ci    assertEquals(count,
586ffe3c632Sopenharmony_ci        jspb.utils.countFixed64Fields(buffer, 0, buffer.length, 123456789));
587ffe3c632Sopenharmony_ci  });
588ffe3c632Sopenharmony_ci
589ffe3c632Sopenharmony_ci
590ffe3c632Sopenharmony_ci  /**
591ffe3c632Sopenharmony_ci   * Tests counting matching delimited fields.
592ffe3c632Sopenharmony_ci   */
593ffe3c632Sopenharmony_ci  it('testCountDelimitedFields', function() {
594ffe3c632Sopenharmony_ci    var writer = new jspb.BinaryWriter();
595ffe3c632Sopenharmony_ci
596ffe3c632Sopenharmony_ci    var count = 0;
597ffe3c632Sopenharmony_ci    for (var i = 1; i < 1000; i *= 1.1) {
598ffe3c632Sopenharmony_ci      writer.writeBytes(1, [Math.floor(i)]);
599ffe3c632Sopenharmony_ci      count++;
600ffe3c632Sopenharmony_ci    }
601ffe3c632Sopenharmony_ci    writer.writeString(2, 'terminator');
602ffe3c632Sopenharmony_ci
603ffe3c632Sopenharmony_ci    var buffer = new Uint8Array(writer.getResultBuffer());
604ffe3c632Sopenharmony_ci    assertEquals(count,
605ffe3c632Sopenharmony_ci        jspb.utils.countDelimitedFields(buffer, 0, buffer.length, 1));
606ffe3c632Sopenharmony_ci
607ffe3c632Sopenharmony_ci    writer = new jspb.BinaryWriter();
608ffe3c632Sopenharmony_ci
609ffe3c632Sopenharmony_ci    count = 0;
610ffe3c632Sopenharmony_ci    for (var i = 1; i < 1000; i *= 1.1) {
611ffe3c632Sopenharmony_ci      writer.writeBytes(123456789, [Math.floor(i)]);
612ffe3c632Sopenharmony_ci      count++;
613ffe3c632Sopenharmony_ci    }
614ffe3c632Sopenharmony_ci    writer.writeString(2, 'terminator');
615ffe3c632Sopenharmony_ci
616ffe3c632Sopenharmony_ci    buffer = new Uint8Array(writer.getResultBuffer());
617ffe3c632Sopenharmony_ci    assertEquals(count,
618ffe3c632Sopenharmony_ci        jspb.utils.countDelimitedFields(buffer, 0, buffer.length, 123456789));
619ffe3c632Sopenharmony_ci  });
620ffe3c632Sopenharmony_ci
621ffe3c632Sopenharmony_ci
622ffe3c632Sopenharmony_ci  /**
623ffe3c632Sopenharmony_ci   * Tests byte format for debug strings.
624ffe3c632Sopenharmony_ci   */
625ffe3c632Sopenharmony_ci  it('testDebugBytesToTextFormat', function() {
626ffe3c632Sopenharmony_ci    assertEquals('""', jspb.utils.debugBytesToTextFormat(null));
627ffe3c632Sopenharmony_ci    assertEquals('"\\x00\\x10\\xff"',
628ffe3c632Sopenharmony_ci        jspb.utils.debugBytesToTextFormat([0, 16, 255]));
629ffe3c632Sopenharmony_ci  });
630ffe3c632Sopenharmony_ci
631ffe3c632Sopenharmony_ci
632ffe3c632Sopenharmony_ci  /**
633ffe3c632Sopenharmony_ci   * Tests converting byte blob sources into byte blobs.
634ffe3c632Sopenharmony_ci   */
635ffe3c632Sopenharmony_ci  it('testByteSourceToUint8Array', function() {
636ffe3c632Sopenharmony_ci    var convert = jspb.utils.byteSourceToUint8Array;
637ffe3c632Sopenharmony_ci
638ffe3c632Sopenharmony_ci    var sourceData = [];
639ffe3c632Sopenharmony_ci    for (var i = 0; i < 256; i++) {
640ffe3c632Sopenharmony_ci      sourceData.push(i);
641ffe3c632Sopenharmony_ci    }
642ffe3c632Sopenharmony_ci
643ffe3c632Sopenharmony_ci    var sourceBytes = new Uint8Array(sourceData);
644ffe3c632Sopenharmony_ci    var sourceBuffer = sourceBytes.buffer;
645ffe3c632Sopenharmony_ci    var sourceBase64 = goog.crypt.base64.encodeByteArray(sourceData);
646ffe3c632Sopenharmony_ci    var sourceString = String.fromCharCode.apply(null, sourceData);
647ffe3c632Sopenharmony_ci
648ffe3c632Sopenharmony_ci    function check(result) {
649ffe3c632Sopenharmony_ci      assertEquals(Uint8Array, result.constructor);
650ffe3c632Sopenharmony_ci      assertEquals(sourceData.length, result.length);
651ffe3c632Sopenharmony_ci      for (var i = 0; i < result.length; i++) {
652ffe3c632Sopenharmony_ci        assertEquals(sourceData[i], result[i]);
653ffe3c632Sopenharmony_ci      }
654ffe3c632Sopenharmony_ci    }
655ffe3c632Sopenharmony_ci
656ffe3c632Sopenharmony_ci    // Converting Uint8Arrays into Uint8Arrays should be a no-op.
657ffe3c632Sopenharmony_ci    assertEquals(sourceBytes, convert(sourceBytes));
658ffe3c632Sopenharmony_ci
659ffe3c632Sopenharmony_ci    // Converting Array.<numbers> into Uint8Arrays should work.
660ffe3c632Sopenharmony_ci    check(convert(sourceData));
661ffe3c632Sopenharmony_ci
662ffe3c632Sopenharmony_ci    // Converting ArrayBuffers into Uint8Arrays should work.
663ffe3c632Sopenharmony_ci    check(convert(sourceBuffer));
664ffe3c632Sopenharmony_ci
665ffe3c632Sopenharmony_ci    // Converting base64-encoded strings into Uint8Arrays should work.
666ffe3c632Sopenharmony_ci    check(convert(sourceBase64));
667ffe3c632Sopenharmony_ci  });
668ffe3c632Sopenharmony_ci});
669