TEST(DictionarySerializationTest, SelfReference) { AmfItemPtr ptr(AmfDictionary(false, false)); ptr.as<AmfDictionary>().values[AmfItemPtr(AmfString("x"))] = ptr; SerializationContext ctx; isEqual({ 0x11, 0x03, 0x00, 0x06, 0x03, 0x78, 0x11, 0x00 }, ptr->serialize(ctx)); }
TEST(SerializationContext, Pointer) { SerializationContext ctx; ASSERT_THROW(ctx.getPointer<AmfInteger>(0), std::out_of_range); ctx.addPointer(AmfItemPtr(AmfNull())); ASSERT_EQ(AmfNull(), ctx.getPointer<AmfNull>(0).as<AmfNull>()); ASSERT_EQ(AmfNull(), ctx.getObject<AmfNull>(0)); ASSERT_THROW(ctx.getPointer<AmfInteger>(0), std::invalid_argument); ASSERT_THROW(ctx.getObject<AmfInteger>(0), std::invalid_argument); ASSERT_THROW(ctx.getPointer<AmfNull>(1), std::out_of_range); ASSERT_THROW(ctx.getObject<AmfNull>(1), std::out_of_range); ctx.addObject(AmfInteger(11)); ASSERT_EQ(AmfNull(), ctx.getPointer<AmfNull>(0).as<AmfNull>()); ASSERT_EQ(AmfInteger(11), ctx.getPointer<AmfInteger>(1).as<AmfInteger>()); ASSERT_EQ(AmfInteger(11), ctx.getObject<AmfInteger>(1)); ASSERT_THROW(ctx.getPointer<AmfDouble>(1), std::invalid_argument); ASSERT_THROW(ctx.getObject<AmfDouble>(1), std::invalid_argument); }
TEST(DictionaryDeserialization, SelfReference2) { v8 data { 0x11, 0x05, 0x00, 0x00, 0x11, 0x00, 0x11, 0x00, 0x00 }; DeserializationContext ctx; auto it = data.cbegin(); AmfItemPtr ptr = AmfDictionary::deserializePtr(it, data.cend(), ctx); AmfDictionary & d = ptr.as<AmfDictionary>(); const AmfItemPtr& inner = d.values.at(AmfItemPtr(AmfUndefined())); EXPECT_EQ(ptr.get(), inner.get()); // TODO: segfault due to AmfDictionaryHash // const AmfItemPtr& inner2 = d.values.at(ptr); // EXPECT_EQ(AmfUndefined(), inner2.as<AmfUndefined>()); }
void setObject(size_t index, const T& object) { objects.at(index) = AmfItemPtr(new T(object)); }
void insert(const std::string key, const T& item) { static_assert(std::is_base_of<AmfItem, T>::value, "Elements must extend AmfItem"); associative[key] = AmfItemPtr(new T(item)); }
AmfItemPtr& operator[](const T& item) { static_assert(std::is_base_of<AmfItem, T>::value, "Keys must extend AmfItem"); return values[AmfItemPtr(new T(item))]; }
void addDynamicProperty(std::string name, const T& value) { dynamicProperties[name] = AmfItemPtr(new T(value)); }
void addSealedProperty(std::string name, const T& value) { traits.addAttribute(name); sealedProperties[name] = AmfItemPtr(new T(value)); }