@@ -188,6 +188,61 @@ describe("CborShapeSerializer2", () => {
188188 expect ( cbor . deserialize ( singleBytes ) ) . toEqual ( cbor . deserialize ( multiBytes ) ) ;
189189 } ) ;
190190
191+ it ( "serializes NumericValue with exponent notation" , ( ) => {
192+ const schema = [
193+ 3 ,
194+ "ns" ,
195+ "Measurement" ,
196+ 0 ,
197+ [ "value" ] ,
198+ [ 19 satisfies BigDecimalSchema ] ,
199+ ] satisfies StaticStructureSchema ;
200+
201+ const cases = [ "1.5e10" , "3E-20" , "-2.0e+5" , "100E3" , "1e2" , ".5e3" ] ;
202+ for ( const str of cases ) {
203+ const data = { value : nv ( str ) } ;
204+
205+ multiPass . write ( schema , data ) ;
206+ const multiBytes = multiPass . flush ( ) ;
207+
208+ singlePass . write ( schema , data ) ;
209+ const singleBytes = singlePass . flush ( ) ;
210+
211+ const multiResult = cbor . deserialize ( multiBytes ) ;
212+ const singleResult = cbor . deserialize ( singleBytes ) ;
213+ expect ( singleResult ) . toEqual ( multiResult ) ;
214+ expect ( singleResult . value . string ) . toEqual ( multiResult . value . string ) ;
215+ }
216+ } ) ;
217+
218+ it ( "serializes NumericValue with exponent exceeding safe integer range" , ( ) => {
219+ const schema = [
220+ 3 ,
221+ "ns" ,
222+ "Measurement" ,
223+ 0 ,
224+ [ "value" ] ,
225+ [ 19 satisfies BigDecimalSchema ] ,
226+ ] satisfies StaticStructureSchema ;
227+
228+ const cases = [ "1e99999999999999999999" , "-1e99999999999999999999" ] ;
229+ for ( const str of cases ) {
230+ const data = { value : nv ( str ) } ;
231+
232+ multiPass . write ( schema , data ) ;
233+ const multiBytes = multiPass . flush ( ) ;
234+
235+ singlePass . write ( schema , data ) ;
236+ const singleBytes = singlePass . flush ( ) ;
237+
238+ const multiResult = cbor . deserialize ( multiBytes ) ;
239+ const singleResult = cbor . deserialize ( singleBytes ) ;
240+ expect ( singleResult ) . toEqual ( multiResult ) ;
241+ // Verify the exponent is preserved exactly (not lossy via Number coercion)
242+ expect ( singleResult . value . string ) . toContain ( "99999999999999999999" ) ;
243+ }
244+ } ) ;
245+
191246 it ( "serializes unions with $unknown" , ( ) => {
192247 const unionSchema = [ 4 , "ns" , "Union" , 0 , [ "a" , "b" ] , [ 0 , 0 ] ] satisfies StaticUnionSchema ;
193248 const data = { $unknown : [ "c" , "hello" ] } ;
@@ -391,6 +446,44 @@ describe("CborShapeDeserializer2", () => {
391446 expect ( result ) . toEqual ( data ) ;
392447 } ) ;
393448
449+ it ( "deserializes NumericValue with exponent notation" , ( ) => {
450+ const schema = [
451+ 3 ,
452+ "ns" ,
453+ "Measurement" ,
454+ 0 ,
455+ [ "value" ] ,
456+ [ 19 satisfies BigDecimalSchema ] ,
457+ ] satisfies StaticStructureSchema ;
458+
459+ const cases = [ "1.5e10" , "3E-20" , "-2.0e+5" , "100E3" , "1e2" , ".5e3" ] ;
460+ for ( const str of cases ) {
461+ const data = { value : nv ( str ) } ;
462+ const result = assertEquivalentDeserialization ( schema , data ) ;
463+ expect ( result . value ) . toBeInstanceOf ( Object ) ;
464+ expect ( result . value . string ) . toBeDefined ( ) ;
465+ }
466+ } ) ;
467+
468+ it ( "deserializes NumericValue with exponent exceeding safe integer range" , ( ) => {
469+ const schema = [
470+ 3 ,
471+ "ns" ,
472+ "Measurement" ,
473+ 0 ,
474+ [ "value" ] ,
475+ [ 19 satisfies BigDecimalSchema ] ,
476+ ] satisfies StaticStructureSchema ;
477+
478+ const cases = [ "1e99999999999999999999" , "-1e99999999999999999999" , "1e-99999999999999999999" ] ;
479+ for ( const str of cases ) {
480+ const data = { value : nv ( str ) } ;
481+ const result = assertEquivalentDeserialization ( schema , data ) ;
482+ expect ( result . value ) . toBeInstanceOf ( Object ) ;
483+ expect ( result . value . string ) . toContain ( "99999999999999999999" ) ;
484+ }
485+ } ) ;
486+
394487 it ( "deserializes unknown union members to $unknown" , ( ) => {
395488 const schema = [
396489 3 ,
0 commit comments