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