@@ -6,7 +6,6 @@ const source = await readFile(process.argv[2] ?? new URL('../__Snapshots__/Bridg
66const shared = process . argv [ 3 ] === 'shared' ;
77const { createInstantiator } = await import ( `data:text/javascript;base64,${ Buffer . from ( source ) . toString ( 'base64' ) } ` ) ;
88const encoder = new TextEncoder ( ) ;
9- const decoder = new TextDecoder ( ) ;
109const swift = { memory : { heap : [ ] , retain : ( value ) => value } } ;
1110const bridge = await createInstantiator ( { getImports : ( ) => ( { } ) } , swift ) ;
1211const imports = { } ;
@@ -35,21 +34,27 @@ function large(value, immortal = false, ptr = 64) {
3534}
3635const values = [ '' , 'div' , 'abcdefgh' , 'abcdefghi' , 'abcdefghij' , 'abcdefé' , 'abcdefgé' ,
3736 'abcdefghé' , 'abcdefghié' , 'abc€' , 'abcdefg€' , 'abc😄' , 'abcdef😄' , 'abcdefg😄' ,
38- 'a\0b' , '\ufeff' , '\ufeffx' , 'x\ufeff' , '\ufeff\ufeffx' , '\ufeffabcdefghijk' ,
39- 'abc\ufeffdefghijk' , '\ufeff\ufeffabcdefghijk' ] ;
40- for ( const value of values ) {
41- const expected = decoder . decode ( encoder . encode ( value ) ) ;
37+ '😄😄' , 'éééé' , 'a\0b' , '\ufeff' , '\ufeffx' , '\ufeffabcde' , '\ufeffabcdef' ,
38+ 'x\ufeff' , '\ufeff\ufeffx' , '\ufeffabcdefghijk' ,
39+ 'abc\ufeffdefghijk' , '\ufeff\ufeffabcdefghijk' ,
40+ // UTF-8 widths, the surrogate gap, and supplementary-plane boundaries.
41+ '\u0080' , '\u07ff' , '\u0800' , '\ud7ff' , '\ue000' , '\uffff' , '\u{10000}' , '\u{10ffff}' ] ;
42+ for ( const [ index , value ] of values . entries ( ) ) {
4243 if ( encoder . encode ( value ) . length <= 8 ) {
4344 words = small ( value ) ;
44- assert . equal ( exports . checkString ( ) , expected ) ;
45+ assert . equal ( exports . checkString ( ) , value ) ;
46+ }
47+ for ( const immortal of [ false , true ] ) {
48+ // Distinct locations keep immortal cache entries faithful to Swift literals.
49+ words = large ( value , immortal , 64 + index * 64 ) ;
50+ assert . equal ( exports . checkString ( ) , value ) ;
51+ assert . equal ( exports . checkString ( ) , value ) ;
4552 }
46- words = large ( value ) ;
47- assert . equal ( exports . checkString ( ) , expected ) ;
4853}
4954// Alternate full and short inputs: bytes outside count must never leak into the result.
5055for ( const value of [ 'abcd😄' , 'é' , 'abcde€' , '\ufeff' , 'abcdefgh' , '' , 'x\0' , '€' , '\ufeff\ufeff' ] ) {
5156 words = small ( value ) ;
52- assert . equal ( exports . checkString ( ) , decoder . decode ( encoder . encode ( value ) ) ) ;
57+ assert . equal ( exports . checkString ( ) , value ) ;
5358}
5459// Every ASCII byte, including NUL, at every small-string length.
5560for ( let byte = 0 ; byte < 128 ; byte ++ ) {
0 commit comments