1b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer// Protocol Buffers - Google's data interchange format
2b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer// Copyright 2008 Google Inc.  All rights reserved.
3b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer// https://developers.google.com/protocol-buffers/
4b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer//
5b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer// Redistribution and use in source and binary forms, with or without
6b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer// modification, are permitted provided that the following conditions are
7b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer// met:
8b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer//
9b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer//     * Redistributions of source code must retain the above copyright
10b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer// notice, this list of conditions and the following disclaimer.
11b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer//     * Redistributions in binary form must reproduce the above
12b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer// copyright notice, this list of conditions and the following disclaimer
13b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer// in the documentation and/or other materials provided with the
14b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer// distribution.
15b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer//     * Neither the name of Google Inc. nor the names of its
16b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer// contributors may be used to endorse or promote products derived from
17b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer// this software without specific prior written permission.
18b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer//
19b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
20b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
21b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
22b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
23b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
24b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
25b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
26b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
27b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
28b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
29b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
30b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
31b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer/**
32b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer * @fileoverview Test cases for jspb's binary protocol buffer decoder.
33b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer *
34b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer * There are two particular magic numbers that need to be pointed out -
35b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer * 2^64-1025 is the largest number representable as both a double and an
36b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer * unsigned 64-bit integer, and 2^63-513 is the largest number representable as
37b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer * both a double and a signed 64-bit integer.
38b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer *
39b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer * Test suite is written using Jasmine -- see http://jasmine.github.io/
40b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer *
41b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer * @author aappleby@google.com (Austin Appleby)
42b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer */
43b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
44b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammergoog.require('goog.testing.asserts');
45b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammergoog.require('jspb.BinaryConstants');
46b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammergoog.require('jspb.BinaryDecoder');
47b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammergoog.require('jspb.BinaryEncoder');
48b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
49b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
50b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer/**
51b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer * Tests encoding and decoding of unsigned types.
52b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer * @param {Function} readValue
53b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer * @param {Function} writeValue
54b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer * @param {number} epsilon
55b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer * @param {number} upperLimit
56b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer * @param {Function} filter
57b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer * @suppress {missingProperties|visibility}
58b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer */
59b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammerfunction doTestUnsignedValue(readValue,
60b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    writeValue, epsilon, upperLimit, filter) {
61b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  var encoder = new jspb.BinaryEncoder();
62b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
63b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  // Encode zero and limits.
64b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  writeValue.call(encoder, filter(0));
65b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  writeValue.call(encoder, filter(epsilon));
66b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  writeValue.call(encoder, filter(upperLimit));
67b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
68b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  // Encode positive values.
69b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  for (var cursor = epsilon; cursor < upperLimit; cursor *= 1.1) {
70b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    writeValue.call(encoder, filter(cursor));
71b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  }
72b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
73b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  var decoder = jspb.BinaryDecoder.alloc(encoder.end());
74b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
75b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  // Check zero and limits.
76b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  assertEquals(filter(0), readValue.call(decoder));
77b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  assertEquals(filter(epsilon), readValue.call(decoder));
78b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  assertEquals(filter(upperLimit), readValue.call(decoder));
79b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
80b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  // Check positive values.
81b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  for (var cursor = epsilon; cursor < upperLimit; cursor *= 1.1) {
82b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    if (filter(cursor) != readValue.call(decoder)) throw 'fail!';
83b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  }
84b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
85b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  // Encoding values outside the valid range should assert.
86b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  assertThrows(function() {writeValue.call(encoder, -1);});
87b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  assertThrows(function() {writeValue.call(encoder, upperLimit * 1.1);});
88b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer}
89b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
90b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
91b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer/**
92b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer * Tests encoding and decoding of signed types.
93b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer * @param {Function} readValue
94b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer * @param {Function} writeValue
95b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer * @param {number} epsilon
96b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer * @param {number} lowerLimit
97b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer * @param {number} upperLimit
98b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer * @param {Function} filter
99b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer * @suppress {missingProperties}
100b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer */
101b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammerfunction doTestSignedValue(readValue,
102b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    writeValue, epsilon, lowerLimit, upperLimit, filter) {
103b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  var encoder = new jspb.BinaryEncoder();
104b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
105b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  // Encode zero and limits.
106b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  writeValue.call(encoder, filter(lowerLimit));
107b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  writeValue.call(encoder, filter(-epsilon));
108b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  writeValue.call(encoder, filter(0));
109b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  writeValue.call(encoder, filter(epsilon));
110b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  writeValue.call(encoder, filter(upperLimit));
111b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
112b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  var inputValues = [];
113b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
114b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  // Encode negative values.
115b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  for (var cursor = lowerLimit; cursor < -epsilon; cursor /= 1.1) {
116b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    var val = filter(cursor);
117b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    writeValue.call(encoder, val);
118b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    inputValues.push(val);
119b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  }
120b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
121b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  // Encode positive values.
122b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  for (var cursor = epsilon; cursor < upperLimit; cursor *= 1.1) {
123b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    var val = filter(cursor);
124b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    writeValue.call(encoder, val);
125b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    inputValues.push(val);
126b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  }
127b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
128b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  var decoder = jspb.BinaryDecoder.alloc(encoder.end());
129b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
130b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  // Check zero and limits.
131b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  assertEquals(filter(lowerLimit), readValue.call(decoder));
132b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  assertEquals(filter(-epsilon), readValue.call(decoder));
133b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  assertEquals(filter(0), readValue.call(decoder));
134b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  assertEquals(filter(epsilon), readValue.call(decoder));
135b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  assertEquals(filter(upperLimit), readValue.call(decoder));
136b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
137b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  // Verify decoded values.
138b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  for (var i = 0; i < inputValues.length; i++) {
139b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    assertEquals(inputValues[i], readValue.call(decoder));
140b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  }
141b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
142b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  // Encoding values outside the valid range should assert.
143b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  assertThrows(function() {writeValue.call(encoder, lowerLimit * 1.1);});
144b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  assertThrows(function() {writeValue.call(encoder, upperLimit * 1.1);});
145b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer}
146b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
147b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammerdescribe('binaryDecoderTest', function() {
148b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  /**
149b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer   * Tests the decoder instance cache.
150b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer   * @suppress {visibility}
151b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer   */
152b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  it('testInstanceCache', function() {
153b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    // Empty the instance caches.
154b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    jspb.BinaryDecoder.instanceCache_ = [];
155b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
156b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    // Allocating and then freeing a decoder should put it in the instance
157b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    // cache.
158b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    jspb.BinaryDecoder.alloc().free();
159b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
160b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    assertEquals(1, jspb.BinaryDecoder.instanceCache_.length);
161b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
162b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    // Allocating and then freeing three decoders should leave us with three in
163b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    // the cache.
164b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
165b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    var decoder1 = jspb.BinaryDecoder.alloc();
166b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    var decoder2 = jspb.BinaryDecoder.alloc();
167b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    var decoder3 = jspb.BinaryDecoder.alloc();
168b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    decoder1.free();
169b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    decoder2.free();
170b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    decoder3.free();
171b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
172b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    assertEquals(3, jspb.BinaryDecoder.instanceCache_.length);
173b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  });
174b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
175b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
176b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  /**
177b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer   * Tests reading 64-bit integers as hash strings.
178b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer   */
179b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  it('testHashStrings', function() {
180b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    var encoder = new jspb.BinaryEncoder();
181b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
182b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    var hashA = String.fromCharCode(0x00, 0x00, 0x00, 0x00,
183b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer                                    0x00, 0x00, 0x00, 0x00);
184b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    var hashB = String.fromCharCode(0x12, 0x34, 0x00, 0x00,
185b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer                                    0x00, 0x00, 0x00, 0x00);
186b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    var hashC = String.fromCharCode(0x12, 0x34, 0x56, 0x78,
187b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer                                    0x87, 0x65, 0x43, 0x21);
188b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    var hashD = String.fromCharCode(0xFF, 0xFF, 0xFF, 0xFF,
189b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer                                    0xFF, 0xFF, 0xFF, 0xFF);
190b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
191b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    encoder.writeVarintHash64(hashA);
192b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    encoder.writeVarintHash64(hashB);
193b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    encoder.writeVarintHash64(hashC);
194b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    encoder.writeVarintHash64(hashD);
195b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
196b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    encoder.writeFixedHash64(hashA);
197b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    encoder.writeFixedHash64(hashB);
198b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    encoder.writeFixedHash64(hashC);
199b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    encoder.writeFixedHash64(hashD);
200b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
201b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    var decoder = jspb.BinaryDecoder.alloc(encoder.end());
202b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
203b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    assertEquals(hashA, decoder.readVarintHash64());
204b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    assertEquals(hashB, decoder.readVarintHash64());
205b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    assertEquals(hashC, decoder.readVarintHash64());
206b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    assertEquals(hashD, decoder.readVarintHash64());
207b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
208b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    assertEquals(hashA, decoder.readFixedHash64());
209b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    assertEquals(hashB, decoder.readFixedHash64());
210b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    assertEquals(hashC, decoder.readFixedHash64());
211b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    assertEquals(hashD, decoder.readFixedHash64());
212b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  });
213b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
214b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
215b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  /**
216b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer   * Verifies that misuse of the decoder class triggers assertions.
217b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer   * @suppress {checkTypes|visibility}
218b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer   */
219b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  it('testDecodeErrors', function() {
220b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    // Reading a value past the end of the stream should trigger an assertion.
221b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    var decoder = jspb.BinaryDecoder.alloc([0, 1, 2]);
222b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    assertThrows(function() {decoder.readUint64()});
223b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
224b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    // Overlong varints should trigger assertions.
225b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    decoder.setBlock([255, 255, 255, 255, 255, 255,
226b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer                      255, 255, 255, 255, 255, 0]);
227b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    assertThrows(function() {decoder.readUnsignedVarint64()});
228b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    decoder.reset();
229b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    assertThrows(function() {decoder.readSignedVarint64()});
230b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    decoder.reset();
231b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    assertThrows(function() {decoder.readZigzagVarint64()});
232b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
233b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    // Positive 32-bit varints encoded with 1 bits in positions 33 through 35
234b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    // should trigger assertions.
235b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    decoder.setBlock([255, 255, 255, 255, 0x1F]);
236b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    assertThrows(function() {decoder.readUnsignedVarint32()});
237b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
238b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    decoder.setBlock([255, 255, 255, 255, 0x2F]);
239b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    assertThrows(function() {decoder.readUnsignedVarint32()});
240b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
241b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    decoder.setBlock([255, 255, 255, 255, 0x4F]);
242b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    assertThrows(function() {decoder.readUnsignedVarint32()});
243b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
244b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    // Negative 32-bit varints encoded with non-1 bits in the high dword should
245b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    // trigger assertions.
246b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    decoder.setBlock([255, 255, 255, 255, 255, 255, 0, 255, 255, 1]);
247b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    assertThrows(function() {decoder.readUnsignedVarint32()});
248b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
249b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    decoder.setBlock([255, 255, 255, 255, 255, 255, 255, 255, 255, 0]);
250b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    assertThrows(function() {decoder.readUnsignedVarint32()});
251b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  });
252b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
253b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
254b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  /**
255b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer   * Tests encoding and decoding of unsigned integers.
256b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer   */
257b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  it('testUnsignedIntegers', function() {
258b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    doTestUnsignedValue(
259b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer        jspb.BinaryDecoder.prototype.readUint8,
260b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer        jspb.BinaryEncoder.prototype.writeUint8,
261b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer        1, 0xFF, Math.round);
262b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
263b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    doTestUnsignedValue(
264b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer        jspb.BinaryDecoder.prototype.readUint16,
265b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer        jspb.BinaryEncoder.prototype.writeUint16,
266b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer        1, 0xFFFF, Math.round);
267b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
268b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    doTestUnsignedValue(
269b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer        jspb.BinaryDecoder.prototype.readUint32,
270b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer        jspb.BinaryEncoder.prototype.writeUint32,
271b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer        1, 0xFFFFFFFF, Math.round);
272b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
273b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    doTestUnsignedValue(
274b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer        jspb.BinaryDecoder.prototype.readUint64,
275b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer        jspb.BinaryEncoder.prototype.writeUint64,
276b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer        1, Math.pow(2, 64) - 1025, Math.round);
277b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  });
278b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
279b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
280b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  /**
281b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer   * Tests encoding and decoding of signed integers.
282b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer   */
283b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  it('testSignedIntegers', function() {
284b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    doTestSignedValue(
285b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer        jspb.BinaryDecoder.prototype.readInt8,
286b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer        jspb.BinaryEncoder.prototype.writeInt8,
287b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer        1, -0x80, 0x7F, Math.round);
288b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
289b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    doTestSignedValue(
290b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer        jspb.BinaryDecoder.prototype.readInt16,
291b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer        jspb.BinaryEncoder.prototype.writeInt16,
292b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer        1, -0x8000, 0x7FFF, Math.round);
293b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
294b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    doTestSignedValue(
295b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer        jspb.BinaryDecoder.prototype.readInt32,
296b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer        jspb.BinaryEncoder.prototype.writeInt32,
297b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer        1, -0x80000000, 0x7FFFFFFF, Math.round);
298b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
299b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    doTestSignedValue(
300b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer        jspb.BinaryDecoder.prototype.readInt64,
301b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer        jspb.BinaryEncoder.prototype.writeInt64,
302b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer        1, -Math.pow(2, 63), Math.pow(2, 63) - 513, Math.round);
303b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  });
304b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
305b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
306b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  /**
307b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer   * Tests encoding and decoding of floats.
308b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer   */
309b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  it('testFloats', function() {
310b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    /**
311b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer     * @param {number} x
312b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer     * @return {number}
313b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer     */
314b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    function truncate(x) {
315b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      var temp = new Float32Array(1);
316b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      temp[0] = x;
317b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      return temp[0];
318b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    }
319b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    doTestSignedValue(
320b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer        jspb.BinaryDecoder.prototype.readFloat,
321b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer        jspb.BinaryEncoder.prototype.writeFloat,
322b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer        jspb.BinaryConstants.FLOAT32_EPS,
323b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer        -jspb.BinaryConstants.FLOAT32_MAX,
324b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer        jspb.BinaryConstants.FLOAT32_MAX,
325b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer        truncate);
326b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
327b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    doTestSignedValue(
328b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer        jspb.BinaryDecoder.prototype.readDouble,
329b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer        jspb.BinaryEncoder.prototype.writeDouble,
330b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer        jspb.BinaryConstants.FLOAT64_EPS * 10,
331b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer        -jspb.BinaryConstants.FLOAT64_MAX,
332b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer        jspb.BinaryConstants.FLOAT64_MAX,
333b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer        function(x) { return x; });
334b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  });
335b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer});
336