@@ -28,15 +28,62 @@ var octets = {
2828 var decoder = new TextDecoder ( encoding ) ;
2929 for ( var i = 0 ; i < encoded . length ; i += len ) {
3030 var sub = [ ] ;
31- for ( var j = i ; j < encoded . length && j < i + len ; ++ j )
31+ for ( var j = i ; j < encoded . length && j < i + len ; ++ j ) {
3232 sub . push ( encoded [ j ] ) ;
33- var uintArray = new Uint8Array ( createBuffer ( arrayBufferOrSharedArrayBuffer , sub . length ) ) ;
34- uintArray . set ( sub ) ;
33+ }
34+ var uintArray = new Uint8Array ( createBuffer ( arrayBufferOrSharedArrayBuffer , sub . length ) ) ;
35+ uintArray . set ( sub ) ;
3536 out += decoder . decode ( uintArray , { stream : true } ) ;
3637 }
3738 out += decoder . decode ( ) ;
3839 assert_equals ( out , string ) ;
3940 } , 'Streaming decode: ' + encoding + ', ' + len + ' byte window (' + arrayBufferOrSharedArrayBuffer + ')' ) ;
4041 }
4142 } ) ;
43+
44+ test ( ( ) => {
45+ function bytes ( byteArray ) {
46+ const view = new Uint8Array ( createBuffer ( arrayBufferOrSharedArrayBuffer , byteArray . length ) ) ;
47+ view . set ( byteArray ) ;
48+ return view ;
49+ }
50+
51+ const decoder = new TextDecoder ( ) ;
52+
53+ assert_equals ( decoder . decode ( bytes ( [ 0xC1 ] ) , { stream : true } ) , "\uFFFD" ) ;
54+ assert_equals ( decoder . decode ( ) , "" ) ;
55+
56+ assert_equals ( decoder . decode ( bytes ( [ 0xF5 ] ) , { stream : true } ) , "\uFFFD" ) ;
57+ assert_equals ( decoder . decode ( ) , "" ) ;
58+
59+ assert_equals ( decoder . decode ( bytes ( [ 0xE0 , 0x41 ] ) , { stream : true } ) , "\uFFFDA" ) ;
60+ assert_equals ( decoder . decode ( bytes ( [ 0x42 ] ) ) , "B" ) ;
61+
62+ assert_equals ( decoder . decode ( bytes ( [ 0xE0 , 0x80 ] ) , { stream : true } ) , "\uFFFD\uFFFD" ) ;
63+ assert_equals ( decoder . decode ( bytes ( [ 0x80 ] ) ) , "\uFFFD" ) ;
64+
65+ assert_equals ( decoder . decode ( bytes ( [ 0xED , 0xA0 ] ) , { stream : true } ) , "\uFFFD\uFFFD" ) ;
66+ assert_equals ( decoder . decode ( bytes ( [ 0x80 ] ) ) , "\uFFFD" ) ;
67+
68+ assert_equals ( decoder . decode ( bytes ( [ 0xF0 , 0x41 ] ) , { stream : true } ) , "\uFFFDA" ) ;
69+ assert_equals ( decoder . decode ( bytes ( [ 0x42 ] ) , { stream : true } ) , "B" ) ;
70+ assert_equals ( decoder . decode ( bytes ( [ 0x43 ] ) ) , "C" ) ;
71+
72+ assert_equals ( decoder . decode ( bytes ( [ 0xF0 , 0x80 ] ) , { stream : true } ) , "\uFFFD\uFFFD" ) ;
73+ assert_equals ( decoder . decode ( bytes ( [ 0x80 ] ) , { stream : true } ) , "\uFFFD" ) ;
74+ assert_equals ( decoder . decode ( bytes ( [ 0x80 ] ) ) , "\uFFFD" ) ;
75+
76+ assert_equals ( decoder . decode ( bytes ( [ 0xF4 , 0xA0 ] ) , { stream : true } ) , "\uFFFD\uFFFD" ) ;
77+ assert_equals ( decoder . decode ( bytes ( [ 0x80 ] ) , { stream : true } ) , "\uFFFD" ) ;
78+ assert_equals ( decoder . decode ( bytes ( [ 0x80 ] ) ) , "\uFFFD" ) ;
79+
80+ assert_equals ( decoder . decode ( bytes ( [ 0xF0 , 0x90 , 0x41 ] ) , { stream : true } ) , "\uFFFDA" ) ;
81+ assert_equals ( decoder . decode ( bytes ( [ 0x42 ] ) ) , "B" ) ;
82+
83+ // 4-byte UTF-8 sequences always correspond to non-BMP characters. Here
84+ // we make sure that, although the first 3 bytes are enough to emit the
85+ // lead surrogate, it only gets emitted when the fourth byte is read.
86+ assert_equals ( decoder . decode ( bytes ( [ 0xF0 , 0x9F , 0x92 ] ) , { stream : true } ) , "" ) ;
87+ assert_equals ( decoder . decode ( bytes ( [ 0xA9 ] ) ) , "\u{1F4A9}" ) ;
88+ } , `Streaming decode: UTF-8 chunk tests (${ arrayBufferOrSharedArrayBuffer } )` ) ;
4289} )
0 commit comments