@@ -252,6 +252,13 @@ class BinaryContainer {
252252 right : BinaryEnvelope = new BinaryEnvelope ( ) ;
253253}
254254
255+
256+ @json
257+ class TAFieldHolder {
258+ items : Int16Array = makeInt16Array ( ) ;
259+ raw : ArrayBuffer = makeArrayBuffer ( ) ;
260+ }
261+
255262describe ( "Should serialize and deserialize typed arrays by default" , ( ) => {
256263 const int8 = makeInt8Array ( ) ;
257264 expect ( JSON . stringify ( int8 ) ) . toBe ( "[-1,0,127]" ) ;
@@ -610,3 +617,48 @@ describe("SWAR: JSON.parse<Int64Array> parses 64-bit integer array", () => {
610617 expect ( v [ 0 ] ) . toBe ( 1000000000000 ) ;
611618 expect ( v [ 1 ] ) . toBe ( - 2 ) ;
612619} ) ;
620+
621+ // simple TAFieldHolder sanity check
622+ describe ( "TAFieldHolder basic round-trip" , ( ) => {
623+ const h = JSON . parse < TAFieldHolder > ( '{"items":[1,2,3],"raw":[10,20]}' ) ;
624+ const serialized = JSON . stringify ( h ) ;
625+ expect ( serialized ) . toBe ( '{"items":[1,2,3],"raw":[10,20]}' ) ;
626+ expect ( h . items . length ) . toBe ( 3 ) ;
627+ expect ( h . items [ 0 ] ) . toBe ( 1 ) ;
628+ expect ( h . items [ 2 ] ) . toBe ( 3 ) ;
629+ expect ( h . raw . byteLength ) . toBe ( 2 ) ;
630+ } ) ;
631+
632+ // swar/typedarray.ts:78 IfBranch — reuse non-empty Int32Array field for empty array
633+ describe ( "SWAR TypedArray field: reuse non-empty field for [] triggers empty path (swar/typedarray.ts:78)" , ( ) => {
634+ const h1 = JSON . parse < TAFieldHolder > ( '{"items":[1,2,3],"raw":[]}' ) ;
635+ const h2 = JSON . parse < TAFieldHolder > ( '{"items":[],"raw":[]}' , h1 ) ;
636+ expect ( h2 . items . length ) . toBe ( 0 ) ;
637+ } ) ;
638+
639+ // swar/typedarray.ts:87 Block — reuse Int32Array field with wrong length for non-empty array
640+ describe ( "SWAR TypedArray field: reuse wrong-size field for new array triggers resize (swar/typedarray.ts:87)" , ( ) => {
641+ const h1 = JSON . parse < TAFieldHolder > ( '{"items":[1,2],"raw":[]}' ) ;
642+ const h2 = JSON . parse < TAFieldHolder > (
643+ '{"items":[10,20,30,40,50],"raw":[]}' ,
644+ h1 ,
645+ ) ;
646+ expect ( h2 . items . length ) . toBe ( 5 ) ;
647+ } ) ;
648+
649+ // swar/typedarray.ts:178 IfBranch+Assignment — reuse non-empty ArrayBuffer field for empty array
650+ describe ( "SWAR ArrayBuffer field: reuse non-empty field for [] triggers empty path (swar/typedarray.ts:178)" , ( ) => {
651+ const h1 = JSON . parse < TAFieldHolder > ( '{"items":[],"raw":[10,20,30]}' ) ;
652+ const h2 = JSON . parse < TAFieldHolder > ( '{"items":[],"raw":[]}' , h1 ) ;
653+ expect ( h2 . raw . byteLength ) . toBe ( 0 ) ;
654+ } ) ;
655+
656+ // swar/typedarray.ts:185+186 Block+Assignment — reuse wrong-size ArrayBuffer field for non-empty array
657+ describe ( "SWAR ArrayBuffer field: reuse wrong-size field for new array triggers resize (swar/typedarray.ts:185)" , ( ) => {
658+ const h1 = JSON . parse < TAFieldHolder > ( '{"items":[],"raw":[1,2]}' ) ;
659+ const h2 = JSON . parse < TAFieldHolder > (
660+ '{"items":[],"raw":[10,20,30,40,50,60,70]}' ,
661+ h1 ,
662+ ) ;
663+ expect ( h2 . raw . byteLength ) . toBe ( 7 ) ;
664+ } ) ;
0 commit comments