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 reader. 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.BinaryReader'); 48b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammergoog.require('jspb.BinaryWriter'); 49b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 50b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 51b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 52b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammerdescribe('binaryReaderTest', function() { 53b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer /** 54b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer * Tests the reader instance cache. 55b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer * @suppress {visibility} 56b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer */ 57b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer it('testInstanceCaches', function() { 58b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer var writer = new jspb.BinaryWriter(); 59b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer var dummyMessage = /** @type {!jspb.BinaryMessage} */({}); 60b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer writer.writeMessage(1, dummyMessage, goog.nullFunction); 61b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer writer.writeMessage(2, dummyMessage, goog.nullFunction); 62b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 63b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer var buffer = writer.getResultBuffer(); 64b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 65b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer // Empty the instance caches. 66b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer jspb.BinaryReader.instanceCache_ = []; 67b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 68b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer // Allocating and then freeing three decoders should leave us with three in 69b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer // the cache. 70b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 71b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer var decoder1 = jspb.BinaryDecoder.alloc(); 72b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer var decoder2 = jspb.BinaryDecoder.alloc(); 73b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer var decoder3 = jspb.BinaryDecoder.alloc(); 74b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer decoder1.free(); 75b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer decoder2.free(); 76b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer decoder3.free(); 77b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 78b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer assertEquals(3, jspb.BinaryDecoder.instanceCache_.length); 79b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer assertEquals(0, jspb.BinaryReader.instanceCache_.length); 80b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 81b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer // Allocating and then freeing a reader should remove one decoder from its 82b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer // cache, but it should stay stuck to the reader afterwards since we can't 83b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer // have a reader without a decoder. 84b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer jspb.BinaryReader.alloc().free(); 85b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 86b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer assertEquals(2, jspb.BinaryDecoder.instanceCache_.length); 87b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer assertEquals(1, jspb.BinaryReader.instanceCache_.length); 88b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 89b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer // Allocating a reader should remove a reader from the cache. 90b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer var reader = jspb.BinaryReader.alloc(buffer); 91b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 92b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer assertEquals(2, jspb.BinaryDecoder.instanceCache_.length); 93b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer assertEquals(0, jspb.BinaryReader.instanceCache_.length); 94b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 95b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer // Processing the message reuses the current reader. 96b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer reader.nextField(); 97b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer assertEquals(1, reader.getFieldNumber()); 98b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer reader.readMessage(dummyMessage, function() { 99b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer assertEquals(0, jspb.BinaryReader.instanceCache_.length); 100b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer }); 101b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 102b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer reader.nextField(); 103b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer assertEquals(2, reader.getFieldNumber()); 104b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer reader.readMessage(dummyMessage, function() { 105b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer assertEquals(0, jspb.BinaryReader.instanceCache_.length); 106b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer }); 107b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 108b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer assertEquals(false, reader.nextField()); 109b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 110b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer assertEquals(2, jspb.BinaryDecoder.instanceCache_.length); 111b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer assertEquals(0, jspb.BinaryReader.instanceCache_.length); 112b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 113b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer // Freeing the reader should put it back into the cache. 114b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer reader.free(); 115b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 116b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer assertEquals(2, jspb.BinaryDecoder.instanceCache_.length); 117b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer assertEquals(1, jspb.BinaryReader.instanceCache_.length); 118b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer }); 119b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 120b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 121b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer /** 122b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer * @param {number} x 123b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer * @return {number} 124b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer */ 125b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer function truncate(x) { 126b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer var temp = new Float32Array(1); 127b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer temp[0] = x; 128b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer return temp[0]; 129b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer } 130b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 131b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 132b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer /** 133b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer * Verifies that misuse of the reader class triggers assertions. 134b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer * @suppress {checkTypes|visibility} 135b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer */ 136b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer it('testReadErrors', function() { 137b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer // Calling readMessage on a non-delimited field should trigger an 138b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer // assertion. 139b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer var reader = jspb.BinaryReader.alloc([8, 1]); 140b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer var dummyMessage = /** @type {!jspb.BinaryMessage} */({}); 141b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer reader.nextField(); 142b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer assertThrows(function() { 143b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer reader.readMessage(dummyMessage, goog.nullFunction); 144b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer }); 145b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 146b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer // Reading past the end of the stream should trigger an assertion. 147b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer reader = jspb.BinaryReader.alloc([9, 1]); 148b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer reader.nextField(); 149b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer assertThrows(function() {reader.readFixed64()}); 150b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 151b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer // Reading past the end of a submessage should trigger an assertion. 152b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer reader = jspb.BinaryReader.alloc([10, 4, 13, 1, 1, 1]); 153b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer reader.nextField(); 154b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer reader.readMessage(dummyMessage, function() { 155b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer reader.nextField(); 156b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer assertThrows(function() {reader.readFixed32()}); 157b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer }); 158b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 159b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer // Skipping an invalid field should trigger an assertion. 160b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer reader = jspb.BinaryReader.alloc([12, 1]); 161b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer reader.nextWireType_ = 1000; 162b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer assertThrows(function() {reader.skipField()}); 163b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 164b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer // Reading fields with the wrong wire type should assert. 165b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer reader = jspb.BinaryReader.alloc([9, 0, 0, 0, 0, 0, 0, 0, 0]); 166b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer reader.nextField(); 167b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer assertThrows(function() {reader.readInt32()}); 168b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer assertThrows(function() {reader.readInt32String()}); 169b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer assertThrows(function() {reader.readInt64()}); 170b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer assertThrows(function() {reader.readInt64String()}); 171b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer assertThrows(function() {reader.readUint32()}); 172b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer assertThrows(function() {reader.readUint32String()}); 173b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer assertThrows(function() {reader.readUint64()}); 174b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer assertThrows(function() {reader.readUint64String()}); 175b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer assertThrows(function() {reader.readSint32()}); 176b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer assertThrows(function() {reader.readBool()}); 177b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer assertThrows(function() {reader.readEnum()}); 178b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 179b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer reader = jspb.BinaryReader.alloc([8, 1]); 180b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer reader.nextField(); 181b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer assertThrows(function() {reader.readFixed32()}); 182b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer assertThrows(function() {reader.readFixed64()}); 183b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer assertThrows(function() {reader.readSfixed32()}); 184b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer assertThrows(function() {reader.readSfixed64()}); 185b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer assertThrows(function() {reader.readFloat()}); 186b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer assertThrows(function() {reader.readDouble()}); 187b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 188b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer assertThrows(function() {reader.readString()}); 189b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer assertThrows(function() {reader.readBytes()}); 190b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer }); 191b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 192b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 193b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer /** 194b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer * Tests encoding and decoding of unsigned field types. 195b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer * @param {Function} readField 196b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer * @param {Function} writeField 197b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer * @param {number} epsilon 198b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer * @param {number} upperLimit 199b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer * @param {Function} filter 200b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer * @private 201b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer * @suppress {missingProperties} 202b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer */ 203b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer function doTestUnsignedField_(readField, 204b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer writeField, epsilon, upperLimit, filter) { 205b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer assertNotNull(readField); 206b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer assertNotNull(writeField); 207b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 208b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer var writer = new jspb.BinaryWriter(); 209b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 210b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer // Encode zero and limits. 211b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer writeField.call(writer, 1, filter(0)); 212b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer writeField.call(writer, 2, filter(epsilon)); 213b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer writeField.call(writer, 3, filter(upperLimit)); 214b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 215b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer // Encode positive values. 216b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer for (var cursor = epsilon; cursor < upperLimit; cursor *= 1.1) { 217b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer writeField.call(writer, 4, filter(cursor)); 218b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer } 219b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 220b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer var reader = jspb.BinaryReader.alloc(writer.getResultBuffer()); 221b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 222b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer // Check zero and limits. 223b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer reader.nextField(); 224b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer assertEquals(1, reader.getFieldNumber()); 225b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer assertEquals(filter(0), readField.call(reader)); 226b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 227b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer reader.nextField(); 228b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer assertEquals(2, reader.getFieldNumber()); 229b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer assertEquals(filter(epsilon), readField.call(reader)); 230b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 231b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer reader.nextField(); 232b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer assertEquals(3, reader.getFieldNumber()); 233b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer assertEquals(filter(upperLimit), readField.call(reader)); 234b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 235b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer // Check positive values. 236b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer for (var cursor = epsilon; cursor < upperLimit; cursor *= 1.1) { 237b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer reader.nextField(); 238b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer if (4 != reader.getFieldNumber()) throw 'fail!'; 239b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer if (filter(cursor) != readField.call(reader)) throw 'fail!'; 240b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer } 241b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer }; 242b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 243b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 244b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer /** 245b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer * Tests encoding and decoding of signed field types. 246b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer * @param {Function} readField 247b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer * @param {Function} writeField 248b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer * @param {number} epsilon 249b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer * @param {number} lowerLimit 250b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer * @param {number} upperLimit 251b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer * @param {Function} filter 252b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer * @private 253b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer * @suppress {missingProperties} 254b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer */ 255b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer function doTestSignedField_(readField, 256b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer writeField, epsilon, lowerLimit, upperLimit, filter) { 257b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer var writer = new jspb.BinaryWriter(); 258b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 259b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer // Encode zero and limits. 260b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer writeField.call(writer, 1, filter(lowerLimit)); 261b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer writeField.call(writer, 2, filter(-epsilon)); 262b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer writeField.call(writer, 3, filter(0)); 263b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer writeField.call(writer, 4, filter(epsilon)); 264b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer writeField.call(writer, 5, filter(upperLimit)); 265b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 266b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer var inputValues = []; 267b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 268b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer // Encode negative values. 269b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer for (var cursor = lowerLimit; cursor < -epsilon; cursor /= 1.1) { 270b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer var val = filter(cursor); 271b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer writeField.call(writer, 6, val); 272b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer inputValues.push({ 273b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer fieldNumber: 6, 274b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer value: val 275b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer }); 276b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer } 277b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 278b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer // Encode positive values. 279b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer for (var cursor = epsilon; cursor < upperLimit; cursor *= 1.1) { 280b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer var val = filter(cursor); 281b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer writeField.call(writer, 7, val); 282b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer inputValues.push({ 283b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer fieldNumber: 7, 284b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer value: val 285b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer }); 286b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer } 287b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 288b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer var reader = jspb.BinaryReader.alloc(writer.getResultBuffer()); 289b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 290b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer // Check zero and limits. 291b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer reader.nextField(); 292b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer assertEquals(1, reader.getFieldNumber()); 293b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer assertEquals(filter(lowerLimit), readField.call(reader)); 294b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 295b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer reader.nextField(); 296b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer assertEquals(2, reader.getFieldNumber()); 297b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer assertEquals(filter(-epsilon), readField.call(reader)); 298b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 299b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer reader.nextField(); 300b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer assertEquals(3, reader.getFieldNumber()); 301b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer assertEquals(filter(0), readField.call(reader)); 302b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 303b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer reader.nextField(); 304b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer assertEquals(4, reader.getFieldNumber()); 305b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer assertEquals(filter(epsilon), readField.call(reader)); 306b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 307b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer reader.nextField(); 308b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer assertEquals(5, reader.getFieldNumber()); 309b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer assertEquals(filter(upperLimit), readField.call(reader)); 310b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 311b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer for (var i = 0; i < inputValues.length; i++) { 312b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer var expected = inputValues[i]; 313b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer reader.nextField(); 314b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer assertEquals(expected.fieldNumber, reader.getFieldNumber()); 315b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer assertEquals(expected.value, readField.call(reader)); 316b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer } 317b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer }; 318b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 319b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 320b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer /** 321b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer * Tests fields that use varint encoding. 322b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer */ 323b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer it('testVarintFields', function() { 324b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer assertNotNull(jspb.BinaryReader.prototype.readUint32); 325b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer assertNotNull(jspb.BinaryReader.prototype.writeUint32); 326b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer assertNotNull(jspb.BinaryReader.prototype.readUint64); 327b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer assertNotNull(jspb.BinaryReader.prototype.writeUint64); 328b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer assertNotNull(jspb.BinaryReader.prototype.readBool); 329b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer assertNotNull(jspb.BinaryReader.prototype.writeBool); 330b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer doTestUnsignedField_( 331b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer jspb.BinaryReader.prototype.readUint32, 332b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer jspb.BinaryWriter.prototype.writeUint32, 333b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 1, Math.pow(2, 32) - 1, Math.round); 334b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 335b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer doTestUnsignedField_( 336b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer jspb.BinaryReader.prototype.readUint64, 337b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer jspb.BinaryWriter.prototype.writeUint64, 338b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 1, Math.pow(2, 64) - 1025, Math.round); 339b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 340b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer doTestSignedField_( 341b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer jspb.BinaryReader.prototype.readInt32, 342b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer jspb.BinaryWriter.prototype.writeInt32, 343b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 1, -Math.pow(2, 31), Math.pow(2, 31) - 1, Math.round); 344b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 345b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer doTestSignedField_( 346b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer jspb.BinaryReader.prototype.readInt64, 347b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer jspb.BinaryWriter.prototype.writeInt64, 348b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 1, -Math.pow(2, 63), Math.pow(2, 63) - 513, Math.round); 349b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 350b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer doTestSignedField_( 351b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer jspb.BinaryReader.prototype.readEnum, 352b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer jspb.BinaryWriter.prototype.writeEnum, 353b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 1, -Math.pow(2, 31), Math.pow(2, 31) - 1, Math.round); 354b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 355b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer doTestUnsignedField_( 356b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer jspb.BinaryReader.prototype.readBool, 357b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer jspb.BinaryWriter.prototype.writeBool, 358b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 1, 1, function(x) { return !!x; }); 359b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer }); 360b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 361b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 362b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer /** 363b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer * Tests 64-bit fields that are handled as strings. 364b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer */ 365b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer it('testStringInt64Fields', function() { 366b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer var writer = new jspb.BinaryWriter(); 367b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 368b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer var testSignedData = [ 369b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer '2730538252207801776', 370b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer '-2688470994844604560', 371b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer '3398529779486536359', 372b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer '3568577411627971000', 373b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer '272477188847484900', 374b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer '-6649058714086158188', 375b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer '-7695254765712060806', 376b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer '-4525541438037104029', 377b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer '-4993706538836508568', 378b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer '4990160321893729138' 379b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer ]; 380b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer var testUnsignedData = [ 381b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer '7822732630241694882', 382b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer '6753602971916687352', 383b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer '2399935075244442116', 384b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer '8724292567325338867', 385b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer '16948784802625696584', 386b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer '4136275908516066934', 387b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer '3575388346793700364', 388b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer '5167142028379259461', 389b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer '1557573948689737699', 390b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer '17100725280812548567' 391b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer ]; 392b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 393b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer for (var i = 0; i < testSignedData.length; i++) { 394b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer writer.writeInt64String(2 * i + 1, testSignedData[i]); 395b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer writer.writeUint64String(2 * i + 2, testUnsignedData[i]); 396b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer } 397b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 398b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer var reader = jspb.BinaryReader.alloc(writer.getResultBuffer()); 399b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 400b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer for (var i = 0; i < testSignedData.length; i++) { 401b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer reader.nextField(); 402b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer assertEquals(2 * i + 1, reader.getFieldNumber()); 403b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer assertEquals(testSignedData[i], reader.readInt64String()); 404b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer reader.nextField(); 405b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer assertEquals(2 * i + 2, reader.getFieldNumber()); 406b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer assertEquals(testUnsignedData[i], reader.readUint64String()); 407b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer } 408b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer }); 409b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 410b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 411b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer /** 412b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer * Tests fields that use zigzag encoding. 413b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer */ 414b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer it('testZigzagFields', function() { 415b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer doTestSignedField_( 416b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer jspb.BinaryReader.prototype.readSint32, 417b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer jspb.BinaryWriter.prototype.writeSint32, 418b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 1, -Math.pow(2, 31), Math.pow(2, 31) - 1, Math.round); 419b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 420b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer doTestSignedField_( 421b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer jspb.BinaryReader.prototype.readSint64, 422b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer jspb.BinaryWriter.prototype.writeSint64, 423b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 1, -Math.pow(2, 63), Math.pow(2, 63) - 513, Math.round); 424b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer }); 425b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 426b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 427b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer /** 428b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer * Tests fields that use fixed-length encoding. 429b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer */ 430b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer it('testFixedFields', function() { 431b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer doTestUnsignedField_( 432b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer jspb.BinaryReader.prototype.readFixed32, 433b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer jspb.BinaryWriter.prototype.writeFixed32, 434b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 1, Math.pow(2, 32) - 1, Math.round); 435b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 436b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer doTestUnsignedField_( 437b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer jspb.BinaryReader.prototype.readFixed64, 438b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer jspb.BinaryWriter.prototype.writeFixed64, 439b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 1, Math.pow(2, 64) - 1025, Math.round); 440b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 441b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer doTestSignedField_( 442b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer jspb.BinaryReader.prototype.readSfixed32, 443b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer jspb.BinaryWriter.prototype.writeSfixed32, 444b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 1, -Math.pow(2, 31), Math.pow(2, 31) - 1, Math.round); 445b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 446b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer doTestSignedField_( 447b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer jspb.BinaryReader.prototype.readSfixed64, 448b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer jspb.BinaryWriter.prototype.writeSfixed64, 449b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 1, -Math.pow(2, 63), Math.pow(2, 63) - 513, Math.round); 450b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer }); 451b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 452b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 453b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer /** 454b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer * Tests floating point fields. 455b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer */ 456b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer it('testFloatFields', function() { 457b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer doTestSignedField_( 458b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer jspb.BinaryReader.prototype.readFloat, 459b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer jspb.BinaryWriter.prototype.writeFloat, 460b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer jspb.BinaryConstants.FLOAT32_MIN, 461b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer -jspb.BinaryConstants.FLOAT32_MAX, 462b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer jspb.BinaryConstants.FLOAT32_MAX, 463b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer truncate); 464b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 465b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer doTestSignedField_( 466b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer jspb.BinaryReader.prototype.readDouble, 467b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer jspb.BinaryWriter.prototype.writeDouble, 468b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer jspb.BinaryConstants.FLOAT64_EPS * 10, 469b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer -jspb.BinaryConstants.FLOAT64_MIN, 470b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer jspb.BinaryConstants.FLOAT64_MIN, 471b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer function(x) { return x; }); 472b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer }); 473b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 474b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 475b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer /** 476b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer * Tests length-delimited string fields. 477b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer */ 478b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer it('testStringFields', function() { 479b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer var s1 = 'The quick brown fox jumps over the lazy dog.'; 480b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer var s2 = '人人生而自由,在尊嚴和權利上一律平等。'; 481b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 482b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer var writer = new jspb.BinaryWriter(); 483b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 484b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer writer.writeString(1, s1); 485b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer writer.writeString(2, s2); 486b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 487b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer var reader = jspb.BinaryReader.alloc(writer.getResultBuffer()); 488b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 489b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer reader.nextField(); 490b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer assertEquals(1, reader.getFieldNumber()); 491b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer assertEquals(s1, reader.readString()); 492b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 493b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer reader.nextField(); 494b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer assertEquals(2, reader.getFieldNumber()); 495b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer assertEquals(s2, reader.readString()); 496b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer }); 497b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 498b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 499b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer /** 500b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer * Tests length-delimited byte fields. 501b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer */ 502b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer it('testByteFields', function() { 503b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer var message = []; 504b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer var lowerLimit = 1; 505b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer var upperLimit = 256; 506b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer var scale = 1.1; 507b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 508b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer var writer = new jspb.BinaryWriter(); 509b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 510b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer for (var cursor = lowerLimit; cursor < upperLimit; cursor *= 1.1) { 511b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer var len = Math.round(cursor); 512b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer var bytes = []; 513b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer for (var i = 0; i < len; i++) bytes.push(i % 256); 514b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 515b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer writer.writeBytes(len, bytes); 516b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer } 517b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 518b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer var reader = jspb.BinaryReader.alloc(writer.getResultBuffer()); 519b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 520b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer for (var cursor = lowerLimit; reader.nextField(); cursor *= 1.1) { 521b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer var len = Math.round(cursor); 522b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer if (len != reader.getFieldNumber()) throw 'fail!'; 523b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 524b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer var bytes = reader.readBytes(); 525b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer if (len != bytes.length) throw 'fail!'; 526b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer for (var i = 0; i < bytes.length; i++) { 527b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer if (i % 256 != bytes[i]) throw 'fail!'; 528b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer } 529b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer } 530b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer }); 531b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 532b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 533b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer /** 534b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer * Tests nested messages. 535b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer */ 536b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer it('testNesting', function() { 537b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer var writer = new jspb.BinaryWriter(); 538b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer var dummyMessage = /** @type {!jspb.BinaryMessage} */({}); 539b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 540b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer writer.writeInt32(1, 100); 541b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 542b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer // Add one message with 3 int fields. 543b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer writer.writeMessage(2, dummyMessage, function() { 544b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer writer.writeInt32(3, 300); 545b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer writer.writeInt32(4, 400); 546b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer writer.writeInt32(5, 500); 547b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer }); 548b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 549b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer // Add one empty message. 550b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer writer.writeMessage(6, dummyMessage, goog.nullFunction); 551b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 552b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer writer.writeInt32(7, 700); 553b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 554b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer var reader = jspb.BinaryReader.alloc(writer.getResultBuffer()); 555b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 556b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer // Validate outermost message. 557b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 558b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer reader.nextField(); 559b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer assertEquals(1, reader.getFieldNumber()); 560b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer assertEquals(100, reader.readInt32()); 561b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 562b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer reader.nextField(); 563b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer assertEquals(2, reader.getFieldNumber()); 564b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer reader.readMessage(dummyMessage, function() { 565b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer // Validate embedded message 1. 566b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer reader.nextField(); 567b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer assertEquals(3, reader.getFieldNumber()); 568b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer assertEquals(300, reader.readInt32()); 569b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 570b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer reader.nextField(); 571b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer assertEquals(4, reader.getFieldNumber()); 572b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer assertEquals(400, reader.readInt32()); 573b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 574b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer reader.nextField(); 575b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer assertEquals(5, reader.getFieldNumber()); 576b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer assertEquals(500, reader.readInt32()); 577b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 578b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer assertEquals(false, reader.nextField()); 579b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer }); 580b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 581b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer reader.nextField(); 582b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer assertEquals(6, reader.getFieldNumber()); 583b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer reader.readMessage(dummyMessage, function() { 584b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer // Validate embedded message 2. 585b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 586b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer assertEquals(false, reader.nextField()); 587b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer }); 588b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 589b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer reader.nextField(); 590b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer assertEquals(7, reader.getFieldNumber()); 591b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer assertEquals(700, reader.readInt32()); 592b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 593b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer assertEquals(false, reader.nextField()); 594b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer }); 595b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 596b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer /** 597b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer * Tests skipping fields of each type by interleaving them with sentinel 598b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer * values and skipping everything that's not a sentinel. 599b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer */ 600b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer it('testSkipField', function() { 601b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer var writer = new jspb.BinaryWriter(); 602b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 603b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer var sentinel = 123456789; 604b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 605b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer // Write varint fields of different sizes. 606b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer writer.writeInt32(1, sentinel); 607b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer writer.writeInt32(1, 1); 608b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer writer.writeInt32(1, 1000); 609b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer writer.writeInt32(1, 1000000); 610b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer writer.writeInt32(1, 1000000000); 611b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 612b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer // Write fixed 64-bit encoded fields. 613b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer writer.writeInt32(2, sentinel); 614b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer writer.writeDouble(2, 1); 615b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer writer.writeFixed64(2, 1); 616b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer writer.writeSfixed64(2, 1); 617b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 618b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer // Write fixed 32-bit encoded fields. 619b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer writer.writeInt32(3, sentinel); 620b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer writer.writeFloat(3, 1); 621b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer writer.writeFixed32(3, 1); 622b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer writer.writeSfixed32(3, 1); 623b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 624b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer // Write delimited fields. 625b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer writer.writeInt32(4, sentinel); 626b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer writer.writeBytes(4, [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]); 627b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer writer.writeString(4, 'The quick brown fox jumps over the lazy dog'); 628b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 629b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer // Write a group with a nested group inside. 630b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer writer.writeInt32(5, sentinel); 631b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer var dummyMessage = /** @type {!jspb.BinaryMessage} */({}); 632b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer writer.writeGroup(5, dummyMessage, function() { 633b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer writer.writeInt64(42, 42); 634b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer writer.writeGroup(6, dummyMessage, function() { 635b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer writer.writeInt64(84, 42); 636b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer }); 637b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer }); 638b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 639b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer // Write final sentinel. 640b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer writer.writeInt32(6, sentinel); 641b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 642b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer var reader = jspb.BinaryReader.alloc(writer.getResultBuffer()); 643b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 644b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer function skip(field, count) { 645b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer for (var i = 0; i < count; i++) { 646b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer reader.nextField(); 647b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer if (field != reader.getFieldNumber()) throw 'fail!'; 648b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer reader.skipField(); 649b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer } 650b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer } 651b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 652b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer reader.nextField(); 653b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer assertEquals(1, reader.getFieldNumber()); 654b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer assertEquals(sentinel, reader.readInt32()); 655b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer skip(1, 4); 656b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 657b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer reader.nextField(); 658b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer assertEquals(2, reader.getFieldNumber()); 659b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer assertEquals(sentinel, reader.readInt32()); 660b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer skip(2, 3); 661b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 662b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer reader.nextField(); 663b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer assertEquals(3, reader.getFieldNumber()); 664b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer assertEquals(sentinel, reader.readInt32()); 665b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer skip(3, 3); 666b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 667b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer reader.nextField(); 668b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer assertEquals(4, reader.getFieldNumber()); 669b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer assertEquals(sentinel, reader.readInt32()); 670b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer skip(4, 2); 671b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 672b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer reader.nextField(); 673b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer assertEquals(5, reader.getFieldNumber()); 674b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer assertEquals(sentinel, reader.readInt32()); 675b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer skip(5, 1); 676b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 677b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer reader.nextField(); 678b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer assertEquals(6, reader.getFieldNumber()); 679b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer assertEquals(sentinel, reader.readInt32()); 680b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer }); 681b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 682b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 683b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer /** 684b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer * Tests packed fields. 685b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer */ 686b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer it('testPackedFields', function() { 687b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer var writer = new jspb.BinaryWriter(); 688b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 689b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer var sentinel = 123456789; 690b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 691b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer var unsignedData = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]; 692b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer var signedData = [-1, 2, -3, 4, -5, 6, -7, 8, -9, 10]; 693b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer var floatData = [1.1, 2.2, 3.3, 4.4, 5.5, 6.6, 7.7, 8.8, 9.9, 10.10]; 694b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer var doubleData = [1.1, 2.2, 3.3, 4.4, 5.5, 6.6, 7.7, 8.8, 9.9, 10.10]; 695b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer var boolData = [true, false, true, true, false, false, true, false]; 696b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 697b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer for (var i = 0; i < floatData.length; i++) { 698b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer floatData[i] = truncate(floatData[i]); 699b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer } 700b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 701b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer writer.writeInt32(1, sentinel); 702b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 703b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer writer.writePackedInt32(2, signedData); 704b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer writer.writePackedInt64(2, signedData); 705b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer writer.writePackedUint32(2, unsignedData); 706b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer writer.writePackedUint64(2, unsignedData); 707b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer writer.writePackedSint32(2, signedData); 708b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer writer.writePackedSint64(2, signedData); 709b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer writer.writePackedFixed32(2, unsignedData); 710b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer writer.writePackedFixed64(2, unsignedData); 711b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer writer.writePackedSfixed32(2, signedData); 712b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer writer.writePackedSfixed64(2, signedData); 713b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer writer.writePackedFloat(2, floatData); 714b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer writer.writePackedDouble(2, doubleData); 715b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer writer.writePackedBool(2, boolData); 716b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer writer.writePackedEnum(2, unsignedData); 717b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 718b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer writer.writeInt32(3, sentinel); 719b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 720b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer var reader = jspb.BinaryReader.alloc(writer.getResultBuffer()); 721b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 722b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer reader.nextField(); 723b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer assertEquals(sentinel, reader.readInt32()); 724b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 725b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer reader.nextField(); 726b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer assertElementsEquals(reader.readPackedInt32(), signedData); 727b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 728b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer reader.nextField(); 729b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer assertElementsEquals(reader.readPackedInt64(), signedData); 730b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 731b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer reader.nextField(); 732b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer assertElementsEquals(reader.readPackedUint32(), unsignedData); 733b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 734b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer reader.nextField(); 735b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer assertElementsEquals(reader.readPackedUint64(), unsignedData); 736b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 737b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer reader.nextField(); 738b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer assertElementsEquals(reader.readPackedSint32(), signedData); 739b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 740b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer reader.nextField(); 741b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer assertElementsEquals(reader.readPackedSint64(), signedData); 742b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 743b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer reader.nextField(); 744b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer assertElementsEquals(reader.readPackedFixed32(), unsignedData); 745b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 746b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer reader.nextField(); 747b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer assertElementsEquals(reader.readPackedFixed64(), unsignedData); 748b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 749b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer reader.nextField(); 750b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer assertElementsEquals(reader.readPackedSfixed32(), signedData); 751b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 752b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer reader.nextField(); 753b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer assertElementsEquals(reader.readPackedSfixed64(), signedData); 754b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 755b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer reader.nextField(); 756b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer assertElementsEquals(reader.readPackedFloat(), floatData); 757b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 758b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer reader.nextField(); 759b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer assertElementsEquals(reader.readPackedDouble(), doubleData); 760b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 761b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer reader.nextField(); 762b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer assertElementsEquals(reader.readPackedBool(), boolData); 763b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 764b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer reader.nextField(); 765b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer assertElementsEquals(reader.readPackedEnum(), unsignedData); 766b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 767b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer reader.nextField(); 768b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer assertEquals(sentinel, reader.readInt32()); 769b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer }); 770b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 771b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 772b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer /** 773b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer * Byte blobs inside nested messages should always have their byte offset set 774b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer * relative to the start of the outermost blob, not the start of their parent 775b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer * blob. 776b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer */ 777b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer it('testNestedBlobs', function() { 778b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer // Create a proto consisting of two nested messages, with the inner one 779b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer // containing a blob of bytes. 780b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 781b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer var fieldTag = (1 << 3) | jspb.BinaryConstants.WireType.DELIMITED; 782b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer var blob = [1, 2, 3, 4, 5]; 783b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer var writer = new jspb.BinaryWriter(); 784b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer var dummyMessage = /** @type {!jspb.BinaryMessage} */({}); 785b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 786b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer writer.writeMessage(1, dummyMessage, function() { 787b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer writer.writeMessage(1, dummyMessage, function() { 788b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer writer.writeBytes(1, blob); 789b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer }); 790b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer }); 791b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 792b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer // Peel off the outer two message layers. Each layer should have two bytes 793b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer // of overhead, one for the field tag and one for the length of the inner 794b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer // blob. 795b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 796b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer var decoder1 = new jspb.BinaryDecoder(writer.getResultBuffer()); 797b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer assertEquals(fieldTag, decoder1.readUnsignedVarint32()); 798b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer assertEquals(blob.length + 4, decoder1.readUnsignedVarint32()); 799b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 800b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer var decoder2 = new jspb.BinaryDecoder(decoder1.readBytes(blob.length + 4)); 801b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer assertEquals(fieldTag, decoder2.readUnsignedVarint32()); 802b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer assertEquals(blob.length + 2, decoder2.readUnsignedVarint32()); 803b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 804b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer assertEquals(fieldTag, decoder2.readUnsignedVarint32()); 805b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer assertEquals(blob.length, decoder2.readUnsignedVarint32()); 806b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer var bytes = decoder2.readBytes(blob.length); 807b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 808b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer assertElementsEquals(bytes, blob); 809b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer }); 810b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 811b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 812b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer /** 813b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer * Tests read callbacks. 814b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer */ 815b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer it('testReadCallbacks', function() { 816b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer var writer = new jspb.BinaryWriter(); 817b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer var dummyMessage = /** @type {!jspb.BinaryMessage} */({}); 818b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 819b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer // Add an int, a submessage, and another int. 820b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer writer.writeInt32(1, 100); 821b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 822b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer writer.writeMessage(2, dummyMessage, function() { 823b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer writer.writeInt32(3, 300); 824b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer writer.writeInt32(4, 400); 825b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer writer.writeInt32(5, 500); 826b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer }); 827b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 828b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer writer.writeInt32(7, 700); 829b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 830b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer // Create the reader and register a custom read callback. 831b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer var reader = jspb.BinaryReader.alloc(writer.getResultBuffer()); 832b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 833b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer /** 834b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer * @param {!jspb.BinaryReader} reader 835b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer * @return {*} 836b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer */ 837b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer function readCallback(reader) { 838b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer reader.nextField(); 839b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer assertEquals(3, reader.getFieldNumber()); 840b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer assertEquals(300, reader.readInt32()); 841b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 842b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer reader.nextField(); 843b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer assertEquals(4, reader.getFieldNumber()); 844b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer assertEquals(400, reader.readInt32()); 845b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 846b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer reader.nextField(); 847b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer assertEquals(5, reader.getFieldNumber()); 848b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer assertEquals(500, reader.readInt32()); 849b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 850b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer assertEquals(false, reader.nextField()); 851b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer }; 852b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 853b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer reader.registerReadCallback('readCallback', readCallback); 854b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 855b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer // Read the container message. 856b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer reader.nextField(); 857b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer assertEquals(1, reader.getFieldNumber()); 858b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer assertEquals(100, reader.readInt32()); 859b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 860b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer reader.nextField(); 861b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer assertEquals(2, reader.getFieldNumber()); 862b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer reader.readMessage(dummyMessage, function() { 863b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer // Decode the embedded message using the registered callback. 864b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer reader.runReadCallback('readCallback'); 865b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer }); 866b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 867b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer reader.nextField(); 868b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer assertEquals(7, reader.getFieldNumber()); 869b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer assertEquals(700, reader.readInt32()); 870b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 871b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer assertEquals(false, reader.nextField()); 872b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer }); 873b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer}); 874