@@ -537,3 +537,60 @@ TEST(MSGPACK_USER_DEFINED, test_non_intrusive)
537537
538538 EXPECT_EQ (t1.name (), t2.name ());
539539}
540+
541+ struct nvp_base {
542+ int a;
543+ int b;
544+ MSGPACK_DEFINE_MAP (MSGPACK_NVP(" aaa" , a), b);
545+ };
546+
547+ struct nvp_derived : nvp_base {
548+ int c;
549+ std::string d;
550+ MSGPACK_DEFINE_MAP (MSGPACK_NVP(" ccc" , c), MSGPACK_NVP(" base" , MSGPACK_BASE(nvp_base)), MSGPACK_NVP(" ddd" , d));
551+ };
552+
553+ TEST (MSGPACK_NVP, combination)
554+ {
555+ msgpack::sbuffer sbuf;
556+ nvp_derived d1;
557+ d1.a = 1 ;
558+ d1.b = 2 ;
559+ d1.c = 3 ;
560+ d1.d = " ABC" ;
561+
562+ msgpack::pack (sbuf, d1);
563+ msgpack::object_handle oh = msgpack::unpack (sbuf.data (), sbuf.size ());
564+ msgpack::object obj = oh.get ();
565+
566+ EXPECT_EQ (obj.via .map .size , 3 );
567+
568+ EXPECT_EQ (std::string (obj.via .map .ptr [0 ].key .via .str .ptr , obj.via .map .ptr [0 ].key .via .str .size ), " ccc" );
569+ EXPECT_EQ (obj.via .map .ptr [0 ].val .via .i64 , 3 );
570+
571+ EXPECT_EQ (std::string (obj.via .map .ptr [1 ].key .via .str .ptr , obj.via .map .ptr [1 ].key .via .str .size ), " base" );
572+ EXPECT_EQ (obj.via .map .ptr [1 ].val .via .map .size , 2 );
573+ EXPECT_EQ (
574+ std::string (
575+ obj.via .map .ptr [1 ].val .via .map .ptr [0 ].key .via .str .ptr ,
576+ obj.via .map .ptr [1 ].val .via .map .ptr [0 ].key .via .str .size ),
577+ " aaa"
578+ );
579+ EXPECT_EQ (obj.via .map .ptr [1 ].val .via .map .ptr [0 ].val .via .i64 , 1 );
580+ EXPECT_EQ (
581+ std::string (
582+ obj.via .map .ptr [1 ].val .via .map .ptr [1 ].key .via .str .ptr ,
583+ obj.via .map .ptr [1 ].val .via .map .ptr [1 ].key .via .str .size ),
584+ " b"
585+ );
586+ EXPECT_EQ (obj.via .map .ptr [1 ].val .via .map .ptr [1 ].val .via .i64 , 2 );
587+
588+ EXPECT_EQ (std::string (obj.via .map .ptr [2 ].key .via .str .ptr , obj.via .map .ptr [2 ].key .via .str .size ), " ddd" );
589+ EXPECT_EQ (std::string (obj.via .map .ptr [2 ].val .via .str .ptr , obj.via .map .ptr [2 ].val .via .str .size ), " ABC" );
590+
591+ nvp_derived d2 = obj.as <nvp_derived>();
592+ EXPECT_EQ (d2.a , 1 );
593+ EXPECT_EQ (d2.b , 2 );
594+ EXPECT_EQ (d2.c , 3 );
595+ EXPECT_EQ (d2.d , " ABC" );
596+ }
0 commit comments