@@ -475,4 +475,105 @@ private static <T> void testTypeDecoding(Type type, Map<T, byte[]> tests)
475475 }
476476 }
477477
478+ @ Test
479+ public void testUint64Coercion () throws IOException {
480+ // Test data: small UINT64 values that fit in smaller types
481+ var testData = largeUint (64 );
482+
483+ var cache = new CHMCache ();
484+
485+ // Test UINT64(0) → Byte
486+ var zeroBytes = testData .get (BigInteger .ZERO );
487+ var buffer = SingleBuffer .wrap (zeroBytes );
488+ var decoder = new TestDecoder (cache , buffer , 0 );
489+ assertEquals ((byte ) 0 , decoder .decode (0 , Byte .class ), "UINT64(0) should coerce to byte" );
490+
491+ // Test UINT64(500) → Long
492+ buffer = SingleBuffer .wrap (testData .get (BigInteger .valueOf (500 )));
493+ decoder = new TestDecoder (cache , buffer , 0 );
494+ assertEquals (500L , decoder .decode (0 , Long .class ), "UINT64(500) should coerce to long" );
495+
496+ // Test UINT64(500) → Integer
497+ buffer = SingleBuffer .wrap (testData .get (BigInteger .valueOf (500 )));
498+ decoder = new TestDecoder (cache , buffer , 0 );
499+ assertEquals (500 , decoder .decode (0 , Integer .class ), "UINT64(500) should coerce to int" );
500+
501+ // Test UINT64(500) → Short
502+ buffer = SingleBuffer .wrap (testData .get (BigInteger .valueOf (500 )));
503+ decoder = new TestDecoder (cache , buffer , 0 );
504+ assertEquals ((short ) 500 , decoder .decode (0 , Short .class ), "UINT64(500) should coerce to short" );
505+
506+ // Test UINT64(500) → Byte (should fail - out of range)
507+ buffer = SingleBuffer .wrap (testData .get (BigInteger .valueOf (500 )));
508+ decoder = new TestDecoder (cache , buffer , 0 );
509+ var finalDecoder1 = decoder ;
510+ var ex1 = assertThrows (DeserializationException .class ,
511+ () -> finalDecoder1 .decode (0 , Byte .class ),
512+ "UINT64(500) should not fit in byte" );
513+ assertThat (ex1 .getMessage (), containsString ("out of range for byte" ));
514+
515+ // Test UINT64(2^64-1) → Long (should fail - too large)
516+ var maxUint64 = BigInteger .valueOf (2 ).pow (64 ).subtract (BigInteger .ONE );
517+ buffer = SingleBuffer .wrap (testData .get (maxUint64 ));
518+ decoder = new TestDecoder (cache , buffer , 0 );
519+ var finalDecoder2 = decoder ;
520+ var ex2 = assertThrows (DeserializationException .class ,
521+ () -> finalDecoder2 .decode (0 , Long .class ),
522+ "UINT64(2^64-1) should not fit in long" );
523+ assertThat (ex2 .getMessage (), containsString ("out of range for long" ));
524+
525+ // Test UINT64(2^64-1) → BigInteger (should work)
526+ buffer = SingleBuffer .wrap (testData .get (maxUint64 ));
527+ decoder = new TestDecoder (cache , buffer , 0 );
528+ assertEquals (maxUint64 , decoder .decode (0 , BigInteger .class ),
529+ "UINT64(2^64-1) should decode to BigInteger" );
530+
531+ // Test UINT64(10872) → Float
532+ buffer = SingleBuffer .wrap (testData .get (BigInteger .valueOf (10872 )));
533+ decoder = new TestDecoder (cache , buffer , 0 );
534+ assertEquals (10872.0f , decoder .decode (0 , Float .class ), 0.001f ,
535+ "UINT64(10872) should coerce to float" );
536+
537+ // Test UINT64(10872) → Double
538+ buffer = SingleBuffer .wrap (testData .get (BigInteger .valueOf (10872 )));
539+ decoder = new TestDecoder (cache , buffer , 0 );
540+ assertEquals (10872.0 , decoder .decode (0 , Double .class ), 0.001 ,
541+ "UINT64(10872) should coerce to double" );
542+ }
543+
544+ @ Test
545+ public void testUint128Coercion () throws IOException {
546+ // Test data: UINT128 values
547+ var testData = largeUint (128 );
548+
549+ var cache = new CHMCache ();
550+
551+ // Test UINT128(0) → Long
552+ var zeroBytes = testData .get (BigInteger .ZERO );
553+ var buffer = SingleBuffer .wrap (zeroBytes );
554+ var decoder = new TestDecoder (cache , buffer , 0 );
555+ assertEquals (0L , decoder .decode (0 , Long .class ), "UINT128(0) should coerce to long" );
556+
557+ // Test UINT128(500) → Integer
558+ buffer = SingleBuffer .wrap (testData .get (BigInteger .valueOf (500 )));
559+ decoder = new TestDecoder (cache , buffer , 0 );
560+ assertEquals (500 , decoder .decode (0 , Integer .class ), "UINT128(500) should coerce to int" );
561+
562+ // Test UINT128(2^128-1) → Long (should fail - way too large)
563+ var maxUint128 = BigInteger .valueOf (2 ).pow (128 ).subtract (BigInteger .ONE );
564+ buffer = SingleBuffer .wrap (testData .get (maxUint128 ));
565+ decoder = new TestDecoder (cache , buffer , 0 );
566+ var finalDecoder = decoder ;
567+ var ex = assertThrows (DeserializationException .class ,
568+ () -> finalDecoder .decode (0 , Long .class ),
569+ "UINT128(2^128-1) should not fit in long" );
570+ assertThat (ex .getMessage (), containsString ("out of range for long" ));
571+
572+ // Test UINT128(2^128-1) → BigInteger (should work)
573+ buffer = SingleBuffer .wrap (testData .get (maxUint128 ));
574+ decoder = new TestDecoder (cache , buffer , 0 );
575+ assertEquals (maxUint128 , decoder .decode (0 , BigInteger .class ),
576+ "UINT128(2^128-1) should decode to BigInteger" );
577+ }
578+
478579}
0 commit comments