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