@@ -33,6 +33,11 @@ template <>
33
33
inline auto logging::config<> =
34
34
logging::fmt::config{std::back_inserter (log_buffer)};
35
35
36
+ TEST_CASE (" get a field from a message" , " [message]" ) {
37
+ using F = msg_defn::field_t <" f1" >;
38
+ STATIC_REQUIRE (std::is_same_v<F, field1>);
39
+ }
40
+
36
41
TEST_CASE (" message with automatic storage" , " [message]" ) {
37
42
test_msg msg{};
38
43
auto data = msg.data ();
@@ -683,6 +688,56 @@ TEST_CASE("pack with empty messages", "[message]") {
683
688
STATIC_REQUIRE (std::is_same_v<defn, expected_defn>);
684
689
}
685
690
691
+ TEST_CASE (" field matchers work with packed messages" , " [message]" ) {
692
+ using f1 = field<" f1" , std::uint32_t >::located<at{15_msb, 0_lsb}>;
693
+ using f2 = field<" f2" , std::uint32_t >::located<at{23_msb, 16_lsb}>;
694
+ using m1 = message<" m1" , f1, f2>;
695
+
696
+ using f3 = field<" f3" , std::uint32_t >::located<at{15_msb, 0_lsb}>;
697
+ using f4 = field<" f4" , std::uint32_t >::located<at{23_msb, 16_lsb}>;
698
+ using m2 = message<" m2" , f3, f4>;
699
+
700
+ constexpr auto m = msg::equal_to_t <f3, 3 >{};
701
+ using defn = pack<" defn" , std::uint8_t , m1, m2>;
702
+ constexpr owning<defn> msg{" f1" _field = 1 , " f2" _field = 2 , " f3" _field = 3 ,
703
+ " f4" _field = 4 };
704
+ STATIC_REQUIRE (m (msg));
705
+ }
706
+
707
+ TEST_CASE (" a packed message matches itself" , " [message]" ) {
708
+ using f1 = field<" f1" , std::uint32_t >::located<at{15_msb, 0_lsb}>;
709
+ using f2 = field<" f2" , std::uint32_t >::located<at{23_msb, 16_lsb}>;
710
+ using m1 = message<" m1" , f1, f2>;
711
+
712
+ using f3 = field<" f3" , std::uint32_t >::located<at{15_msb, 0_lsb}>;
713
+ using f4 = field<" f4" , std::uint32_t >::located<at{23_msb, 16_lsb}>;
714
+ using m2 = message<" m2" , f3::with_equal_to<3 >, f4>;
715
+
716
+ using defn = pack<" defn" , std::uint8_t , m1, m2>;
717
+ constexpr owning<defn> msg{" f1" _field = 1 , " f2" _field = 2 , " f3" _field = 3 ,
718
+ " f4" _field = 4 };
719
+ STATIC_REQUIRE (defn::matcher_t {}(msg));
720
+ }
721
+
722
+ TEST_CASE (" correct field matchers can be post-defined" , " [message]" ) {
723
+ using f1 = field<" f1" , std::uint32_t >::located<at{15_msb, 0_lsb}>;
724
+ using f2 = field<" f2" , std::uint32_t >::located<at{23_msb, 16_lsb}>;
725
+ using m1 = message<" m1" , f1, f2>;
726
+
727
+ using f3 = field<" f3" , std::uint32_t >::located<at{15_msb, 0_lsb}>;
728
+ using f4 = field<" f4" , std::uint32_t >::located<at{23_msb, 16_lsb}>;
729
+ using m2 = message<" m2" , f3, f4>;
730
+
731
+ using defn = pack<" defn" , std::uint8_t , m1, m2>;
732
+ constexpr owning<defn> msg{" f1" _field = 1 , " f2" _field = 2 , " f3" _field = 3 ,
733
+ " f4" _field = 4 };
734
+
735
+ constexpr auto m_wrong = msg::equal_to_t <f3, 3 >{};
736
+ STATIC_REQUIRE (not m_wrong (msg.data ()));
737
+ constexpr auto m_right = msg::equal_to_t <defn::field_t <" f3" >, 3 >{};
738
+ STATIC_REQUIRE (m_right (msg.data ()));
739
+ }
740
+
686
741
namespace {
687
742
[[maybe_unused]] constexpr inline struct custom_t {
688
743
template <typename T>
0 commit comments