TEST(DictionarySerializationTest, NullKeys) { AmfDictionary n(false, false); n.insert(AmfNull(), AmfNull()); isEqual(v8 { 0x11, 0x03, 0x00, 0x01, 0x01 }, n); n.asString = true; isEqual(v8 { 0x11, 0x03, 0x00, 0x06, 0x09, 0x6e, 0x75, 0x6c, 0x6c, 0x01 }, n); }
TEST(DictionaryEquality, NestedDictionary) { AmfDictionary d0(true), d1(true), i(false); i.insert(AmfNull(), AmfUndefined()); d0.insert(i, i); d1.insert(i, i); EXPECT_EQ(d0, d1); }
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(DictionaryEquality, SimpleValues) { AmfDictionary d0(true), d1(true), d2(false); d0.insert(AmfInteger(0), AmfString("foo")); d1.insert(AmfInteger(0), AmfString("foo")); d2.insert(AmfInteger(0), AmfString("foo")); EXPECT_EQ(d0, d1); EXPECT_NE(d0, d2); d0.insert(AmfString("qux"), AmfByteArray(v8 { 0x00 })); EXPECT_NE(d0, d1); d1.insert(AmfString("qux"), AmfByteArray(v8 { 0x00 })); EXPECT_EQ(d0, d1); d0.insert(AmfNull(), AmfUndefined()); d1.insert(AmfUndefined(), AmfNull()); EXPECT_NE(d0, d1); d0.insert(AmfUndefined(), AmfNull()); d1.insert(AmfNull(), AmfUndefined()); EXPECT_EQ(d0, d1); }
TEST(SerializationContext, Item) { SerializationContext ctx; // Verify no objects are stored yet. ASSERT_THROW(ctx.getObject<AmfNull>(0), std::out_of_range); // Add one. ctx.addObject(AmfNull()); ASSERT_EQ(AmfNull(), ctx.getObject<AmfNull>(0)); ASSERT_THROW(ctx.getObject<AmfInteger>(0), std::invalid_argument); // Another one. AmfInteger i(17); ctx.addObject(i); ASSERT_EQ(AmfNull(), ctx.getObject<AmfNull>(0)); ASSERT_EQ(i, ctx.getObject<AmfInteger>(1)); // Verify that a copy is made. i.value = 21; ASSERT_EQ(AmfInteger(17), ctx.getObject<AmfInteger>(1)); }
TEST(SerializerTest, MultipleMixedValues) { Serializer s; s << AmfDouble(0.5) << AmfInteger(0x3ff) << AmfString("bar") << AmfNull(); v8 expected { 0x05, 0x3F, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x87, 0x7F, 0x06, 0x07, 0x62, 0x61, 0x72, 0x01 }; ASSERT_EQ(expected, s.data()); }
TEST(DeserializerTest, Null) { deserializesTo(AmfNull(), { 0x01 }); deserializesTo(AmfNull(), { 0x01, 0x01 }, 1); }
static AmfNull deserialize(v8::const_iterator& it, v8::const_iterator end, SerializationContext&) { if (it == end || *it++ != AMF_NULL) throw std::invalid_argument("AmfNull: Invalid type marker"); return AmfNull(); }
TEST(NullSerialization, SimpleValue) { isEqual(v8 { 0x01 }, AmfNull()); }
TEST(NullDeserialization, SimpleValue) { deserialize(AmfNull(), v8 { 0x01, }, 0); deserialize(AmfNull(), v8 { 0x01, 0x00 }, 1); deserialize(AmfNull(), v8 { 0x01, AMF_NULL }, 1); deserialize(AmfNull(), v8 { 0x01, 0x00, 0x00, 0x00 }, 3); }