| OLD | NEW |
| 1 // Protocol Buffers - Google's data interchange format | 1 // Protocol Buffers - Google's data interchange format |
| 2 // Copyright 2008 Google Inc. All rights reserved. | 2 // Copyright 2008 Google Inc. All rights reserved. |
| 3 // https://developers.google.com/protocol-buffers/ | 3 // https://developers.google.com/protocol-buffers/ |
| 4 // | 4 // |
| 5 // Redistribution and use in source and binary forms, with or without | 5 // Redistribution and use in source and binary forms, with or without |
| 6 // modification, are permitted provided that the following conditions are | 6 // modification, are permitted provided that the following conditions are |
| 7 // met: | 7 // met: |
| 8 // | 8 // |
| 9 // * Redistributions of source code must retain the above copyright | 9 // * Redistributions of source code must retain the above copyright |
| 10 // notice, this list of conditions and the following disclaimer. | 10 // notice, this list of conditions and the following disclaimer. |
| (...skipping 179 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 190 result = jspb.utils.hash64ArrayToDecimalStrings([ | 190 result = jspb.utils.hash64ArrayToDecimalStrings([ |
| 191 toHashString(0xFFFFFFFF, 0xFFFFFFFF), | 191 toHashString(0xFFFFFFFF, 0xFFFFFFFF), |
| 192 toHashString(0x00000000, 0x80000000), | 192 toHashString(0x00000000, 0x80000000), |
| 193 toHashString(0xacd05f15, 0x01b69b4b)], false); | 193 toHashString(0xacd05f15, 0x01b69b4b)], false); |
| 194 assertEquals(3, result.length); | 194 assertEquals(3, result.length); |
| 195 assertEquals('18446744073709551615', result[0]); | 195 assertEquals('18446744073709551615', result[0]); |
| 196 assertEquals('9223372036854775808', result[1]); | 196 assertEquals('9223372036854775808', result[1]); |
| 197 assertEquals('123456789123456789', result[2]); | 197 assertEquals('123456789123456789', result[2]); |
| 198 }); | 198 }); |
| 199 | 199 |
| 200 /* |
| 201 * Going from decimal strings to hash strings should be lossless. |
| 202 */ |
| 203 it('testDecimalToHashConversion', function() { |
| 204 var result; |
| 205 var convert = jspb.utils.decimalStringToHash64; |
| 206 |
| 207 result = convert('0'); |
| 208 assertEquals(String.fromCharCode.apply(null, |
| 209 [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00]), result); |
| 210 |
| 211 result = convert('-1'); |
| 212 assertEquals(String.fromCharCode.apply(null, |
| 213 [0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF]), result); |
| 214 |
| 215 result = convert('18446744073709551615'); |
| 216 assertEquals(String.fromCharCode.apply(null, |
| 217 [0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF]), result); |
| 218 |
| 219 result = convert('9223372036854775808'); |
| 220 assertEquals(String.fromCharCode.apply(null, |
| 221 [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80]), result); |
| 222 |
| 223 result = convert('-9223372036854775808'); |
| 224 assertEquals(String.fromCharCode.apply(null, |
| 225 [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80]), result); |
| 226 |
| 227 result = convert('123456789123456789'); |
| 228 assertEquals(String.fromCharCode.apply(null, |
| 229 [0x15, 0x5F, 0xD0, 0xAC, 0x4B, 0x9B, 0xB6, 0x01]), result); |
| 230 |
| 231 result = convert('-123456789123456789'); |
| 232 assertEquals(String.fromCharCode.apply(null, |
| 233 [0xEB, 0xA0, 0x2F, 0x53, 0xB4, 0x64, 0x49, 0xFE]), result); |
| 234 }); |
| 200 | 235 |
| 201 /** | 236 /** |
| 202 * Going from hash strings to hex strings should be lossless. | 237 * Going from hash strings to hex strings should be lossless. |
| 203 */ | 238 */ |
| 204 it('testHashToHexConversion', function() { | 239 it('testHashToHexConversion', function() { |
| 205 var result; | 240 var result; |
| 206 var convert = jspb.utils.hash64ToHexString; | 241 var convert = jspb.utils.hash64ToHexString; |
| 207 | 242 |
| 208 result = convert(toHashString(0x00000000, 0x00000000)); | 243 result = convert(toHashString(0x00000000, 0x00000000)); |
| 209 assertEquals('0x0000000000000000', result); | 244 assertEquals('0x0000000000000000', result); |
| (...skipping 93 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 303 * Tests conversion from 32-bit floating point numbers to split64 numbers. | 338 * Tests conversion from 32-bit floating point numbers to split64 numbers. |
| 304 */ | 339 */ |
| 305 it('testFloat32ToSplit64', function() { | 340 it('testFloat32ToSplit64', function() { |
| 306 var f32_eps = jspb.BinaryConstants.FLOAT32_EPS; | 341 var f32_eps = jspb.BinaryConstants.FLOAT32_EPS; |
| 307 var f32_min = jspb.BinaryConstants.FLOAT32_MIN; | 342 var f32_min = jspb.BinaryConstants.FLOAT32_MIN; |
| 308 var f32_max = jspb.BinaryConstants.FLOAT32_MAX; | 343 var f32_max = jspb.BinaryConstants.FLOAT32_MAX; |
| 309 | 344 |
| 310 // NaN. | 345 // NaN. |
| 311 jspb.utils.splitFloat32(NaN); | 346 jspb.utils.splitFloat32(NaN); |
| 312 if (!isNaN(jspb.utils.joinFloat32(jspb.utils.split64Low, | 347 if (!isNaN(jspb.utils.joinFloat32(jspb.utils.split64Low, |
| 313 jspb.utils.split64High))) { | 348 jspb.utils.split64High))) { |
| 314 throw 'fail!'; | 349 throw 'fail!'; |
| 315 } | 350 } |
| 316 | 351 |
| 317 /** | 352 /** |
| 318 * @param {number} x | 353 * @param {number} x |
| 319 * @param {number=} opt_bits | 354 * @param {number=} opt_bits |
| 320 */ | 355 */ |
| 321 function test(x, opt_bits) { | 356 function test(x, opt_bits) { |
| 322 jspb.utils.splitFloat32(x); | 357 jspb.utils.splitFloat32(x); |
| 323 if (goog.isDef(opt_bits)) { | 358 if (goog.isDef(opt_bits)) { |
| 324 if (opt_bits != jspb.utils.split64Low) throw 'fail!'; | 359 if (opt_bits != jspb.utils.split64Low) throw 'fail!'; |
| 325 } | 360 } |
| 326 if (truncate(x) != jspb.utils.joinFloat32(jspb.utils.split64Low, | 361 if (truncate(x) != jspb.utils.joinFloat32(jspb.utils.split64Low, |
| 327 jspb.utils.split64High)) { | 362 jspb.utils.split64High)) { |
| 328 throw 'fail!'; | 363 throw 'fail!'; |
| 329 } | 364 } |
| 330 } | 365 } |
| 331 | 366 |
| 332 // Positive and negative infinity. | 367 // Positive and negative infinity. |
| 333 test(Infinity, 0x7f800000); | 368 test(Infinity, 0x7f800000); |
| 334 test(-Infinity, 0xff800000); | 369 test(-Infinity, 0xff800000); |
| 335 | 370 |
| 336 // Positive and negative zero. | 371 // Positive and negative zero. |
| 337 test(0, 0x00000000); | 372 test(0, 0x00000000); |
| (...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 369 * Tests conversion from 64-bit floating point numbers to split64 numbers. | 404 * Tests conversion from 64-bit floating point numbers to split64 numbers. |
| 370 */ | 405 */ |
| 371 it('testFloat64ToSplit64', function() { | 406 it('testFloat64ToSplit64', function() { |
| 372 var f64_eps = jspb.BinaryConstants.FLOAT64_EPS; | 407 var f64_eps = jspb.BinaryConstants.FLOAT64_EPS; |
| 373 var f64_min = jspb.BinaryConstants.FLOAT64_MIN; | 408 var f64_min = jspb.BinaryConstants.FLOAT64_MIN; |
| 374 var f64_max = jspb.BinaryConstants.FLOAT64_MAX; | 409 var f64_max = jspb.BinaryConstants.FLOAT64_MAX; |
| 375 | 410 |
| 376 // NaN. | 411 // NaN. |
| 377 jspb.utils.splitFloat64(NaN); | 412 jspb.utils.splitFloat64(NaN); |
| 378 if (!isNaN(jspb.utils.joinFloat64(jspb.utils.split64Low, | 413 if (!isNaN(jspb.utils.joinFloat64(jspb.utils.split64Low, |
| 379 jspb.utils.split64High))) { | 414 jspb.utils.split64High))) { |
| 380 throw 'fail!'; | 415 throw 'fail!'; |
| 381 } | 416 } |
| 382 | 417 |
| 383 /** | 418 /** |
| 384 * @param {number} x | 419 * @param {number} x |
| 385 * @param {number=} opt_highBits | 420 * @param {number=} opt_highBits |
| 386 * @param {number=} opt_lowBits | 421 * @param {number=} opt_lowBits |
| 387 */ | 422 */ |
| 388 function test(x, opt_highBits, opt_lowBits) { | 423 function test(x, opt_highBits, opt_lowBits) { |
| 389 jspb.utils.splitFloat64(x); | 424 jspb.utils.splitFloat64(x); |
| 390 if (goog.isDef(opt_highBits)) { | 425 if (goog.isDef(opt_highBits)) { |
| 391 if (opt_highBits != jspb.utils.split64High) throw 'fail!'; | 426 if (opt_highBits != jspb.utils.split64High) throw 'fail!'; |
| 392 } | 427 } |
| 393 if (goog.isDef(opt_lowBits)) { | 428 if (goog.isDef(opt_lowBits)) { |
| 394 if (opt_lowBits != jspb.utils.split64Low) throw 'fail!'; | 429 if (opt_lowBits != jspb.utils.split64Low) throw 'fail!'; |
| 395 } | 430 } |
| 396 if (x != jspb.utils.joinFloat64(jspb.utils.split64Low, | 431 if (x != jspb.utils.joinFloat64(jspb.utils.split64Low, |
| 397 jspb.utils.split64High)) { | 432 jspb.utils.split64High)) { |
| 398 throw 'fail!'; | 433 throw 'fail!'; |
| 399 } | 434 } |
| 400 } | 435 } |
| 401 | 436 |
| 402 // Positive and negative infinity. | 437 // Positive and negative infinity. |
| 403 test(Infinity, 0x7ff00000, 0x00000000); | 438 test(Infinity, 0x7ff00000, 0x00000000); |
| 404 test(-Infinity, 0xfff00000, 0x00000000); | 439 test(-Infinity, 0xfff00000, 0x00000000); |
| 405 | 440 |
| 406 // Positive and negative zero. | 441 // Positive and negative zero. |
| 407 test(0, 0x00000000, 0x00000000); | 442 test(0, 0x00000000, 0x00000000); |
| (...skipping 24 matching lines...) Expand all Loading... |
| 432 test(cursor); | 467 test(cursor); |
| 433 cursor *= 1.1; | 468 cursor *= 1.1; |
| 434 } | 469 } |
| 435 }); | 470 }); |
| 436 | 471 |
| 437 | 472 |
| 438 /** | 473 /** |
| 439 * Tests counting packed varints. | 474 * Tests counting packed varints. |
| 440 */ | 475 */ |
| 441 it('testCountVarints', function() { | 476 it('testCountVarints', function() { |
| 442 var writer = new jspb.BinaryWriter(); | 477 var values = []; |
| 443 | |
| 444 var count = 0; | |
| 445 for (var i = 1; i < 1000000000; i *= 1.1) { | 478 for (var i = 1; i < 1000000000; i *= 1.1) { |
| 446 writer.rawWriteVarint(Math.floor(i)); | 479 values.push(Math.floor(i)); |
| 447 count++; | |
| 448 } | 480 } |
| 449 | 481 |
| 482 var writer = new jspb.BinaryWriter(); |
| 483 writer.writePackedUint64(1, values); |
| 484 |
| 450 var buffer = new Uint8Array(writer.getResultBuffer()); | 485 var buffer = new Uint8Array(writer.getResultBuffer()); |
| 451 assertEquals(count, jspb.utils.countVarints(buffer, 0, buffer.length)); | 486 |
| 487 // We should have two more varints than we started with - one for the field |
| 488 // tag, one for the packed length. |
| 489 assertEquals(values.length + 2, |
| 490 jspb.utils.countVarints(buffer, 0, buffer.length)); |
| 452 }); | 491 }); |
| 453 | 492 |
| 454 | 493 |
| 455 /** | 494 /** |
| 456 * Tests counting matching varint fields. | 495 * Tests counting matching varint fields. |
| 457 */ | 496 */ |
| 458 it('testCountVarintFields', function() { | 497 it('testCountVarintFields', function() { |
| 459 var writer = new jspb.BinaryWriter(); | 498 var writer = new jspb.BinaryWriter(); |
| 460 | 499 |
| 461 var count = 0; | 500 var count = 0; |
| (...skipping 156 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 618 assertEquals(sourceBytes, convert(sourceBytes)); | 657 assertEquals(sourceBytes, convert(sourceBytes)); |
| 619 | 658 |
| 620 // Converting Array.<numbers> into Uint8Arrays should work. | 659 // Converting Array.<numbers> into Uint8Arrays should work. |
| 621 check(convert(sourceData)); | 660 check(convert(sourceData)); |
| 622 | 661 |
| 623 // Converting ArrayBuffers into Uint8Arrays should work. | 662 // Converting ArrayBuffers into Uint8Arrays should work. |
| 624 check(convert(sourceBuffer)); | 663 check(convert(sourceBuffer)); |
| 625 | 664 |
| 626 // Converting base64-encoded strings into Uint8Arrays should work. | 665 // Converting base64-encoded strings into Uint8Arrays should work. |
| 627 check(convert(sourceBase64)); | 666 check(convert(sourceBase64)); |
| 628 | |
| 629 // Converting binary-data strings into Uint8Arrays should work. | |
| 630 check(convert(sourceString, /* opt_stringIsRawBytes = */ true)); | |
| 631 }); | 667 }); |
| 632 }); | 668 }); |
| OLD | NEW |