@@ -462,6 +462,247 @@ void cb_iterator_test()
462462 }
463463}
464464
465+ void cb_copy_move_test ()
466+ {
467+ SCOPED_TRACE (" Copy/Move" );
468+
469+ // Copy constructor
470+ {
471+ FixedCircularBuffer<int , 4 > original = {1 , 2 , 3 };
472+ FixedCircularBuffer<int , 4 > copied (original);
473+
474+ EXPECT_EQ (copied.size (), 3U );
475+ EXPECT_EQ (copied[0 ], 1 );
476+ EXPECT_EQ (copied[1 ], 2 );
477+ EXPECT_EQ (copied[2 ], 3 );
478+
479+ // Verify original unchanged
480+ EXPECT_EQ (original.size (), 3U );
481+ EXPECT_EQ (original[0 ], 1 );
482+ }
483+
484+ // Move constructor
485+ {
486+ FixedCircularBuffer<int , 4 > original = {4 , 5 , 6 };
487+ FixedCircularBuffer<int , 4 > moved (std::move (original));
488+
489+ EXPECT_EQ (moved.size (), 3U );
490+ EXPECT_EQ (moved[0 ], 4 );
491+ EXPECT_EQ (moved[1 ], 5 );
492+ EXPECT_EQ (moved[2 ], 6 );
493+ }
494+
495+ // Copy assignment
496+ {
497+ FixedCircularBuffer<int , 4 > original = {7 , 8 };
498+ FixedCircularBuffer<int , 4 > assigned;
499+ assigned = original;
500+
501+ EXPECT_EQ (assigned.size (), 2U );
502+ EXPECT_EQ (assigned[0 ], 7 );
503+ EXPECT_EQ (assigned[1 ], 8 );
504+ }
505+
506+ // Move assignment
507+ {
508+ FixedCircularBuffer<int , 4 > original = {9 , 10 };
509+ FixedCircularBuffer<int , 4 > assigned;
510+ assigned = std::move (original);
511+
512+ EXPECT_EQ (assigned.size (), 2U );
513+ EXPECT_EQ (assigned[0 ], 9 );
514+ EXPECT_EQ (assigned[1 ], 10 );
515+ }
516+ }
517+
518+ void cb_swap_test ()
519+ {
520+ SCOPED_TRACE (" Swap" );
521+
522+ // Member swap
523+ {
524+ FixedCircularBuffer<int , 4 > a = {1 , 2 , 3 };
525+ FixedCircularBuffer<int , 4 > b = {4 , 5 };
526+
527+ a.swap (b);
528+
529+ EXPECT_EQ (a.size (), 2U );
530+ EXPECT_EQ (a[0 ], 4 );
531+ EXPECT_EQ (a[1 ], 5 );
532+
533+ EXPECT_EQ (b.size (), 3U );
534+ EXPECT_EQ (b[0 ], 1 );
535+ EXPECT_EQ (b[1 ], 2 );
536+ EXPECT_EQ (b[2 ], 3 );
537+ }
538+
539+ // std::swap specialization
540+ {
541+ FixedCircularBuffer<int , 4 > a = {10 , 20 };
542+ FixedCircularBuffer<int , 4 > b = {30 , 40 , 50 };
543+
544+ std::swap (a, b);
545+
546+ EXPECT_EQ (a.size (), 3U );
547+ EXPECT_EQ (a[0 ], 30 );
548+ EXPECT_EQ (a[1 ], 40 );
549+ EXPECT_EQ (a[2 ], 50 );
550+
551+ EXPECT_EQ (b.size (), 2U );
552+ EXPECT_EQ (b[0 ], 10 );
553+ EXPECT_EQ (b[1 ], 20 );
554+ }
555+
556+ // Swap with empty
557+ {
558+ FixedCircularBuffer<int , 4 > a = {1 , 2 , 3 , 4 };
559+ FixedCircularBuffer<int , 4 > b;
560+
561+ a.swap (b);
562+
563+ EXPECT_TRUE (a.empty ());
564+ EXPECT_TRUE (b.full ());
565+ EXPECT_EQ (b.size (), 4U );
566+ }
567+
568+ // Self swap
569+ {
570+ FixedCircularBuffer<int , 4 > a = {1 , 2 , 3 };
571+ a.swap (a);
572+
573+ EXPECT_EQ (a.size (), 3U );
574+ EXPECT_EQ (a[0 ], 1 );
575+ EXPECT_EQ (a[1 ], 2 );
576+ EXPECT_EQ (a[2 ], 3 );
577+ }
578+ }
579+
580+ void cb_assign_test ()
581+ {
582+ SCOPED_TRACE (" Assign" );
583+
584+ // assign with initializer_list
585+ {
586+ FixedCircularBuffer<int , 4 > rb = {1 , 2 , 3 , 4 };
587+ rb.assign ({10 , 20 });
588+
589+ EXPECT_EQ (rb.size (), 2U );
590+ EXPECT_EQ (rb[0 ], 10 );
591+ EXPECT_EQ (rb[1 ], 20 );
592+ }
593+
594+ // assign with count and value (use size_t to avoid template overload)
595+ {
596+ FixedCircularBuffer<int , 4 > rb;
597+ rb.assign (size_t (3 ), 42 );
598+
599+ EXPECT_EQ (rb.size (), 3U );
600+ EXPECT_EQ (rb[0 ], 42 );
601+ EXPECT_EQ (rb[1 ], 42 );
602+ EXPECT_EQ (rb[2 ], 42 );
603+ }
604+
605+ // assign with iterators
606+ {
607+ std::vector<int > src = {100 , 200 , 300 };
608+ FixedCircularBuffer<int , 4 > rb;
609+ rb.assign (src.begin (), src.end ());
610+
611+ EXPECT_EQ (rb.size (), 3U );
612+ EXPECT_EQ (rb[0 ], 100 );
613+ EXPECT_EQ (rb[1 ], 200 );
614+ EXPECT_EQ (rb[2 ], 300 );
615+ }
616+ }
617+
618+ void cb_dynamic_buffer_test ()
619+ {
620+ SCOPED_TRACE (" DynamicBuffer" );
621+
622+ // CircularBuffer (dynamic size)
623+ {
624+ CircularBuffer<int > rb (4 );
625+
626+ EXPECT_TRUE (rb.empty ());
627+ EXPECT_EQ (rb.capacity (), 4U );
628+
629+ rb.push_back (1 );
630+ rb.push_back (2 );
631+ rb.push_back (3 );
632+
633+ EXPECT_EQ (rb.size (), 3U );
634+ EXPECT_EQ (rb[0 ], 1 );
635+ EXPECT_EQ (rb[1 ], 2 );
636+ EXPECT_EQ (rb[2 ], 3 );
637+ }
638+
639+ // CircularBuffer with assign (full fill)
640+ {
641+ CircularBuffer<int > rb (4 );
642+ rb.assign (size_t (4 ), 99 );
643+
644+ EXPECT_TRUE (rb.full ());
645+ EXPECT_EQ (rb.size (), 4U );
646+ EXPECT_EQ (rb[0 ], 99 );
647+ EXPECT_EQ (rb[1 ], 99 );
648+ EXPECT_EQ (rb[2 ], 99 );
649+ EXPECT_EQ (rb[3 ], 99 );
650+ }
651+
652+ // CircularBuffer with assign (partial fill)
653+ {
654+ CircularBuffer<int > rb (4 );
655+ rb.assign (size_t (3 ), 99 );
656+
657+ EXPECT_EQ (rb.size (), 3U );
658+ EXPECT_EQ (rb[0 ], 99 );
659+ EXPECT_EQ (rb[1 ], 99 );
660+ EXPECT_EQ (rb[2 ], 99 );
661+ }
662+
663+ // CircularBuffer with iterator constructor
664+ {
665+ std::vector<int > src = {1 , 2 , 3 , 4 , 5 };
666+ CircularBuffer<int > rb (3 , src.begin (), src.end ());
667+
668+ EXPECT_TRUE (rb.full ());
669+ EXPECT_EQ (rb.size (), 3U );
670+ EXPECT_EQ (rb[0 ], 3 ); // Last 3 elements
671+ EXPECT_EQ (rb[1 ], 4 );
672+ EXPECT_EQ (rb[2 ], 5 );
673+ }
674+
675+ // CircularBuffer with initializer_list constructor
676+ {
677+ CircularBuffer<int > rb (4 , {10 , 20 , 30 });
678+
679+ EXPECT_EQ (rb.size (), 3U );
680+ EXPECT_EQ (rb[0 ], 10 );
681+ EXPECT_EQ (rb[1 ], 20 );
682+ EXPECT_EQ (rb[2 ], 30 );
683+ }
684+
685+ // CircularBuffer swap
686+ {
687+ CircularBuffer<int > a (4 );
688+ CircularBuffer<int > b (6 );
689+
690+ a.push_back (1 );
691+ a.push_back (2 );
692+ b.push_back (10 );
693+
694+ a.swap (b);
695+
696+ EXPECT_EQ (a.capacity (), 6U );
697+ EXPECT_EQ (a.size (), 1U );
698+ EXPECT_EQ (a[0 ], 10 );
699+
700+ EXPECT_EQ (b.capacity (), 4U );
701+ EXPECT_EQ (b.size (), 2U );
702+ EXPECT_EQ (b[0 ], 1 );
703+ }
704+ }
705+
465706} // namespace
466707
467708TEST (Utility, CircularBuffer)
@@ -470,4 +711,8 @@ TEST(Utility, CircularBuffer)
470711 cb_constructor_test ();
471712 cb_read ();
472713 cb_iterator_test ();
714+ cb_copy_move_test ();
715+ cb_swap_test ();
716+ cb_assign_test ();
717+ cb_dynamic_buffer_test ();
473718}
0 commit comments