@@ -457,4 +457,72 @@ abstract class AbstractByteStringTest internal constructor(
457
457
sortedByteStrings.sort()
458
458
assertEquals(originalByteStrings, sortedByteStrings)
459
459
}
460
+
461
+ @Test fun toIndex () {
462
+ assertEquals(0 , factory.decodeHex(" " ).toIndex(1 ))
463
+ assertEquals(0 , factory.decodeHex(" 00" ).toIndex(1 ))
464
+ assertEquals(0 , factory.decodeHex(" ff" ).toIndex(1 ))
465
+ assertEquals(0 , factory.decodeHex(" ffffffff" ).toIndex(1 ))
466
+ assertEquals(0 , factory.decodeHex(" ffffffffffff" ).toIndex(1 ))
467
+
468
+ assertEquals(0 , factory.decodeHex(" " ).toIndex(100 ))
469
+ assertEquals(0 , factory.decodeHex(" 00" ).toIndex(100 ))
470
+ assertEquals(10 , factory.decodeHex(" 1a" ).toIndex(100 ))
471
+ assertEquals(25 , factory.decodeHex(" 40" ).toIndex(100 ))
472
+ assertEquals(50 , factory.decodeHex(" 80" ).toIndex(100 ))
473
+ assertEquals(75 , factory.decodeHex(" c0" ).toIndex(100 ))
474
+ assertEquals(99 , factory.decodeHex(" ff" ).toIndex(100 ))
475
+ assertEquals(99 , factory.decodeHex(" ffff" ).toIndex(100 ))
476
+ assertEquals(99 , factory.decodeHex(" ffffff" ).toIndex(100 ))
477
+ assertEquals(99 , factory.decodeHex(" ffffffff" ).toIndex(100 ))
478
+
479
+ assertEquals(0 , factory.decodeHex(" " ).toIndex(Int .MAX_VALUE ))
480
+ assertEquals(0x7f7fffff , factory.decodeHex(" ff" ).toIndex(Int .MAX_VALUE ))
481
+ assertEquals(0x7fff7fff , factory.decodeHex(" ffff" ).toIndex(Int .MAX_VALUE ))
482
+ assertEquals(0x7fffff7f , factory.decodeHex(" ffffff" ).toIndex(Int .MAX_VALUE ))
483
+ assertEquals(0x7ffffffe , factory.decodeHex(" ffffffff" ).toIndex(Int .MAX_VALUE ))
484
+ }
485
+
486
+ /* *
487
+ * Our math is incorrect for values that round differently depending on data beyond the first 4
488
+ * bytes. For example, "aaaaaaaaab".toIndex(3) is 1, but if we did arbitrary-precision math the
489
+ * result would be 2.
490
+ */
491
+ @Test fun toIndexHonorsFirstFourBytesOnly () {
492
+ assertEquals(2 , factory.decodeHex(" aaaaab" ).toIndex(3 ))
493
+ assertEquals(2 , factory.decodeHex(" aaaaaaab" ).toIndex(3 ))
494
+
495
+ // Note: wrong due to truncation!
496
+ assertEquals(1 , factory.decodeHex(" aaaaaaaaab" ).toIndex(3 ))
497
+ assertEquals(1 , factory.decodeHex(" aaaaaaaaaaab" ).toIndex(3 ))
498
+ assertEquals(1 , factory.decodeHex(" aaaaaaaaaaaaab" ).toIndex(3 ))
499
+ }
500
+
501
+ @Test fun toFraction () {
502
+ assertEquals(0.0 , factory.decodeHex(" " ).toFraction())
503
+ assertEquals(0.0 , factory.decodeHex(" 00" ).toFraction())
504
+ assertEquals(0.0 , factory.decodeHex(" 00" ).toFraction())
505
+ assertEquals(0.1015625 , factory.decodeHex(" 1a" ).toFraction())
506
+ assertEquals(0.25 , factory.decodeHex(" 40" ).toFraction())
507
+ assertEquals(0.5 , factory.decodeHex(" 80" ).toFraction())
508
+ assertEquals(0.75 , factory.decodeHex(" c0" ).toFraction())
509
+ assertEquals(0.7929493631236255 , factory.decodeHex(" cafebabe" ).toFraction())
510
+ assertEquals(0.99609375 , factory.decodeHex(" ff" ).toFraction())
511
+ assertEquals(0.9999847412109375 , factory.decodeHex(" ffff" ).toFraction())
512
+ assertEquals(0.9999999403953552 , factory.decodeHex(" ffffff" ).toFraction())
513
+ assertEquals(0.9999999997671694 , factory.decodeHex(" ffffffff" ).toFraction())
514
+ assertEquals(0.9999999999999964 , factory.decodeHex(" ffffffffffff" ).toFraction())
515
+ assertEquals(0.9999999999999999 , factory.decodeHex(" ffffffffffffff" ).toFraction())
516
+ assertEquals(0.9999999999999999 , factory.decodeHex(" ffffffffffffffff" ).toFraction())
517
+ }
518
+
519
+ /* * Only 5 bits of the 7th byte are used. We use 53 bits in total for IEEE 754 doubles. */
520
+ @Test fun toFractionLast5BitsOf7thByte () {
521
+ assertEquals(0.0000000000000000 , factory.decodeHex(" 00000000000007" ).toFraction())
522
+ assertEquals(1 .1102230246251565E- 16 , factory.decodeHex(" 00000000000008" ).toFraction())
523
+ assertEquals(1 .1102230246251565E- 16 , factory.decodeHex(" 0000000000000f" ).toFraction())
524
+ assertEquals(2 .220446049250313E- 16 , factory.decodeHex(" 00000000000010" ).toFraction())
525
+ assertEquals(0.9999999999999998 , factory.decodeHex(" fffffffffffff0" ).toFraction())
526
+ assertEquals(0.9999999999999999 , factory.decodeHex(" fffffffffffff8" ).toFraction())
527
+ }
460
528
}
0 commit comments