@@ -586,6 +586,226 @@ TYPED_TEST_P(OperationsTest, SyncedIterate2)
586586 }
587587}
588588
589+ // /////////////////////////////////////////////////////////////////////////////////////////////////
590+ // / SyncedIterate3 test (event range)
591+ // /////////////////////////////////////////////////////////////////////////////////////////////////
592+ TYPED_TEST_P (OperationsTest, SyncedIterate3)
593+ {
594+ using D = typename SyncedIterate3::MyDomain;
595+
596+ auto in1 = MakeVar<D>(1 );
597+ auto in2 = MakeVar<D>(1 );
598+
599+ auto op1 = in1 + in2;
600+ auto op2 = (in1 + in2) * 10 ;
601+
602+ auto src1 = MakeEventSource<D>();
603+ auto src2 = MakeEventSource<D,int >();
604+
605+ auto out1 = Iterate (
606+ src1,
607+ make_tuple (0 ,0 ),
608+ With (op1,op2),
609+ [] (EventRange<Token> range, const tuple<int ,int >& t, int op1, int op2) {
610+ return make_tuple (
611+ get<0 >(t) + (op1 * range.Size ()),
612+ get<1 >(t) + (op2 * range.Size ()));
613+ });
614+
615+ auto out2 = Iterate (
616+ src2,
617+ make_tuple (0 ,0 ,0 ),
618+ With (op1,op2),
619+ [] (EventRange<int > range, const tuple<int ,int ,int >& t, int op1, int op2) {
620+ int sum = 0 ;
621+ for (const auto & e : range)
622+ sum += e;
623+
624+ return make_tuple (
625+ get<0 >(t) + sum,
626+ get<1 >(t) + (op1 * range.Size ()),
627+ get<2 >(t) + (op2 * range.Size ()));
628+ });
629+
630+ int obsCount1 = 0 ;
631+ int obsCount2 = 0 ;
632+
633+ {
634+ auto obs1 = Observe (out1, [&] (const tuple<int ,int >& t) {
635+ ++obsCount1;
636+
637+ ASSERT_EQ (get<0 >(t), 33 );
638+ ASSERT_EQ (get<1 >(t), 330 );
639+ });
640+
641+ auto obs2 = Observe (out2, [&] (const tuple<int ,int ,int >& t) {
642+ ++obsCount2;
643+
644+ ASSERT_EQ (get<0 >(t), 42 );
645+ ASSERT_EQ (get<1 >(t), 33 );
646+ ASSERT_EQ (get<2 >(t), 330 );
647+ });
648+
649+ in1 <<= 22 ;
650+ in2 <<= 11 ;
651+
652+ src1.Emit ();
653+ src2.Emit (42 );
654+
655+ ASSERT_EQ (obsCount1, 1 );
656+ ASSERT_EQ (obsCount2, 1 );
657+
658+ obs1.Detach ();
659+ obs2.Detach ();
660+ }
661+
662+ {
663+ auto obs1 = Observe (out1, [&] (const tuple<int ,int >& t) {
664+ ++obsCount1;
665+
666+ ASSERT_EQ (get<0 >(t), 33 + 330 );
667+ ASSERT_EQ (get<1 >(t), 330 + 3300 );
668+ });
669+
670+ auto obs2 = Observe (out2, [&] (const tuple<int ,int ,int >& t) {
671+ ++obsCount2;
672+
673+ ASSERT_EQ (get<0 >(t), 42 + 420 );
674+ ASSERT_EQ (get<1 >(t), 33 + 330 );
675+ ASSERT_EQ (get<2 >(t), 330 + 3300 );
676+ });
677+
678+ in1 <<= 220 ;
679+ in2 <<= 110 ;
680+
681+ src1.Emit ();
682+ src2.Emit (420 );
683+
684+ ASSERT_EQ (obsCount1, 2 );
685+ ASSERT_EQ (obsCount2, 2 );
686+
687+ obs1.Detach ();
688+ obs2.Detach ();
689+ }
690+ }
691+
692+ // /////////////////////////////////////////////////////////////////////////////////////////////////
693+ // / SyncedIterate4 test (event range, by ref)
694+ // /////////////////////////////////////////////////////////////////////////////////////////////////
695+ TYPED_TEST_P (OperationsTest, SyncedIterate4)
696+ {
697+ using D = typename SyncedIterate4::MyDomain;
698+
699+ auto in1 = MakeVar<D>(1 );
700+ auto in2 = MakeVar<D>(1 );
701+
702+ auto op1 = in1 + in2;
703+ auto op2 = (in1 + in2) * 10 ;
704+
705+ auto src1 = MakeEventSource<D>();
706+ auto src2 = MakeEventSource<D,int >();
707+
708+ auto out1 = Iterate (
709+ src1,
710+ vector<int >{},
711+ With (op1,op2),
712+ [] (EventRange<Token> range, vector<int >& v, int op1, int op2) -> void {
713+ for (const auto & e : range)
714+ {
715+ v.push_back (op1);
716+ v.push_back (op2);
717+ }
718+ });
719+
720+ auto out2 = Iterate (
721+ src2,
722+ vector<int >{},
723+ With (op1,op2),
724+ [] (EventRange<int > range, vector<int >& v, int op1, int op2) -> void {
725+ for (const auto & e : range)
726+ {
727+ v.push_back (e);
728+ v.push_back (op1);
729+ v.push_back (op2);
730+ }
731+ });
732+
733+ int obsCount1 = 0 ;
734+ int obsCount2 = 0 ;
735+
736+ {
737+ auto obs1 = Observe (out1, [&] (const vector<int >& v) {
738+ ++obsCount1;
739+
740+ ASSERT_EQ (v.size (), 2 );
741+
742+ ASSERT_EQ (v[0 ], 33 );
743+ ASSERT_EQ (v[1 ], 330 );
744+ });
745+
746+ auto obs2 = Observe (out2, [&] (const vector<int >& v) {
747+ ++obsCount2;
748+
749+ ASSERT_EQ (v.size (), 3 );
750+
751+ ASSERT_EQ (v[0 ], 42 );
752+ ASSERT_EQ (v[1 ], 33 );
753+ ASSERT_EQ (v[2 ], 330 );
754+ });
755+
756+ in1 <<= 22 ;
757+ in2 <<= 11 ;
758+
759+ src1.Emit ();
760+ src2.Emit (42 );
761+
762+ ASSERT_EQ (obsCount1, 1 );
763+ ASSERT_EQ (obsCount2, 1 );
764+
765+ obs1.Detach ();
766+ obs2.Detach ();
767+ }
768+
769+ {
770+ auto obs1 = Observe (out1, [&] (const vector<int >& v) {
771+ ++obsCount1;
772+
773+ ASSERT_EQ (v.size (), 4 );
774+
775+ ASSERT_EQ (v[0 ], 33 );
776+ ASSERT_EQ (v[1 ], 330 );
777+ ASSERT_EQ (v[2 ], 330 );
778+ ASSERT_EQ (v[3 ], 3300 );
779+ });
780+
781+ auto obs2 = Observe (out2, [&] (const vector<int >& v) {
782+ ++obsCount2;
783+
784+ ASSERT_EQ (v.size (), 6 );
785+
786+ ASSERT_EQ (v[0 ], 42 );
787+ ASSERT_EQ (v[1 ], 33 );
788+ ASSERT_EQ (v[2 ], 330 );
789+
790+ ASSERT_EQ (v[3 ], 420 );
791+ ASSERT_EQ (v[4 ], 330 );
792+ ASSERT_EQ (v[5 ], 3300 );
793+ });
794+
795+ in1 <<= 220 ;
796+ in2 <<= 110 ;
797+
798+ src1.Emit ();
799+ src2.Emit (420 );
800+
801+ ASSERT_EQ (obsCount1, 2 );
802+ ASSERT_EQ (obsCount2, 2 );
803+
804+ obs1.Detach ();
805+ obs2.Detach ();
806+ }
807+ }
808+
589809// /////////////////////////////////////////////////////////////////////////////////////////////////
590810// / EventFilter1
591811// /////////////////////////////////////////////////////////////////////////////////////////////////
@@ -688,6 +908,8 @@ REGISTER_TYPED_TEST_CASE_P
688908 SyncedTransform1,
689909 SyncedIterate1,
690910 SyncedIterate2,
911+ SyncedIterate3,
912+ SyncedIterate4,
691913 SyncedEventFilter1,
692914 SyncedEventTransform1
693915);
0 commit comments