@@ -120,6 +120,8 @@ test subsequent_anonymous_transitions_composite = [] {
120
120
// clang-format off
121
121
return make_transition_table (
122
122
*idle / [] (V& v) { v+=" ss1|" ; } = s1
123
+ ,s1 + sml::on_entry<_> / [] (V& v) { v+=" ss1en|" ; }
124
+ ,s1 + sml::on_exit<_> / [] (V& v) { v+=" ss1ex|" ; }
123
125
,s1 / [] (V& v) { v+=" ss2|" ; } = s2
124
126
,s2 / [] (V& v) { v+=" ss3|" ; } = X
125
127
);
@@ -157,7 +159,7 @@ test subsequent_anonymous_transitions_composite = [] {
157
159
sml::sm<composite_sm> sm{calls};
158
160
expect (sm.is <decltype (state<sub_sm>)>(X));
159
161
expect (sm.is (s3));
160
- std::string expected (" 11|12|s1|s2|s3|ssen|ss1|ss2|ss3|ssex|s4|13|14|" );
162
+ std::string expected (" 11|12|s1|s2|s3|ssen|ss1|ss1en|ss1ex| ss2|ss3|ssex|s4|13|14|" );
161
163
expect (calls == expected);
162
164
};
163
165
@@ -550,20 +552,59 @@ test initial_nontrivial_entry = [] {
550
552
using namespace sml ;
551
553
// clang-format off
552
554
return make_transition_table (
553
- *idle + sml::on_entry<e2 > / [] {}
555
+ *idle + sml::on_entry<e2 > / [this ] { calls+=" e2|" ; }
556
+ ,idle + sml::on_entry<_> / [this ] { calls+=" _|" ; }
554
557
,idle + event<e2 > = s1
555
- ,s1 + on_entry<_> / [this ] { ++entry_calls; }
558
+ ,s1 + on_entry<_> / [this ] { calls+=" _|" ; }
559
+ ,s1 + event<e3 > = s2
560
+ ,s2 + on_entry<e3 > / [this ] { calls+=" e3|" ; }
561
+ ,s2 + on_entry<e2 > / [this ] { calls+=" e2|" ; }
562
+ ,s2 + on_entry<e1 > / [this ] { calls+=" e1|" ; }
563
+ ,s2 + on_entry<_> / [this ] { calls+=" _|" ; }
564
+ ,s2 + event<e3 > = s3
565
+ ,s3 + on_entry<e2 > / [this ] { calls+=" e2|" ; }
566
+ ,s3 + on_entry<e1 > / [this ] { calls+=" e1|" ; }
567
+ ,s3 + on_entry<_> / [this ] { calls+=" _|" ; }
556
568
);
557
569
// clang-format on
558
570
}
559
571
560
- int entry_calls = 0 ;
572
+ std::string calls ;
561
573
};
562
574
563
- sml::sm<c> sm{};
564
- const c& c_ = sm;
565
- sm.process_event (e2 {});
566
- expect (1 == c_.entry_calls );
575
+ struct d {
576
+ auto operator ()() noexcept {
577
+ using namespace sml ;
578
+ // clang-format off
579
+ return make_transition_table (
580
+ *idle + event<e2 > = state<c>
581
+ );
582
+ // clang-format on
583
+ }
584
+ };
585
+ {
586
+ sml::sm<c> sm{};
587
+ const c& c_ = sm;
588
+ expect (" _|" == c_.calls );
589
+ sm.process_event (e2 {});
590
+ expect (" _|_|" == c_.calls );
591
+ sm.process_event (e3 {});
592
+ expect (" _|_|e3|" == c_.calls );
593
+ sm.process_event (e3 {});
594
+ expect (" _|_|e3|_|" == c_.calls );
595
+ }
596
+ {
597
+ sml::sm<d> sm{};
598
+ const c& c_ = sm;
599
+ sm.process_event (e2 {});
600
+ expect (" e2|" == c_.calls );
601
+ sm.process_event (e2 {});
602
+ expect (" e2|_|" == c_.calls );
603
+ sm.process_event (e3 {});
604
+ expect (" e2|_|e3|" == c_.calls );
605
+ sm.process_event (e3 {});
606
+ expect (" e2|_|e3|_|" == c_.calls );
607
+ }
567
608
};
568
609
569
610
test initial_nontrivial_exit = [] {
@@ -572,20 +613,69 @@ test initial_nontrivial_exit = [] {
572
613
using namespace sml ;
573
614
// clang-format off
574
615
return make_transition_table (
575
- *idle + sml::on_exit<_> / [this ] { ++entry_calls; }
616
+ *idle + sml::on_exit<_> / [](std::string& calls) { calls+=" _|" ; }
617
+ ,idle + sml::on_exit<e2 > / [](std::string& calls) { calls+=" e2|" ; }
576
618
,idle + event<e1 > = s1
577
- ,s1 + sml::on_exit<e1 > / [] {}
619
+ ,idle + event<e2 > = s1
620
+ ,s1 + sml::on_exit<e2 > / [](std::string& calls) { calls+=" e2|" ; }
621
+ ,s1 + sml::on_exit<e1 > / [](std::string& calls) { calls+=" e1|" ; }
622
+ ,s1 + sml::on_exit<_> / [](std::string& calls) { calls+=" _|" ; }
623
+ ,s1 + event<e3 > = s2
624
+ ,s1 + event<e1 > = s2
625
+ ,s2 + sml::on_exit<e4 > / [](std::string& calls) { calls+=" e4|" ; }
626
+ ,s2 + sml::on_exit<e3 > / [](std::string& calls) { calls+=" e3|" ; }
627
+ ,s2 + sml::on_exit<e2 > / [](std::string& calls) { calls+=" e2|" ; }
628
+ ,s2 + sml::on_exit<e1 > / [](std::string& calls) { calls+=" e1|" ; }
629
+ ,s2 + sml::on_exit<_> / [](std::string& calls) { calls+=" _|" ; }
630
+ ,s2 + event<e3 > = s3
578
631
);
579
632
// clang-format on
580
633
}
581
-
582
- int entry_calls = 0 ;
583
634
};
584
635
585
- sml::sm<c> sm{};
586
- const c& c_ = sm;
587
- sm.process_event (e1 {});
588
- expect (1 == c_.entry_calls );
636
+ struct d {
637
+ auto operator ()() noexcept {
638
+ using namespace sml ;
639
+ // clang-format off
640
+ return make_transition_table (
641
+ *state<c> + event<e2 > = idle
642
+ ,state<c> + sml::on_exit<e4 > / [](std::string& calls) { calls+=" ce4|" ; }
643
+ );
644
+ // clang-format on
645
+ }
646
+ };
647
+ struct e {
648
+ auto operator ()() noexcept {
649
+ using namespace sml ;
650
+ // clang-format off
651
+ return make_transition_table (
652
+ *state<d> + event<e4 > = idle
653
+ );
654
+ // clang-format on
655
+ }
656
+ };
657
+ {
658
+ // Test with a simple sm
659
+ std::string s;
660
+ sml::sm<c> sm{s};
661
+ sm.process_event (e1 {});
662
+ expect (" _|" == s);
663
+ sm.process_event (e3 {});
664
+ expect (" _|_|" == s);
665
+ sm.process_event (e3 {});
666
+ expect (" _|_|e3|" == s);
667
+ }
668
+ {
669
+ // Test with a composite sm
670
+ std::string s;
671
+ sml::sm<e> sm{s};
672
+ sm.process_event (e1 {});
673
+ expect (" _|" == s);
674
+ sm.process_event (e1 {});
675
+ expect (" _|e1|" == s);
676
+ sm.process_event (e4 {});
677
+ expect (" _|e1|e4|ce4|" == s);
678
+ }
589
679
};
590
680
591
681
#if !defined(_MSC_VER)
0 commit comments