mirror of
https://github.com/fraillt/bitsery.git
synced 2026-06-08 08:13:56 +00:00
check type information before assigning to observer pointer
This commit is contained in:
@@ -458,6 +458,23 @@ TEST_F(SerializeExtensionPointerDeserialization, PointerObserver)
|
||||
EXPECT_THAT(pr3, Eq(&r3));
|
||||
}
|
||||
|
||||
TEST_F(SerializeExtensionPointerDeserialization,
|
||||
PointerObserverAndOwnerTypeMustBeTheSame)
|
||||
{
|
||||
// serialize as if we have two same objects
|
||||
auto& ser = createSerializer();
|
||||
ser.ext2b(d1, ReferencedByPointer{});
|
||||
ser.ext2b(pd1, PointerObserver{});
|
||||
auto& des = createDeserializer();
|
||||
// but actual implementation expects distinct objects
|
||||
des.ext2b(r1, ReferencedByPointer{});
|
||||
des.ext4b(pr2, PointerObserver{});
|
||||
|
||||
EXPECT_THAT(isPointerContextValid(), Eq(true));
|
||||
EXPECT_THAT(sctx1.des->adapter().error(),
|
||||
Eq(bitsery::ReaderError::InvalidPointer));
|
||||
}
|
||||
|
||||
struct Test1Data
|
||||
{
|
||||
std::vector<MyStruct1> vdata;
|
||||
|
||||
@@ -371,3 +371,63 @@ TEST_F(SerializeExtensionPointerPolymorphicTypes,
|
||||
EXPECT_THAT(sctx.des->adapter().error(),
|
||||
Eq(bitsery::ReaderError::InvalidPointer));
|
||||
}
|
||||
|
||||
TEST_F(SerializeExtensionPointerPolymorphicTypes,
|
||||
SameObjectIsCorrectlyIdentifiedEvenIfObserverHasDifferentBase)
|
||||
{
|
||||
|
||||
MultipleVirtualInheritance md;
|
||||
Derived2* derivedData = &md;
|
||||
EXPECT_THAT(static_cast<void*>(&md),
|
||||
::testing::Ne(static_cast<void*>(derivedData)));
|
||||
|
||||
auto& ser = createSerializer();
|
||||
ser.ext(md, ReferencedByPointer{});
|
||||
ser.ext(derivedData, PointerObserver{});
|
||||
EXPECT_THAT(isPointerContextValid(), Eq(true));
|
||||
}
|
||||
|
||||
TEST_F(SerializeExtensionPointerPolymorphicTypes,
|
||||
CheckIfOwnerTypeIsAssignableToObserverType)
|
||||
{
|
||||
|
||||
MultipleVirtualInheritance md;
|
||||
Derived2* derivedData = &md;
|
||||
|
||||
auto& ser = createSerializer();
|
||||
ser.ext(&md, PointerOwner{});
|
||||
ser.ext(derivedData, PointerObserver{});
|
||||
|
||||
MultipleVirtualInheritance* res1 = nullptr;
|
||||
NoRelationshipSpecifiedDerived* res2 = nullptr;
|
||||
auto& des = createDeserializer();
|
||||
des.ext(res1, PointerOwner{});
|
||||
des.ext(res2, PointerObserver{});
|
||||
|
||||
EXPECT_THAT(res1, ::testing::NotNull());
|
||||
EXPECT_THAT(res2, ::testing::IsNull());
|
||||
EXPECT_THAT(sctx.des->adapter().error(),
|
||||
Eq(bitsery::ReaderError::InvalidPointer));
|
||||
}
|
||||
|
||||
TEST_F(SerializeExtensionPointerPolymorphicTypes,
|
||||
OwnerIsStaticallyCastToObserverType)
|
||||
{
|
||||
|
||||
MultipleVirtualInheritance md{ 1, 2, 3, 4 };
|
||||
Derived2* derivedData = &md;
|
||||
|
||||
auto& ser = createSerializer();
|
||||
ser.ext(&md, PointerOwner{});
|
||||
ser.ext(derivedData, PointerObserver{});
|
||||
|
||||
MultipleVirtualInheritance* res1 = nullptr;
|
||||
Base* res2 = nullptr;
|
||||
auto& des = createDeserializer();
|
||||
des.ext(res1, PointerOwner{});
|
||||
des.ext(res2, PointerObserver{});
|
||||
|
||||
EXPECT_THAT(res1, ::testing::NotNull());
|
||||
EXPECT_THAT(res2, ::testing::NotNull());
|
||||
EXPECT_THAT(res2->x, Eq(1));
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user