@@ -289,3 +289,102 @@ fn test_optimize_train_from_buffer_cover_pool(thread_count: u32) {
289289 ( compressed, dict_buffer)
290290 } ) ;
291291}
292+
293+ #[ test]
294+ #[ cfg( not( target_family = "wasm" ) ) ]
295+ fn test_optimize_train_from_buffer_fastcover_single_threaded ( ) {
296+ test_optimize_train_from_buffer_fastcover_pool ( 1 ) ;
297+ }
298+
299+ #[ test]
300+ #[ ignore = "let's fix the single-threaded case first" ]
301+ #[ cfg( not( target_family = "wasm" ) ) ]
302+ fn test_optimize_train_from_buffer_fastcover_multi_threaded ( ) {
303+ test_optimize_train_from_buffer_fastcover_pool ( 4 ) ;
304+ }
305+
306+ fn test_optimize_train_from_buffer_fastcover_pool ( thread_count : u32 ) {
307+ let input_data = "The quick brown fox jumps high" ;
308+
309+ assert_eq_rs_c ! ( {
310+ let mut sample_data = Vec :: new( ) ;
311+
312+ let mut sample_sizes = Vec :: new( ) ;
313+
314+ for & s in & SAMPLES {
315+ sample_data. extend_from_slice( s. as_bytes( ) ) ;
316+
317+ sample_sizes. push( s. len( ) ) ;
318+ }
319+
320+ let dict_capacity = 16 * 1024 ;
321+
322+ let mut dict_buffer = vec![ 0u8 ; dict_capacity] ;
323+
324+ let mut params = ZDICT_fastCover_params_t {
325+ k: 200 ,
326+ d: 8 ,
327+ steps: 4 ,
328+ nbThreads: thread_count,
329+ splitPoint: 0.5 ,
330+ shrinkDict: 0 ,
331+ shrinkDictMaxRegression: 1 ,
332+ zParams: ZDICT_params_t {
333+ compressionLevel: 3 ,
334+ notificationLevel: 1 ,
335+ dictID: 0 ,
336+ } ,
337+ f: 20 ,
338+ accel: 1 ,
339+ } ;
340+
341+ let dict_size = ZDICT_optimizeTrainFromBuffer_fastCover (
342+ dict_buffer. as_mut_ptr( ) as * mut c_void,
343+ dict_buffer. len( ) ,
344+ sample_data. as_ptr( ) as * const c_void,
345+ sample_sizes. as_ptr( ) ,
346+ sample_sizes. len( ) as u32 ,
347+ & mut params,
348+ ) ;
349+
350+ assert_eq!(
351+ ZDICT_isError ( dict_size) ,
352+ 0 ,
353+ "Dict training failed {:?}" ,
354+ CStr :: from_ptr( ZDICT_getErrorName ( dict_size) ) . to_str( ) ,
355+ ) ;
356+
357+ dict_buffer. truncate( dict_size) ;
358+
359+ println!( "Dictionary size: {}" , dict_size) ;
360+
361+ let cctx = ZSTD_createCCtx ( ) ;
362+
363+ assert!( !cctx. is_null( ) ) ;
364+
365+ let max_compressed_size = ZSTD_compressBound ( input_data. len( ) ) ;
366+
367+ let mut compressed = vec![ 0u8 ; max_compressed_size] ;
368+
369+ let compressed_size = ZSTD_compress_usingDict (
370+ cctx,
371+ compressed. as_mut_ptr( ) as * mut c_void,
372+ compressed. len( ) ,
373+ input_data. as_bytes( ) . as_ptr( ) as * const c_void,
374+ input_data. len( ) ,
375+ dict_buffer. as_ptr( ) as * const c_void,
376+ dict_buffer. len( ) ,
377+ 3 , // compression level
378+ ) ;
379+
380+ assert_eq!( ZSTD_isError ( compressed_size) , 0 , "Compression failed" ) ;
381+
382+ compressed. truncate( compressed_size) ;
383+
384+ println!( "Compressed size: {}" , compressed_size) ;
385+
386+ ZSTD_freeCCtx ( cctx) ;
387+
388+ ( compressed, dict_buffer)
389+ } ) ;
390+ }
0 commit comments