@@ -20,6 +20,7 @@ import {
20
20
numberOfLeadingZerosInByte ,
21
21
OrderedCodeWriter
22
22
} from '../../../src/index/ordered_code_writer' ;
23
+ import { ByteString } from '../../../src/util/byte_string' ;
23
24
24
25
class ValueTestCase < T > {
25
26
constructor (
@@ -108,6 +109,23 @@ const STRING_TEST_CASES: Array<ValueTestCase<string>> = [
108
109
)
109
110
] ;
110
111
112
+ const BYTES_TEST_CASES : Array < ValueTestCase < Uint8Array > > = [
113
+ new ValueTestCase ( fromHex ( '' ) , '0001' , 'fffe' ) ,
114
+ new ValueTestCase ( fromHex ( '00' ) , '00ff0001' , 'ff00fffe' ) ,
115
+ new ValueTestCase ( fromHex ( '0000' ) , '00ff00ff0001' , 'ff00ff00fffe' ) ,
116
+ new ValueTestCase ( fromHex ( '0001' ) , '00ff010001' , 'ff00fefffe' ) ,
117
+ new ValueTestCase ( fromHex ( '0041' ) , '00ff410001' , 'ff00befffe' ) ,
118
+ new ValueTestCase ( fromHex ( '00ff' ) , '00ffff000001' , 'ff0000fffffe' ) ,
119
+ new ValueTestCase ( fromHex ( '01' ) , '010001' , 'fefffe' ) ,
120
+ new ValueTestCase ( fromHex ( '0100' ) , '0100ff0001' , 'feff00fffe' ) ,
121
+ new ValueTestCase ( fromHex ( '6f776c' ) , '6f776c0001' , '908893fffe' ) ,
122
+ new ValueTestCase ( fromHex ( 'ff' ) , 'ff000001' , '00fffffe' ) ,
123
+ new ValueTestCase ( fromHex ( 'ff00' ) , 'ff0000ff0001' , '00ffff00fffe' ) ,
124
+ new ValueTestCase ( fromHex ( 'ff01' ) , 'ff00010001' , '00fffefffe' ) ,
125
+ new ValueTestCase ( fromHex ( 'ffff' ) , 'ff00ff000001' , '00ff00fffffe' ) ,
126
+ new ValueTestCase ( fromHex ( 'ffffff' ) , 'ff00ff00ff000001' , '00ff00ff00fffffe' )
127
+ ] ;
128
+
111
129
describe ( 'Ordered Code Writer' , ( ) => {
112
130
it ( 'computes number of leading zeros' , ( ) => {
113
131
for ( let i = 0 ; i < 0xff ; ++ i ) {
@@ -139,6 +157,34 @@ describe('Ordered Code Writer', () => {
139
157
verifyOrdering ( STRING_TEST_CASES ) ;
140
158
} ) ;
141
159
160
+ it ( 'converts bytes to bits' , ( ) => {
161
+ verifyEncoding ( BYTES_TEST_CASES ) ;
162
+ } ) ;
163
+
164
+ it ( 'orders bytes correctly' , ( ) => {
165
+ verifyOrdering ( BYTES_TEST_CASES ) ;
166
+ } ) ;
167
+
168
+ it ( 'encodes infinity' , ( ) => {
169
+ const writer = new OrderedCodeWriter ( ) ;
170
+ writer . writeInfinityAscending ( ) ;
171
+ expect ( writer . encodedBytes ( ) ) . to . deep . equal ( fromHex ( "ffff" ) ) ;
172
+
173
+ writer . reset ( ) ;
174
+ writer . writeInfinityDescending ( ) ;
175
+ expect ( writer . encodedBytes ( ) ) . to . deep . equal ( fromHex ( "0000" ) ) ;
176
+ } ) ;
177
+
178
+ it ( 'seeds bytes' , ( ) => {
179
+ const writer = new OrderedCodeWriter ( ) ;
180
+ writer . seed ( fromHex ( "01" ) ) ;
181
+ writer . writeInfinityAscending ( ) ;
182
+ writer . seed ( fromHex ( "02" ) ) ;
183
+ expect ( writer . encodedBytes ( ) ) . to . deep . equal (
184
+ fromHex ( "01ffff02" )
185
+ ) ;
186
+ } ) ;
187
+
142
188
function verifyEncoding ( testCases : Array < ValueTestCase < unknown > > ) : void {
143
189
for ( let i = 0 ; i < testCases . length ; ++ i ) {
144
190
const bytes = getBytes ( testCases [ i ] . val ) ;
@@ -202,8 +248,9 @@ function getBytes(val: unknown): { asc: Uint8Array; desc: Uint8Array } {
202
248
} else if ( typeof val === 'string' ) {
203
249
ascWriter . writeUtf8Ascending ( val ) ;
204
250
descWriter . writeUtf8Descending ( val ) ;
205
- } else {
206
- throw new Error ( 'Encoding not yet supported for ' + val ) ;
251
+ } else if ( val instanceof Uint8Array ) {
252
+ ascWriter . writeBytesAscending ( ByteString . fromUint8Array ( val ) ) ;
253
+ descWriter . writeBytesDescending ( ByteString . fromUint8Array ( val ) ) ;
207
254
}
208
255
return { asc : ascWriter . encodedBytes ( ) , desc : descWriter . encodedBytes ( ) } ;
209
256
}
0 commit comments