@@ -28,15 +28,62 @@ var octets = {
28
28
var decoder = new TextDecoder ( encoding ) ;
29
29
for ( var i = 0 ; i < encoded . length ; i += len ) {
30
30
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 ) {
32
32
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 ) ;
35
36
out += decoder . decode ( uintArray , { stream : true } ) ;
36
37
}
37
38
out += decoder . decode ( ) ;
38
39
assert_equals ( out , string ) ;
39
40
} , 'Streaming decode: ' + encoding + ', ' + len + ' byte window (' + arrayBufferOrSharedArrayBuffer + ')' ) ;
40
41
}
41
42
} ) ;
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 } )` ) ;
42
89
} )
0 commit comments