public void DefaultConstructor() { ASObject obj = new ASObject(); Assert.AreEqual(0, obj.MemberValues.Count); Assert.IsTrue(obj.MemberValues.IsReadOnly); Assert.AreEqual(0, obj.DynamicProperties.Count); Assert.IsFalse(obj.DynamicProperties.IsReadOnly); }
public void ConstructorWithClass(ASClassLayout classLayout, string[] memberNames) { ASClass @class = new ASClass("class", classLayout, memberNames); ASObject obj = new ASObject(@class); Assert.AreSame(@class, obj.Class); Assert.AreEqual(memberNames.Length, obj.MemberValues.Count); Assert.AreEqual(0, obj.DynamicProperties.Count); Assert.AreEqual(classLayout == ASClassLayout.Normal, obj.DynamicProperties.IsReadOnly); if (memberNames.Length == 0) Assert.IsTrue(obj.MemberValues.IsReadOnly); }
public void ConstructorWithClassAndMemberValues(ASClassLayout classLayout, string[] memberNames, int[] memberValues) { IASValue[] asMemberValues = WrapInts(memberValues); ASClass @class = new ASClass("class", classLayout, memberNames); ASObject obj = new ASObject(@class, asMemberValues); Assert.AreSame(@class, obj.Class); Assert.AreSame(asMemberValues, obj.MemberValues); Assert.AreEqual(0, obj.DynamicProperties.Count); Assert.AreEqual(classLayout == ASClassLayout.Normal, obj.DynamicProperties.IsReadOnly); }
public void Indexer() { ASClass @class = new ASClass("class", ASClassLayout.Dynamic, new string[] { "member" }); ASObject obj = new ASObject(@class); obj["member"] = new ASInt29(1); Assert.AreEqual(new ASInt29(1), obj["member"]); Assert.AreEqual(new ASInt29(1), obj.MemberValues[0]); obj["nonmember"] = new ASInt29(2); Assert.AreEqual(new ASInt29(2), obj["nonmember"]); Assert.AreEqual(new ASInt29(2), obj.DynamicProperties["nonmember"]); }
public void SetPropertiesWithInitializedInstanceThrows() { ASObject obj = new ASObject(); obj.SetProperties(EmptyArray<IASValue>.Instance, EmptyDictionary<string, IASValue>.Instance); }
public void ConstructorWithClassAndMemberValuesAndDynamicValues(ASClassLayout classLayout, string[] memberNames, int[] memberValues) { IASValue[] asMemberValues = WrapInts(memberValues); IDictionary<string, IASValue> dynamicProperties = new Dictionary<string, IASValue>(); ASClass @class = new ASClass("class", classLayout, memberNames); ASObject obj = new ASObject(@class, asMemberValues, dynamicProperties); Assert.AreSame(@class, obj.Class); Assert.AreSame(asMemberValues, obj.MemberValues); Assert.AreSame(dynamicProperties, obj.DynamicProperties); }
public void WriteObject_Objects_ReferenceCaching(AMFObjectEncoding objectEncoding, byte[] expected) { // Create an array with multiple copies of each kind of object and including a self-reference ASObject obj = new ASObject(); ASByteArray byteArray = new ASByteArray(new byte[0]); ASDate date = new ASDate(1, 0); ASArray array = new ASArray(6); array.IndexedValues[0] = obj; array.IndexedValues[1] = byteArray; array.IndexedValues[2] = date; array.IndexedValues[3] = obj; array.IndexedValues[4] = byteArray; array.IndexedValues[5] = date; array.DynamicProperties["a"] = array; output.ObjectEncoding = objectEncoding; output.BeginObjectStream(); output.WriteObject(array); output.EndObjectStream(); CollectionAssert.AreElementsEqual(expected, stream.ToArray()); }
public void WriteObject_Objects_ClassDefinitionCaching_AMF3() { // Write out two untyped dynamic objects and two typed normal // objects and ensure the class definition is reused. ASObject untyped1 = new ASObject(); ASObject untyped2 = new ASObject(); ASClass @class = new ASClass("class", ASClassLayout.Normal, EmptyArray<string>.Instance); ASObject typed1 = new ASObject(@class); ASObject typed2 = new ASObject(@class); Mocks.ReplayAll(); output.ObjectEncoding = AMFObjectEncoding.AMF3; output.BeginObjectStream(); output.WriteObject(untyped1); output.WriteObject(typed1); output.WriteObject(untyped2); output.WriteObject(typed2); output.EndObjectStream(); byte[] expected = new byte[] { (byte)AMF0ObjectTypeCode.AMF3Data, (byte)AMF3ObjectTypeCode.Object, 0x0b, 0x01, 0x01, // untyped1 (byte)AMF3ObjectTypeCode.Object, 0x03, 0x0b, 0x63, 0x6c, 0x61, 0x73, 0x73, // typed1 (byte)AMF3ObjectTypeCode.Object, 0x01, 0x01, // untyped2 using cached class definition (byte)AMF3ObjectTypeCode.Object, 0x05, // typed2 using cached class definition }; CollectionAssert.AreElementsEqual(expected, stream.ToArray()); }
public void WriteObject_Objects(AMFObjectEncoding objectEncoding, byte[] expected, string className, ASClassLayout classLayout, string[] memberNames, string[] memberValues, string[] dynamicKeysAndValues) { ASClass @class = new ASClass(className, classLayout, memberNames); ASObject obj = new ASObject(@class, WrapStrings(memberValues), new Dictionary<string, IASValue>()); for (int i = 0; i < dynamicKeysAndValues.Length; i += 2) obj.DynamicProperties[dynamicKeysAndValues[i]] = new ASString(dynamicKeysAndValues[i + 1]); output.ObjectEncoding = objectEncoding; output.BeginObjectStream(); output.WriteObject(obj); output.EndObjectStream(); CollectionAssert.AreElementsEqual(expected, stream.ToArray()); }
public void WriteObject_Strings_Caching_AMF3() { ASString empty = new ASString(""); ASString valueA = new ASString("a"); ASString valueB = new ASString("b"); ASString valueC = new ASString("c"); ASXmlDocument xml = new ASXmlDocument(valueB.Value); ASArray array = new ASArray(new IASValue[] { valueA, valueB }); array.DynamicProperties[valueB.Value] = valueA; ASClass clazz = new ASClass(valueB.Value, ASClassLayout.Dynamic, new string[] { valueC.Value }); ASObject obj = new ASObject(clazz); obj.MemberValues[0] = valueC; obj.DynamicProperties[valueA.Value] = valueB; output.ObjectEncoding = AMFObjectEncoding.AMF3; output.BeginObjectStream(); output.WriteObject(empty); // empty strings are not cached output.WriteObject(valueA); // will get string ref #0 output.WriteObject(empty); // empty strings are not cached output.WriteObject(valueB); // will get string ref #1 output.WriteObject(valueA); // will use string ref #0 output.WriteObject(xml); // XML contents are same as valueB, will use ref #1 output.WriteObject(array); // Array contains valueA and valueB and mixed values with key valueB and value valueA output.WriteObject(obj); // Object has class name valueB contains member with key valueC and value valueA dynamic property with key valueA and value valueB output.EndObjectStream(); CollectionAssert.AreElementsEqual( new byte[] { (byte)AMF0ObjectTypeCode.AMF3Data, (byte)AMF3ObjectTypeCode.String, 0x01, // "" (byte)AMF3ObjectTypeCode.String, 0x03, 0x61, // valueA (byte)AMF3ObjectTypeCode.String, 0x01, // "" (byte)AMF3ObjectTypeCode.String, 0x03, 0x62, // valueB (byte)AMF3ObjectTypeCode.String, 0x00, // valueA (by ref) (byte)AMF3ObjectTypeCode.Xml, 0x02, // valueB (by ref) (byte)AMF3ObjectTypeCode.Array, 0x05, 0x02, (byte)AMF3ObjectTypeCode.String, 0x00, 0x01, (byte)AMF3ObjectTypeCode.String, 0x00, (byte)AMF3ObjectTypeCode.String, 0x02, // array (byte)AMF3ObjectTypeCode.Object, 0x1b, 0x02, 0x03, 0x63, (byte)AMF3ObjectTypeCode.String, 0x04, 0x00, (byte)AMF3ObjectTypeCode.String, 0x02, 0x01 // object }, stream.ToArray()); }