예제 #1
0
        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);
        }
예제 #2
0
        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);
        }
예제 #3
0
        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);
        }
예제 #4
0
        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"]);
        }
예제 #5
0
 public void SetPropertiesWithInitializedInstanceThrows()
 {
     ASObject obj = new ASObject();
     obj.SetProperties(EmptyArray<IASValue>.Instance, EmptyDictionary<string, IASValue>.Instance);
 }
예제 #6
0
        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);
        }
예제 #7
0
        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());
        }
예제 #8
0
        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());
        }
예제 #9
0
        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());
        }
예제 #10
0
        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());
        }