@@ -316,6 +316,74 @@ TEST_CASE("req sketch: byte serialize-deserialize estimation mode", "[req_sketch
316316 REQUIRE (sketch2.get_max_item () == sketch.get_max_item ());
317317}
318318
319+ TEST_CASE (" req sketch: stream serialize-deserialize negative values" , " [req_sketch]" ) {
320+ req_sketch<float > sketch (12 );
321+ const size_t n = 50 ;
322+ for (size_t i = 1 ; i <= n; ++i) sketch.update (-static_cast <float >(i));
323+
324+ std::stringstream s (std::ios::in | std::ios::out | std::ios::binary);
325+ sketch.serialize (s);
326+ auto sketch2 = req_sketch<float >::deserialize (s);
327+ REQUIRE (s.tellg () == s.tellp ());
328+ REQUIRE (sketch2.is_empty () == sketch.is_empty ());
329+ REQUIRE (sketch2.is_estimation_mode () == sketch.is_estimation_mode ());
330+ REQUIRE (sketch2.get_num_retained () == sketch.get_num_retained ());
331+ REQUIRE (sketch2.get_n () == sketch.get_n ());
332+ REQUIRE (sketch2.get_min_item () == -static_cast <float >(n));
333+ REQUIRE (sketch2.get_max_item () == -1 .0f );
334+ }
335+
336+ TEST_CASE (" req sketch: byte serialize-deserialize negative values" , " [req_sketch]" ) {
337+ req_sketch<float > sketch (12 );
338+ const size_t n = 50 ;
339+ for (size_t i = 1 ; i <= n; ++i) sketch.update (-static_cast <float >(i));
340+
341+ auto bytes = sketch.serialize ();
342+ REQUIRE (bytes.size () == sketch.get_serialized_size_bytes ());
343+ auto sketch2 = req_sketch<float >::deserialize (bytes.data (), bytes.size ());
344+ REQUIRE (bytes.size () == sketch2.get_serialized_size_bytes ());
345+ REQUIRE (sketch2.is_empty () == sketch.is_empty ());
346+ REQUIRE (sketch2.is_estimation_mode () == sketch.is_estimation_mode ());
347+ REQUIRE (sketch2.get_num_retained () == sketch.get_num_retained ());
348+ REQUIRE (sketch2.get_n () == sketch.get_n ());
349+ REQUIRE (sketch2.get_min_item () == -static_cast <float >(n));
350+ REQUIRE (sketch2.get_max_item () == -1 .0f );
351+ }
352+
353+ TEST_CASE (" req sketch: stream serialize-deserialize mixed values" , " [req_sketch]" ) {
354+ req_sketch<float > sketch (12 );
355+ const int half = 25 ;
356+ for (int i = -half; i < half; ++i) sketch.update (static_cast <float >(i));
357+
358+ std::stringstream s (std::ios::in | std::ios::out | std::ios::binary);
359+ sketch.serialize (s);
360+ auto sketch2 = req_sketch<float >::deserialize (s);
361+ REQUIRE (s.tellg () == s.tellp ());
362+ REQUIRE (sketch2.is_empty () == sketch.is_empty ());
363+ REQUIRE (sketch2.is_estimation_mode () == sketch.is_estimation_mode ());
364+ REQUIRE (sketch2.get_num_retained () == sketch.get_num_retained ());
365+ REQUIRE (sketch2.get_n () == sketch.get_n ());
366+ REQUIRE (sketch2.get_min_item () == static_cast <float >(-half));
367+ REQUIRE (sketch2.get_max_item () == static_cast <float >(half - 1 ));
368+ }
369+
370+ TEST_CASE (" req sketch: byte serialize-deserialize mixed values" , " [req_sketch]" ) {
371+ req_sketch<float > sketch (12 );
372+ const int half = 25 ;
373+ for (int i = -half; i < half; ++i) sketch.update (static_cast <float >(i));
374+
375+ auto bytes = sketch.serialize ();
376+ REQUIRE (bytes.size () == sketch.get_serialized_size_bytes ());
377+ auto sketch2 = req_sketch<float >::deserialize (bytes.data (), bytes.size ());
378+ REQUIRE (bytes.size () == sketch2.get_serialized_size_bytes ());
379+ REQUIRE (sketch2.is_empty () == sketch.is_empty ());
380+ REQUIRE (sketch2.is_estimation_mode () == sketch.is_estimation_mode ());
381+ REQUIRE (sketch2.get_num_retained () == sketch.get_num_retained ());
382+ REQUIRE (sketch2.get_n () == sketch.get_n ());
383+ REQUIRE (sketch2.get_min_item () == static_cast <float >(-half));
384+ REQUIRE (sketch2.get_max_item () == static_cast <float >(half - 1 ));
385+ }
386+
319387TEST_CASE (" req sketch: serialize deserialize stream and bytes equivalence" , " [req_sketch]" ) {
320388 req_sketch<float > sketch (12 );
321389 const size_t n = 100000 ;
0 commit comments